高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

ひらめき

 おぉ、昨日買い物中にひらめきまして、早速テキストファイルに打ち込んでみたところ…。改行(形式段落)をpに、さらに意味段落をdivに変えるということは出来ました。もちろん、対象はスカラ変数ですよ。
※ 以下はすべて正規表現の区切り文字に、///ではなく{}{}を使ってます。

$_ = join('', <STDIN>);
s{^(.+)$}{<p>$1</p>}mg;     # 段落で囲む
s{((&lt;p>.+&lt;/p>\n)+)}{<div class="section">\n$1</div>\n}g; # pを段落で囲む
s{^$}{}mg;
print;

 さらに、ちょっとしたはてな記法を導入してみます。ul, ol, h?の展開機能を付加です。

$_ = join('', <STDIN>);
$hcode = 3 - 1; # 何段階目からのヘッダ(h?)を使う?
s{^(?!-|\+|\*|\.)(.+)$}{<p>$1</p>}mg;         # 段落で囲む
s{^\.(\w+)\s?(.+)$}{<p class="$1">$2</p>}mg;  # 段落で囲む(クラス指定)
s{^-(.+)$}{<li class="ul">$1</li>}mg;         # ulのリスト
s{^\+(.+)$}{<li class="ol">$1</li>}mg;        # liのリスト
s{^(\*{1,3})(.+)$}{
  $hl = (length($1) + $hcode) > 6 ? 6 : length($1) + $hcode;
  "<h$hl>$2</h$hl>";
}mge; # h?
s{((<p>.+</p>\n)+)}{<div class="section">\n$1</div>\n}g; # pを段落で囲む
s{((<li class="ul">.+</li>\n)+)}{<ul>\n$1</ul>\n}g; # ulで囲む
s{((<li class="ol">.+</li>\n)+)}{<ol>\n$1</ol>\n}g; # olで囲む
s{^$}{}mg;
print;

 liにclassをつけなければulとolの別が分からないあたり、ちょっと不細工ですが、これでいいと思います。
これで、はてなと同じようなやり方で、h?タグ、li, ul, olが挿入できます。CGIで何かドキュメントを書くときには、これほど便利なものはないかも。さらにおまけで、.class 文字列…と書いて、段落のクラス指定も出来るようになってます。

 さらに<li>は意味段落に含めたい!という場合は、
「<p>.+</p>\n」を「<(p|li|ul).*?>.+\n」に変えるといいです。ユーザーによる投稿は考慮していないので、ユーザー投稿を処理するときは、< > & " は全部変換してから使用します。ちょっと長いので、studyなんかしておくといいかもしれません。


 以上でした。突き詰めると結構いろいろ出来るかも。でもまあ、見た感じ時間はかかりそうなので、全レコードに対してこれを行うなどとなると、速度的に危険かも。ÆüËܸì perl texinfo - studyなんかを見た限りだと、工夫次第でどうにでもなりそうな気はしますが。