Changeset 414

Show
Ignore:
Timestamp:
2007-07-07 13:14:45 (17 months ago)
Author:
martinkou
Message:

Fixed #102 : HTML code generated by the "Paste As Plain Text" feature now obeys the EnterMode setting.

Location:
FCKeditor/trunk
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • FCKeditor/trunk/editor/dialog/fck_paste.html

    r224 r414  
    102102        { 
    103103                sHtml = oEditor.FCKTools.HTMLEncode( document.getElementById('txtData').value )  ; 
    104                 sHtml = sHtml.replace( /\n/g, '<BR>' ) ; 
     104                sHtml = FCKTools.ProcessLineBreaks( oEditor, FCKConfig, sHtml ) ; 
     105 
     106                // FCK.InsertHtml() does not work for us, since document fragments cannot contain node fragments. :( 
     107                // Use the marker method instead. It's primitive, but it works. 
     108                var range = new oEditor.FCKDomRange( oEditor.FCK.EditorWindow ) ; 
     109                var oDoc = oEditor.FCK.EditorDocument ; 
     110                range.MoveToSelection() ; 
     111                range.DeleteContents() ; 
     112                var marker = [] ; 
     113                for ( var i = 0 ; i < 5 ; i++ ) 
     114                        marker.push( parseInt(Math.random() * 100000) ) ; 
     115                marker = marker.join( "" ) ; 
     116                range.InsertNode ( oDoc.createTextNode( marker ) ) ; 
     117                range.Release() ; 
     118 
     119                // Now we've got a marker indicating the paste position in the editor document. 
     120                // Find its position in the HTML code. 
     121                var htmlString = oDoc.body.innerHTML ; 
     122                var index = htmlString.indexOf( marker ) ; 
     123 
     124                // Split it the HTML code up, add the code we generated, and put them back together. 
     125                var htmlList = [] ; 
     126                htmlList.push( htmlString.substr( 0, index ) ) ; 
     127                htmlList.push( sHtml ) ; 
     128                htmlList.push( htmlString.substr( index + marker.length ) ) ; 
     129                htmlString = htmlList.join( "" ) ; 
     130 
     131                if ( oEditor.FCKBrowserInfo.IsIE ) 
     132                        oEditor.FCK.SetInnerHtml( htmlString ) ; 
     133                else 
     134                        oDoc.body.innerHTML = htmlString ; 
     135 
     136                return true ; 
    105137        } 
    106138 
  • FCKeditor/trunk/editor/_source/internals/fck_ie.js

    r400 r414  
    246246        { 
    247247                // Replace the carriage returns with <BR> 
    248                 sText = FCKTools.HTMLEncode( sText ).replace( /\n/g, '<BR>' ) ; 
     248                sText = FCKTools.HTMLEncode( sText ) ; 
     249                sText = FCKTools.ProcessLineBreaks( window, FCKConfig, sText ) ; 
    249250 
    250251                // Insert the resulting data in the editor. 
  • FCKeditor/trunk/editor/_source/internals/fcktools.js

    r411 r414  
    111111 
    112112        return text ; 
     113} 
     114 
     115FCKTools._ProcessLineBreaksForPMode = function( oEditor, text, liState, node, strArray ) 
     116{ 
     117        var closeState = 0 ; 
     118        var blockStartTag = "<p>" ; 
     119        var blockEndTag = "</p>" ; 
     120        var lineBreakTag = "<br />" ; 
     121        if ( liState ) 
     122        { 
     123                blockStartTag = "<li>" ; 
     124                blockEndTag = "</li>" ; 
     125                closeState = 1 ; 
     126        } 
     127 
     128        // Are we currently inside a <p> tag now? 
     129        // If yes, close it at the next double line break. 
     130        while ( node && node != oEditor.FCK.EditorDocument.body ) 
     131        { 
     132                if ( node.tagName.toLowerCase() == 'p' ) 
     133                { 
     134                        closeState = 1 ; 
     135                        break; 
     136                } 
     137                node = node.parentNode ; 
     138        } 
     139 
     140        for ( var i = 0 ; i < text.length ; i++ ) 
     141        { 
     142                var c = text.charAt( i ) ; 
     143                if ( c == '\r' ) 
     144                        continue ; 
     145 
     146                if ( c != '\n' ) 
     147                { 
     148                        strArray.push( c ) ; 
     149                        continue ; 
     150                } 
     151 
     152                // Now we have encountered a line break. 
     153                // Check if the next character is also a line break. 
     154                var n = text.charAt( i + 1 ) ; 
     155                if ( n == '\r' ) 
     156                { 
     157                        i++ ; 
     158                        n = text.charAt( i + 1 ) ; 
     159                } 
     160                if ( n == '\n' ) 
     161                { 
     162                        i++ ;   // ignore next character - we have already processed it. 
     163                        if ( closeState ) 
     164                                strArray.push( blockEndTag ) ; 
     165                        strArray.push( blockStartTag ) ; 
     166                        closeState = 1 ; 
     167                } 
     168                else 
     169                        strArray.push( lineBreakTag ) ; 
     170        } 
     171        if ( closeState ) 
     172                strArray.push( blockEndTag ) ; 
     173} 
     174 
     175FCKTools._ProcessLineBreaksForDivMode = function( oEditor, text, liState, node, strArray ) 
     176{ 
     177        var closeState = 0 ; 
     178        var blockStartTag = "<div>" ; 
     179        var blockEndTag = "</div>" ; 
     180        if ( liState ) 
     181        { 
     182                blockStartTag = "<li>" ; 
     183                blockEndTag = "</li>" ; 
     184                closeState = 1 ; 
     185        } 
     186 
     187        // Are we currently inside a <div> tag now? 
     188        // If yes, close it at the next double line break. 
     189        while ( node && node != oEditor.FCK.EditorDocument.body ) 
     190        { 
     191                if ( node.tagName.toLowerCase() == 'div' ) 
     192                { 
     193                        closeState = 1 ; 
     194                        break ; 
     195                } 
     196                node = node.parentNode ; 
     197        } 
     198 
     199        for ( var i = 0 ; i < text.length ; i++ ) 
     200        { 
     201                var c = text.charAt( i ) ; 
     202                if ( c == '\r' ) 
     203                        continue ; 
     204 
     205                if ( c != '\n' ) 
     206                { 
     207                        strArray.push( c ) ; 
     208                        continue ; 
     209                } 
     210 
     211                if ( closeState ) 
     212                { 
     213                        if ( strArray[ strArray.length - 1 ] == blockStartTag ) 
     214                        { 
     215                                // A div tag must have some contents inside for it to be visible. 
     216                                strArray.push( "&nbsp;" ) ; 
     217                        } 
     218                        strArray.push( blockEndTag ) ; 
     219                } 
     220                strArray.push( blockStartTag ) ; 
     221                closeState = 1 ; 
     222        } 
     223        if ( closeState ) 
     224                strArray.push( blockEndTag ) ; 
     225} 
     226 
     227FCKTools._ProcessLineBreaksForBrMode = function( oEditor, text, liState, node, strArray ) 
     228{ 
     229        var closeState = 0 ; 
     230        var blockStartTag = "<br />" ; 
     231        var blockEndTag = "" ; 
     232        if ( liState ) 
     233        { 
     234                blockStartTag = "<li>" ; 
     235                blockEndTag = "</li>" ; 
     236                closeState = 1 ; 
     237        } 
     238 
     239        for ( var i = 0 ; i < text.length ; i++ ) 
     240        { 
     241                var c = text.charAt( i ) ; 
     242                if ( c == '\r' ) 
     243                        continue ; 
     244 
     245                if ( c != '\n' ) 
     246                { 
     247                        strArray.push( c ) ; 
     248                        continue ; 
     249                } 
     250 
     251                if ( closeState && blockEndTag.length ) 
     252                        strArray.push ( blockEndTag ) ; 
     253                strArray.push( blockStartTag ) ; 
     254                closeState = 1 ; 
     255        } 
     256} 
     257 
     258FCKTools.ProcessLineBreaks = function( oEditor, oConfig, text ) 
     259{ 
     260        var enterMode = oConfig.EnterMode.toLowerCase() ; 
     261        var strArray = [] ; 
     262 
     263        // Is the caret or selection inside an <li> tag now? 
     264        var liState = 0 ; 
     265        var range = new oEditor.FCKDomRange( oEditor.FCK.EditorWindow ) ; 
     266        range.MoveToSelection() ; 
     267        var node = range._Range.startContainer ; 
     268        while ( node && node.nodeType != 1 ) 
     269                node = node.parentNode ; 
     270        if ( node && node.tagName.toLowerCase() == 'li' ) 
     271                liState = 1 ; 
     272 
     273        if ( enterMode == 'p' ) 
     274                this._ProcessLineBreaksForPMode( oEditor, text, liState, node, strArray ) ; 
     275        else if ( enterMode == 'div' ) 
     276                this._ProcessLineBreaksForDivMode( oEditor, text, liState, node, strArray ) ; 
     277        else if ( enterMode == 'br' ) 
     278                this._ProcessLineBreaksForBrMode( oEditor, text, liState, node, strArray ) ; 
     279        return strArray.join( "" ) ; 
    113280} 
    114281 
  • FCKeditor/trunk/_whatsnew.html

    r413 r414  
    5858                        AbsolutePath setting so it's possible to set the url to a full domain or a relative path and specify that 
    5959                        way the physical folder where the files are stored..</li> 
     60                <li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/100">#100</a>] A new configuration directive 
     61                        "FCKConfig.EditorAreaStyles" has been implemented to allow setting editing area styles from JavaScript. 
     62                        </li> 
     63                <li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/102">#102</a>] HTML code generated by the "Paste 
     64                        As Plain Text" feature now obeys the EnterMode setting.</li> 
    6065        </ul> 
    6166        <p> 
     
    8085                <li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/560">#560</a>] The PHP connector will work better if the 
    8186                        connector or the userfiles folder is a symlink.</li> 
     87                <li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/802">#802</a>] The replace dialog will now advance its searching 
     88                        position correctly and is able to search for strings spanning across multiple inline tags.</li> 
    8289        </ul> 
    8390        <h3>