新しいブログに移動しました。
9ensanのLifeHack
こちらの記事も必要に応じて新しいブログに移動させる予定です。
今後ともよろしくお願い致します。

HOME > WordPress > 

FCKEditorでpreタグの改行が消えてしまう原因

FCKEditorでpreタグの改行が消えてしまう原因

  • 2009.02.11 (水) 13:52
  • WordPress
  • ,

FCKEditorを使用していてpreタグの中の改行コードが消えてしまう事象が発生

これは、ある特定の場合に発生していることが判明しました

  1. IE以外のブラウザを使用している。
    (FireFoxなど)
  2. preタグの中でspanタグを使用していて、そのspanタグの中で改行コードが使用されている
    (ソースコードの整形の為のシンタックスハイライトを行っている場合に良く発生します)

この条件がそろうとFCKEditorで「ソースモード」と「WYSIWYGモード」を切り替えているとpreタグの中のspanタグの中にあった改行コードがなくなってしまいます

FCKEditorで改行コードが消える

原因を調査した結果以下のことが判明しました。

  1. FCKEditorでは、preタグ直下の要素の改行はそのまま改行と判断し、残します。
  2. preタグ以外のタグの中でbrでないただの改行コードがあった場合、半角スペースに置き換えます。

となるとpreタグの中に別のタグがあった場合、別のタグの要素として判断され改行コードを半角スペースに置き換えてしまいます。

ということは、preタグの中のspanタグの中の改行コードは、半角スペースに変更されてしまうということです。(spanタグの中の改行コードと判断される為)

なのでこれを対策する為にFCKEditorのコアファイルに修正を加えました。

修正内容)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
*** original/fckxhtml.js	2008-10-07 13:52:24.000000000 +0900
--- fckxhtml.js	2009-02-12 09:47:39.000000000 +0900
***************
*** 189,195 ****
  			// This is a workaround for the Gecko bug here: https://bugzilla.mozilla.org/show_bug.cgi?id=92921
  			if ( FCKBrowserInfo.IsGecko
  					&& htmlNode.tagName.toLowerCase() == 'br'
! 					&& htmlNode.parentNode.tagName.toLowerCase() == 'pre' )
  			{
  				var val = '\r' ;
  				if ( htmlNode == htmlNode.parentNode.firstChild )
--- 189,199 ----
  			// This is a workaround for the Gecko bug here: https://bugzilla.mozilla.org/show_bug.cgi?id=92921
  			if ( FCKBrowserInfo.IsGecko
  					&& htmlNode.tagName.toLowerCase() == 'br'
! 					&& (
! 						htmlNode.parentNode.tagName.toLowerCase() == 'pre' ||
! 						( htmlNode.parentNode && htmlNode.parentNode.parentNode && htmlNode.parentNode.parentNode.nodeName.IEquals( 'pre' ) )
! 					 )
! 			)
  			{
  				var val = '\r' ;
  				if ( htmlNode == htmlNode.parentNode.firstChild )
***************
*** 270,276 ****
 
  		// Text Node.
  		case 3 :
! 			if ( htmlNode.parentNode && htmlNode.parentNode.nodeName.IEquals( 'pre' ) )
  				return this._AppendTextNode( xmlNode, htmlNode.nodeValue ) ;
  			return this._AppendTextNode( xmlNode, htmlNode.nodeValue.ReplaceNewLineChars(' ') ) ;
 
--- 274,283 ----
 
  		// Text Node.
  		case 3 :
! 			if (
! 				( htmlNode.parentNode && htmlNode.parentNode.nodeName.IEquals( 'pre' ) ) ||
! 				( htmlNode.parentNode && htmlNode.parentNode.parentNode && htmlNode.parentNode.parentNode.nodeName.IEquals( 'pre' ) )
! 			 )
  				return this._AppendTextNode( xmlNode, htmlNode.nodeValue ) ;
  			return this._AppendTextNode( xmlNode, htmlNode.nodeValue.ReplaceNewLineChars(' ') ) ;

対象の要素の親の親のタグがpreかどうか判断するという方法に修正しました。
これで修正が完璧かというと完璧ではないと思います。

なのでそれぞれの環境に合うように修正して使用してください。

それでは、修正の反映方法です。

  1. まず、FCKEditorのルートフォルダ「fckeditor」フォルダに移動します。
    (ここには「fckconfig.js」などのソースファイルが格納されています。)
  2. そのフォルダから「fckeditor\editor\_source\internals」フォルダに移動します。
  3. 「fckxhtml.js」ファイルを開き、189~195行目、270~276行目を上記内容に修正します。
  4. fckpackager.exeをダウンロードしてきます
    (これは、FCKEditorのソースファイルを圧縮するためのツールです。詳しくはこちら
  5. ダウンロードしてきたファイルをfckeditorのルートフォルダにコピーします。
  6. 「fckpackager.exe」を実行します。
  7. 実行が成功すると、「fckeditor\editor\js」フォルダの「fckeditorcode_ie.js」と「fckeditorcode_gecko.js」が更新されるのでその2つのファイルをFCKEditorを使用しているフォルダにアップロードします。
  8. これでFCKEditorの修正は完了です

設定方法が、もしわからんかったら連絡もらえたら教えますよ

コメント:0件

コメント投稿フォーム
コメントを入力して下さい。
ユーザー名(必須)
メールアドレス(必須)(非公開)
ホームページ
コメント

トラックバック:0件

この記事のトラックバックURL
http://blog.veryposi.info/programing/cms/wordpress/wordpress-fckeditor-pre/trackback/
お薦めのレンタルサーバー
広告
お薦めの書籍
HOME > WordPress > 

FCKEditorでpreタグの改行が消えてしまう原因