/wp-content/plugins/tinymce-advanced/mce/anchor/plugin.js

https://bitbucket.org/carloskikea/helpet · JavaScript · 117 lines · 108 code · 9 blank · 0 comment · 13 complexity · 1ef8c868dafafc3baa2e20f1be538ad6 MD5 · raw file

  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. } else {
  20. editor.focus();
  21. editor.selection.collapse(true);
  22. editor.execCommand('mceInsertContent', false, editor.dom.createHTML('a', { id: id }));
  23. }
  24. };
  25. var $_4ofr6484jfuviwhx = {
  26. isValidId: isValidId,
  27. getId: getId,
  28. insert: insert
  29. };
  30. var insertAnchor = function (editor, newId) {
  31. if (!$_4ofr6484jfuviwhx.isValidId(newId)) {
  32. editor.windowManager.alert('Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.');
  33. return true;
  34. } else {
  35. $_4ofr6484jfuviwhx.insert(editor, newId);
  36. return false;
  37. }
  38. };
  39. var open = function (editor) {
  40. var currentId = $_4ofr6484jfuviwhx.getId(editor);
  41. editor.windowManager.open({
  42. title: 'Anchor',
  43. body: {
  44. type: 'textbox',
  45. name: 'id',
  46. size: 40,
  47. label: 'Id',
  48. value: currentId
  49. },
  50. onsubmit: function (e) {
  51. var newId = e.data.id;
  52. if (insertAnchor(editor, newId)) {
  53. e.preventDefault();
  54. }
  55. }
  56. });
  57. };
  58. var $_5ybsb183jfuviwhw = { open: open };
  59. var register = function (editor) {
  60. editor.addCommand('mceAnchor', function () {
  61. $_5ybsb183jfuviwhw.open(editor);
  62. });
  63. };
  64. var $_bu68pd82jfuviwhv = { register: register };
  65. var isAnchorNode = function (node) {
  66. return !node.attr('href') && (node.attr('id') || node.attr('name')) && !node.firstChild;
  67. };
  68. var setContentEditable = function (state) {
  69. return function (nodes) {
  70. for (var i = 0; i < nodes.length; i++) {
  71. if (isAnchorNode(nodes[i])) {
  72. nodes[i].attr('contenteditable', state);
  73. }
  74. }
  75. };
  76. };
  77. var setup = function (editor) {
  78. editor.on('PreInit', function () {
  79. editor.parser.addNodeFilter('a', setContentEditable('false'));
  80. editor.serializer.addNodeFilter('a', setContentEditable(null));
  81. });
  82. };
  83. var $_7q0hk685jfuviwhy = { setup: setup };
  84. var register$1 = function (editor) {
  85. editor.addButton('anchor', {
  86. icon: 'anchor',
  87. tooltip: 'Anchor',
  88. cmd: 'mceAnchor',
  89. stateSelector: 'a:not([href])'
  90. });
  91. editor.addMenuItem('anchor', {
  92. icon: 'anchor',
  93. text: 'Anchor',
  94. context: 'insert',
  95. cmd: 'mceAnchor'
  96. });
  97. };
  98. var $_5nc4wj86jfuviwi0 = { register: register$1 };
  99. global.add('anchor', function (editor) {
  100. $_7q0hk685jfuviwhy.setup(editor);
  101. $_bu68pd82jfuviwhv.register(editor);
  102. $_5nc4wj86jfuviwi0.register(editor);
  103. });
  104. function Plugin () {
  105. }
  106. return Plugin;
  107. }());
  108. })();