#!/usr/local/bin/ruby
=begin
【mkdiary.rb 用サンプ ルの「本文→HTMLフィルタ」】
mkdiary.rb のメイル処理モードでは、(見出しの次の行からの)本文相当部分
を適当に見繕ってHTML形式にするスクリプトを指定できる。たとえば、このへ
ぼいスクリプトを使う場合は ~/.mkdiaryrc に
bodyfilter=body2html
と書いて、このスクリプトを動作している mkdiary.rb と同じディレクトリに
コピーすると、メイル処理でこのスクリプトを利用するようになる。
このスクリプトが自動生成できるHTML要素と、その元となるメイル本文は以下の通り。
段落(
〜
)
行頭から文章を書き始めた部分から、空行まで。
引用段落(〜
)
タブ一個直後に文章を書き始めた部分から、空行まで。
叫び(〜
)
タブ二個直後に文章を書き始めた部分から、空行まで。
各行の末尾にそれぞれ
が追加される。
PRE段落()
スペース一個直後に文章を書き始めた部分から、空行まで。
箇条書()
タブ一個直後に "* " (アスタリスク+半角スペース)
番号付き箇条書(〜
)
タブ一個直後に 半角数字半角ピリオド
大見出し(〜
)
行頭に半角の = と半角スペースがあると
ほげほげ
になる
全ての単位は空行で区切られるので終わりたい部分には改行だけの行を入れ忘れ
ないように注意すること!! またいずれの単位も行頭が < ではじまっている場合
はその行を生HTMLの記述だとみなしてそのまま表示し、次の行に判断を先送りす
る。
変換例:
【メイル本文】------------------------------------------------------------
m=変換方法
行頭からどんどん続けていく部分は
HTMLでの p エレメントとなる。ただし、
1. タブ一個 + 数字 + ピリオド
2. タブ一個 + * + スペース
3. タブ一個 + 文章
4. タブ二個 + 文章
5. スペース一個 + 式
という部分は特別に処理される。それぞれ、番号付き箇条書, 箇条書, ブロック
クォート、センタリング+でかい文字、クォートしたpreエレメント、に変換され
る。なお、特別にセンタリングや <a href=...> などを示すような簡易記号を導
入する予定は無い。なぜなら、簡易記法を導入すると、どんどん増やしたくなり、
それ自身を覚えるのが大変になって来て
だったらHTML覚えた方が早い
という元の黙阿弥状態になってしまうからである。
【変換後のHTML部分】------------------------------------------------------
変換方法
行頭からどんどん続けていく部分は
HTMLでの p エレメントとなる。ただし、
- タブ一個 + 数字 + ピリオド
- タブ一個 + * + スペース
- タブ一個 + 文章
- タブ二個 + 文章
- スペース一個 + 式
という部分は特別に処理される。それぞれ、番号付き箇条書, 箇条書, ブロック
クォート、センタリング+でかい文字、クォートしたpreエレメント、に変換され
る。なお、特別にセンタリングや <a href=...> などを示すような簡易記号を導
入する予定は無い。なぜなら、簡易記法を導入すると、どんどん増やしたくなり、
それ自身を覚えるのが大変になって来て
という元の木阿弥状態になってしまうからである。
---------------------------------------------------------------------------
これを使えば割と楽にメイルでHTMLが書けるだろう。でもあれだな、携帯電話だ
とTABコードが入れられないか。んー、じゃあ、スペース二個でTAB一個の代わり
という風にでもしておくか。
=end
$quotestarter = "\n"
$quoteender = "
\n
"
$samplestarter = ""
$shoutstarter = ""
$shoutender = "
"
$ulpattern = "[-*]\s"
$ulstarter = ""
$olpattern = "(\\d+\.\|\\(?\\d+\\))"
$olstarter = ""
$olender = "
"
$tab = "(\t| )"
in_p = false
in_qt = false
in_ul = false
in_ol = false
in_pre = false
in_samp = false
in_shout = false
ender = ''
while line=gets
if (in_p || in_qt || in_shout || in_samp) then
if /^$/ =~ line
print "#{ender}\n"
if in_p
in_p= false
elsif in_qt
in_qt = false
elsif in_shout
in_shout = false
elsif in_samp
in_samp = false
end
else # continues
if in_samp then
line.sub!(/^ /, '') # strip one indent exactly (in )
else
line.sub!(/^\s*/, '')
end
if (in_shout) then print "
" end
print line
end
elsif (in_ul)
if /^#{$tab}#{$ulpattern}/ =~ line
print "
" + $'
elsif /^$/ =~ line
in_ul = false
print "#{ender}\n"
else
print line
end
elsif (in_ol)
if /^#{$tab}#{$olpattern}/ =~ line
print " " + $'
elsif /^$/ =~ line
in_ol = false
print "#{ender}\n"
else
print line
end
elsif (in_pre)
print line
if %r,$, =~ line
in_pre = false
end
elsif /^ =~ line # lines that begin with
print line
elsif /^#{$tab}#{$tab}\S/ =~ line
print "#{$shoutstarter}" + line.sub!(/^\s*/, '')
in_shout = true; ender = $shoutender
elsif /^#{$tab}#{$ulpattern}/ =~ line
line = $'
print "#{$ulstarter}\n " + line
in_ul = true; ender = $ulender
elsif /^#{$tab}#{$olpattern}/ =~ line
line = $'
print "#{$olstarter}\n " + line
in_ol = true; ender = $olender
elsif /^#{$tab}\S/ =~ line
print "#{$quotestarter}" + line.sub!(/^\s*/, '')
in_qt = true; ender = $quoteender
elsif /^/i =~ line
print line
in_pre = true
elsif /^ \S/ =~ line
print "#{$samplestarter}" + line.sub!(/^\s*/, '')
in_samp = true; ender = $sampleender
elsif /^(m=|= +)(.*)$/ =~ line
print "" + $2 + "
\n"
elsif /^\S/ =~ line
print "" + line
in_p = true; ender = "
";
end
end
if (in_p)
print "\n"
elsif (in_qt)
print "#{$quoteender}\n"
elsif (in_shout)
print "#{$shoutender}\n"
elsif (in_samp)
print "#{$sampleender}\n"
elsif (in_ol)
print "#{$olender}\n"
elsif (in_ul)
print "#{$ulender}\n"
elsif (in_shout)
print "#{$shoutender}\n"
end