plugin.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. (function () {
  2. var noneditable = (function () {
  3. 'use strict';
  4. var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  5. var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');
  6. var getNonEditableClass = function (editor) {
  7. return editor.getParam('noneditable_noneditable_class', 'mceNonEditable');
  8. };
  9. var getEditableClass = function (editor) {
  10. return editor.getParam('noneditable_editable_class', 'mceEditable');
  11. };
  12. var getNonEditableRegExps = function (editor) {
  13. var nonEditableRegExps = editor.getParam('noneditable_regexp', []);
  14. if (nonEditableRegExps && nonEditableRegExps.constructor === RegExp) {
  15. return [nonEditableRegExps];
  16. } else {
  17. return nonEditableRegExps;
  18. }
  19. };
  20. var $_a4wz1bi2jkmcwpjc = {
  21. getNonEditableClass: getNonEditableClass,
  22. getEditableClass: getEditableClass,
  23. getNonEditableRegExps: getNonEditableRegExps
  24. };
  25. var hasClass = function (checkClassName) {
  26. return function (node) {
  27. return (' ' + node.attr('class') + ' ').indexOf(checkClassName) !== -1;
  28. };
  29. };
  30. var replaceMatchWithSpan = function (editor, content, cls) {
  31. return function (match) {
  32. var args = arguments, index = args[args.length - 2];
  33. var prevChar = index > 0 ? content.charAt(index - 1) : '';
  34. if (prevChar === '"') {
  35. return match;
  36. }
  37. if (prevChar === '>') {
  38. var findStartTagIndex = content.lastIndexOf('<', index);
  39. if (findStartTagIndex !== -1) {
  40. var tagHtml = content.substring(findStartTagIndex, index);
  41. if (tagHtml.indexOf('contenteditable="false"') !== -1) {
  42. return match;
  43. }
  44. }
  45. }
  46. return '<span class="' + cls + '" data-mce-content="' + editor.dom.encode(args[0]) + '">' + editor.dom.encode(typeof args[1] === 'string' ? args[1] : args[0]) + '</span>';
  47. };
  48. };
  49. var convertRegExpsToNonEditable = function (editor, nonEditableRegExps, e) {
  50. var i = nonEditableRegExps.length, content = e.content;
  51. if (e.format === 'raw') {
  52. return;
  53. }
  54. while (i--) {
  55. content = content.replace(nonEditableRegExps[i], replaceMatchWithSpan(editor, content, $_a4wz1bi2jkmcwpjc.getNonEditableClass(editor)));
  56. }
  57. e.content = content;
  58. };
  59. var setup = function (editor) {
  60. var editClass, nonEditClass;
  61. var contentEditableAttrName = 'contenteditable';
  62. editClass = ' ' + global$1.trim($_a4wz1bi2jkmcwpjc.getEditableClass(editor)) + ' ';
  63. nonEditClass = ' ' + global$1.trim($_a4wz1bi2jkmcwpjc.getNonEditableClass(editor)) + ' ';
  64. var hasEditClass = hasClass(editClass);
  65. var hasNonEditClass = hasClass(nonEditClass);
  66. var nonEditableRegExps = $_a4wz1bi2jkmcwpjc.getNonEditableRegExps(editor);
  67. editor.on('PreInit', function () {
  68. if (nonEditableRegExps.length > 0) {
  69. editor.on('BeforeSetContent', function (e) {
  70. convertRegExpsToNonEditable(editor, nonEditableRegExps, e);
  71. });
  72. }
  73. editor.parser.addAttributeFilter('class', function (nodes) {
  74. var i = nodes.length, node;
  75. while (i--) {
  76. node = nodes[i];
  77. if (hasEditClass(node)) {
  78. node.attr(contentEditableAttrName, 'true');
  79. } else if (hasNonEditClass(node)) {
  80. node.attr(contentEditableAttrName, 'false');
  81. }
  82. }
  83. });
  84. editor.serializer.addAttributeFilter(contentEditableAttrName, function (nodes) {
  85. var i = nodes.length, node;
  86. while (i--) {
  87. node = nodes[i];
  88. if (!hasEditClass(node) && !hasNonEditClass(node)) {
  89. continue;
  90. }
  91. if (nonEditableRegExps.length > 0 && node.attr('data-mce-content')) {
  92. node.name = '#text';
  93. node.type = 3;
  94. node.raw = true;
  95. node.value = node.attr('data-mce-content');
  96. } else {
  97. node.attr(contentEditableAttrName, null);
  98. }
  99. }
  100. });
  101. });
  102. };
  103. var $_4jcucsi0jkmcwpj9 = { setup: setup };
  104. global.add('noneditable', function (editor) {
  105. $_4jcucsi0jkmcwpj9.setup(editor);
  106. });
  107. function Plugin () {
  108. }
  109. return Plugin;
  110. }());
  111. })();