ed.addButton('visualchars', {title : 'visualchars.desc', cmd : 'mceVisualChars'});\r
\r
ed.onBeforeGetContent.add(function(ed, o) {\r
- if (t.state) {\r
+ if (t.state && o.format != 'raw' && !o.draft) {\r
t.state = true;\r
- t._toggleVisualChars();\r
+ t._toggleVisualChars(false);\r
}\r
});\r
},\r
\r
// Private methods\r
\r
- _toggleVisualChars : function() {\r
- var t = this, ed = t.editor, nl, i, h, d = ed.getDoc(), b = ed.getBody(), nv, s = ed.selection, bo;\r
+ _toggleVisualChars : function(bookmark) {\r
+ var t = this, ed = t.editor, nl, i, h, d = ed.getDoc(), b = ed.getBody(), nv, s = ed.selection, bo, div, bm;\r
\r
t.state = !t.state;\r
ed.controlManager.setActive('visualchars', t.state);\r
\r
+ if (bookmark)\r
+ bm = s.getBookmark();\r
+\r
if (t.state) {\r
nl = [];\r
tinymce.walk(b, function(n) {\r
nl.push(n);\r
}, 'childNodes');\r
\r
- for (i=0; i<nl.length; i++) {\r
+ for (i = 0; i < nl.length; i++) {\r
nv = nl[i].nodeValue;\r
- nv = nv.replace(/(\u00a0+)/g, '<span class="mceItemHidden mceVisualNbsp">$1</span>');\r
- nv = nv.replace(/\u00a0/g, '\u00b7');\r
- ed.dom.setOuterHTML(nl[i], nv, d);\r
+ nv = nv.replace(/(\u00a0)/g, '<span data-mce-bogus="1" class="mceItemHidden mceItemNbsp">$1</span>');\r
+\r
+ div = ed.dom.create('div', null, nv);\r
+ while (node = div.lastChild)\r
+ ed.dom.insertAfter(node, nl[i]);\r
+\r
+ ed.dom.remove(nl[i]);\r
}\r
} else {\r
- nl = tinymce.grep(ed.dom.select('span', b), function(n) {\r
- return ed.dom.hasClass(n, 'mceVisualNbsp');\r
- });\r
+ nl = ed.dom.select('span.mceItemNbsp', b);\r
\r
- for (i=0; i<nl.length; i++)\r
- ed.dom.setOuterHTML(nl[i], nl[i].innerHTML.replace(/(·|\u00b7)/g, ' '), d);\r
+ for (i = nl.length - 1; i >= 0; i--)\r
+ ed.dom.remove(nl[i], 1);\r
}\r
+\r
+ s.moveToBookmark(bm);\r
}\r
});\r
\r