Changeset 688 for trunk/plugins


Ignore:
Timestamp:
01/22/07 20:22:22 (12 years ago)
Author:
ray
Message:

This is a grand scale sorting and structuring action, see #10

Location:
trunk/plugins
Files:
2 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/plugins/GetHtml/get-html.js

    r677 r688  
    11/** 
    2   * Based on XML_Utility functions submitted by troels_kn. 
    3   * credit also to adios, who helped with reg exps: 
    4   * http://www.sitepoint.com/forums/showthread.php?t=201052 
    5   *  
    6   * A replacement for HTMLArea.getHTML 
    7   * 
    8   * Features: 
    9   *   - Generates XHTML code 
    10   *   - Much faster than HTMLArea.getHTML 
    11   *   - Eliminates the hacks to accomodate browser quirks 
    12   *   - Returns correct code for Flash objects and scripts 
    13   *   - Formats html in an indented, readable format in html mode 
    14   *   - Preserves script and pre formatting 
    15   *   - Preserves formatting in comments 
    16   *   - Removes contenteditable from body tag in full-page mode 
    17   *   - Supports only7BitPrintablesInURLs config option 
    18   *   - Supports htmlRemoveTags config option 
     2 Implemented now as GetHtmlImplementation plugin in modules/GetHtml/TransformInnerHTML.js 
    193  */ 
    204   
    215function GetHtml(editor) { 
    22     this.editor = editor; 
     6    editor.config.getHtmlMethod = "TransformInnerHTML"; 
    237} 
    248 
     
    2812        developer     : "Nelson Bright", 
    2913        developer_url : "http://www.brightworkweb.com/", 
     14        sponsor       : "", 
     15    sponsor_url   : "", 
    3016        license       : "htmlArea" 
    3117}; 
    32  
    33 HTMLArea.RegExpCache = [ 
    34 /*00*/  new RegExp().compile(/<\s*\/?([^\s\/>]+)[\s*\/>]/gi),//lowercase tags 
    35 /*01*/  new RegExp().compile(/(\s+)_moz[^=>]*=[^\s>]*/gi),//strip _moz attributes 
    36 /*02*/  new RegExp().compile(/\s*=\s*(([^'"][^>\s]*)([>\s])|"([^"]+)"|'([^']+)')/g),// find attributes 
    37 /*03*/  new RegExp().compile(/\/>/g),//strip singlet terminators 
    38 /*04*/  new RegExp().compile(/<(br|hr|img|input|link|meta|param|embed|area)((\s*\S*="[^"]*")*)>/g),//terminate singlet tags 
    39 /*05*/  new RegExp().compile(/(checked|compact|declare|defer|disabled|ismap|multiple|no(href|resize|shade|wrap)|readonly|selected)([\s>])/gi),//expand singlet attributes 
    40 /*06*/  new RegExp().compile(/(="[^']*)'([^'"]*")/),//check quote nesting 
    41 /*07*/  new RegExp().compile(/&(?=[^<]*>)/g),//expand query ampersands 
    42 /*08*/  new RegExp().compile(/<\s+/g),//strip tagstart whitespace 
    43 /*09*/  new RegExp().compile(/\s+(\/)?>/g),//trim whitespace 
    44 /*10*/  new RegExp().compile(/\s{2,}/g),//trim extra whitespace 
    45 /*11*/  new RegExp().compile(/\s+([^=\s]+)((="[^"]+")|([\s>]))/g),// lowercase attribute names 
    46 /*12*/  new RegExp().compile(/\s+contenteditable(=[^>\s\/]*)?/gi),//strip contenteditable 
    47 /*13*/  new RegExp().compile(/((href|src)=")([^\s]*)"/g), //find href and src for stripBaseHref() 
    48 /*14*/  new RegExp().compile(/<\/?(div|p|h[1-6]|table|tr|td|th|ul|ol|li|blockquote|object|br|hr|img|embed|param|pre|script|html|head|body|meta|link|title|area|input|form|textarea|select|option)[^>]*>/g), 
    49 /*15*/  new RegExp().compile(/<\/(div|p|h[1-6]|table|tr|ul|ol|blockquote|object|html|head|body|script|form|select)( [^>]*)?>/g),//blocklevel closing tag 
    50 /*16*/  new RegExp().compile(/<(div|p|h[1-6]|table|tr|ul|ol|blockquote|object|html|head|body|script|form|select)( [^>]*)?>/g),//blocklevel opening tag 
    51 /*17*/  new RegExp().compile(/<(td|th|li|option|br|hr|embed|param|pre|meta|link|title|area|input|textarea)[^>]*>/g),//singlet tag or output on 1 line 
    52 /*18*/  new RegExp().compile(/(^|<\/(pre|script)>)(\s|[^\s])*?(<(pre|script)[^>]*>|$)/g),//find content NOT inside pre and script tags 
    53 /*19*/  new RegExp().compile(/(<pre[^>]*>)([\s\S])*?(<\/pre>)/g),//find content inside pre tags 
    54 /*20*/  new RegExp().compile(/(^|<!--[\s\S]*?-->)([\s\S]*?)(?=<!--[\s\S]*?-->|$)/g),//find content NOT inside comments 
    55 /*21*/  new RegExp().compile(/\S*=""/g), //find empty attributes 
    56 /*22*/  new RegExp().compile(/<!--[\s\S]*?-->|<\?[\s\S]*?\?>|<\/?\w[^>]*>/g), //find all tags, including comments and php 
    57 /*23*/  new RegExp().compile(/(^|<\/script>)[\s\S]*?(<script[^>]*>|$)/g) //find content NOT inside script tags 
    58 ]; 
    59  
    60 /**  
    61   * Cleans HTML into wellformed xhtml 
    62   */ 
    63 HTMLArea.prototype.cleanHTML = function(sHtml) { 
    64         var c = HTMLArea.RegExpCache; 
    65         sHtml = sHtml. 
    66                 replace(c[0], function(str) { return str.toLowerCase(); } ).//lowercase tags/attribute names 
    67                 replace(c[1], ' ').//strip _moz attributes 
    68                 replace(c[12], ' ').//strip contenteditable 
    69                 replace(c[2], '="$2$4$5"$3').//add attribute quotes 
    70                 replace(c[21], ' ').//strip empty attributes 
    71                 replace(c[11], function(str, p1, p2) { return ' '+p1.toLowerCase()+p2; }).//lowercase attribute names 
    72                 replace(c[3], '>').//strip singlet terminators 
    73                 replace(c[9], '$1>').//trim whitespace 
    74                 replace(c[5], '$1="$1"$3').//expand singlet attributes 
    75                 replace(c[4], '<$1$2 />').//terminate singlet tags 
    76                 replace(c[6], '$1$2').//check quote nesting 
    77         //      replace(c[7], '&amp;').//expand query ampersands 
    78                 replace(c[8], '<').//strip tagstart whitespace 
    79                 replace(c[10], ' ');//trim extra whitespace 
    80         if(HTMLArea.is_ie && c[13].test(sHtml)) { 
    81                 sHtml = sHtml.replace(c[13],'$1'+this.stripBaseURL(RegExp.$3)+'"'); 
    82         } 
    83         if(this.config.only7BitPrintablesInURLs) { 
    84                 if (HTMLArea.is_ie) c[13].test(sHtml); // oddly the test below only triggers when we call this once before (IE6), in Moz it fails if tested twice 
    85                 if ( c[13].test(sHtml)) { 
    86                         try { //Mozilla returns an incorrectly encoded value with innerHTML 
    87                                 sHtml = sHtml.replace(c[13], '$1'+decodeURIComponent(RegExp.$3).replace(/([^!-~]+)/g,function(chr){return escape(chr);})+'"'); 
    88                         } catch (e) { // once the URL is escape()ed, you can't decodeURIComponent() it anymore 
    89                                 sHtml = sHtml.replace(c[13], '$1'+RegExp.$3.replace(/([^!-~]+)/g,function(chr){return escape(chr);})+'"'); 
    90                         } 
    91                 } 
    92         } 
    93         return sHtml; 
    94 }; 
    95  
    96 /** 
    97   * Prettyfies html by inserting linebreaks before tags, and indenting blocklevel tags 
    98   */ 
    99 HTMLArea.indent = function(s, sindentChar) { 
    100         HTMLArea.__nindent = 0; 
    101         HTMLArea.__sindent = ""; 
    102         HTMLArea.__sindentChar = (typeof sindentChar == "undefined") ? "  " : sindentChar; 
    103         var c = HTMLArea.RegExpCache; 
    104         if(HTMLArea.is_gecko) { //moz changes returns into <br> inside <pre> tags 
    105                 s = s.replace(c[19], function(str){return str.replace(/<br \/>/g,"\n")}); 
    106         } 
    107         s = s.replace(c[18], function(strn) { //skip pre and script tags 
    108           strn = strn.replace(c[20], function(st,$1,$2) { //exclude comments 
    109                 string = $2.replace(/[\n\r]/gi, " ").replace(/\s+/gi," ").replace(c[14], function(str) { 
    110                         if (str.match(c[16])) { 
    111                                 var s = "\n" + HTMLArea.__sindent + str; 
    112                                 // blocklevel openingtag - increase indent 
    113                                 HTMLArea.__sindent += HTMLArea.__sindentChar; 
    114                                 ++HTMLArea.__nindent; 
    115                                 return s; 
    116                         } else if (str.match(c[15])) { 
    117                                 // blocklevel closingtag - decrease indent 
    118                                 --HTMLArea.__nindent; 
    119                                 HTMLArea.__sindent = ""; 
    120                                 for (var i=HTMLArea.__nindent;i>0;--i) { 
    121                                         HTMLArea.__sindent += HTMLArea.__sindentChar; 
    122                                 } 
    123                                 return "\n" + HTMLArea.__sindent + str; 
    124                         } else if (str.match(c[17])) { 
    125                                 // singlet tag 
    126                                 return "\n" + HTMLArea.__sindent + str; 
    127                         } 
    128                         return str; // this won't actually happen 
    129                 }); 
    130                 return $1 + string; 
    131           });return strn; 
    132     }); 
    133     //final cleanup 
    134     s = s.replace(/^\s*/,'').//strip leading whitespace 
    135         replace(/ +\n/g,'\n').//strip spaces at end of lines 
    136         replace(/[\r\n]+<\/script>/g,'\n</script>');//strip returns added into scripts 
    137     return s; 
    138 }; 
    139  
    140 HTMLArea.getHTML = function(root, outputRoot, editor) { 
    141         var html = ""; 
    142         var c = HTMLArea.RegExpCache; 
    143  
    144         if(root.nodeType == 11) {//document fragment 
    145             //we can't get innerHTML from the root (type 11) node, so we  
    146             //copy all the child nodes into a new div and get innerHTML from the div 
    147             var div = document.createElement("div"); 
    148             var temp = root.insertBefore(div,root.firstChild); 
    149             for (j = temp.nextSibling; j; j = j.nextSibling) {  
    150                         temp.appendChild(j.cloneNode(true)); 
    151             } 
    152                 html += temp.innerHTML.replace(c[23], function(strn) { //skip content inside script tags 
    153                         strn = strn.replace(c[22], function(tag){ 
    154                                 if(/^<[!\?]/.test(tag)) return tag; //skip comments and php tags 
    155                                 else return editor.cleanHTML(tag)}); 
    156                         return strn; 
    157                 }); 
    158  
    159         } else { 
    160  
    161                 var root_tag = (root.nodeType == 1) ? root.tagName.toLowerCase() : '';  
    162                 if (outputRoot) { //only happens with <html> tag in fullpage mode 
    163                         html += "<" + root_tag; 
    164                         var attrs = root.attributes; // strangely, this doesn't work in moz 
    165                         for (i = 0; i < attrs.length; ++i) { 
    166                                 var a = attrs.item(i); 
    167                                 if (!a.specified) { 
    168                                   continue; 
    169                                 } 
    170                                 var name = a.nodeName.toLowerCase(); 
    171                                 var value = a.nodeValue; 
    172                                 html += " " + name + '="' + value + '"'; 
    173                         } 
    174                         html += ">"; 
    175                 } 
    176                 if(root_tag == "html") { 
    177                         innerhtml = editor._doc.documentElement.innerHTML; 
    178                 } else { 
    179                         innerhtml = root.innerHTML; 
    180                 } 
    181                 //pass tags to cleanHTML() one at a time 
    182                 //includes support for htmlRemoveTags config option 
    183                 html += innerhtml.replace(c[23], function(strn) { //skip content inside script tags 
    184                         strn = strn.replace(c[22], function(tag){ 
    185                                 if(/^<[!\?]/.test(tag)) return tag; //skip comments and php tags 
    186                                 else if(!(editor.config.htmlRemoveTags && editor.config.htmlRemoveTags.test(tag.replace(/<([^\s>\/]+)/,'$1')))) 
    187                                         return editor.cleanHTML(tag); 
    188                                 else return ''}); 
    189                         return strn; 
    190                 }); 
    191                 //IE drops  all </li> tags in a list except the last one 
    192                 if(HTMLArea.is_ie) { 
    193                         html = html.replace(/<li( [^>]*)?>/g,'</li><li$1>'). 
    194                                 replace(/(<(ul|ol)[^>]*>)[\s\n]*<\/li>/g, '$1'). 
    195                                 replace(/<\/li>([\s\n]*<\/li>)+/g, '<\/li>'); 
    196                 } 
    197                 if(HTMLArea.is_gecko) 
    198                         html = html.replace(/<br \/>\n$/, ''); //strip trailing <br> added by moz 
    199                 if (outputRoot) { 
    200                         html += "</" + root_tag + ">"; 
    201                 } 
    202                 html = HTMLArea.indent(html); 
    203         }; 
    204 //      html = HTMLArea.htmlEncode(html); 
    205  
    206         return html; 
    207 }; 
    208  
    209 //overload outwardHtml() to handle onclick suppression 
    210 HTMLArea.prototype._origOutwardHtml = HTMLArea.prototype.outwardHtml; 
    211 HTMLArea.prototype.outwardHtml = function(html) { 
    212         html = html.replace("onclick=\"try{if(document.designMode && document.designMode == 'on') return false;}catch(e){} window.open(", "onclick=\"window.open("); 
    213         html = this._origOutwardHtml(html); 
    214         return html; 
    215 }; 
  • trunk/plugins/TableOperations/table-operations.js

    r675 r688  
    4646        // add a new line in the toolbar 
    4747        cfg.toolbar.push(toolbar); 
     48         
     49  if ( typeof PopupWin == 'undefined' ) 
     50  { 
     51    Xinha._loadback(_editor_url + 'modules/Dialogs/popupwin.js'); 
     52  } 
    4853} 
    4954 
Note: See TracChangeset for help on using the changeset viewer.