Diary Markup Language DML


Version 0.03 [2003/1/26]

最近、DanaのLauncherにセットして使っているもの。言語仕様を一通り使って動くので公開。

日記マークアップ言語dml仕様

  1. 今のところ、HTMLへの単なるコンバータである。変換仕様は更新日記仕様である(^^;)v
  2. 日記の日付(DA:)は行頭に単独で置く。自動的に日付を生成してくれる。
  3. 日記のカテゴリー(C: catogory)とタイトル(T: title)はセットで書く必要がある。":"とデータの間にはスペース文字が少なくとも一つ必要で、行頭から書く。行末がデータの区切りである。タイトルにはハイパーリンクを含めることができる。ハイパーリンクにはURLとタイトルを記述する必要がある。記法は"[U: url;T: title]"となる。ハイパーリンクのタイトルは日記のタイトルの一部となるようにしてもよい。自動的にカテゴリ名には更新日記インデックスへのリンクが張られ、タイトルにはカテゴリ別のアンカーが付加される。アンカー名は"category_name_id"となり、idにはPerlのtime関数の出力が使われる。
  4. 記述(DE: description)は行頭から書く。改行までが一つの段落になる。新しい段落を作る場合には、新たに行頭から"DE: "で書く。記述にはハイパーリンク、アンカーとイメージを含めることができる。ハイパーリンクの記法は"[U: url;T: title]"、"[U: url]"の二つであり、後者はurlの文字列にリンクする。アンカーの記法は"[N: anchor_name;T: title]"で、アンカー名は"anchor_name_id"となる。idにはPerlのtime関数の出力が使われる。イメージの記法は三種類、イメージのみの"[I: imagefile]"、イメージにハイパーリンクとタイトルを付加できる"[U: url;I: imagefile;T: title]"、イメージのタイトルにハイパーリンクを付加できる"[U: url;I: imagefile;U: url;T: title]"がある。
  5. 行頭の"PRE:"の行と"/PRE:"の行で挟まれた行は<>のみが文字符号に置換されて出力される。スクリプトやHTML等の出力用。
  6. 行頭の"HTML:"の行と"/HTML:"の行で挟まれた行はそのまま出力される。この部分は前述のスクリプトに含まれない(^^;)今、リスト記法がないので臨時で作った(^^;;;が、自由にHTMLを書くことができる。
  7. リストを書くために、"UL:"と"/UL:"のみの行で囲まれた行を行単位のリストと見做す。"OL:"と"/OL:"も使える。
  8. 書く順序は、必要な順序で必要な部分だけ書けばよい。例えば、日記に項目を追加する場合は"DA:"(日付)は不要である。"C: "(カテゴリ)と"T: "(タイトル)は順不同だが、続けて書くこと。
  9. DMLは小文字で書いても良い。

%categories = (
      "rn" => "更新履歴",
      "cw" => "Cygwin",
      "ps" => "PS2 Linux",
      "com" => "コミュニケーション",
      "ai" => "A.I.",
      "book" => "蔵書目録",
      "awking" => "AWKING Project",
      "awk" => "AWK",
      "net" => ".net",
      "os" => "Operating System",
      "tt" => "立花 隆",
      "perl" => "Perl",
      "ruby" => "Ruby",
      "tcl" => "Tcl/Tk",
      "python" => "Python",
      "prolog" => "Prolog",
      "linux" => "Linux",
      "printing" => "Printing",
      "hiroshima" => "ひろしま",
      "an" => "ArrangeNote",
      "qnx" => "QNX",
      "web" => "Web Development",
      "diary" => "日記",
      "scheme" => "Scheme",
      "tsn" => "TS Network",
      "tip" => "Tips",
      "col" => "コラム",
      "xml" => "XML",
      "vm" => "VMware",
      "freebsd" => "FreeBSD",
      "computing" => "Computing",
      "lang" => "言語",
      "card" => "カード",
      "oo" => "OpenOffice",
      "sf" => "SF",
      "wbh" => "WinBatchEh",
);
$title = "";
$category = "";
sub linking{
            $id = time;
            $_[0] =~ s/\[U:\s+([^;]+);T:\s+([^\]]+)\]/<a href="$1">$2<\/a>/gi;
            $_[0] =~ s/\[N:\s+([^;]+);T:\s+([^\]]+)\]/<a name="${1}_$id">$2<\/a>/gi;
            $_[0] =~ s/\[U:\s+([^;\]]+)\]/<a href="$1">$1<\/a>/i;
            $_[0] =~ s/\[I:\s+([^;\]]+)\]/<IMG SRC="$1" ALIGN=CENTER HSPACE=20 ALT="$1">/i;
            $_[0] =~ s/^\[U:\s+([^;]+);I:\s+([^;]+);T:\s+([^\]]+)\]$/<a href="$1"><IMG SRC="$2" ALIGN=CENTER HSPACE=20 ALT="$2"><\/a>$3/i;
            $_[0] =~ s/^\[U:\s+([^;]+);I:\s+([^;]+);U:\s+([^;]+);T:\s+([^\]]+)\]$/<a href="$1"><IMG SRC="$2" ALIGN=CENTER HSPACE=20 ALT="$2"><\/a><a href="$3">$4<\/a>/i;
            return $_[0];
}
while(<>){
      chomp;
      if(/^DA:$/i){
            $thisday = ("Sun.","Mon.","Tue.","Wed.","Thu.","Fri.","Sat.")[(localtime)[6]];
            $mon = (localtime)[4] + 1;
            $mday = (localtime)[3];
            $year = (localtime)[5] + 1900;
            print "<DT>$mon/$mday/$year ($thisday)<DD>\n";
      }elsif(/^C:\s+(.+)$/i){
            $category = $1;
            if($title ne ""){
                  $catid = time;
                  print "<div class=\"emph\"><A HREF=\"renewal_index.html#$category\">[$categories{$category}]</A> <A NAME=\"${category}_$catid\">$title</A></div>\n";
                  $title = "";
            }
      }elsif(/^T:\s+(.+)$/i){
            $title = $1;
            $title =~ s/\[U:\s+([^;]+);T:\s+([^\]]+)\]/<a href="$1">$2<\/a>/i;
            $title =~ s/\[U:\s+([^;\]]+)\]/<a href="$1">$1<\/a>/i;
            if($category ne ""){
                  $catid = time;
                  print "<div class=\"emph\"><A HREF=\"renewal_index.html#$category\">[$categories{$category}]</A> <A NAME=\"${category}_$catid\">$title</A></div>\n";
                  $category = "";
            }
      }elsif(/^DE:\s+(.+)$/i){
            $cont = $1;
            $description = &linking($cont);
            print "<p>$description</p>\n";
      }elsif(/^PRE:$/i){
            print "<pre>\n";
            $pre = 1;
            next;
      }elsif(/^\/PRE:/i){
            print "</pre>\n";
            $pre = 0;
            next;
      }elsif(/^HTML:$/i){
            $html = 1;
            next;
      }elsif(/^\/HTML:$/i){
            $html = 0;
            next;
      }elsif(/^UL:$/i){
            print "<ul>\n";
            $ul = 1;
            next;
      }elsif(/^\/UL:$/i){
            print "</ul>\n";
            $ul = 0;
            next;
      }elsif(/^OL:$/i){
            print "<ol>\n";
            $ol = 1;
            next;
      }elsif(/^\/OL/i){
            print "</ol>\n";
            $ol = 0;
            next;
      }
      if($pre == 1){
            s/</</g;
            s/>/>/g;
            print $_, "\n";
      }
      if($html == 1){
            print $_, "\n";
      }
      if($ul == 1){
            $str = &linking($_);
            print "<li>$str\n";
      }
      if($ol == 1){
            $str = &linking($_);
            print "<li>$str\n";
      }
}


TS Network ☆ミ >> (C)jscripter