1
0
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:
salexdv
2020-07-20 23:30:56 +03:00
parent 41a4d395b9
commit 0d81829471
14 changed files with 35986 additions and 35890 deletions

View File

@@ -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)

View File

@@ -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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1647
src/bslMetadata.js Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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 };
}
}
}

View File

@@ -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');

View File

@@ -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',

View File

@@ -4,8 +4,7 @@
<head>
<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>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<style>
html,
body {

1099
src/snippets.js Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -9,8 +9,7 @@
<script>
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>
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/2.0.0/chai.js"></script>
</head>
<body>
@@ -29,7 +28,25 @@
'"ВЫБРАТЬ',
'|ИЗ',
'|Справочники";',
'',
'Если Истина Тогда',
' Выполнить(ТекстКода);',
' Счетчик = Счетчик + 1',
' Состояние("Выполнено " + Счетчик + " из " + Всего);',
'КонецЕсли;',
'',
'Пока Истина Цикл',
' Выполнить(ТекстКода);',
' Счетчик = Счетчик + 1',
' Состояние("Выполнено " + Счетчик + " из " + Всего);',
'КонецЦикла;',
'',
'Для Индекс = 1 По 5 Цикл',
' Выполнить(ТекстКода);',
' Счетчик = Счетчик + 1',
' Состояние("Выполнено " + Счетчик + " из " + Всего);',
'КонецЦикла;',
'',
'ТаблицаЗначений.Найти(Справочники.',
'',
' Стр = ОписаниеОшибки',

View File

@@ -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();