メーリングリストマークアップ言語 (案)

[2003-08-24 追記]

下記の日付が示す通り、このページの内容は古いです。が、僕がほっといた間に、もっとまともな仕様が考案されていました。

興味のある方は、わかば さんのサイト 「若葉的世界」にある SuikaWiki内の、 MLML1.0の仕様確定をまたーりと目指すスレをどうぞ。


[1998-10-12]

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 &lt;dorayaki-ml@dorayaki.gr.jp&gt;</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 &lt;dorayaki-ml@dorayaki.gr.jp&gt;</to>
         </mail>
         <site href="http://www.dorayaki.gr.jp/ml/list.cgi"/>
      </post>
      <archive>
         <desc>
            バックナンバーをメールで取り寄せることができます。
            もちろん、投稿用のサイトでも読めます。
         </desc>
         <mail>
            <to>dorayaki-ml &lt;dorayaki-ml@dorayaki.gr.jp&gt;</to>
         </mail>
         <site href="http://www.dorayaki.gr.jp/ml/list.cgi"/>
      </archive>
   </ml>
</mlml>

この例は MLML のほぼすべての要素を使い、メーリングリスト自体の紹介と、 登録・投稿・脱退や過去の投稿を取り寄せるための方法を示しています。

mlml、group、ml

mlml は MLML ドキュメントのルート要素です。マークアップ言語の名前を ルート要素の名前にするのは嫌いなのですが、他に思いつきませんでした。 属性はありません。子要素は任意の数の group ないし ml です。

ml が 1 つの ML を表す要素です。 上記の例では 1 つの ML しかなかったので ml も 1 つしかありませんが、 MLML では複数の ML の情報を 1 ドキュメントにまとめることができます。 でなければルートが ml になって気分的にはすっきりするんですが。 属性には、メーリングリストの名称を示す title があります。 子要素は、desc を 0 または 1 つ、 続いて任意の数の site ないし mail、 さらに adminjoinbyepostarchive がこの順番で続きますが、admin 以降は それぞれ 0 または 1 個です。

複数の ML の情報を記述する際の「オプション」として、group 要素が あります。便宜のために title 属性で名前を付けることができます。 子要素は任意の数の group または ml です。

adminjoinbyepostarchive

adminjoinbyepostarchive は、属性も子要素も共通しています。どれも、 ML に参加する (あるいは参加をやめる) ための手段を表す要素で、順に、 管理者へのアクセス、登録、脱退、投稿、バックナンバーへのアクセスを意味します。 ここでも bye という要素名は「違うだろ」という感じですが、 「抜ける」を辞書でひいたところ「leave」と載っていまして、自分の中では「脱退」と 「leave」はつながらないので保留にしています。「unsubscribe」だと長くていやだし、 かといって半端に略すのもいやだという、わがままを言っています。

これらの要素は、属性を持ちません。子要素には、 最初に 0 または 1 個の desc、続いて 任意の数の site ないし mail をもちます。

descsitemail

ここまでで説明した要素の中で、mladminjoinbyepostarchive は、 子要素の持ち方が共通しています。最も、ml だけは少し違いますが、 初めの方は他の 5 つと同じです。

desc は、これらの要素につける説明文です。属性はありません。 中身は PCDATA なので、HTML のようにいろいろ「飾りつける」ことはできません。 コメントも禁止です (ホントか?)。プログラムでこの情報を表示する場合は、

  1. 行頭・行末の空白は削除
  2. 先頭行が空行なら削除
  3. 末尾行が空行ならその行を削除

という段階を踏んで表示します。この 3 段階は、それぞれ必要なだけ繰り返してから 次の段階に進みます。従って、処理がおわって表示されるテキストは、

  1. どの行にも行頭や行末に空白がない
  2. 先頭行は空行でない
  3. 末尾行は空行でない

、という条件を満たすはずです。途中に空行があるのはそのまま残りますね。 下手な説明ですいません。

site要素は、ウェブサイトでその行動が行なえることを示します。 例えば、CGI を使った登録フォームなどです。属性はその URI を示すhrefと、 そのサイトの名前を示す title です。 title は HTML 4.0 にある title 属性と同様です。

mail は、メールを出すことでその行動が行なえることを示す要素です。 属性はなく、子要素は subjecttoheadermainです。現れる場合はこの通りの順番です。 header は 0 回以上、他の 3 つは 0 または 1 回です。 これらの子要素をつかうことで、出されるメールの形式を指定することができます。

mailsite を子要素に持つ場合はすべて、 mailsite は順不同・回数任意で記述できます。 mailsite が複数あると、その行動を行なうのに 複数の手段があることを示します。プログラムによっては、MLML で書かれた情報から 直接に登録などの作業を行なえるものもあるかもしれません。この場合、 ユーザーはその mailsite から選ぶことができますが、 上にあるものほど優先度が高いと考えます。従って、ブラウザもメーラーも 利用できるとすると、ユーザーが明示的に選択しなければ先頭のものが選ばれます。 ブラウザが利用できなければ mail の中でもっとも上にあるものが 選ばれますし、メーラーが利用できない場合も考え方は同じです。

subjecttoheadermain

メールの形式を指定するのが subjecttoheadermain の各要素です。 それぞれ、標題、宛先、Subject: やTo: 以外のメールヘッダ、本文を表します。 本文を書くだけの要素を main とするのも気が進まないところです。 そのうち変えます。たぶん。

これらの 4 つの要素は、基本的には PCDATA を子に持つのですが、 そこに myaddressmynamebranyvoid の各要素を混ぜることができます。例えば main 要素に 「Hello」という PCDATA を入れると、本文に「Hello」とだけ書いたメールを送ることを 意味します。myaddressmyname はそれぞれ ユーザーのメールアドレスと名前を意味するプレースホルダです。 プログラムが mail 要素の情報を利用して登録などを行なう場合は、 実際のデータに置き換えて送信します。br は改行記号、 any は任意のテキスト、void は空文字列です。 実際にはメーラーによっては末尾に署名などを負荷してしまうかも知れません。 よく使われるのは、おそらく main に 「subscribe <myaddress/> <myname/><br/>end<br/>」 とするパターンでしょう。

subjecttomain は、指定しない場合は 「<any/>」をデフォルトの中身であるとします。 anyは「任意のテキスト」ですから、実際にはタグとして書かれることは あまりないかもしれません。逆に「標題は必ず空にしておくって欲しい」 といった場合には void をつかうことになります。

header は、Cc: などのメールヘッダを指定するために使います。 複数書いてもかまいません。ヘッダ名を示す name 属性を持ち、 それに対する値は要素の中身として記述します。あまり意味がないかもしれません。 使いみちとして思いつくのは、Cc: を void 指定することぐらいですかね。 あとは、うーん、登録時に独自のヘッダに「MLML」という値を書かせて、 新規登録者のどれくらいが MLML 対応のプログラムを利用したかを 数えることができるかもしれません。そんなん調べてもおもしろくないでしょうけど。

subjecttoheadermain の 中身は、desc と同様の処理を施してからプレースホルダを置き換えます。 逆だと、名前が空白で終わる人 (いるか?) の名前を削ってしまうことになるからです。

現状

書いてるとなんとなく「つかえそう」な気がしてきたので、もうすこし厳密に 定義するかも知れません。しかし、そんなやたらに ML に入る人っているのかな。 ブラウザでスクリプト使って XML が処理できる、みたいな「インフラ」がないと、 誰も使わないだろうなー。



Presented by 鰯 <sardine@toyfish.net>