scloader.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /**
  2. * This file is part of the ForkBB <https://github.com/forkbb>.
  3. *
  4. * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
  5. * @license The MIT License (MIT)
  6. */
  7. if (typeof ForkBB === "undefined" || !ForkBB) {
  8. var ForkBB = {};
  9. }
  10. ForkBB.editor = (function (doc, win) {
  11. 'use strict';
  12. var instance,
  13. nameSelector = ".f-username",
  14. dataName = "data-SCEditorConfig",
  15. emotName = "data-smiliesEnabled",
  16. linkName = "data-linkEnabled",
  17. selector = "textarea[" + dataName + "]",
  18. textarea,
  19. elForScroll,
  20. options = {
  21. format: 'bbcode',
  22. icons: 'monocons',
  23. style: '',
  24. emoticonsCompat: true,
  25. emoticonsEnabled: false,
  26. resizeWidth: false,
  27. width: '100%',
  28. toolbar: 'bold,italic,underline,strike,subscript,superscript|' +
  29. 'left,center,right,justify|font,size,color,removeformat|' +
  30. 'bulletlist,orderedlist,indent,outdent|' +
  31. 'table|code,mono,quote|horizontalrule,image,email,link,unlink|' +
  32. 'emoticon,date,time|maximize,source'
  33. };
  34. function initEditor()
  35. {
  36. var conf, smiliesEnabled, linkEnabled;
  37. if (
  38. !Object.assign
  39. || !sceditor
  40. || !(textarea = doc.querySelector(selector))
  41. || !(conf = JSON.parse(textarea.getAttribute(dataName)))
  42. ) {
  43. return;
  44. }
  45. options = Object.assign(options, conf);
  46. smiliesEnabled = '1' == textarea.getAttribute(emotName);
  47. linkEnabled = '1' == textarea.getAttribute(linkName);
  48. var forDelete = ['youtube', 'rtl', 'ltr'];
  49. if (!smiliesEnabled) {
  50. forDelete = forDelete.concat('emoticon');
  51. }
  52. if (!linkEnabled) {
  53. forDelete = forDelete.concat('url', 'link', 'image', 'img', 'email');
  54. }
  55. for (var bbcodeForDelete of forDelete) {
  56. sceditor.command.remove(bbcodeForDelete);
  57. sceditor.formats.bbcode.remove(bbcodeForDelete);
  58. options.toolbar = options.toolbar.replace(new RegExp("\\b" + bbcodeForDelete + "\\b", "gi"), '');
  59. }
  60. options.toolbar = options.toolbar.replace(/[^\w]*\|[^\w]*/g, '|').replace(/,{2,}/g, ',');
  61. sceditor.create(textarea, options);
  62. instance = sceditor.instance(textarea);
  63. if (smiliesEnabled) {
  64. var checkbox = doc.querySelector('input[name="hide_smilies"]');
  65. if (checkbox) {
  66. checkbox.addEventListener('change', function (e) {
  67. instance.emoticons(!e.target.checked);
  68. });
  69. instance.emoticons(!checkbox.checked);
  70. } else {
  71. instance.emoticons(true);
  72. }
  73. }
  74. elForScroll = textarea.parentNode;
  75. var users = doc.querySelectorAll(nameSelector);
  76. for (var node of users) {
  77. var a = doc.createElement("a");
  78. a.textContent = "@";
  79. a.addEventListener('click', function (e) {
  80. instance.insert("[b]" + e.target.parentNode.textContent + "[/b], ");
  81. elForScroll.scrollIntoView({behavior: "smooth", block: "end"});
  82. });
  83. node.insertBefore(a, node.firstChild);
  84. }
  85. }
  86. return {
  87. init : function () {
  88. initEditor();
  89. },
  90. getInstance : function () {
  91. return instance;
  92. }
  93. };
  94. }(document, window));
  95. document.addEventListener("DOMContentLoaded", ForkBB.editor.init, false);