長年どうしたら良いんだろーと考えていたことが今日判明。

smartyでcsvファイルを吐き出すってのは個人的に良くやる。
そん時に改行コードを任意の場所に出力したいとずっと思っていた。
例えば、csvファイルをエクセルで開くとカンマ毎にセルで表示されるんだけど、そのセルの中で改行したい時とか。
そもそもcsvファイルでそこまでやらなくちゃいけないのかって言われると、NOだと思うけどね。

で、普通に\\rとか\\nとかいれるとそのまんま出力されちゃう。
で、どうしたものかと考えて適当に書いたら上手くできた。

{"\\r\\n"}


コンパイルされたファイルを見れば早かったんだけど、
{"hoge"}

echo "hoge"

と出力されとる。

んー案外シンプルだったなー。
さっさとコンパイルしたファイル見ればよかった。
でもまあ、上手くいったので良かった良かった。
このブログソースコードが以下の点で凄く見難かった。

1.phpのnl2br関数を使っているので、preタグの中でも改行されてしまう。
2.全て同じ色

で、素直にはてな日記とかで書こうかなと思ったんだけど、そういうのを解決していくのが勉強かなと思い留まり、頑張って実装してみた。

まずは、1つめの改行問題について。
smartyで独自の修飾子で解決できないかなと考え、いろんなところからソース探してきてこんなものが出来た。
参考サイト:No Such Blog or Diary - Nucleus の改行をちょっと頭よくする
function smarty_modifier_mynl2br($value)
{
$i=0;
$v2="";
$n=mb_strlen($value);
while($i<$n){
$p=mb_strpos($value,"<pre",$i);
if($p==FALSE){
$v2.=nl2br(mb_substr($value, $i));
break;
}
$v2.=nl2br(mb_substr($value, $i,$p-$i));
$i=$p;
$p=mb_strpos($value,"</pre>",$i);

// 1つも無い場合
if($p==FALSE){
$v2.=mb_substr($value, $i);
break;
}

$v2.=mb_substr($value, $i,$p-$i);
$i=$p;
}
return $v2; }

これで一応preタグ間はbrタグ入らないようになった。

続いて2の問題については、いろいろ探したらjavascriptで色つけれる奴があるみたいだった。
一番簡単そうなのが、Javascript code prettifierって奴だったので、以下のサイトを参考に実装。
参考サイト:コードをプリティに整形するjavascript「code prettifier」 : skuare.net

で、DBに格納しているデータそのものにprettifierってclass名をつけるのがなんだか嫌だったので、これまたsmartyの修飾子を作成。
function smarty_modifier_prettyprint($value)
{
$result = str_replace('<pre', '<pre class="prettyprint"', $value);
return $result; }

んで、smartyのテンプレートで2つとも呼んでやればOKってことにした。
キレイキレイ。