X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=Roo%2Fhtmleditor%2FTidyWriter.js;h=575efdc3625914d4347b2bc132345cbfe46345bc;hb=b85f624217edf58108ae121a01b6d0e9a7d613b5;hp=c0e3500f0dc194d3324e957e8346d1049f0f678f;hpb=91f9198ebb02ea864536e8807ce2e7abd287b1f7;p=roojs1 diff --git a/Roo/htmleditor/TidyWriter.js b/Roo/htmleditor/TidyWriter.js index c0e3500f0d..575efdc362 100644 --- a/Roo/htmleditor/TidyWriter.js +++ b/Roo/htmleditor/TidyWriter.js @@ -2,6 +2,12 @@ * This is based loosely on tinymce * @class Roo.htmleditor.TidyWriter * https://github.com/thorn0/tinymce.html/blob/master/tinymce.html.js + * + * Known issues? + * - not tested much with 'PRE' formated elements. + * - long text inside of inline can be wrapped and clened? + * + * */ Roo.htmleditor.TidyWriter = function(settings) @@ -10,14 +16,13 @@ Roo.htmleditor.TidyWriter = function(settings) // indent, indentBefore, indentAfter, encode, htmlOutput, html = []; Roo.apply(this, settings); this.html = []; - - this.indentBefore =this.makeMap(settings.indent_before || ''); - this.indentAfter = this.makeMap(settings.indent_after || ''); + this.state = []; + this.encode = Roo.htmleditor.TidyEntities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities); - this.htmlOutput = 'html' == settings.element_format; + } -Roo.apply(Roo.htmleditor.TidyWriter, -{ +Roo.htmleditor.TidyWriter.prototype = { + makeMap : function (items, delim, map) { @@ -35,12 +40,17 @@ Roo.apply(Roo.htmleditor.TidyWriter, return map; }, - - indent : 0, - indentBefore : false, - indentAfter : false, + state : false, + + indent : ' ', + + // part of state... + indentstr : '', + in_pre: false, + in_inline : false, + last_inline : false, encode : false, - htmlOutput : false, + /** * Writes the a start element such as
.
@@ -50,24 +60,87 @@ Roo.apply(Roo.htmleditor.TidyWriter,
* @param {Array} attrs Optional attribute array or undefined if it hasn't any.
* @param {Boolean} empty Optional empty state if the tag should end like
.
*/
- start: function(name, attrs, empty) {
- var i, l, attr, value;
- if (this.indent && this.indentBefore[name] && this.html.length > 0) {
- this.value = this.html[this.html.length - 1];
- value.length > 0 && '\n' !== value && this.html.push('\n');
- }
- this.html.push('<', name);
- if (attrs) {
- for (i = 0, l = attrs.length; i < l; i++) {
- attr = attrs[i];
- this.html.push(' ', attr.name, '="', this.encode(attr.value, true), '"');
- }
- }
- this.html[this.html.length] = !empty || this.htmlOutput ? '>' : ' />';
- if (empty && this.indent && this.indentAfter[name] && this.html.length > 0) {
- value = this.html[this.html.length - 1];
- value.length > 0 && '\n' !== value && this.html.push('\n');
- }
+ start: function(name, attrs, empty, node)
+ {
+ var i, l, attr, value;
+
+ // there are some situations where adding line break && indentation will not work. will not work.
+ // -1;
+ var in_pre = this.in_pre || Roo.htmleditor.TidyWriter.whitespace_elements.indexOf(name) > -1;
+
+ var is_short = empty ? Roo.htmleditor.TidyWriter.shortend_elements.indexOf(name) > -1 : false;
+
+ var i_inline = name == 'BR' ? false : in_inline;
+
+ var indentstr = in_inli_inlineine || this.in_pre ? '' : this.indentstr;
+
+ // e_inline = elements that can be inline, but still allow \n before and after?
+ // only 'BR' ??? any others?
+ var e_inline = name == 'BR' ? false : this.in_inline;
+
+ // if this element is inline - then don't add stuff beforehand..
+ if (!e_inline && !this.in_pre) {
+ this.addLine();
+ }
+
+ this.html.push(indentstr + '<', name.toLowerCase());
+
+ if (attrs) {
+ for (i = 0, l = attrs.length; i < l; i++) {
+ attr = attrs[i];
+ this.html.push(' ', attr.name, '="', this.encode(attr.value, true), '"');
+ }
+ }
+
+ if (empty) {
+ if (is_short) {
+ this.html[this.html.length] = '/>';
+ } else {
+ this.html[this.html.length] = '>' + name.toLowerCase() + '>';
+ }
+ var e_inline = name == 'BR' ? false : this.in_inline;
+
+ if (!e_inline && !this.in_pre) {
+ this.addLine();
+ }
+ return;
+
+ }
+ // not empty..
+ this.html[this.html.length] = '>';
+
+ // there is a special situation, where we need to turn on in_inline - if any of the imediate chidlren are one of these.
+ /*
+ if (!in_inline && !in_pre) {
+ var cn = node.firstChild;
+ while(cn) {
+ if (Roo.htmleditor.TidyWriter.inline_elements.indexOf(cn.nodeName) > -1) {
+ in_inline = true
+ break;
+ }
+ cn = cn.nextSibling;
+ }
+
+ }
+ */
+
+
+ this.pushState({
+ indentstr : in_pre || in_inline ? '' : (this.indentstr + this.indent),
+ in_pre : in_pre,
+ in_inline : in_inline
+ });
+ // add a line after if we are not in a
+
+ if (!in_inline && !in_pre) {
+ this.addLine();
+ }
+
+
+
+
},
/**
* Writes the a end element such as