h2h

H2H

[63] H2H (えいちつーえいち) は、 平成時代中期にウェブ日記ウィキ風メモの記述に使われていた軽量マーク付け言語です。

紹介

[1] H2H冬日の記述に使われているマーク付け言語です。 H2H はもともと HNF to HTML という実装の名前でしたが、後にマーク付け言語の名前とされています。 この時新しい展開名を考えたような気もしますが、覚えていませんw

[2] H2H には H2H/0.9, H2H/1.0, H2H/2.0 の3つの版があります。 H2H/2.0 は今でいう wiki のようなものの記述言語として考えていたもので、 実装も仕様も固まっていませんでした。使われていたのは H2H/0.9H2H/1.0 だけです。

[3] 冬日は元々ハイパー日記システム (HNS) を使っていたので、 H2H/0.9HNSマーク付け言語である HNF の部分集合を独自に修正したものとなっています。 H2H の1つ目の H の元の由来は HNF でした。 実装もハイパー日記システムに強く影響を受けています。

[4] H2H/1.0 はどうやら H2H/0.9 と互換な拡張のようです。 実装は以前のものよりも拡張性を重視していますが、 依然ハイパー日記システムの影響を断ち切れていないのが藁えますw

構文

[5] 基本的なところは HNF を受け継いでいますが、 必ずしも同じではありません。

[6] 行指向: マークは1行で完結していなければなりません。

[7] 魔法行: H2H/1.0 では最初の行が H2H/1.0 でなければなりません。そうでなければ、 H2H/0.9 とみなされます。

[8] 頭部: 最初の OK の行までが頭部となります。 その次に空行が来て、その後が本体になります。

頭部は零個以上の頭部変数、本体は零個以上の命令とデータで構成されます。

この構造は HNF に由来しています。

[9] 頭部変数: 頭部には変数を1行に1つ記述できます。 これは meta 要素型のようなもので、 名前、空白、値 (1文字以上) と順に記述します。 名前は1文字以上の大文字 (26種類) または数字 (10種類) です。値は人間向けの自由な文字列です。 HNF に由来しています。

H2H/0.9 ではリンク (>>11) が使えます。

[12] 命令: 行頭に大文字だけの語が現れると、命令とみなします。 語の前に斜線があっても構いません。その場合、 終了命令となります。斜線なしの命令は、 開始命令またはその行だけの命令です。 その行だけか、終了命令と対になるか、 終了命令が省略可能かは、種類によって異なります。

命令の後には、値を零個以上指定できます。空白が区切りになります。 指定できる値の数は命令の種類によって決まっていて、 可変な場合もあります。最後の値は (空白があっても) 行末まで含みます。

[38] 継続: H2H/1.0 では、命令名と (あれば) リンク星の前に + を入れることができます。 これを入れると通常1行だけの命令を開始命令とし、 終了命令が現れるまで続けることができます。

[11] リンク: H2H/0.9 の頭部変数と一部の命令は、命令名の直後に * を指定すると、1つ目の値としてリンク先を記述できます。 H2H/1.0 では、どの命令 (終了命令を除きます。) でも使えます。

これは、TomsoftDiarySystem (TDS) のマーク付け言語である tdf を参考に採用した機能です。

[37] 参照: リンク先を指定する場所では、次の方法で参照先を記述します。

  1. . は、ダミーで、リンク先指定なしとなります。
  2. [({](\d{4}),?(\d{2}),?(\d{2})(?:[i,]?(\d{2})(?:[s,]?(\d{2}))?)?[)}] に一致する文字列は、日記内への参照となります。 (解釈は >>29 と同様の方法によります。)
  3. \?[({]([A-Za-z0-9_.-]+)[)}] に一致する文字列は、用語集への参照となります。 (H2H/0.9 のみです。)
  4. \?\?(?:\{([A-Za-z0-9_.-]+)\})?[(]?([\x00-\xFF]+?)[)]? に一致する文字列は、 $1 (既定値 = 既定の用語集) の用語集で指定された用語 $2 への参照となります。 (H2H/1.0 のみです。)
  5. その他は、 URI となります。

[39] 引数: H2H/1.0 では命令に引数を指定できます。 リンク星がある場合、リンク先の前でも後ろでも構いませんが、 1命令に1つだけ指定できます。終了命令には指定できません。

引数は、 { ではじまり } で終わる部分の中に書きます。引数は1個以上記述でき、 互いに ,; で区切ります。 引数の前後には空白を零個以上入れることができます。

引数は引数名と値で構成されます。引数名は小文字 (26種類)、 数字 (10種類)、 -, _ の1文字以上の並びです。値は、 ;,, }, SPACE を含まない場合、そのまま書けます。 " で囲むと、 " を除く任意の文字列 (1文字以上) を値とすることができます。ただし、実際には SPACE が含まれているのに括られていないデータがあるようです。

名前と値は => で区切ります。その前後には空白を零個以上入れることができます。 ただし、実際には =: を使うデータがあるようです。

[36] 注釈: ! ではじまり、空白が続く行全体は、注釈です。 HTML注釈宣言に相当します。

!# ではじまり、空白が続く行全体は、注釈です。 HTML に変換する場合は無視されます。

ということになっていたはずですが、空白が抜けているデータもあります。

[10] 空白: 空白として使用できるのは SPACE で、1文字以上連続して使えます。値の区切りとして使う時は、 値の個数が決まっている場合、最後の値の一部 (途中または最後の部分) として空白が使えます。

[13] データ: その他の文字列はデータになります。

データや命令の値は、 HTML 変換時に必ずしも escape されません。当初の意図はよくわかりませんが、 現在ではそういう仕様 (HTML タグを書いてもよいもの) と理解していますw

[56] 改行: 改行は、当初の仕様ではそのまま HTML に変換され、 HTML の表示時に (Webブラウザ) で場合によっては無視されるはずでしたが、 後の H2H/1.0 実装では無視されています。 このため、初期のデータの PRE 要素は改行だけを使っていますが、 後のデータでは改行の前に必ず HTML<br> を入れています。

頭部変数

[14] 頭部変数は次のものが存在するようです。 いくつかは、ハイパー日記システムに由来し、 実際には使われていません。

ハイパー日記システムでも利用者 (日記の著者) が自由に追加・編集できるようになっていますが、 H2H でも言語の機能ではなく、プロファイルの機能となっています。
名前H2H/0.9 既定プロファイルH2H/1.0 冬日プロファイル説明
TENKI天気
BASHO場所
TAION体温
LUNCH昼食
TAIJU体重
SUIMIN睡眠時間
BGM背景音楽
HOSU歩数
HON読書
KITAKU帰宅時間
WALK散歩
RUNジョギング
KEYWORD鍵語
CAT分類
KION気温
T11限
T22限
T33限
T44限
T55限
T66限
T77限
SP行事
THEME話題

命令

[16] 説明の見方:

命令名
行頭に指定する命令の名前。
リンク星
開始命令名直後の * の使用可否。 省略時は使用不可。
終了命令
終了命令の存在。
開始命令が閉じる要素
開始命令が現れた時に開かれていれば閉じる要素の命令名。 特に記述が無い限り、記述された順に高々1回閉じようと試みます。 省略時はなし。
終了命令が閉じる要素
同様に、終了命令が現れた時に開かれていれば閉じる要素の命令名。 省略時はなし。
文脈
その命令を使用できる場所。 その他とは FNULOL を除く任意の場所。省略時はその他
定義されている版。HNF 由来のものはその旨。
説明
意味など。

[40] H2H/1.0 では、終了命令は命令名に関わらず P を閉じようと試みます。

[27]

命令名
ABBR
終了命令
禁止
H2H/0.9H2H/1.0
説明
略語 (abbr 要素に相当)。

値を2つ指定しなければなりません。 1つ目は abbr 要素内容に、 2つ目は同じく title 属性に相当します。

[26]

命令名
ACRONYM
終了命令
禁止
H2H/0.9H2H/1.0
説明
acronym 要素に相当。

値を2つ指定しなければなりません。 1つ目は acronym 要素内容に、 2つ目は同じく title 属性に相当します。

[15]

命令名
CITE
リンク星
指定可能
終了命令
省略可能
開始命令が閉じる要素
PRE
終了命令が閉じる要素
PPREDIVYAMI
HNFH2H/0.9H2H/1.0
説明
引用要素型名に反して、 citation ではなく quotation のために使います。

値を高々2つ指定できます。* を指定した場合は、 値を最低1つ指定しなければなりません。

1つ目の値は、引用元URI です。 (blockquote 要素cite 属性に相当します。) 2つ目の値は、引用元の人間向け文字列による簡単な説明です。

実際のデータは星の有無と値の個数が混乱しているので、 URI らしきものを URI scheme 名で検出する必要があります。

値が零個のこともあります。

[42]

命令名
DD
H2H/1.0
説明
説明リスト説明 (dd に相当します)。

[45]

命令名
DEL
H2H/1.0
説明
削除 (del に相当します)。

[32]

命令名
DIV
終了命令
省略可能
開始命令が閉じる要素
P
終了命令が閉じる要素
PPRE
HNFH2H/0.9H2H/1.0
説明
区間。

値を1つ指定しなければなりません。 値は class 属性に相当します。

[43]

命令名
DL
H2H/1.0
説明
説明リスト (dl に相当します)。

[44]

命令名
DT
H2H/1.0
説明
説明リスト項目 (dt に相当します)。

[18]

命令名
FN
終了命令
必須
HNFH2H/0.9H2H/1.0
説明
脚注

[46]

命令名
INS
H2H/1.0
説明
削除 (ins に相当します)。

[29]

命令名
LDIARY
終了命令
禁止
文脈
LINK, LDIARY, SEE, SEE, PERSON の外 (H2H/1.0)
HNFH2H/0.9H2H/1.0
説明
日記の記事の参照。

値を2つまたは4つ指定しなければなりません。

いずれの場合も、最後の値が参照文字列 (a 要素内容に相当します。) です。

2つの1つ目は、 YYYYMMDDYYYYMMDDiII、または YYYYMMDDiIIsSS の形式とします。

4つの1つ目は YYYY、 2つ目は M (1桁又は2桁)、 3つ目は D (1桁又は2桁) の形式とします。

ただし、 Y は年、M は月、 D は日、 I は章、 S は節とします。

[23]

命令名
LI
リンク星
使用可能
終了命令
禁止
文脈
ULOL
HNFH2H/0.9H2H/1.0
説明
リスト項目。

値を1つ指定できます。項目の値 (li 要素内容に相当します。) を指定します。

リンク星を使用すると、項目の値の前にリンク先を指定できます。

H2H/1.0 では、 ULOL の中で命令なしの文字列を記述すると、 LI 命令が行頭に省略されているものとみなします。

[34]

命令名
LIMG
終了命令
禁止
HNFH2H/0.9
説明
画像

値を4つ指定しなければなりません。 1つ目はリンク先です。2つ目は align 属性に相当する記号を指定しますが、H2H では無視されます。3つ目は画像の指定です。 4つ目は代替文 (alt 属性に相当します。) です。

[19]

命令名
LINK
リンク星
使用可能
終了命令
禁止
文脈
FN、その他 (H2H/0.9); LINK, LDIARY, SEE, SEE, PERSON の外 (H2H/1.0)
HNFH2H/0.9H2H/1.0
説明
ハイパーリンク

値を2つ指定しなければなりません。1つ目はリンク先、 2つ目は名札 (a 要素内容に相当します。) です。

リンク星を使用した場合は、値は1つだけ指定しなければなりません。 値は名札です。

[35]

命令名
LMG
終了命令
禁止
H2H/0.9
説明
画像

値を2つ指定しなければなりません。 1つ目はリンク先かつ画像の場所です。 2つ目は代替文 (alt 属性に相当します。) です。

[24]

命令名
NEW
リンク星
使用可能
終了命令
禁止
開始命令が閉じる要素
PPREDIV、 節、章 (H2H/0.9); すべて (H2H/1.0)
HNFH2H/0.9H2H/1.0
説明
見出し

新しい章の始まりとなります。

値を1つ指定しなければなりません。章の名前 (hn 要素内容に相当します。) となります。

リンク星を使用すると、見出しの値の前にリンク先を指定できます。

[22]

命令名
OL
終了命令
必須
開始命令が閉じる要素
PRE
HNFH2H/0.9H2H/1.0
説明
順序付きリスト。

[17]

命令名
P
終了命令
省略可能
開始命令が閉じる要素
PPRE
HNFH2H/0.9H2H/1.0
説明
段落

[28]

命令名
PERSON
終了命令
禁止
文脈
LINK, LDIARY, SEE, SEE, PERSON の外 (H2H/1.0)
H2H/0.9H2H/1.0
説明
人名

値を2つ指定しなければなりません。 1つ目は人名録の項目名、2つ目は人名です。

[33]

命令名
PRE
終了命令
省略可能
開始命令が閉じる要素
P
HNFH2H/0.9H2H/1.0
説明
整形済文章

[47]

命令名
RB
H2H/1.0
説明
ルビ基底

[48]

命令名
RT
H2H/1.0
説明
ルビ文

[20]

命令名
RUBY
終了命令
禁止
H2H/0.9H2H/1.0
文脈
FN、その他
説明
ルビ

値2を2つ指定しなければなりません。 1つ目はルビ基底 (rb に相当します。)、 2つ目はルビ文 (rt に相当します。) です。

[30]

命令名
SEE
終了命令
禁止
文脈
LINK, LDIARY, SEE, SEE, PERSON の外 (H2H/1.0)
H2H/0.9H2H/1.0
説明
用語集への参照。

値を2つ指定しなければなりません。 1つ目は用語集の項目、2つ目は本文に示す用語 (a 要素内容に相当します。) です。

[49]

命令名
SPAN
H2H/1.0
説明
span に相当します。

[50]

命令名
STRONG
H2H/1.0
説明
strong に相当します。

[31]

命令名
SUB
リンク星
使用可能
終了命令
禁止
開始命令が閉じる要素
PPREDIV、 節 (H2H/0.9); 章以外 (H2H/1.0)
文脈
その他 (NEW が出現した後)
HNFH2H/0.9H2H/1.0
説明
小見出し

新しい節の始まりとなります。

値を1つ指定しなければなりません。章の名前 (hn 要素内容に相当します。) となります。

リンク星を使用すると、見出しの値の前にリンク先を指定できます。

[21]

命令名
UL
終了命令
必須
開始命令が閉じる要素
PRE
HNFH2H/0.9H2H/1.0
説明
順序なしリスト。

[25]

命令名
YAMI
H2H/0.9H2H/1.0
説明
すぐに読めない状態にするべき文章。

値を1つ指定して構いません。

値を1つ指定する場合は、終了命令は存在しません。 その値が要素の内容に相当します。行内要素として扱われます。

値を指定しない場合は、終了命令までが要素の内容となります。 YAMI 要素が開かれていれば、 開始命令により閉じられます。 ブロック水準要素として扱われます。

[53] H2H/1.0 は命令毎に入れ子やデータが HTML として解釈されるかを制御できるようですが、 よくわかりませんwwww

[57]

という方針で行けばうまくいくみたいw

(名無しさん)

引数

[41]

命令引数名説明
NEWcat分類 (COMMA と零個以上の空白区切り)
*classclass に相当
*content-typetext/html, text/x-h2h+html
*idid に相当
*langlang に相当
STRONGlevel強調度 (整数)
SP (頭部変数)place場所 (人間向け)
RUBYpositionbelow
CITEsource出典 (人間向け)
*stylestyle に相当
TAION (頭部変数)Time16:00 +0900 など
SP (頭部変数)time時刻 (人間向け)
*titletitle に相当
CITEuricite に相当

MIME 型

[60] text/x-h2h, text/x-h2h+html が用いられました。

拡張子

[52] .h2h を本来用いるべきところですが、歴史的経緯より .hnf もよく用いられました。

実装

[58] H2H Classic Implementation (2004-10-25 09:03:27 +09:00 版) https://suika.suikawiki.org/www/markup/h2h/implementation/classic/

2001年3月以来の最初の H2H の実装 (2003年には既に事実上放棄されているが、 2008年現在なお一部で使っている)。

[59] https://suika.suikawiki.org/www/markup/html/whatpm/Whatpm/H2H.pm

Whatpm にこっそり入れてある最新の実装。

[62] wakaba/h2h, https://github.com/wakaba/h2h

歴史

[51] draft-h2h.txt

[54] 実際に使われたことのある命令・頭部変数一覧:

ABBR
ACRONYM
CITE
DD
DEL
DIV
DL
DT
EM
FN
HOUR
INS
KION
LDIARY
LI
LIMG
LINK
LMG
LNEW
LUNCH
NEW
OK
OL
P
PERSON
PRE
RIBU ← RUBY のつもり
RUBY
SEE
SP
SPAN
STRONG
SUB
T1
T2
T3
T4
T5
T6
T7
TAION
TENKI
THEME
UL
YAMI
XML ← データとして
/CITE
/DIV
/DL
/FN
/INS
/LI
/LINK
/OL
/P
/PRE
/STRONG
/UL
/YAMI

+ がつかわれたことがあるのは LINKSTRONG だけ。

* が使われたことがあるのは T1SP, SUB, SP, NEW, LINK, LI, [CITE]]。

[55] 今までに使用された HTML 系マーク:

<a>
<a href>
</a>
<abbr>
<abbr lang>
<abbr title>
</abbr>
<acronym>
<acronym lang>
<acronym title>
</acronym>
<blockquote>
</blockquote>
<br>
<br/>
<caption>
</caption>
<code>
<code class>
<code lang>
<code wbradded> ← コピペのミス
</code>
<dd>
</dd>
<del>
</del>
<dfn>
</dfn>
<div>
<div style>
</div>
<dl>
</dl>
<dt>
</dt>
<em>
</em>
<form>
<form accept-charset>
<form action>
<form method>
</form>
<h1>
<h1 style>
</h1>
<h2>
</h2>
<h3>
</h3>
<h4>
</h4>
<img>
<img/>
<img alt>
<img class>
<img src>
<img style>
<img title>
<img type>
<input/>
<input accesskey>
<input name>
<input type>
<input value>
<ins>
</ins>
<kbd>
</kbd>
<label>
<label for>
</label>
<li>
</li>
<ol>
</ol>
<p>
<p id>
<p style>
</p>
<pre>
<pre class>
<pre style>
</pre>
<q>
<q cite>
</q>
<rb>
</rb>
<rp>
</rp>
<rt>
</rt>
<ruby>
</ruby>
<span>
<span class>
<span lang>
<span onclick>
<span style>
<span xml:lang>
</span>
<strong>
</strong>
<sub>
</sub>
<sup>
</sup>
<table>
<table style>
<tbody>
</tbody>
<td>
<td style>
<td title> ← <td abbr> の逆
</td>
<th>
<th colspan>
<th scope>
<th style>
</th>
<table style>
<table summary>
</table>
<thead>
</thead>
<tr>
</tr>
<ul>
</ul>
<var>
<var class>
<var lang>
<var title>
</var>
<local-part@domain.example> ← 電子メイル・アドレス
<!-- -->
<!--#exec cmd-->
& ← LINK 命令の1つ目の値 (URI) 中, NEW 命令のリンク値 (URI) 中, 本文中
&& ← 本文中の論理積演算子
&ame; ← 雨マーク
&amp; ← 本文中, CITE 命令の出典 URI の値中, LINK 命令の2つ目の値 (名札) 中, NEW 命令のリンク値 (URI) 中
&gt;
&hare; ← 晴マーク
&harekumori; ← 晴/曇マーク
&hearts;
&kumori; ← 曇マーク
&lt;
&quot;
&reg;
&yuki; ← 雪マーク
&#dd; ← 数値文字参照
&#ddddd; ← 数値文字参照
&#xHH; ← 十六進数文字参照
&#xHHHH; ← 十六進数文字参照
&#xhhhh; ← 十六進数文字参照

メモ