forkbb/public/js/scloader.js
2023-08-08 21:38:38 +07:00

115 lines
3.6 KiB
JavaScript

/**
* This file is part of the ForkBB <https://github.com/forkbb>.
*
* @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
* @license The MIT License (MIT)
*/
if (typeof ForkBB === "undefined" || !ForkBB) {
var ForkBB = {};
}
ForkBB.editor = (function (doc, win) {
'use strict';
var instance,
nameSelector = ".f-username",
dataName = "data-SCEditorConfig",
emotName = "data-smiliesEnabled",
linkName = "data-linkEnabled",
selector = "textarea[" + dataName + "]",
textarea,
elForScroll,
options = {
format: 'bbcode',
icons: 'monocons',
style: '',
emoticonsCompat: true,
emoticonsEnabled: false,
resizeWidth: false,
width: '100%',
toolbar: 'bold,italic,underline,strike,subscript,superscript|' +
'left,center,right,justify|font,size,color,removeformat|' +
'bulletlist,orderedlist,indent,outdent|' +
'table|code,mono,quote|horizontalrule,image,email,link,unlink|' +
'emoticon,date,time|maximize,source'
};
function initEditor()
{
var conf, smiliesEnabled, linkEnabled;
if (
!Object.assign
|| !sceditor
|| !(textarea = doc.querySelector(selector))
|| !(conf = JSON.parse(textarea.getAttribute(dataName)))
) {
return;
}
options = Object.assign(options, conf);
smiliesEnabled = '1' == textarea.getAttribute(emotName);
linkEnabled = '1' == textarea.getAttribute(linkName);
var forDelete = ['youtube', 'rtl', 'ltr'];
if (!smiliesEnabled) {
forDelete = forDelete.concat('emoticon');
}
if (!linkEnabled) {
forDelete = forDelete.concat('url', 'link', 'image', 'img', 'email');
}
for (var bbcodeForDelete of forDelete) {
sceditor.command.remove(bbcodeForDelete);
sceditor.formats.bbcode.remove(bbcodeForDelete);
options.toolbar = options.toolbar.replace(new RegExp("\\b" + bbcodeForDelete + "\\b", "gi"), '');
}
options.toolbar = options.toolbar.replace(/[^\w]*\|[^\w]*/g, '|').replace(/,{2,}/g, ',');
sceditor.create(textarea, options);
instance = sceditor.instance(textarea);
instance.height(instance.height() - instance.getContentAreaContainer().offsetHeight + 250);
if (smiliesEnabled) {
var checkbox = doc.querySelector('input[name="hide_smilies"]');
if (checkbox) {
checkbox.addEventListener('change', function (e) {
instance.emoticons(!e.target.checked);
});
instance.emoticons(!checkbox.checked);
} else {
instance.emoticons(true);
}
}
elForScroll = textarea.parentNode;
var users = doc.querySelectorAll(nameSelector);
for (var node of users) {
var a = doc.createElement("a");
a.textContent = "@";
a.addEventListener('click', function (e) {
instance.insert("[b]" + e.target.parentNode.textContent + "[/b], ");
elForScroll.scrollIntoView({behavior: "smooth", block: "end"});
});
node.insertBefore(a, node.firstChild);
}
}
return {
init : function () {
initEditor();
},
getInstance : function () {
return instance;
}
};
}(document, window));
document.addEventListener("DOMContentLoaded", ForkBB.editor.init, false);