Article 作成用フィルター t2h

Article タグ以下に section タグを記述する構造化タグでHTML文書を作ると論理的な文章ができますが、いきなりHTML 文書を作成するのは少々手間がかかります。そこで、テキストファイルを HTML 文書に変換するフィルターを作ってみました。

テキストファイルをHTML文書に変換する

ベタのテキストファイルを articl タグの HTML 文書に変換するフィルターを作りました。article タグと section タグの代わりに、略式タグをつかいます。

略式タグは、英子文字だけを1行に記述します。フィルターを通すと、a は article タグに aa は /article タグに s は section タグに ss は/section タグに、h はすぐ下の行を h1 タグに、p は pre タグに、pp は /pre タグに変換されます。また、アンカータグはそのままスルーします。 段落は空行の下に書くと、段落の先頭に <p> タグを挿入します。

特殊文字の置き換えもやってくれますが。2パスで使うと置き換えた文字を置き換えて変な具合になります。また、完全な置き換えができないで、直接 HTML 文書に手を入れなくてはならない場合もあります。

なんともいい加減なプログラムですが、article タグの文書を作るのはこれで十分です。また、仕様が不足していればすぐに変更できます。自分用のツールは汎用のものより簡単に手を入れてカスタマイズできるもののほうが使いやすいです。

ソース文書例 foo.txt

a
h
タイトル
s
h
セクションの見出し

段落の内容を記入
p
~$ echo hello | sed 's/hello/world/'
world
pp
ss
aa

使い方

~$ t2h foo.txt > foo.html

プログラム名 t2h

#!/usr/bin/ruby
line = gets
while line != nil
  if line == "\n"
    print "\n<p>"
  elsif line == "p\n"
    puts "<pre>"
  elsif line == "pp\n"
    puts "</pre>"
  elsif line == "a\n"
    puts "<article id=\"contents\">"
  elsif line == "aa\n"
    puts "</article>"
  elsif line == "s\n"
    puts "<section>"
  elsif line == "ss\n"
    puts "</section>"
  elsif line == "h\n"
    line = gets
    puts "<h1>" + line.chomp + "</h1>"
  elsif line =~ /<a href/
    puts line
  elsif line =~ /<\/a>/
    puts line
  else
    puts line.gsub(/&/, '&amp;').gsub(/</, '&lt;').gsub(/>/, '&gt;').gsub(/"/, '&quot;')
  end
  line = gets
end

sed 版 t2h.sh

sed 版の t2h も作りました。foo.sed, bar.sed, t2h.sh の3つのファイルで構成されています。

# foo.sed
s/&/\&amp;/g
s/</\&lt;/g
s/>/\&gt;/g
s/"/\&quot;/g

# bar.sed
s/^a$/<article>/
s/^aa$/<\/article>/
s/^s$/<section>/
s/^ss$/<\/section>/
/^$/{n;s/^/<p>/} 
/^h$/{N;s/^h\n/<h1>/;s/$/<\/h1>/}

#!/bin/sh
# t2h.sh
sed -f foo.sed $1 | sed -f bar.sed