Mobile OhYeah!
趣味のブログ
Ajax

(詳細)
タイトル: Pydio エディタのマルチエンコーディング化
投稿者: OhYeah!
日付: 2015-2-6(金)
時刻: 22:59
閲覧数: 33072
内容
以前、このブログで「AjaxPlorer エディタのマルチエンコーディング化」のコードハックを紹介したが、今回はその Pydio 版。Pydio のエディタを UTF-8 だけでなく、EUC-JP, Shift_JIS, ISO-2022-JP に対応させる。
といっても、修正内容はほぼ同じで、修正箇所の探し方がちょっと変わったくらい。このハックにより、UTF-8 以外のエンコーディングでも日本語が化けずに表示されるようになる。エンコーディング変換機能はないので、元ファイルのエンコーディングで保存される。当然、Pydio のエディタでの新規作成は UTF-8 のみとなる。
前回と異なるのは、coreserver の php 周りの仕様変更のせいか、file_put_contents での保存ができないので保存時のファイルロックをかけるのをやめたこと、エンコーディング判定の際に detect order を指定するようにしたことの2点のみだ。

修正するファイルは、今回も plugins/access.fs/class.fsAccessDriver.php だけ。AjaxPlorer 4, Pydio 5/6、いずれも同じ方法で修正可能だ(AjaxPlorer 4 は文括弧やインデントの位置が若干異なるが)。

1. マルチエンコーディング表示
 function readFile の
        if ($headerType == "plain") {
            header("Content-type:text/plain");
        } else if ($headerType == "image") {

を下記のように修正する。

        if ($headerType == "plain") {
            //header("Content-type:text/plain");
            // Added by OhYeah!
            $header = "Content-type:text/plain";
            if (ConfService::getLanguage() == 'ja' && function_exists('mb_detect_encoding')) {
                if (!$data) {
                    $filePathOrData = file_get_contents($filePathOrData);
                    $data = true;
                }
                session_start();
                $_SESSION['edenc'] = mb_detect_encoding($filePathOrData, 'sjis-win,eucjp-win,JIS,UTF-8');
                session_write_close();
                switch (strtolower($_SESSION['edenc'])) {
                    case 'sjis-win':
                        $header .= '; charset=shift_jis';
                        break;
                    case 'eucjp-win':
                        $header .= '; charset=euc-jp';
                        break;
                    case 'jis':
                        $header .= '; charset=iso-2022-jp';
                        break;
                    case 'utf-8':
                       $header .= '; charset=utf-8';
                }
            }
            header($header);
            // End Addition
        } else if ($headerType == "image") {


2. 元ファイルのエンコーディングで保存
function switchAction の case "put_content" の
                }
                $fp=fopen($fileName,"w");

を下記のように修正する。

                }
                // Added by OhYeah!
                if (isset($_SESSION['edenc'])) {
                    $code = mb_convert_encoding($code, $_SESSION['edenc'], mb_detect_encoding($code, 'sjis-win,eucjp-win,JIS,UTF-8'));
                }
                // End Addition
                $fp=fopen($fileName,"w");


(1) 2 ..12 >>