WP Category Tag Cloud がぶっ壊れたで起こっているのとおんなじことが、「道具」群で。
fontune、SkyScanner、命名規則のための名前変形処理@(Python + jquery + json)。これも <p> やら <br/> やらを撒き散らされて全滅。何してんだ、誰がやってんだ。これが「サニタイズ」とかなんだとしたら笑っちまうぜ、酷すぎねぇか?
ただ幸いなことにこれらはどうせ自作なので、簡単に措置は出来た。要は改行しなきゃいいわけで。
1 /**
2 *
3 */
4 function fortune_js_handler($atts, $content=null) {
5 $str=<<<eot
6 /*省略*/
7 eot;
8 /* 改行コード、空白の連続を一個の空白に */
9 return preg_replace("/[ \n]+/", " ", $str);
10 }
11 add_shortcode('fortune_js', 'fortune_js_handler');
注意しなければいけないこと。javascript はかなり緩い言語仕様なので、普通であれば、
1 var a = 1
2 var b = 1;
は許されてしまいますな(セミコロンの抜け)。でも「改行コード、空白の連続を一個の空白に」すると、
1 var a = 1 var b = 1;
となるね。このような置換後コードが動くか動かないかは運次第。適用前にセミコロンはちゃんとしとくがいいね。それともっと被害甚大なのがコメントの形式な。
1 //var a = 1;
2 var a = 3;
3 /*var b = 1;*/
これが
1 //var a = 1; var a = 3; /*var b = 1;*/
こうなる。はいぃ、アウト。
注意すべきことはこれだけね。
なお、「問答無用に<p> やら <br/> やらを撒き散らされ」る振る舞いにはなにか「それらしい仕様」があるようで、不思議なことに
- style要素の終了タグの直後に問答無用で改行する
- style要素の終了タグの直後に問答無用で改行後、なぜかパラグラフ(<p>)が開始する
らしい。つまりは、preg_replace さえも無碍にしてしまう強烈なものなのだが、まぁスクリプトの動作には問題ないみたい。
どうも head セクションなら加工は行われず、body セクション内をゴリゴリ書き換え出すようであって、なんというか、まっとうに css、javascript を外出しのファイルにして head 内で link で読み込む、とすればこの問題は起こってなかったのであろうな。
いまのところはどの「道具」も所詮はオモチャなので別段致命傷ではないけれど、これ、商売だったらえらい損害だったろうね。
2015-06-20 23:15 追記
この話の「しかるべき対処」についてはWordPress での自動パラグラフやらバッククオートがcodeになったりやらを無効化参照。