plugin.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. (function () {
  2. var anchor = (function () {
  3. 'use strict';
  4. var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  5. var isValidId = function (id) {
  6. return /^[A-Za-z][A-Za-z0-9\-:._]*$/.test(id);
  7. };
  8. var getId = function (editor) {
  9. var selectedNode = editor.selection.getNode();
  10. var isAnchor = selectedNode.tagName === 'A' && editor.dom.getAttrib(selectedNode, 'href') === '';
  11. return isAnchor ? selectedNode.id || selectedNode.name : '';
  12. };
  13. var insert = function (editor, id) {
  14. var selectedNode = editor.selection.getNode();
  15. var isAnchor = selectedNode.tagName === 'A' && editor.dom.getAttrib(selectedNode, 'href') === '';
  16. if (isAnchor) {
  17. selectedNode.removeAttribute('name');
  18. selectedNode.id = id;
  19. editor.undoManager.add();
  20. } else {
  21. editor.focus();
  22. editor.selection.collapse(true);
  23. editor.execCommand('mceInsertContent', false, editor.dom.createHTML('a', { id: id }));
  24. }
  25. };
  26. var Anchor = {
  27. isValidId: isValidId,
  28. getId: getId,
  29. insert: insert
  30. };
  31. var insertAnchor = function (editor, newId) {
  32. if (!Anchor.isValidId(newId)) {
  33. editor.windowManager.alert('Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.');
  34. return true;
  35. } else {
  36. Anchor.insert(editor, newId);
  37. return false;
  38. }
  39. };
  40. var open = function (editor) {
  41. var currentId = Anchor.getId(editor);
  42. editor.windowManager.open({
  43. title: 'Anchor',
  44. body: {
  45. type: 'textbox',
  46. name: 'id',
  47. size: 40,
  48. label: 'Id',
  49. value: currentId
  50. },
  51. onsubmit: function (e) {
  52. var newId = e.data.id;
  53. if (insertAnchor(editor, newId)) {
  54. e.preventDefault();
  55. }
  56. }
  57. });
  58. };
  59. var Dialog = { open: open };
  60. var register = function (editor) {
  61. editor.addCommand('mceAnchor', function () {
  62. Dialog.open(editor);
  63. });
  64. };
  65. var Commands = { register: register };
  66. var isAnchorNode = function (node) {
  67. return !node.attr('href') && (node.attr('id') || node.attr('name')) && !node.firstChild;
  68. };
  69. var setContentEditable = function (state) {
  70. return function (nodes) {
  71. for (var i = 0; i < nodes.length; i++) {
  72. if (isAnchorNode(nodes[i])) {
  73. nodes[i].attr('contenteditable', state);
  74. }
  75. }
  76. };
  77. };
  78. var setup = function (editor) {
  79. editor.on('PreInit', function () {
  80. editor.parser.addNodeFilter('a', setContentEditable('false'));
  81. editor.serializer.addNodeFilter('a', setContentEditable(null));
  82. });
  83. };
  84. var FilterContent = { setup: setup };
  85. var register$1 = function (editor) {
  86. editor.addButton('anchor', {
  87. icon: 'anchor',
  88. tooltip: 'Anchor',
  89. cmd: 'mceAnchor',
  90. stateSelector: 'a:not([href])'
  91. });
  92. editor.addMenuItem('anchor', {
  93. icon: 'anchor',
  94. text: 'Anchor',
  95. context: 'insert',
  96. cmd: 'mceAnchor'
  97. });
  98. };
  99. var Buttons = { register: register$1 };
  100. global.add('anchor', function (editor) {
  101. FilterContent.setup(editor);
  102. Commands.register(editor);
  103. Buttons.register(editor);
  104. });
  105. function Plugin () {
  106. }
  107. return Plugin;
  108. }());
  109. })();