おぉ、昨日買い物中にひらめきまして、早速テキストファイルに打ち込んでみたところ…。改行(形式段落)をpに、さらに意味段落をdivに変えるということは出来ました。もちろん、対象はスカラ変数ですよ。
※ 以下はすべて正規表現の区切り文字に、///ではなく{}{}を使ってます。
$_ = join('', <STDIN>); s{^(.+)$}{<p>$1</p>}mg; # 段落で囲む s{((<p>.+</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).*?>.+\3.*?>\n」に変えるといいです。ユーザーによる投稿は考慮していないので、ユーザー投稿を処理するときは、< > & " は全部変換してから使用します。ちょっと長いので、studyなんかしておくといいかもしれません。
以上でした。突き詰めると結構いろいろ出来るかも。でもまあ、見た感じ時間はかかりそうなので、全レコードに対してこれを行うなどとなると、速度的に危険かも。ÆüËܸì perl texinfo - studyなんかを見た限りだと、工夫次第でどうにでもなりそうな気はしますが。