You've already forked bsl_console
mirror of
https://github.com/salexdv/bsl_console.git
synced 2025-11-06 08:59:16 +02:00
Отказ от хранения описаний конструкций языка и метаданных в файлах JSON. Теперь всё хранится в js и новая функция для загрузки метаданных из 1С.
Обработка подсказок для предопределенных значений элементов
This commit is contained in:
18
CHANGELOG.md
18
CHANGELOG.md
@@ -1,10 +1,24 @@
|
||||
## 0.1.2 (20.07.2020)
|
||||
### Новое:
|
||||
* Добавлена обработка подсказок для предопределенных значений элементов
|
||||
|
||||
### Улучшения:
|
||||
* Отказ от хранения описаний конструкций языка и метаданных в файлах JSON из-за CORS policy
|
||||
|
||||
### Исправления:
|
||||
* Выделение ключевого слова *Выполнить*
|
||||
|
||||
### Исправления:
|
||||
* Исправлен сниппет для выборки из регистра накопления
|
||||
|
||||
## 0.1.1 (19.07.2020)
|
||||
Новое:
|
||||
|
||||
### Новое:
|
||||
* Доработана глобальная функция вставки текста, чтобы можно было вставлять не только в конкретную позицию, но в область (range)
|
||||
* Добавлена глобальная функция для определения текущего текста запроса и его положения
|
||||
* Добавлена глобальная функция для очистки всего текста
|
||||
|
||||
Исправления:
|
||||
### Исправления:
|
||||
* Исправлен сниппет для выборки из регистра накопления
|
||||
|
||||
## 0.1.0 (16.07.2020)
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
* Вставка готовых блоков кода (сниппеты)
|
||||
|
||||
## Как запускать?
|
||||
Для запуска достаточно открыть **index.html** из каталога **src**, правда есть одно но.
|
||||
По умолчанию основные браузеры блокируют загрузку файлов с локальной машины, а все описания синтаксиса лежат тут же в JSON, поэтому тот же Chrome надо запускать с ключом *--allow-file-access-from-files*
|
||||
Для запуска достаточно открыть **index.html** из каталога **src**.
|
||||
|
||||
## Благодарности
|
||||
Выражаю благодарность команде [1c-syntax](https://github.com/1c-syntax) и их [проекту для VSCode](https://github.com/1c-syntax/vsc-language-1c-bsl) за подробное описание внутренних конструкций языка в JSON, а также за коллекцию сниппетов.
|
||||
|
||||
33124
src/bslGlobals.js
Normal file
33124
src/bslGlobals.js
Normal file
File diff suppressed because one or more lines are too long
33122
src/bslGlobals.json
33122
src/bslGlobals.json
File diff suppressed because one or more lines are too long
1647
src/bslMetadata.js
Normal file
1647
src/bslMetadata.js
Normal file
File diff suppressed because it is too large
Load Diff
1641
src/bslMetadata.json
1641
src/bslMetadata.json
File diff suppressed because it is too large
Load Diff
@@ -594,6 +594,23 @@ class bslHelper {
|
||||
|
||||
if (itemNode) {
|
||||
|
||||
if (itemNode.hasOwnProperty('predefined')) {
|
||||
|
||||
for (const [pkey, pvalue] of Object.entries(itemNode.predefined)) {
|
||||
|
||||
values.push({
|
||||
name: pkey,
|
||||
postfix: '',
|
||||
detail: '',
|
||||
description: '',
|
||||
kind: monaco.languages.CompletionItemKind.Field,
|
||||
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (value.hasOwnProperty('methods')) {
|
||||
|
||||
for (const [mkey, mvalue] of Object.entries(value.methods)) {
|
||||
@@ -627,7 +644,8 @@ class bslHelper {
|
||||
}
|
||||
|
||||
}
|
||||
else if (key == 'enums') {
|
||||
|
||||
if (key == 'enums') {
|
||||
|
||||
for (const [pkey, pvalue] of Object.entries(itemNode.properties)) {
|
||||
suggestions.push({
|
||||
@@ -1028,4 +1046,34 @@ class bslHelper {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates bslMetadata from JSON-string which
|
||||
* was received from 1C
|
||||
*
|
||||
* @param {string} metadata JSON-string with metadata info
|
||||
*
|
||||
* @returns {true|object} true - metadata was updated, {errorDescription} - not
|
||||
*/
|
||||
static updateMetadata(metadata) {
|
||||
|
||||
try {
|
||||
let metadataObj = JSON.parse(metadata);
|
||||
if (metadataObj.hasOwnProperty('catalogs')) {
|
||||
for (const [key, value] of Object.entries(metadataObj)) {
|
||||
bslMetadata[key].items = value;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
throw new TypeError("Wrong structure of metadata");
|
||||
}
|
||||
|
||||
}
|
||||
catch (e) {
|
||||
return { errorDescription: e.message };
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
function loadJSON(filename) {
|
||||
|
||||
let xobj = new XMLHttpRequest();
|
||||
xobj.overrideMimeType("application/json");
|
||||
xobj.open('GET', filename, false);
|
||||
xobj.send();
|
||||
|
||||
if (xobj.readyState == 4)
|
||||
return JSON.parse(xobj.responseText);
|
||||
else
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
// Loading main data
|
||||
bslGlobals = loadJSON('./bslGlobals.json');
|
||||
bslMetadata = loadJSON('./bslMetadata.json');
|
||||
snippets = loadJSON('./snippets.json');
|
||||
@@ -1,4 +1,4 @@
|
||||
define(['vs/editor/editor.main'], function () {
|
||||
define(['bslGlobals', 'bslMetadata', 'snippets', 'vs/editor/editor.main'], function () {
|
||||
|
||||
setText = function(txt, range) {
|
||||
|
||||
@@ -46,6 +46,12 @@ define(['vs/editor/editor.main'], function () {
|
||||
|
||||
}
|
||||
|
||||
updateMetadata = function (metadata) {
|
||||
|
||||
return bslHelper.updateMetadata(metadata);
|
||||
|
||||
}
|
||||
|
||||
// Register a new language
|
||||
monaco.languages.register({ id: 'bsl' });
|
||||
|
||||
@@ -66,7 +72,7 @@ define(['vs/editor/editor.main'], function () {
|
||||
'While', 'Для', 'For', 'Каждого', 'Each', 'Из', 'In', 'По', 'To', 'Цикл',
|
||||
'Do', 'КонецЦикла', 'EndDo', 'НЕ', 'NOT', 'И', 'AND', 'ИЛИ', 'OR', 'Новый',
|
||||
'New', 'Процедура', 'Procedure', 'Функция', 'Function', 'Перем', 'Var',
|
||||
'Экспорт', 'Export', 'Знач', 'Val', 'Неопределено'
|
||||
'Экспорт', 'Export', 'Знач', 'Val', 'Неопределено', 'Выполнить'
|
||||
],
|
||||
namespaceFollows: [
|
||||
'namespace', 'using',
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
<title>BSL-editor</title>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
|
||||
<script src="./data_loader.js"></script>
|
||||
<style>
|
||||
html,
|
||||
body {
|
||||
|
||||
1099
src/snippets.js
Normal file
1099
src/snippets.js
Normal file
File diff suppressed because it is too large
Load Diff
1097
src/snippets.json
1097
src/snippets.json
File diff suppressed because it is too large
Load Diff
@@ -10,7 +10,6 @@
|
||||
mocha.setup('bdd');
|
||||
</script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/2.0.0/chai.js"></script>
|
||||
<script src="./data_loader.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -29,7 +28,25 @@
|
||||
'"ВЫБРАТЬ',
|
||||
'|ИЗ',
|
||||
'|Справочники";',
|
||||
|
||||
'',
|
||||
'Если Истина Тогда',
|
||||
' Выполнить(ТекстКода);',
|
||||
' Счетчик = Счетчик + 1',
|
||||
' Состояние("Выполнено " + Счетчик + " из " + Всего);',
|
||||
'КонецЕсли;',
|
||||
'',
|
||||
'Пока Истина Цикл',
|
||||
' Выполнить(ТекстКода);',
|
||||
' Счетчик = Счетчик + 1',
|
||||
' Состояние("Выполнено " + Счетчик + " из " + Всего);',
|
||||
'КонецЦикла;',
|
||||
'',
|
||||
'Для Индекс = 1 По 5 Цикл',
|
||||
' Выполнить(ТекстКода);',
|
||||
' Счетчик = Счетчик + 1',
|
||||
' Состояние("Выполнено " + Счетчик + " из " + Всего);',
|
||||
'КонецЦикла;',
|
||||
'',
|
||||
'ТаблицаЗначений.Найти(Справочники.',
|
||||
'',
|
||||
' Стр = ОписаниеОшибки',
|
||||
|
||||
21
src/test.js
21
src/test.js
@@ -185,6 +185,14 @@ describe("Проверка автокомлита и подсказок реда
|
||||
assert.equal(suggestions.some(suggest => suggest.label === "Цена"), true);
|
||||
});
|
||||
|
||||
it("проверка автокомплита для элемента справочника 'Товары.' (список предопределенных)", function () {
|
||||
bsl = helper('Товар = Справочники.Товары.');
|
||||
let suggestions = [];
|
||||
bsl.getMetadataCompletition(suggestions, bslMetadata)
|
||||
expect(suggestions).to.be.an('array').that.not.is.empty;
|
||||
assert.equal(suggestions.some(suggest => suggest.label === "Услуга"), true);
|
||||
});
|
||||
|
||||
it("проверка автокомплита для элемента справочника 'Товары.' (список реквизитов и функций объекта) обернутого в функцию", function () {
|
||||
bsl = helper('Товар = Справочники.Товары.НайтиПоКоду(1);\nНайти(Товар.');
|
||||
let suggestions = [];
|
||||
@@ -218,6 +226,19 @@ describe("Проверка автокомлита и подсказок реда
|
||||
assert.equal(text, getText());
|
||||
});
|
||||
|
||||
it("проверка обновления метаданных", function () {
|
||||
let mCopy = JSON.parse(JSON.stringify(bslMetadata));
|
||||
assert.notEqual(updateMetadata(123), true);
|
||||
let strJSON = '{"catalogs": {"АвансовыйОтчетПрисоединенныеФайлы": {"properties": {"Автор": "Автор","ВладелецФайла": "Размещение","ДатаМодификацииУниверсальная": "Дата изменения (универсальное время)","ДатаСоздания": "Дата создания","Зашифрован": "Зашифрован","Изменил": "Отредактировал","ИндексКартинки": "Индекс значка","Описание": "Описание","ПодписанЭП": "Подписан электронно","ПутьКФайлу": "Путь к файлу","Размер": "Размер (байт)","Расширение": "Расширение","Редактирует": "Редактирует","СтатусИзвлеченияТекста": "Статус извлечения текста","ТекстХранилище": "Текст","ТипХраненияФайла": "Тип хранения файла","Том": "Том","ФайлХранилище": "Временное хранилище файла","ДатаЗаема": "Дата заема","ХранитьВерсии": "Хранить версии","ИмяПредопределенныхДанных": "","Предопределенный": "","Ссылка": "","ПометкаУдаления": "","Наименование": ""}}}}';
|
||||
assert.equal(updateMetadata(strJSON), true);
|
||||
bsl = helper('Отчет = Справочники.АвансовыйОтчетПрисоединенныеФайлы.НайтиПоКоду(1);\nОтчет.');
|
||||
let suggestions = [];
|
||||
bsl.getMetadataCompletition(suggestions, bslMetadata)
|
||||
expect(suggestions).to.be.an('array').that.not.is.empty;
|
||||
assert.equal(suggestions.some(suggest => suggest.label === "ДатаМодификацииУниверсальная"), true);
|
||||
bslMetadata = JSON.parse(JSON.stringify(mCopy));
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
mocha.run();
|
||||
|
||||
Reference in New Issue
Block a user