Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

275 lines
9.8 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
window.initCounter = 0;
function on_init_server(type)
{
if (type === (window.initCounter & type))
return;
window.initCounter |= type;
if (window.initCounter === 3)
{
load_library("onlyoffice", "../libs/" + window.editorType + "/api.js");
_postMessage({
command: 'aceEditorReady',
referer: 'ace-editor'
});
}
}
function load_library(name, url)
{
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4)
{
var EditSession = ace.require("ace/edit_session").EditSession;
var editDoc = new EditSession(xhr.responseText, "ace/mode/javascript");
editor.ternServer.addDoc(name, editDoc);
}
};
xhr.send();
}
var editor = ace.edit("editor");
editor.session.setMode("ace/mode/javascript");
editor.container.style.lineHeight = "20px";
editor.setValue("");
editor.getSession().setUseWrapMode(true);
editor.getSession().setWrapLimitRange(null, null);
editor.setShowPrintMargin(false);
editor.$blockScrolling = Infinity;
ace.config.loadModule('ace/ext/tern', function () {
editor.setOptions({
enableTern: {
defs: ['browser', 'ecma5'],
plugins: { doc_comment: { fullDocs: true } },
useWorker: !!window.Worker,
switchToDoc: function (name, start) {},
startedCb: function () {
on_init_server(1);
},
},
enableSnippets: false,
// tooltipContainer: '#code-editor'
});
});
var firstLineNumber = 1;
if (!window.isIE) {
ace.config.loadModule('ace/ext/language_tools', function () {
editor.setOptions({
enableBasicAutocompletion: false,
enableLiveAutocompletion: true,
firstLineNumber: firstLineNumber
});
});
}
ace.config.loadModule('ace/ext/html_beautify', function (beautify) {
editor.setOptions({
autoBeautify: true,
htmlBeautify: true,
});
window.beautifyOptions = beautify.options;
});
var _postMessage = function(msg) {
window.parent && window.JSON && window.parent.postMessage(window.JSON.stringify(msg), "*");
};
(function (window, undefined) {
var _dropDisabled = undefined;
editor.getSession().on('change', function() {
if (window.isDisable) return;
_postMessage({
command: 'changeValue',
data: { value: editor.getValue(), pos: editor.getCursorPosition() },
referer: 'ace-editor'
});
});
on_init_server(2);
var editorSetValue = function(data) {
window.isDisable = true;
editor.setValue(data.value || '');
editor.setReadOnly(!!data.readonly);
if (!data.readonly) {
editor.focus();
editor.selection.clearSelection();
editor.moveCursorToPosition(data.currentPos ? data.currentPos : {row: 0, column : 0});
editor.scrollToLine((data.currentPos ? data.currentPos.row : 0) + firstLineNumber, true);
}
window.isDisable = false;
};
var editorDisableDrop = function(disable) {
if (_dropDisabled===undefined) {
let el = document.getElementById('editor');
el.ondrop = function(e) {
if (!_dropDisabled) return;
if (e && e.preventDefault)
e.preventDefault();
return false;
};
el.ondragenter = function(e) {
if (!_dropDisabled) return;
if (e && e.preventDefault)
e.preventDefault();
return false;
};
el.ondragover = function(e) {
if (!_dropDisabled) return;
if (e && e.preventDefault)
e.preventDefault();
if (e && e.dataTransfer)
e.dataTransfer.dropEffect = "none";
return false;
};
}
_dropDisabled = disable;
};
var fillDefaultColors = function(colors) {
if (colors.type==='dark') {
var defColors = {'text-normal': 'rgba(255, 255, 255, 0.8)', 'icon-normal': 'rgba(255, 255, 255, 0.8)', 'background-normal': '#333', 'background-toolbar': '#404040', 'highlight-button-hover': '#555',
'canvas-background': '#555', 'border-divider': '#505050', 'canvas-scroll-thumb-pressed': '#adadad', 'canvas-scroll-thumb': '#404040'},
hasOwnProps = false;
for (var color in defColors) {
if (colors.hasOwnProperty(color)) {
hasOwnProps = true;
break;
}
}
if (!hasOwnProps) {
for (var color in defColors) {
colors[color] = defColors[color];
}
}
}
};
var onThemeChanged = function(colors) {
if (!colors) return;
let styles = document.querySelectorAll("style"),
i = 0;
if (styles) {
while (i < styles.length) {
if (styles[i].id === 'ace-chrome' || styles[i].id === 'ace-custom-theme') {
styles[i].parentNode.removeChild(styles[i]);
}
i++;
}
}
fillDefaultColors(colors);
var _css = '';
if (colors['text-normal'])
_css += '.ace_content, .ace_layer.ace_gutter-layer.ace_folding-enabled, .ace_cursor, .Ace-Tern-tooltip, .Ace-Tern-jsdoc-param-description { color: ' + colors['text-normal'] + ' !important; }';
if (colors['icon-normal'])
_css += '.Ace-Tern-tooltip .Ace-Tern-tooltip-boxclose { color: ' + colors['icon-normal'] + ' !important; }';
if (colors['background-normal']) {
_css += '.ace_editor, .ace_content, .ace_gutter, .gutter_bg { background: ' + colors['background-normal'] + ' !important; }';
_css += '.ace_active-line, .ace_gutter-active-line, .ace_gutter-active-line-bg { background-color: ' + colors['background-normal'] + ' !important; }';
}
if (colors['background-toolbar'])
_css += '.Ace-Tern-tooltip, .Ace-Tern-jsdoc-param-description { background-color: ' + colors['background-toolbar'] + ' !important; }';
if (colors['highlight-button-hover'])
_css += '.ace_line-hover, .ace_autocomplete .ace_active-line { background-color: ' + colors['highlight-button-hover'] + ' !important; }';
if (colors['canvas-background'])
_css += '.ace_active-line, .ace_gutter-active-line, .ace_gutter-active-line-bg { border-color: ' + colors['canvas-background'] + ' !important; }';
if (colors['border-divider'])
_css += '.Ace-Tern-tooltip { border-color: ' + colors['border-divider'] + ' !important; }';
if (colors['canvas-scroll-thumb-pressed'] && colors['canvas-scroll-thumb'])
_css += '.ace_autocomplete { scrollbar-color: ' + colors['canvas-scroll-thumb-pressed'] + ' ' + colors['canvas-scroll-thumb'] + ' !important; }';
if (_css) {
var style = document.createElement('style');
style.id = 'ace-custom-theme';
style.type = 'text/css';
style.innerHTML = _css;
document.getElementsByTagName('head')[0].appendChild(style);
}
if (colors.type === 'dark')
editor.setTheme("ace/theme/vs-dark");
else
editor.setTheme("ace/theme/vs-light");
};
var _onMessage = function(msg) {
var data = msg.data;
if (Object.prototype.toString.apply(data) !== '[object String]' || !window.JSON) {
return;
}
var cmd, handler;
try {
cmd = window.JSON.parse(data)
} catch(e) {
cmd = '';
}
if (cmd && cmd.referer == "ace-editor") {
if (cmd.command==='setValue') {
editorSetValue(cmd.data);
} else if (cmd.command==='setTheme') {
onThemeChanged(cmd.data);
}else if (cmd.command==='disableDrop') {
editorDisableDrop(cmd.data);
}
}
};
var fn = function(e) { _onMessage(e); };
if (window.attachEvent) {
window.attachEvent('onmessage', fn);
} else {
window.addEventListener('message', fn, false);
}
})(window, undefined);