WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

net2ftp : テキスト編集機能の日本語対応パッチ

前回の記事の宿題であった net2ftp 内蔵テキストエディタの日本語対応ですが、あっさりできてしまいました。ついでなので、改行コードの変換なども付けてしまいました。機能は以下のとおりです。

  • 編集内容のテキストから文字コードを推測して文字化けを防ぐ。
  • ドロップダウンで保存時の文字コードを変更できる。
  • 同じくドロップダウンで保存時の改行コードを変更できる(要バイナリモード)。
  • プレーンテキストエディタはもちろん、 WYSIWYG エディタやコードエディタでも動作する。
  • 設定ファイルで利用可能な文字コードを指定できる。 PHP の mbstring が扱える文字コードならなんでもいけるはず。たぶん、きっと(^^;

これだけあれば、文字コード関連ではほとんど困らないのではないでしょうか。そんなわけで、本日はこの net2ftp 内蔵テキストエディタ多言語対応&改行コード変更対応パッチをご紹介します。

Ver. 0.95 にて、このパッチ相当の機能を取り入れていただきました。現在は日本語の UI を選択してログインするだけで文字化けが抑制され、保存時の文字コードも選択できます。

パッチ

さっそくパッチです。複数のファイルにわたりますので、 diff 形式で掲載させていただきます。ちょっと長いですがご了承ください。

diff -r -U 3 net2ftp_orig/modules/edit/edit.inc.php net2ftp/modules/edit/edit.inc.php
--- net2ftp_orig/modules/edit/edit.inc.php	2007-01-21 19:29:16.000000000 +0900
+++ net2ftp/modules/edit/edit.inc.php	2007-01-21 19:16:46.000000000 +0900
@@ -169,6 +169,23 @@
 	if (isset($_POST["text_splitted"]) == true) { $text_splitted = $_POST["text_splitted"]; }
 	else                                        { $text_splitted = ""; }
 
+	if(isset($net2ftp_settings["textarea_encoding_default"]))
+		$page_encoding = $net2ftp_settings["textarea_encoding_default"];
+	else
+		$page_encoding = $net2ftp_messages["iso-8859-1"];
+
+	$text_encoding = $page_encoding;
+	if(isset($net2ftp_settings["textarea_encodings"]) && isset($_POST["encodingSelect"])) {
+		foreach($net2ftp_settings["textarea_encodings"] as $value) {
+			if(strcasecmp($value, $_POST["encodingSelect"]) == 0) {
+				$text_encoding = $value;
+			}
+		}
+	}
+	$line_break = "LF";
+	if($net2ftp_settings["line_break_selector"] && isset($_POST["breakSelect"])) {
+		$line_break = $_POST["breakSelect"]; // $line_break may be polluted.
+	}
 
 // -------------------------------------------------------------------------
 // Variables for all screens
@@ -224,6 +241,26 @@
 		if ($net2ftp_globals["state2"] == "") {
 			$text = ftp_readfile("", $net2ftp_globals["directory"], $net2ftp_globals["entry"]);
 			if ($net2ftp_result["success"] == false) { return false; }
+
+			// Character code conversion.
+			if(isset($net2ftp_settings["textarea_encodings"])) {
+				$text_encoding = mb_detect_encoding($text, $net2ftp_settings["textarea_encodings"]);
+				if(strcasecmp($text_encoding, $page_encoding) != 0) {
+					$text = mb_convert_encoding($text, $page_encoding, $text_encoding);
+				}
+			}
+			if($net2ftp_settings["line_break_selector"])
+			{
+				if(strpos($text, "\r\n") !== false) {
+					$line_break = "CRLF";
+				} else if(strpos($text, "\n") !== false) {
+					$line_break = "LF";
+				} else if(strpos($text, "\r") !== false) {
+					$line_break = "CR";
+				} else {
+					$line_break = "LF";
+				}
+			}
 		}
 
 // New file: read the template file
@@ -294,9 +331,21 @@
 			$text .= $text_splitted["bottom"];
 		}
 
+// Character code conversion.
+		$write_text = $text;
+		$break_map = array("CRLF" => "\r\n", "CR" => "\r", "LF" => "\n");
+		if($net2ftp_settings["line_break_selector"] && $break_map[$line_break]) {
+			$write_text = preg_replace('/(\\r\\n)|\\r|\\n/', $break_map[$line_break], $write_text);
+		}
+		if(isset($net2ftp_settings["textarea_encodings"])) {
+			if(strcasecmp($text_encoding, $page_encoding) != 0) {
+				$write_text = mb_convert_encoding($write_text, $text_encoding, $page_encoding);
+			}
+		}
+
 // Write the string to the FTP server
 // Note: this function also replaces CarriageReturn+LineFeed by LineFeed
-		ftp_writefile("", $net2ftp_globals["directory"], $net2ftp_globals["entry"], $text);
+		ftp_writefile("", $net2ftp_globals["directory"], $net2ftp_globals["entry"], $write_text);
 		if ($net2ftp_result["success"] == false) { 
 			setErrorVars(true, "", "", "", ""); // Continue anyway and print warning message
 			$savestatus = __("Status: <b>This file could not be saved</b>"); 
@@ -418,6 +467,70 @@
 // **                                                                                  **
 // **                                                                                  **
 
+function printEncodingSelect($text_encoding) {
+
+// --------------
+// This function prints a select with the available encodings
+// --------------
+
+// -------------------------------------------------------------------------
+// Global variables
+// -------------------------------------------------------------------------
+	global $net2ftp_settings, $net2ftp_globals;
+
+	if(isset($net2ftp_settings["textarea_encodings"])) {
+
+		echo "<select name=\"encodingSelect\" id=\"encodingSelect\">\n";
+		foreach($net2ftp_settings["textarea_encodings"] as $value) {
+			if(strcasecmp($value, $text_encoding) == 0) { $selected = "selected=\"selected\""; }
+			else                                        { $selected = ""; }
+			echo "<option value=\"$value\" $selected>$value</option>\n";
+		}
+		echo "</select>\n";
+	}
+
+
+} // End function printEncodingSelect
+
+function printLineBreakSelect($line_break) {
+
+// --------------
+// This function prints a select with the available line-break sequences.
+// --------------
+
+// -------------------------------------------------------------------------
+// Global variables
+// -------------------------------------------------------------------------
+	global $net2ftp_settings, $net2ftp_globals;
+
+	if($net2ftp_settings["line_break_selector"]) {
+
+		echo "<select name=\"breakSelect\" id=\"breakSelect\">\n";
+		foreach(array("CRLF", "CR", "LF") as $value) {
+			if(strcasecmp($value, $line_break) == 0) { $selected = "selected=\"selected\""; }
+			else                                     { $selected = ""; }
+			echo "<option value=\"$value\" $selected>$value</option>\n";
+		}
+		echo "</select>\n";
+	}
+
+
+} // End function printLineBreakSelect
+
+// **                                                                                  **
+// **                                                                                  **
+// **************************************************************************************
+// **************************************************************************************
+
+
+
+
+
+// **************************************************************************************
+// **************************************************************************************
+// **                                                                                  **
+// **                                                                                  **
+
 function syntaxTextareaEncode($string) {
 
 // --------------
diff -r -U 3 net2ftp_orig/settings.inc.php net2ftp/settings.inc.php
--- net2ftp_orig/settings.inc.php	2007-01-21 19:29:17.000000000 +0900
+++ net2ftp/settings.inc.php	2007-01-21 19:33:43.000000000 +0900
@@ -112,6 +112,18 @@
 
 
 // ----------------------------------------------------------------------------------
+// Character encodings and line break selection
+// ----------------------------------------------------------------------------------
+
+//$net2ftp_settings["textarea_encoding_default"] = "EUC-JP";
+//$net2ftp_settings["textarea_encodings"][1] = "UTF-8";
+//$net2ftp_settings["textarea_encodings"][2] = "EUC-JP";
+//$net2ftp_settings["textarea_encodings"][3] = "SJIS";
+
+//$net2ftp_settings["line_break_selector"] = true;
+
+
+// ----------------------------------------------------------------------------------
 // DO NOT CHANGE ANYTHING BELOW THIS LINE
 // ----------------------------------------------------------------------------------
 
diff -r -U 3 net2ftp_orig/skins/blue/edit.template.php net2ftp/skins/blue/edit.template.php
--- net2ftp_orig/skins/blue/edit.template.php	2007-01-21 19:29:17.000000000 +0900
+++ net2ftp/skins/blue/edit.template.php	2007-01-21 18:39:11.000000000 +0900
@@ -12,7 +12,9 @@
 		<td style="vertical-align: top; text-align: <?php echo __("left"); ?>; width: 25%;">
 <?php			printActionIcon("back", "document.forms['" . $formname . "'].state.value='browse';document.forms['" . $formname . "'].state2.value='main';document.forms['" . $formname . "'].submit();", ""); ?> &nbsp; 
 <?php	  		printActionIcon("save", "document.forms['" . $formname . "'].screen.value=3;" . $getCode . "document.forms['" . $formname . "'].submit();", ""); ?> &nbsp; 
-<?php			printTextareaSelect($onchange); ?>
+<?php			printTextareaSelect($onchange); ?> &nbsp;
+<?php			printEncodingSelect($text_encoding); ?> &nbsp;
+<?php			printLineBreakSelect($line_break); ?>
 		</td>
 		<td style="vertical-align: top; text-align: <?php echo __("left"); ?>; width: 50%;">
 <?php			if ($net2ftp_globals["state2"] == "") { ?>

パッチを適用するには、適当なテキストエディタで新規テキストを開き、上記のパッチをコピー&ペーストし、改行コードを CR+LF にして保存してください。ここでは、 "~/net2ftp_encoding.patch" に保存したと仮定します。後は、以下のコマンドを実行すれば全自動で変更が適用されます。 $net2ftp は前回と同じく net2ftp のインストールパスですので、適切に置き換えてください。

cd $net2ftp
patch -p1 < ~/net2ftp_encoding.patch

そうそう、対象バージョンは 0.94 ですので、それ以外のバージョンではうまくいかないかもしれません。その他、パッチが正常に当てらない場合は、目視で該当箇所を見つけて変更してください。差分ファイルの読み方に関してはこちらのページが詳しいです。

使い方

パッチを当てた直後の状態では、オリジナルとまったく同じ動作をするようになっています。追加機能を有効にするには、 "settings.inc.php" で以下の設定を行う必要があります。

設定名機能
textarea_encoding_defaultページの文字コード
textarea_encodings利用する文字コードの配列
line_break_selectortrue で改行コード選択が有効になる

コメントアウトした状態でサンプルの設定が追加されていますので、 UTF-8, EUC-JP, SJIS だけで用が足りるなら、コメントを外すだけで使えます。文字コードを追加する場合は後述の注意点を参照してください。

設定が済んだら、さっそく使ってみましょう。まずは日本語インターフェース、バイナリモードでログインしてください(理由は後述の注意点参照)。あとは、普通にテキストを編集するだけです。 EUC-JP 以外の文字コードでも自動検出によって文字コードが変換され、文字化けせずに表示できるはずです。さらに、ページ上部に文字コードと改行コードを指定するドロップダウンが表示されます。

net2ftp : 文字コード選択

これらのドロップダウンで文字コード・改行コードを選択して保存すれば、 FTP サーバー側のファイルにそれが反映されます。

注意点

今回のパッチはいかんせん付け焼刃なので、いろいろと制限があります。現時点で私が把握している範囲ですが、以下の点にご注意ください。

  • 文字コード変換を利用する場合は、ログイン画面で適切な言語を選択してください。英語 UI のままだとブラウザ側で文字コードを正しく判別できず、文字化けしてしまいます。
  • 同様に、改行コード変換を利用する場合は、ログイン画面でバイナリモードを選択してください。自動モードだと FTP サーバー側で改行コードが変換されてしまい、意味がありません。
  • settings.inc.php で文字コードを指定する場合は、 mbstring のドキュメントの「サポートされる文字エンコーディング」でリストされているもので指定してください。
  • 文字コードの自動判別は textarea_encodings の順序で行われますので、文字コードを正しい順序で並べないと自動判別が正しく働きません。 mbstring の文字コード検出については mb_detect_order のドキュメントをご覧ください。
  • 日本語の文字があまりに少ないと、誤認識して文字化けすることがあります。

その他、もし動作がおかしい点を見つけましたら、ご報告いただけると助かります(^^ゞ

本日は net2ftp の内蔵テキストエディタに文字コード検出・変換機能を追加するパッチをご紹介しました。 net2ftp をインストール際には、ぜひご利用ください。予想外の手間でしたが、これで net2ftp を利用する準備が整いましたので、今後は少し net2ftp を使ってみて、機能や使い方のコツなどが把握できたところでまた記事にしようと思います。けっこう多彩な機能がありそうなので、お楽しみに。

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles