plugin.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /**
  2. * TinyMCE version 8.0.2 (2025-08-14)
  3. */
  4. (function () {
  5. 'use strict';
  6. var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');
  7. var global = tinymce.util.Tools.resolve('tinymce.Env');
  8. const option = (name) => (editor) => editor.options.get(name);
  9. const register$2 = (editor) => {
  10. const registerOption = editor.options.register;
  11. registerOption('pagebreak_separator', {
  12. processor: 'string',
  13. default: '<!-- pagebreak -->'
  14. });
  15. registerOption('pagebreak_split_block', {
  16. processor: 'boolean',
  17. default: false
  18. });
  19. };
  20. const getSeparatorHtml = option('pagebreak_separator');
  21. const shouldSplitBlock = option('pagebreak_split_block');
  22. const pageBreakClass = 'mce-pagebreak';
  23. const getPlaceholderHtml = (shouldSplitBlock) => {
  24. const html = `<img src="${global.transparentSrc}" class="${pageBreakClass}" data-mce-resize="false" data-mce-placeholder />`;
  25. return shouldSplitBlock ? `<p>${html}</p>` : html;
  26. };
  27. const setup$1 = (editor) => {
  28. const separatorHtml = getSeparatorHtml(editor);
  29. const shouldSplitBlock$1 = () => shouldSplitBlock(editor);
  30. const pageBreakSeparatorRegExp = new RegExp(separatorHtml.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, (a) => {
  31. return '\\' + a;
  32. }), 'gi');
  33. editor.on('BeforeSetContent', (e) => {
  34. e.content = e.content.replace(pageBreakSeparatorRegExp, getPlaceholderHtml(shouldSplitBlock$1()));
  35. });
  36. editor.on('PreInit', () => {
  37. editor.serializer.addNodeFilter('img', (nodes) => {
  38. let i = nodes.length, node, className;
  39. while (i--) {
  40. node = nodes[i];
  41. className = node.attr('class');
  42. if (className && className.indexOf(pageBreakClass) !== -1) {
  43. // Replace parent block node if pagebreak_split_block is enabled
  44. const parentNode = node.parent;
  45. if (parentNode && editor.schema.getBlockElements()[parentNode.name] && shouldSplitBlock$1()) {
  46. parentNode.type = 3;
  47. parentNode.value = separatorHtml;
  48. parentNode.raw = true;
  49. node.remove();
  50. continue;
  51. }
  52. node.type = 3;
  53. node.value = separatorHtml;
  54. node.raw = true;
  55. }
  56. }
  57. });
  58. });
  59. };
  60. const register$1 = (editor) => {
  61. editor.addCommand('mcePageBreak', () => {
  62. editor.insertContent(getPlaceholderHtml(shouldSplitBlock(editor)));
  63. });
  64. };
  65. const setup = (editor) => {
  66. editor.on('ResolveName', (e) => {
  67. if (e.target.nodeName === 'IMG' && editor.dom.hasClass(e.target, pageBreakClass)) {
  68. e.name = 'pagebreak';
  69. }
  70. });
  71. };
  72. const onSetupEditable = (editor) => (api) => {
  73. const nodeChanged = () => {
  74. api.setEnabled(editor.selection.isEditable());
  75. };
  76. editor.on('NodeChange', nodeChanged);
  77. nodeChanged();
  78. return () => {
  79. editor.off('NodeChange', nodeChanged);
  80. };
  81. };
  82. const register = (editor) => {
  83. const onAction = () => editor.execCommand('mcePageBreak');
  84. editor.ui.registry.addButton('pagebreak', {
  85. icon: 'page-break',
  86. tooltip: 'Page break',
  87. onAction,
  88. onSetup: onSetupEditable(editor)
  89. });
  90. editor.ui.registry.addMenuItem('pagebreak', {
  91. text: 'Page break',
  92. icon: 'page-break',
  93. onAction,
  94. onSetup: onSetupEditable(editor)
  95. });
  96. };
  97. var Plugin = () => {
  98. global$1.add('pagebreak', (editor) => {
  99. register$2(editor);
  100. register$1(editor);
  101. register(editor);
  102. setup$1(editor);
  103. setup(editor);
  104. });
  105. };
  106. Plugin();
  107. /** *****
  108. * DO NOT EXPORT ANYTHING
  109. *
  110. * IF YOU DO ROLLUP WILL LEAVE A GLOBAL ON THE PAGE
  111. *******/
  112. })();