sync
[roojs1] / docs / src / Roo_htmleditor_TidyWriter.js.html
1 <html><head><title>Roo/htmleditor/TidyWriter.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/***
2  * This is based loosely on tinymce 
3  * @class Roo.htmleditor.TidyWriter
4  * https://github.com/thorn0/tinymce.html/blob/master/tinymce.html.js
5  *
6  * Known issues?
7  * - not tested much with 'PRE' formated elements.
8  * 
9  *
10  *
11  */
12
13 </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">settings</span><span class="jsdoc-syntax">)
14 {
15
16     </span><span class="jsdoc-comment">// indent, indentBefore, indentAfter, encode, htmlOutput, html = [];
17     </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">settings</span><span class="jsdoc-syntax">);
18     </span><span class="jsdoc-var">this.html </span><span class="jsdoc-syntax">= [];
19     </span><span class="jsdoc-var">this.state </span><span class="jsdoc-syntax">= [];
20
21     </span><span class="jsdoc-var">this.encode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor.TidyEntities.getEncodeFunc</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">settings.entity_encoding </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-string">'raw'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">settings.entities</span><span class="jsdoc-syntax">);
22
23 }
24 </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.prototype </span><span class="jsdoc-syntax">= {
25
26
27     </span><span class="jsdoc-var">state </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
28
29     </span><span class="jsdoc-var">indent </span><span class="jsdoc-syntax">:  </span><span class="jsdoc-string">'  '</span><span class="jsdoc-syntax">,
30
31     </span><span class="jsdoc-comment">// part of state...
32     </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
33     </span><span class="jsdoc-var">in_pre</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
34     </span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
35     </span><span class="jsdoc-var">last_inline </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
36     </span><span class="jsdoc-var">encode </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
37
38
39             </span><span class="jsdoc-comment">/**
40     * Writes the a start element such as &lt;p id=&quot;a&quot;&gt;.
41     *
42     * @method start
43     * @param {String} name Name of the element.
44     * @param {Array} attrs Optional attribute array or undefined if it hasn't any.
45     * @param {Boolean} empty Optional empty state if the tag should end like &lt;br /&gt;.
46     */
47     </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attrs</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">empty</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
48     {
49         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">;
50
51         </span><span class="jsdoc-comment">// there are some situations where adding line break &amp;&amp; indentation will not work. will not work.
52         // &lt;span / b / i ... formating?
53
54         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.in_inline </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.inline_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">) &gt; -1;
55         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">in_pre    </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.in_pre    </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.whitespace_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">) &gt; -1;
56
57         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">is_short   </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">empty </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.shortend_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">) &gt; -1 : </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
58
59         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">add_lb </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'BR' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-keyword">false </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">in_inline</span><span class="jsdoc-syntax">;
60
61         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">add_lb </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">this.in_pre </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.lastElementEndsWS</span><span class="jsdoc-syntax">()) {
62             </span><span class="jsdoc-var">i_inline </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
63         }
64
65         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">=  </span><span class="jsdoc-var">this.indentstr</span><span class="jsdoc-syntax">;
66
67         </span><span class="jsdoc-comment">// e_inline = elements that can be inline, but still allow \n before and after?
68         // only 'BR' ??? any others?
69
70         // ADD LINE BEFORE tage
71         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.in_pre</span><span class="jsdoc-syntax">) {
72             </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">in_inline</span><span class="jsdoc-syntax">) {
73                 </span><span class="jsdoc-comment">//code
74                 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'BR'</span><span class="jsdoc-syntax">) {
75                     </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
76                 } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.lastElementEndsWS</span><span class="jsdoc-syntax">()) {
77                     </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
78                 } </span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
79                     </span><span class="jsdoc-comment">// otherwise - no new line. (and dont indent.)
80                     </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
81                 }
82
83             } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
84                 </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
85             }
86         } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
87             </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
88         }
89
90         </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'&lt;'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">name.toLowerCase</span><span class="jsdoc-syntax">());
91
92         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attrs</span><span class="jsdoc-syntax">) {
93             </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0, </span><span class="jsdoc-var">l </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">attrs.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
94                 </span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">attrs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
95                 </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr.name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'=&quot;'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.encode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr.value</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">), </span><span class="jsdoc-string">'&quot;'</span><span class="jsdoc-syntax">);
96             }
97         }
98
99         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">empty</span><span class="jsdoc-syntax">) {
100             </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">is_short</span><span class="jsdoc-syntax">) {
101                 </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-string">'/&gt;'</span><span class="jsdoc-syntax">;
102             } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
103                 </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-string">'&gt;&lt;/' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">name.toLowerCase</span><span class="jsdoc-syntax">() + </span><span class="jsdoc-string">'&gt;'</span><span class="jsdoc-syntax">;
104             }
105             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">e_inline </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'BR' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-keyword">false </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.in_inline</span><span class="jsdoc-syntax">;
106
107             </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">e_inline </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">this.in_pre</span><span class="jsdoc-syntax">) {
108                 </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
109             }
110             </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
111
112         }
113         </span><span class="jsdoc-comment">// not empty..
114         </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-string">'&gt;'</span><span class="jsdoc-syntax">;
115
116         </span><span class="jsdoc-comment">// there is a special situation, where we need to turn on in_inline - if any of the imediate chidlren are one of these.
117         /*
118         if (!in_inline &amp;&amp; !in_pre) {
119             var cn = node.firstChild;
120             while(cn) {
121                 if (Roo.htmleditor.TidyWriter.inline_elements.indexOf(cn.nodeName) &gt; -1) {
122                     in_inline = true
123                     break;
124                 }
125                 cn = cn.nextSibling;
126             }
127              
128         }
129         */
130
131
132         </span><span class="jsdoc-var">this.pushState</span><span class="jsdoc-syntax">({
133             </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">in_pre   </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">: (</span><span class="jsdoc-var">this.indentstr </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">this.indent</span><span class="jsdoc-syntax">),
134             </span><span class="jsdoc-var">in_pre </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">in_pre</span><span class="jsdoc-syntax">,
135             </span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">:  </span><span class="jsdoc-var">in_inline
136         </span><span class="jsdoc-syntax">});
137         </span><span class="jsdoc-comment">// add a line after if we are not in a
138
139         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">in_pre</span><span class="jsdoc-syntax">) {
140             </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
141         }
142
143
144
145
146     },
147
148     </span><span class="jsdoc-var">lastElementEndsWS </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
149     {
150         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">value </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.html.length </span><span class="jsdoc-syntax">&gt; 0 ? </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">-1] : </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
151         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">value </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
152             </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
153         }
154         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">value.match</span><span class="jsdoc-syntax">(/\s+$/);
155
156     },
157
158     </span><span class="jsdoc-comment">/**
159      * Writes the a end element such as &lt;/p&gt;.
160      *
161      * @method end
162      * @param {String} name Name of the element.
163      */
164     </span><span class="jsdoc-var">end</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">) {
165         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">;
166         </span><span class="jsdoc-var">this.popState</span><span class="jsdoc-syntax">();
167         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
168         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.in_inline </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.inline_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">) &gt; -1;
169
170         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.in_pre </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">in_inline</span><span class="jsdoc-syntax">) {
171             </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
172             </span><span class="jsdoc-var">indentstr  </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.indentstr</span><span class="jsdoc-syntax">;
173         }
174         </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'&lt;/'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">name.toLowerCase</span><span class="jsdoc-syntax">(), </span><span class="jsdoc-string">'&gt;'</span><span class="jsdoc-syntax">);
175         </span><span class="jsdoc-var">this.last_inline </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">in_inline</span><span class="jsdoc-syntax">;
176
177         </span><span class="jsdoc-comment">// pop the indent state..
178     </span><span class="jsdoc-syntax">},
179     </span><span class="jsdoc-comment">/**
180      * Writes a text node.
181      *
182      * In pre - we should not mess with the contents.
183      * 
184      *
185      * @method text
186      * @param {String} text String to write out.
187      * @param {Boolean} raw Optional raw state if true the contents wont get encoded.
188      */
189     </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
190     {
191         </span><span class="jsdoc-comment">// if not in whitespace critical
192         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text.length </span><span class="jsdoc-syntax">&lt; 1) {
193             </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
194         }
195         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.in_pre</span><span class="jsdoc-syntax">) {
196             </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">] =  </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">;
197             </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
198         }
199
200         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.in_inline</span><span class="jsdoc-syntax">) {
201             </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+/g,</span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// all white space inc line breaks to a slingle' '
202             </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">) {
203                 </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+/,</span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">);  </span><span class="jsdoc-comment">// all white space to single white space
204
205
206                 // if next tag is '&lt;BR&gt;', then we can trim right..
207                 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nextSibling </span><span class="jsdoc-syntax">&amp;&amp;
208                     </span><span class="jsdoc-var">node.nextSibling.nodeType </span><span class="jsdoc-syntax">== 1 &amp;&amp;
209                     </span><span class="jsdoc-var">node.nextSibling.nodeName </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'BR' </span><span class="jsdoc-syntax">)
210                 {
211                     </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+$/g,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
212                 }
213                 </span><span class="jsdoc-comment">// if previous tag was a BR, we can also trim..
214                 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">&amp;&amp;
215                     </span><span class="jsdoc-var">node.previousSibling.nodeType </span><span class="jsdoc-syntax">== 1 &amp;&amp;
216                     </span><span class="jsdoc-var">node.previousSibling.nodeName </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'BR' </span><span class="jsdoc-syntax">)
217                 {
218                     </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.indentstr </span><span class="jsdoc-syntax">+  </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/^\s+/g,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
219                 }
220                 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text.match</span><span class="jsdoc-syntax">(/\n/)) {
221                     </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(
222                         /(?![^\n]{1,64}$)([^\n]{1,64})\s/g, </span><span class="jsdoc-string">'$1\n' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">this.indentstr
223                     </span><span class="jsdoc-syntax">);
224                     </span><span class="jsdoc-comment">// remoeve the last whitespace / line break.
225                     </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\n\s+$/,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
226                 }
227                 </span><span class="jsdoc-comment">// repace long lines
228
229             </span><span class="jsdoc-syntax">}
230
231             </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">] =  </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">;
232             </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
233         }
234         </span><span class="jsdoc-comment">// see if previous element was a inline element.
235         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.indentstr</span><span class="jsdoc-syntax">;
236
237         </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+/g,</span><span class="jsdoc-string">&quot; &quot;</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// all whitespace into single white space.
238
239         // should trim left?
240         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">&amp;&amp;
241             </span><span class="jsdoc-var">node.previousSibling.nodeType </span><span class="jsdoc-syntax">== 1 &amp;&amp;
242             </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.inline_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.previousSibling.nodeName</span><span class="jsdoc-syntax">) &gt; -1)
243         {
244             </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
245
246         } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
247             </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
248             </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/^\s+/,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// trim left
249
250         </span><span class="jsdoc-syntax">}
251         </span><span class="jsdoc-comment">// should trim right?
252         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nextSibling </span><span class="jsdoc-syntax">&amp;&amp;
253             </span><span class="jsdoc-var">node.nextSibling.nodeType </span><span class="jsdoc-syntax">== 1 &amp;&amp;
254             </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.inline_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nextSibling.nodeName</span><span class="jsdoc-syntax">) &gt; -1)
255         {
256           </span><span class="jsdoc-comment">// noop
257
258         </span><span class="jsdoc-syntax">}  </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
259             </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+$/,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// trim right
260         </span><span class="jsdoc-syntax">}
261
262
263
264
265
266         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text.length </span><span class="jsdoc-syntax">&lt; 1) {
267             </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
268         }
269         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">text.match</span><span class="jsdoc-syntax">(/\n/)) {
270             </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">);
271             </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
272         }
273
274         </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.indentstr </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(
275             /(?![^\n]{1,64}$)([^\n]{1,64})\s/g, </span><span class="jsdoc-string">'$1\n' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">this.indentstr
276         </span><span class="jsdoc-syntax">);
277         </span><span class="jsdoc-comment">// remoeve the last whitespace / line break.
278         </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+$/,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
279
280         </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">);
281
282         </span><span class="jsdoc-comment">// split and indent..
283
284
285     </span><span class="jsdoc-syntax">},
286     </span><span class="jsdoc-comment">/**
287      * Writes a cdata node such as &lt;![CDATA[data]]&gt;.
288      *
289      * @method cdata
290      * @param {String} text String to write out inside the cdata.
291      */
292     </span><span class="jsdoc-var">cdata</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) {
293         </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'&lt;![CDATA['</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">']]&gt;'</span><span class="jsdoc-syntax">);
294     },
295     </span><span class="jsdoc-comment">/**
296     * Writes a comment node such as &lt;!-- Comment --&gt;.
297     *
298     * @method cdata
299     * @param {String} text String to write out inside the comment.
300     */
301    </span><span class="jsdoc-var">comment</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) {
302        </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'&lt;!--'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'--&gt;'</span><span class="jsdoc-syntax">);
303    },
304     </span><span class="jsdoc-comment">/**
305      * Writes a PI node such as &lt;?xml attr=&quot;value&quot; ?&gt;.
306      *
307      * @method pi
308      * @param {String} name Name of the pi.
309      * @param {String} text String to write out inside the pi.
310      */
311     </span><span class="jsdoc-var">pi</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) {
312         </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'&lt;?'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.encode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">), </span><span class="jsdoc-string">'?&gt;'</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'&lt;?'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'?&gt;'</span><span class="jsdoc-syntax">);
313         </span><span class="jsdoc-var">this.indent </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'\n'</span><span class="jsdoc-syntax">);
314     },
315     </span><span class="jsdoc-comment">/**
316      * Writes a doctype node such as &lt;!DOCTYPE data&gt;.
317      *
318      * @method doctype
319      * @param {String} text String to write out inside the doctype.
320      */
321     </span><span class="jsdoc-var">doctype</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) {
322         </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'&lt;!DOCTYPE'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'&gt;'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.indent </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">'\n' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
323     },
324     </span><span class="jsdoc-comment">/**
325      * Resets the internal buffer if one wants to reuse the writer.
326      *
327      * @method reset
328      */
329     </span><span class="jsdoc-var">reset</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
330         </span><span class="jsdoc-var">this.html.length </span><span class="jsdoc-syntax">= 0;
331         </span><span class="jsdoc-var">this.state </span><span class="jsdoc-syntax">= [];
332         </span><span class="jsdoc-var">this.pushState</span><span class="jsdoc-syntax">({
333             </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
334             </span><span class="jsdoc-var">in_pre </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
335             </span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false
336         </span><span class="jsdoc-syntax">})
337     },
338     </span><span class="jsdoc-comment">/**
339      * Returns the contents that got serialized.
340      *
341      * @method getContent
342      * @return {String} HTML contents that got written down.
343      */
344     </span><span class="jsdoc-var">getContent</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
345         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.html.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.replace</span><span class="jsdoc-syntax">(/\n$/, </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
346     },
347
348     </span><span class="jsdoc-var">pushState </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
349     {
350         </span><span class="jsdoc-var">this.state.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
351         </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
352     },
353
354     </span><span class="jsdoc-var">popState </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
355     {
356         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.state.length </span><span class="jsdoc-syntax">&lt; 1) {
357             </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// nothing to push
358         </span><span class="jsdoc-syntax">}
359         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cfg </span><span class="jsdoc-syntax">= {
360             </span><span class="jsdoc-var">in_pre</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
361             </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''
362         </span><span class="jsdoc-syntax">};
363         </span><span class="jsdoc-var">this.state.pop</span><span class="jsdoc-syntax">();
364         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.state.length </span><span class="jsdoc-syntax">&gt; 0) {
365             </span><span class="jsdoc-var">cfg </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.state</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.state.length</span><span class="jsdoc-syntax">-1];
366         }
367         </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
368     },
369
370     </span><span class="jsdoc-var">addLine</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
371     {
372         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.html.length </span><span class="jsdoc-syntax">&lt; 1) {
373             </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
374         }
375
376
377         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">value </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length </span><span class="jsdoc-syntax">- 1];
378         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">value.length </span><span class="jsdoc-syntax">&gt; 0 &amp;&amp; </span><span class="jsdoc-string">'\n' </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">) {
379             </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'\n'</span><span class="jsdoc-syntax">);
380         }
381     }
382
383
384 </span><span class="jsdoc-comment">//'pre script noscript style textarea video audio iframe object code'
385 // shortended... 'area base basefont br col frame hr img input isindex link  meta param embed source wbr track');
386 // inline 
387 </span><span class="jsdoc-syntax">};
388
389 </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.inline_elements </span><span class="jsdoc-syntax">= [
390         </span><span class="jsdoc-string">'SPAN'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'STRONG'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'B'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'EM'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'I'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'FONT'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'STRIKE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'U'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'VAR'</span><span class="jsdoc-syntax">,
391         </span><span class="jsdoc-string">'CITE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'DFN'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'CODE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'MARK'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'Q'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'SUP'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'SUB'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'SAMP'
392 </span><span class="jsdoc-syntax">];
393 </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.shortend_elements </span><span class="jsdoc-syntax">= [
394     </span><span class="jsdoc-string">'AREA'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'BASE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'BASEFONT'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'BR'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'COL'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'FRAME'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'HR'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'IMG'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'INPUT'</span><span class="jsdoc-syntax">,
395     </span><span class="jsdoc-string">'ISINDEX'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'LINK'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'META'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'PARAM'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'EMBED'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'SOURCE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'WBR'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'TRACK'
396 </span><span class="jsdoc-syntax">];
397
398 </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.whitespace_elements </span><span class="jsdoc-syntax">= [
399     </span><span class="jsdoc-string">'PRE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'SCRIPT'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'NOSCRIPT'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'STYLE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'TEXTAREA'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'VIDEO'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'AUDIO'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'IFRAME'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'OBJECT'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'CODE'
400 </span><span class="jsdoc-syntax">];</span></code></body></html>