WordPress:インポーターで<pre></pre>内のスペースが削除される

はてなブログで運用している3つのサイトを WordPress に移行中です。すでにひとつは移行完了しています。


次に当サイトを移行しようとしているのですが、WordPress に付属している「Movable Type と TypePadインポーター」を使いますと、<pre></pre> でくくった整形済みのテキストのスペースが削除されてしまいフォーマットが崩れてしまいます。



スペースが削除されてしまう

f:id:ausnichts:20220308195536j:plain

これがはてなブログでの <pre></pre> の表示です。


f:id:ausnichts:20220308195643j:plain

それを WordPress 付属の movabletype-importer インポーターでインポートしますとこういう結果になります。文字色はスタイルが設定していないためですのでこの問題とは関係がありません。


原因は $line = trim($line);

インポーターは /wp-content/plugins/movabletype-importer/movabletype-importer.php ですが、その340行目に

$line = trim($line);

というコードがあり、テキストファイルを1行ずつ取り出して行頭のスペースを削除してしまう処理があります。


これが原因ですね。


対策

インポーターは一度だけ使用する処理ですのでソースを書き換えても問題は発生しません。次のように書き換えます。


     while ( $line = $this->fgets($handle) ) {
// <pre></pre>内のスペースが削除されないように
            if(preg_match('/^(?=<pre.*)(?!.*<\/pre>)/', $line)){
                $my_flg = true;
            }else if(preg_match('/<\/pre>/', $line)){
                $my_flg = false;
            }
 
            if($my_flg){
                if(!preg_match( '/^[\r|\n|\r\n]/', $line)){
                    $line = preg_replace( '/\r|\n|\r\n/', '', $line);
                }
            }else{
                $line = trim($line);
            }
// ここまで(下の1行がオリジナル)
//          $line = trim($line);

            if ( '-----' == $line ) {
                // Finishing a multi-line field


結果

f:id:ausnichts:20220308201628j:plain

<pre></pre> 内のスペースが保持されるようになりました。