下記の日付が示す通り、このページの内容は古いです。が、僕がほっといた間に、もっとまともな仕様が考案されていました。
興味のある方は、わかば さんのサイト 「若葉的世界」にある SuikaWiki内の、 MLML1.0の仕様確定をまたーりと目指すスレをどうぞ。
MLML (メーリングリストマークアップ言語) は、XML アプリケーションであり、 メーリングリスト (ML) に関する情報をまとめる機能を持ちます。 ネーミングを先に考えたんで、実用性があるかどうかはまだわかりません。 いや、そのネーミングにしても、「同ネタ多数」っぽい気がしますが。
説明する前に、架空のメーリングリストについてMLMLで記述した、 次の例を見てください。
<?xml version="1.0"?> <mlml> <ml title="どら焼きメーリングリスト"> <desc> 全国のどら焼き愛好家のためのメーリングリストです。 半年ごとにオフ会もやってます。 </desc> <site href="http://www.dorayaki.gr.jp/" title="日本どら焼き愛好会"/> <site href="http://www.dorayaki.gr.jp/ml/" title="どら焼きメーリングリスト"/> <admin> <desc> 当MLの管理は、日本どら焼き愛好会のメンバーが担当しています。 現在の担当者は、愛好会会長の餡野です。 </desc> <mail> <to>admin-dorayaki-ml@dorayaki.gr.jp</to> </mail> <site href="http://www.dorayaki.gr.jp/people/anno/"/> <mail> <to>anno@dorayaki.gr.jp</to> </mail> </admin> <join> <desc>投稿すると自動的に登録されます。</desc> <mail> <to>dorayaki-ml <dorayaki-ml@dorayaki.gr.jp></to> </mail> </join> <bye> <desc>メールを送ってください。</desc> <mail> <subject><void/></subject> <to>control-dorayaki-ml@dorayaki.gr.jp</to> <main>unsubscribe <myaddress/><br/>end<br/></main> </mail> </bye> <post> <desc>メールアドレスのない方のために、サイトからも参加できます。</desc> <mail> <to>dorayaki-ml <dorayaki-ml@dorayaki.gr.jp></to> </mail> <site href="http://www.dorayaki.gr.jp/ml/list.cgi"/> </post> <archive> <desc> バックナンバーをメールで取り寄せることができます。 もちろん、投稿用のサイトでも読めます。 </desc> <mail> <to>dorayaki-ml <dorayaki-ml@dorayaki.gr.jp></to> </mail> <site href="http://www.dorayaki.gr.jp/ml/list.cgi"/> </archive> </ml> </mlml>
この例は MLML のほぼすべての要素を使い、メーリングリスト自体の紹介と、 登録・投稿・脱退や過去の投稿を取り寄せるための方法を示しています。
mlml は MLML ドキュメントのルート要素です。マークアップ言語の名前を ルート要素の名前にするのは嫌いなのですが、他に思いつきませんでした。 属性はありません。子要素は任意の数の group ないし ml です。
ml が 1 つの ML を表す要素です。 上記の例では 1 つの ML しかなかったので ml も 1 つしかありませんが、 MLML では複数の ML の情報を 1 ドキュメントにまとめることができます。 でなければルートが ml になって気分的にはすっきりするんですが。 属性には、メーリングリストの名称を示す title があります。 子要素は、desc を 0 または 1 つ、 続いて任意の数の site ないし mail、 さらに admin、join、bye、post、 archive がこの順番で続きますが、admin 以降は それぞれ 0 または 1 個です。
複数の ML の情報を記述する際の「オプション」として、group 要素が あります。便宜のために title 属性で名前を付けることができます。 子要素は任意の数の group または ml です。
admin、join、bye、post、 archive は、属性も子要素も共通しています。どれも、 ML に参加する (あるいは参加をやめる) ための手段を表す要素で、順に、 管理者へのアクセス、登録、脱退、投稿、バックナンバーへのアクセスを意味します。 ここでも bye という要素名は「違うだろ」という感じですが、 「抜ける」を辞書でひいたところ「leave」と載っていまして、自分の中では「脱退」と 「leave」はつながらないので保留にしています。「unsubscribe」だと長くていやだし、 かといって半端に略すのもいやだという、わがままを言っています。
これらの要素は、属性を持ちません。子要素には、 最初に 0 または 1 個の desc、続いて 任意の数の site ないし mail をもちます。
ここまでで説明した要素の中で、ml、admin、 join、bye、post、archive は、 子要素の持ち方が共通しています。最も、ml だけは少し違いますが、 初めの方は他の 5 つと同じです。
desc は、これらの要素につける説明文です。属性はありません。 中身は PCDATA なので、HTML のようにいろいろ「飾りつける」ことはできません。 コメントも禁止です (ホントか?)。プログラムでこの情報を表示する場合は、
という段階を踏んで表示します。この 3 段階は、それぞれ必要なだけ繰り返してから 次の段階に進みます。従って、処理がおわって表示されるテキストは、
、という条件を満たすはずです。途中に空行があるのはそのまま残りますね。 下手な説明ですいません。
site要素は、ウェブサイトでその行動が行なえることを示します。 例えば、CGI を使った登録フォームなどです。属性はその URI を示すhrefと、 そのサイトの名前を示す title です。 title は HTML 4.0 にある title 属性と同様です。
mail は、メールを出すことでその行動が行なえることを示す要素です。 属性はなく、子要素は subject、to、header、 mainです。現れる場合はこの通りの順番です。 header は 0 回以上、他の 3 つは 0 または 1 回です。 これらの子要素をつかうことで、出されるメールの形式を指定することができます。
mail と site を子要素に持つ場合はすべて、 mail と site は順不同・回数任意で記述できます。 mail と site が複数あると、その行動を行なうのに 複数の手段があることを示します。プログラムによっては、MLML で書かれた情報から 直接に登録などの作業を行なえるものもあるかもしれません。この場合、 ユーザーはその mail と site から選ぶことができますが、 上にあるものほど優先度が高いと考えます。従って、ブラウザもメーラーも 利用できるとすると、ユーザーが明示的に選択しなければ先頭のものが選ばれます。 ブラウザが利用できなければ mail の中でもっとも上にあるものが 選ばれますし、メーラーが利用できない場合も考え方は同じです。
メールの形式を指定するのが subject、to、 header、main の各要素です。 それぞれ、標題、宛先、Subject: やTo: 以外のメールヘッダ、本文を表します。 本文を書くだけの要素を main とするのも気が進まないところです。 そのうち変えます。たぶん。
これらの 4 つの要素は、基本的には PCDATA を子に持つのですが、
そこに myaddress、myname、br、any、
void の各要素を混ぜることができます。例えば main 要素に
「Hello」という PCDATA を入れると、本文に「Hello」とだけ書いたメールを送ることを
意味します。myaddress と myname はそれぞれ
ユーザーのメールアドレスと名前を意味するプレースホルダです。
プログラムが mail 要素の情報を利用して登録などを行なう場合は、
実際のデータに置き換えて送信します。br は改行記号、
any は任意のテキスト、void は空文字列です。
実際にはメーラーによっては末尾に署名などを負荷してしまうかも知れません。
よく使われるのは、おそらく main に
「subscribe <myaddress/> <myname/><br/>end<br/>
」
とするパターンでしょう。
subject、to、main は、指定しない場合は
「<any/>
」をデフォルトの中身であるとします。
anyは「任意のテキスト」ですから、実際にはタグとして書かれることは
あまりないかもしれません。逆に「標題は必ず空にしておくって欲しい」
といった場合には void をつかうことになります。
header は、Cc: などのメールヘッダを指定するために使います。 複数書いてもかまいません。ヘッダ名を示す name 属性を持ち、 それに対する値は要素の中身として記述します。あまり意味がないかもしれません。 使いみちとして思いつくのは、Cc: を void 指定することぐらいですかね。 あとは、うーん、登録時に独自のヘッダに「MLML」という値を書かせて、 新規登録者のどれくらいが MLML 対応のプログラムを利用したかを 数えることができるかもしれません。そんなん調べてもおもしろくないでしょうけど。
subject、to、header、main の 中身は、desc と同様の処理を施してからプレースホルダを置き換えます。 逆だと、名前が空白で終わる人 (いるか?) の名前を削ってしまうことになるからです。
書いてるとなんとなく「つかえそう」な気がしてきたので、もうすこし厳密に 定義するかも知れません。しかし、そんなやたらに ML に入る人っているのかな。 ブラウザでスクリプト使って XML が処理できる、みたいな「インフラ」がないと、 誰も使わないだろうなー。