1
0
mirror of https://github.com/salexdv/bsl_console.git synced 2025-09-16 09:06:17 +02:00

Merge branch 'salexdv:develop' into develop

This commit is contained in:
Sergey Starykh
2025-05-11 17:09:38 +03:00
committed by GitHub
5 changed files with 313 additions and 29 deletions

View File

@@ -279,7 +279,7 @@ setLanguageMode('bsl');
* На платформах, выпущенных примерно до ноября 2020 года могут не работать горячие клавиши CTRL+SPACE, CTRL+C, CTRL+V и CTRL+Z и т.п.
* В веб-клиенте недоступно любое взаимодействие редактора и 1С. Можно попробовать только набор кода. Иногда для этого в браузере надо предварительно открыть данную [ссылку](https://salexdv.github.io/bsl_console/src/index.html)
* В linux пока возможны проблемы с некоторым функционалом. Для сборки под linux необходимо использовать ветку [webpack](https://github.com/salexdv/bsl_console/tree/webpack)
* В linux на данный момент работает не весь фунционал. Для сборки под linux используется отдельная [ветка](https://github.com/salexdv/bsl_console/tree/webpack). Проблемы сборки описаны [тут](docs/linux.md)
* Из-за особенностей реализации подсказка через точку для реквизитов ссылочного типа работает только тогда, когда подсказываемый реквизит выбран через Enter
* В некоторых версиях платформы поле HTML некорректно работает с путями, содержащими кириллицу, поэтому обработка **console.epf** может выдавать ошибку `Метод объекта не обнаружен (init)`. Решением в таком случае будет изменить в коде каталог хранения исходников на другой.

278
docs/linux.md Normal file
View File

@@ -0,0 +1,278 @@
# Сборка под linux
До версии 0.31 более или менее нормально собирается.
Начиная с версии 0.32 нужен полифил для [Proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy). [proxy-polyfill](https://www.npmjs.com/package/proxy-polyfill) нормально работает только с версией 0.32. В версии 0.33 уже не работает, поэтому объекты, созданные через прокси оказываются undefined и вызывают ошибку вроде `TypeError: undefined is not an object (evaluating 'languageFeaturesService.colorProvider.register')`
```js
// package.json
{
"name": "bsl-console",
"version": "1.0.0",
"description": "",
"main": "editor.js",
"homepage": "https://github.com/salexdv/bsl_console",
"scripts": {
"test": "mocha",
"debug": "webpack-dev-server --mode development --env lang=ru --progress",
"build": "webpack --mode production --env lang=ru --progress",
"build_en": "webpack --mode production --progress",
"dev": "webpack --mode development --env lang=ru --progress"
},
"author": "Shkuraev Alexander",
"license": "MIT",
"devDependencies": {
"@babel/core": "^7.26.10",
"@babel/preset-env": "^7.26.9",
"@codingame/monaco-vscode-api": "^15.0.3",
"@codingame/monaco-vscode-language-pack-ru": "^15.0.3",
"@ungap/global-this": "^0.4.4",
"autoprefixer": "^9.8.6",
"babel-loader": "^10.0.0",
"chai": "^5.2.0",
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^6.4.1",
"core-js": "^3.41.0",
"css-loader": "^7.1.2",
"file-loader": "^6.1.0",
"html-inline-script-webpack-plugin": "^3.2.1",
"html-webpack-plugin": "^5.6.3",
"mini-css-extract-plugin": "^2.9.2",
"mocha": "^11.1.0",
"performance-polyfill": "^0.0.3",
"postcss-cli": "^8.2.0",
"postcss-loader": "^3.0.0",
"proxy-polyfill": "^0.3.2",
"regenerator-runtime": "^0.14.1",
"remove-files-webpack-plugin": "^1.4.5",
"resize-observer-polyfill": "^1.5.1",
"string-replace-loader": "^3.1.0",
"style-loader": "^4.0.0",
"terser-webpack-plugin": "^4.2.3",
"url-loader": "^4.1.1",
"webpack": "^5.98.0",
"webpack-cli": "^6.0.1",
"webpack-dev-server": "^5.2.0"
},
"dependencies": {
"big-integer": "^1.6.52",
"monaco-editor": "^0.33.0",
"monaco-editor-webpack-plugin": "^7.1.0"
}
}
```
```js
// webpack.config.js
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const HtmlInlineScriptPlugin = require('html-inline-script-webpack-plugin');
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const RemovePlugin = require('remove-files-webpack-plugin');
const webpack = require('webpack');
const path = require('path');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const nls = require.resolve('./src/nls.ru');
module.exports = (env, args) => {
return {
context: path.resolve(__dirname, 'src'),
entry: Object.assign(
{
console: './editor'
},
args.mode == 'development' ?
{
test: './test',
test_query: './test_query'
}
: {}
),
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: '',
filename: '[name].js',
environment: {
arrowFunction: false,
const: false,
destructuring: false,
forOf: false,
dynamicImport: false,
module: false
}
},
resolveLoader: {
alias: {
'blob-url-loader': require.resolve('./tools/loaders/blobUrl'),
'compile-loader': require.resolve('./tools/loaders/compile'),
}
},
devtool: args.mode == 'development' ? "inline-source-map" : false,
module: {
rules: [
args.customOptions ?
{
test: /src[\\/]editor\.js$/,
loader: 'string-replace-loader',
options: {
search: 'customOptions: true',
replace: args.customOptions + ', customOptions: true'
}
} : {},
{
test: /node_modules[\\/]monaco-editor[\\/].+actions\.js$/,
loader: 'string-replace-loader',
options: {
search: '(this._menuItems.get(id) || []).slice(0);',
replace: '(this._menuItems.get(id) || []).slice(0);result=result.filter(function(item){return isIMenuItem(item)&&item.command.id.indexOf("_bsl")>=0;});'
}
},
{
test: /node_modules[\\/]monaco-editor[\\/].+parameterHints\.js$/,
loader: 'string-replace-loader',
options: {
multiple: [{
search: '[512 /* KeyMod.Alt */ | 16 /* KeyCode.UpArrow */',
replace: '[2048 /* KeyMod.CtrlCmd */ | 16 /* KeyCode.UpArrow */'
},
{
search: '[512 /* KeyMod.Alt */ | 18 /* KeyCode.DownArrow */',
replace: '[2048 /* KeyMod.CtrlCmd */ | 18 /* KeyCode.DownArrow */'
}]
}
},
{
test: /node_modules[\\/]monaco-editor[\\/].+tfIdf\.js$/,
loader: 'string-replace-loader',
options: {
search: "word.split(/(?<=[a-z])(?=[A-Z])/g)",
replace: "word.replace(/([a-z])([A-Z])/g, '$1 $2').split(' ')"
}
},
{
test: /\.js$/,
enforce: 'pre',
include: function(modulePath) {
return (modulePath.includes('monaco-editor') || modulePath.includes('src'))
},
exclude: /tingle/,
use: {
loader: 'babel-loader',
options: {
cacheDirectory: true,
presets: [
["@babel/preset-env", {
targets: {
ie: "11"
},
useBuiltIns: "usage",
corejs: 3
}]
],
plugins: [
'@babel/plugin-transform-arrow-functions',
'@babel/plugin-transform-block-scoping',
'@babel/plugin-transform-modules-commonjs',
'@babel/plugin-transform-block-scoped-functions'
]
}
}
},
{
test: /\.(png|jpg|gif|svg|ttf)$/i,
type: 'asset/inline',
},
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
esModule: false
}
}
]
},
{
test: /\.wasm$/,
type: "asset/inline",
},
]
},
optimization: {
// minimize: args.mode === 'production',
minimize: false,
splitChunks: {
chunks: 'all'
}
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css'
}),
env.lang == 'ru' ? new webpack.NormalModuleReplacementPlugin(/\/(vscode-)?nls\.js$/, function (resource) {
resource.request = nls
resource.resource = nls
}) : false,
args.mode == 'development' ? new CopyWebpackPlugin({
patterns: [
{ from: path.join(__dirname, 'node_modules/mocha/mocha.js'), to: 'mocha.js' },
{ from: path.join(__dirname, 'node_modules/mocha/mocha.css'), to: 'mocha.css' },
{ from: path.join(__dirname, 'node_modules/chai/chai.js'), to: 'chai.js' },
]
}) : false,
new MonacoWebpackPlugin({
languages: ['xml'],
}),
new HtmlInlineScriptPlugin(),
new CopyWebpackPlugin({
patterns: [
{ from: './tree/icons', to: 'tree/icons' }
]
}),
args.mode == 'production' ? new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1
}) : false,
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
inject: 'body',
chunks: ['console'],
template: './index.html',
filename: 'index.html',
cache: false
}),
args.mode == 'development' ? new HtmlWebpackPlugin({
inject: 'body',
chunks: ['console', 'test'],
template: './test.html',
filename: 'test',
cache: false
}) : false,
args.mode == 'development' ? new HtmlWebpackPlugin({
inject: 'body',
chunks: ['console', 'test_query'],
template: './test_query.html',
filename: 'test_query',
cache: false
}) : false,
args.mode == 'production' ? new RemovePlugin({
after: {
include: [
'./dist/test.js',
'./dist/test_query.js',
'./dist/editor.worker.js'
]
}
}) : false
].filter(Boolean),
devServer: {
port: 9000,
open: true
}
}
};
```

View File

@@ -39,4 +39,5 @@ setOption("skipInsertSuggestionAcceptor", true);
* `disableContextQueryConstructor` - *boolean*, отключает формирование кнопки контекстного меню "Конструктор запросов". Установка значения опции имеет смысл только до вызова `init()`
* `autoResizeEditorLayout` - *boolean*, включает перерисовку редактора при изменении размеров окна
* `renderQueryDelimiters` - *boolean*, включает выделение цветом разделителей запросов
* `disableDefinitionMessage` - *boolean*, отключает показ сообщения `Определение для ххх не найдено` при переходе к определению по F12 или CTRL+F12
* `disableDefinitionMessage` - *boolean*, отключает показ сообщения `Определение для ххх не найдено` при переходе к определению по F12 или CTRL+F12
* `disableFolding` - *boolean*, отключает сворачивание блоков кода

View File

@@ -7173,14 +7173,18 @@ class bslHelper {
*/
static getFoldingRanges(model) {
let ranges = this.getRangesForRegexp(model, "\"(?:\\n|\\r|\\|)*(?:выбрать|select)(?:(?:\\s|\\S|\"\")*?)?\"");
ranges = ranges.concat(this.getRangesForProcedureDescription(model));
ranges = ranges.concat(this.getRangesForRegexp(model, "(?:^|\\b)(?:функция|процедура).*\\([\\s\\S]*?(?:конецпроцедуры|конецфункции)"));
ranges = ranges.concat(this.getRangesForConstruction(model, "пока|while", "конеццикла|enddo", true));
ranges = ranges.concat(this.getRangesForConstruction(model, "для .*(?:по|из) .*|for .* (?:to|each) .*", "конеццикла|enddo", true));
ranges = ranges.concat(this.getRangesForConstruction(model, "если|if", "конецесли|endif", true));
ranges = ranges.concat(this.getRangesForConstruction(model, "#область|#region", "#конецобласти|#endregion", false));
ranges = ranges.concat(this.getRangesForConstruction(model, "#если|#if", "#конецесли|#endif", false));
let ranges = [];
if (!getOption('disableFolding')) {
ranges = this.getRangesForRegexp(model, "\"(?:\\n|\\r|\\|)*(?:выбрать|select)(?:(?:\\s|\\S|\"\")*?)?\"");
ranges = ranges.concat(this.getRangesForProcedureDescription(model));
ranges = ranges.concat(this.getRangesForRegexp(model, "(?:^|\\b)(?:функция|процедура).*\\([\\s\\S]*?(?:конецпроцедуры|конецфункции)"));
ranges = ranges.concat(this.getRangesForConstruction(model, "пока|while", "конеццикла|enddo", true));
ranges = ranges.concat(this.getRangesForConstruction(model, "для .*(?:по|из) .*|for .* (?:to|each) .*", "конеццикла|enddo", true));
ranges = ranges.concat(this.getRangesForConstruction(model, "если|if", "конецесли|endif", true));
ranges = ranges.concat(this.getRangesForConstruction(model, "#область|#region", "#конецобласти|#endregion", false));
ranges = ranges.concat(this.getRangesForConstruction(model, "#если|#if", "#конецесли|#endif", false));
}
return ranges;

View File

@@ -165,11 +165,9 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
eraseText = function () {
setText('', editor.getModel().getFullModelRange(), false);
if (getOption('reviewMode')) {
removeReviewWidgets();
currentIssue = -1;
}
removeReviewWidgets();
currentIssue = -1;
}
@@ -762,7 +760,6 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
{
disposeEditor();
createEditor(language_id, originalText, currentTheme);
initEditorEventListenersAndProperies();
originalText = '';
editor.diffCount = 0;
}
@@ -1749,9 +1746,6 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
setReviewIssues = function(issuesJSON) {
if (!getOption('reviewMode'))
return { errorDescription: 'Необходимо включить режим Code Review' };
try {
const issues = JSON.parse(issuesJSON);
@@ -1859,9 +1853,14 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
// #region init editor
editor = undefined;
function createEditor(language_id, text, theme) {
createEditor = function(language_id, text, theme) {
editor = monaco.editor.create(document.getElementById("container"), {
const container = document.getElementById("container");
if (!container)
return;
editor = monaco.editor.create(container, {
theme: theme,
value: text,
language: language_id,
@@ -1890,6 +1889,7 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
lineNumbersDedocrations = [];
setDefaultStyle();
initEditorEventListenersAndProperies();
}
@@ -1948,9 +1948,11 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
registerCodeLensProviders();
setDefaultSnippets();
contextMenuEnabled = editor.getRawOptions().contextmenu;
editor.originalText = '';
editor.definitionBreadcrumbs = [];
if (editor) {
contextMenuEnabled = editor.getRawOptions().contextmenu;
editor.originalText = '';
editor.definitionBreadcrumbs = [];
}
}
@@ -1970,7 +1972,6 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
}
initEditorEventListenersAndProperies();
// #endregion
// #region editor events
@@ -2243,7 +2244,7 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
}
function disposeEditor() {
disposeEditor = function() {
if (editor) {
@@ -3656,7 +3657,7 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
let diff_zone = document.getElementById('diff-zone');
let rect = diff_zone.getBoundingClientRect();
this.domNode.style.left = (rect.left - 1) + 'px';
this.domNode.style.left = layout.decorationsLeft + layout.decorationsWidth + 'px';
this.domNode.style.top = rect.top + 'px';
this.domNode.style.height = rect.height + 'px';
this.domNode.style.width = (layout.contentWidth - layout.verticalScrollbarWidth) + 'px';
@@ -3911,7 +3912,7 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
}
buttons.appendChild(button);
if (!getOption('readOnlyCodeReview')) {
if (getOption('reviewMode') && !getOption('readOnlyCodeReview')) {
button = document.createElement('div');
button.classList.add('review-delete');
button.setAttribute('widgetid', widgetId);
@@ -3968,7 +3969,7 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
textarea.classList.add('review-message');
editGroup.appendChild(textarea);
if (!getOption('readOnlyCodeReview')) {
if (getOption('reviewMode') && !getOption('readOnlyCodeReview')) {
button = document.createElement('button');
button.setAttribute('widgetid', widgetId);
button.classList.add('review-save');