diff -r fd8fb93e1b6a -r a361355b55c7 src/pyams_skin/resources/js/ext/tinymce/dev/plugins/visualchars/plugin.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_skin/resources/js/ext/tinymce/dev/plugins/visualchars/plugin.js Wed Jun 17 10:00:10 2015 +0200 @@ -0,0 +1,123 @@ +/** + * plugin.js + * + * Copyright, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://www.tinymce.com/license + * Contributing: http://www.tinymce.com/contributing + */ + +/*global tinymce:true */ + +tinymce.PluginManager.add('visualchars', function(editor) { + var self = this, state; + + function toggleVisualChars(addBookmark) { + var node, nodeList, i, body = editor.getBody(), nodeValue, selection = editor.selection, div, bookmark; + var charMap, visualCharsRegExp; + + charMap = { + '\u00a0': 'nbsp', + '\u00ad': 'shy' + }; + + function wrapCharWithSpan(value) { + return '' + value + ''; + } + + function compileCharMapToRegExp() { + var key, regExp = ''; + + for (key in charMap) { + regExp += key; + } + + return new RegExp('[' + regExp + ']', 'g'); + } + + function compileCharMapToCssSelector() { + var key, selector = ''; + + for (key in charMap) { + if (selector) { + selector += ','; + } + + selector += 'span.mce-' + charMap[key]; + } + + return selector; + } + + state = !state; + self.state = state; + editor.fire('VisualChars', {state: state}); + visualCharsRegExp = compileCharMapToRegExp(); + + if (addBookmark) { + bookmark = selection.getBookmark(); + } + + if (state) { + nodeList = []; + tinymce.walk(body, function(n) { + if (n.nodeType == 3 && n.nodeValue && visualCharsRegExp.test(n.nodeValue)) { + nodeList.push(n); + } + }, 'childNodes'); + + for (i = 0; i < nodeList.length; i++) { + nodeValue = nodeList[i].nodeValue; + nodeValue = nodeValue.replace(visualCharsRegExp, wrapCharWithSpan); + + div = editor.dom.create('div', null, nodeValue); + while ((node = div.lastChild)) { + editor.dom.insertAfter(node, nodeList[i]); + } + + editor.dom.remove(nodeList[i]); + } + } else { + nodeList = editor.dom.select(compileCharMapToCssSelector(), body); + + for (i = nodeList.length - 1; i >= 0; i--) { + editor.dom.remove(nodeList[i], 1); + } + } + + selection.moveToBookmark(bookmark); + } + + function toggleActiveState() { + var self = this; + + editor.on('VisualChars', function(e) { + self.active(e.state); + }); + } + + editor.addCommand('mceVisualChars', toggleVisualChars); + + editor.addButton('visualchars', { + title: 'Show invisible characters', + cmd: 'mceVisualChars', + onPostRender: toggleActiveState + }); + + editor.addMenuItem('visualchars', { + text: 'Show invisible characters', + cmd: 'mceVisualChars', + onPostRender: toggleActiveState, + selectable: true, + context: 'view', + prependToContext: true + }); + + editor.on('beforegetcontent', function(e) { + if (state && e.format != 'raw' && !e.draft) { + state = true; + toggleVisualChars(false); + } + }); +});