マジックコメントを利用して軽量markup


『Fate/kaleid liner プリズマ☆イリヤ』
4期まで作られたってことで、相当面白いのだろう、と半信半疑で視聴しましたが、面白いです。主にバトルが。魔法のステッキで変身できるようになるのですが、魔法少女になってもさほど強くない。むしろ弱いし、やる気もない。魔法少女なんか面白いかも、的に始めたら、死と隣合わせなので、急に尻込み。変身も解けちゃって、あああ、もうだめだあ、と思っていたら、魔法少女への変身はまったく必要もないという感じで、急に強くなります。シリアスでキレキレのバトル始めたところから、面白くなって一気に見ました。バトルが一段落して、日常に戻ると見てる方としては急に恥ずかしくなってきます。なんせ主人公は小学生ですからね。登場人物に男性が少ないなあと思っていたら、小学生のGLっぽいものがあったり、DVDスキップしてやりたい気持ちを抑えて見てるとすぐに、バトルが始まってまた面白くなるので、飽きずに見られます。
では魔法つながりで、マジックを使ってみます。プログラミング関連のマジックは、シェバン(#!)を始めとするマジックナンバーや、記述を楽にするマジックオプション等ありますが、今回はマジックコメントを使ってみます。(ここではコメント以外の目的で使用するコメントのことをマジックコメントと呼んでいます)

自作の軽量markup言語を作る時、データとスクリプトをばらばらにしてしまうと、どのスクリプトとどのデータが対応しているのやら、わけがわからなくなりますので、バージョン管理等うまく管理しなければなりません。いっそのことスクリプトとデータを一緒にしてしまえば、管理の煩わしさがなくなりますが、そんな時マジックコメントが使えます。
lwmarkup-title
上図のように、前半をコメント部、後半をスクリプト部に分けます。このスクリプトとは前半のコメントに書かれた自作軽量markup言語の解析を行ってHTMLを生成するスクリプトです。

下が具体的なスクリプトです。行頭に#が2個連続で続いた場合にマジックコメントとみなして、自作のmarkup言語の解析を行います。生成するHTMLはただのTABLEです。
BEGINとENDに挟まれた一区画が一つのTABLEです。タブ区切りでを生成します。

~$ cat -n lwmarkup.pl
     1	#!/usr/bin/perl
     2	##
     3	##
     4	##	BEGIN
     5	##	1	2
     6	##	3	4
     7	##	END
     8	##
     9	##
    10	##	BEGIN
    11	##	1	2	3	4
    12	##	5	6	7	8
    13	##	9	10	11	12
    14	##	END
    15	##
    16	##
    17	
    18	open(IN,"<$0");
    19	while(<IN>){
    20		next unless /^##/;
    21		s/^##\t//;
    22		if(/END/){
    23			print "</table>";
    24			$status="";
    25		}
    26		if($status eq "TABLE"){
    27			my @td = split /\t/,$_;
    28			print "<tr>";
    29			foreach(@td){
    30				print "<td>$_</td>";
    31			}
    32			print "</tr>";
    33		}
    34		if(/BEGIN/){
    35			print "<table border=1>";
    36			$status="TABLE";
    37		}
    38	}
    39	close(IN);
    40	

18行目の$0には、スクリプトのファイル名が格納されています。 スクリプト名が変わっても大丈夫です。

以下のように本スクリプトを実行すると、

~$ ./lwmarkup.pl > a.html

このようなテーブルが出来上がります。

lwmarkup-001

日本でプログラム中の直値もマジックナンバーと呼ばれるようになったのは、いつからでしょうか。文字通り「魔法の数字」の意味で、マジックナンバーだと思っていましたが、言葉は生きているのでしょうね。という私も最近まで、軽量マークアップ言語=Markdownと誤解していました。正しくは、Markdown in 軽量マークアップ言語、ですね。

One response to “マジックコメントを利用して軽量markup

  1. Great ingsthi! That’s the answer we’ve been looking for.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA