plugin.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. (function () {
  2. var importcss = (function () {
  3. 'use strict';
  4. var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  5. var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
  6. var global$2 = tinymce.util.Tools.resolve('tinymce.EditorManager');
  7. var global$3 = tinymce.util.Tools.resolve('tinymce.Env');
  8. var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools');
  9. var shouldMergeClasses = function (editor) {
  10. return editor.getParam('importcss_merge_classes');
  11. };
  12. var shouldImportExclusive = function (editor) {
  13. return editor.getParam('importcss_exclusive');
  14. };
  15. var getSelectorConverter = function (editor) {
  16. return editor.getParam('importcss_selector_converter');
  17. };
  18. var getSelectorFilter = function (editor) {
  19. return editor.getParam('importcss_selector_filter');
  20. };
  21. var getCssGroups = function (editor) {
  22. return editor.getParam('importcss_groups');
  23. };
  24. var shouldAppend = function (editor) {
  25. return editor.getParam('importcss_append');
  26. };
  27. var getFileFilter = function (editor) {
  28. return editor.getParam('importcss_file_filter');
  29. };
  30. var Settings = {
  31. shouldMergeClasses: shouldMergeClasses,
  32. shouldImportExclusive: shouldImportExclusive,
  33. getSelectorConverter: getSelectorConverter,
  34. getSelectorFilter: getSelectorFilter,
  35. getCssGroups: getCssGroups,
  36. shouldAppend: shouldAppend,
  37. getFileFilter: getFileFilter
  38. };
  39. var removeCacheSuffix = function (url) {
  40. var cacheSuffix = global$3.cacheSuffix;
  41. if (typeof url === 'string') {
  42. url = url.replace('?' + cacheSuffix, '').replace('&' + cacheSuffix, '');
  43. }
  44. return url;
  45. };
  46. var isSkinContentCss = function (editor, href) {
  47. var settings = editor.settings, skin = settings.skin !== false ? settings.skin || 'lightgray' : false;
  48. if (skin) {
  49. var skinUrl = settings.skin_url ? editor.documentBaseURI.toAbsolute(settings.skin_url) : global$2.baseURL + '/skins/' + skin;
  50. return href === skinUrl + '/content' + (editor.inline ? '.inline' : '') + '.min.css';
  51. }
  52. return false;
  53. };
  54. var compileFilter = function (filter) {
  55. if (typeof filter === 'string') {
  56. return function (value) {
  57. return value.indexOf(filter) !== -1;
  58. };
  59. } else if (filter instanceof RegExp) {
  60. return function (value) {
  61. return filter.test(value);
  62. };
  63. }
  64. return filter;
  65. };
  66. var getSelectors = function (editor, doc, fileFilter) {
  67. var selectors = [], contentCSSUrls = {};
  68. function append(styleSheet, imported) {
  69. var href = styleSheet.href, rules;
  70. href = removeCacheSuffix(href);
  71. if (!href || !fileFilter(href, imported) || isSkinContentCss(editor, href)) {
  72. return;
  73. }
  74. global$4.each(styleSheet.imports, function (styleSheet) {
  75. append(styleSheet, true);
  76. });
  77. try {
  78. rules = styleSheet.cssRules || styleSheet.rules;
  79. } catch (e) {
  80. }
  81. global$4.each(rules, function (cssRule) {
  82. if (cssRule.styleSheet) {
  83. append(cssRule.styleSheet, true);
  84. } else if (cssRule.selectorText) {
  85. global$4.each(cssRule.selectorText.split(','), function (selector) {
  86. selectors.push(global$4.trim(selector));
  87. });
  88. }
  89. });
  90. }
  91. global$4.each(editor.contentCSS, function (url) {
  92. contentCSSUrls[url] = true;
  93. });
  94. if (!fileFilter) {
  95. fileFilter = function (href, imported) {
  96. return imported || contentCSSUrls[href];
  97. };
  98. }
  99. try {
  100. global$4.each(doc.styleSheets, function (styleSheet) {
  101. append(styleSheet);
  102. });
  103. } catch (e) {
  104. }
  105. return selectors;
  106. };
  107. var defaultConvertSelectorToFormat = function (editor, selectorText) {
  108. var format;
  109. var selector = /^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(selectorText);
  110. if (!selector) {
  111. return;
  112. }
  113. var elementName = selector[1];
  114. var classes = selector[2].substr(1).split('.').join(' ');
  115. var inlineSelectorElements = global$4.makeMap('a,img');
  116. if (selector[1]) {
  117. format = { title: selectorText };
  118. if (editor.schema.getTextBlockElements()[elementName]) {
  119. format.block = elementName;
  120. } else if (editor.schema.getBlockElements()[elementName] || inlineSelectorElements[elementName.toLowerCase()]) {
  121. format.selector = elementName;
  122. } else {
  123. format.inline = elementName;
  124. }
  125. } else if (selector[2]) {
  126. format = {
  127. inline: 'span',
  128. title: selectorText.substr(1),
  129. classes: classes
  130. };
  131. }
  132. if (Settings.shouldMergeClasses(editor) !== false) {
  133. format.classes = classes;
  134. } else {
  135. format.attributes = { class: classes };
  136. }
  137. return format;
  138. };
  139. var getGroupsBySelector = function (groups, selector) {
  140. return global$4.grep(groups, function (group) {
  141. return !group.filter || group.filter(selector);
  142. });
  143. };
  144. var compileUserDefinedGroups = function (groups) {
  145. return global$4.map(groups, function (group) {
  146. return global$4.extend({}, group, {
  147. original: group,
  148. selectors: {},
  149. filter: compileFilter(group.filter),
  150. item: {
  151. text: group.title,
  152. menu: []
  153. }
  154. });
  155. });
  156. };
  157. var isExclusiveMode = function (editor, group) {
  158. return group === null || Settings.shouldImportExclusive(editor) !== false;
  159. };
  160. var isUniqueSelector = function (editor, selector, group, globallyUniqueSelectors) {
  161. return !(isExclusiveMode(editor, group) ? selector in globallyUniqueSelectors : selector in group.selectors);
  162. };
  163. var markUniqueSelector = function (editor, selector, group, globallyUniqueSelectors) {
  164. if (isExclusiveMode(editor, group)) {
  165. globallyUniqueSelectors[selector] = true;
  166. } else {
  167. group.selectors[selector] = true;
  168. }
  169. };
  170. var convertSelectorToFormat = function (editor, plugin, selector, group) {
  171. var selectorConverter;
  172. if (group && group.selector_converter) {
  173. selectorConverter = group.selector_converter;
  174. } else if (Settings.getSelectorConverter(editor)) {
  175. selectorConverter = Settings.getSelectorConverter(editor);
  176. } else {
  177. selectorConverter = function () {
  178. return defaultConvertSelectorToFormat(editor, selector);
  179. };
  180. }
  181. return selectorConverter.call(plugin, selector, group);
  182. };
  183. var setup = function (editor) {
  184. editor.on('renderFormatsMenu', function (e) {
  185. var globallyUniqueSelectors = {};
  186. var selectorFilter = compileFilter(Settings.getSelectorFilter(editor)), ctrl = e.control;
  187. var groups = compileUserDefinedGroups(Settings.getCssGroups(editor));
  188. var processSelector = function (selector, group) {
  189. if (isUniqueSelector(editor, selector, group, globallyUniqueSelectors)) {
  190. markUniqueSelector(editor, selector, group, globallyUniqueSelectors);
  191. var format = convertSelectorToFormat(editor, editor.plugins.importcss, selector, group);
  192. if (format) {
  193. var formatName = format.name || global$1.DOM.uniqueId();
  194. editor.formatter.register(formatName, format);
  195. return global$4.extend({}, ctrl.settings.itemDefaults, {
  196. text: format.title,
  197. format: formatName
  198. });
  199. }
  200. }
  201. return null;
  202. };
  203. if (!Settings.shouldAppend(editor)) {
  204. ctrl.items().remove();
  205. }
  206. global$4.each(getSelectors(editor, e.doc || editor.getDoc(), compileFilter(Settings.getFileFilter(editor))), function (selector) {
  207. if (selector.indexOf('.mce-') === -1) {
  208. if (!selectorFilter || selectorFilter(selector)) {
  209. var selectorGroups = getGroupsBySelector(groups, selector);
  210. if (selectorGroups.length > 0) {
  211. global$4.each(selectorGroups, function (group) {
  212. var menuItem = processSelector(selector, group);
  213. if (menuItem) {
  214. group.item.menu.push(menuItem);
  215. }
  216. });
  217. } else {
  218. var menuItem = processSelector(selector, null);
  219. if (menuItem) {
  220. ctrl.add(menuItem);
  221. }
  222. }
  223. }
  224. }
  225. });
  226. global$4.each(groups, function (group) {
  227. if (group.item.menu.length > 0) {
  228. ctrl.add(group.item);
  229. }
  230. });
  231. e.control.renderNew();
  232. });
  233. };
  234. var ImportCss = {
  235. defaultConvertSelectorToFormat: defaultConvertSelectorToFormat,
  236. setup: setup
  237. };
  238. var get = function (editor) {
  239. var convertSelectorToFormat = function (selectorText) {
  240. return ImportCss.defaultConvertSelectorToFormat(editor, selectorText);
  241. };
  242. return { convertSelectorToFormat: convertSelectorToFormat };
  243. };
  244. var Api = { get: get };
  245. global.add('importcss', function (editor) {
  246. ImportCss.setup(editor);
  247. return Api.get(editor);
  248. });
  249. function Plugin () {
  250. }
  251. return Plugin;
  252. }());
  253. })();