本ブログにおいて <blockquote> 要素の cite 属性の提供を止めた
Markdown にはブロック引用の構文が用意されています。これは John Gruber によるドキュメント(daringfireball.net)にもあるように電子メールで慣例的に使われていたスタイルを踏襲したものですが、個人的には帰属情報を設定できないことに不満があります。
例えば拡張構文であるコードブロックなら先頭を ```html とすることでそのコードが HTML であることを明示できます。しかし引用文に対する引用元 URL やタイトル、言語情報などの設定は考慮されていません。
昔はプレーンな HTML で引用の帰属情報は <blockquote> の中に入れて良いのか、それとも外に出すべきかで議論が盛り上がったこともありましたが、今は HTML Standard 仕様で
Attribution for the quotation, if any, must be placed outside the blockquote element.
とされているため、外に書かなければいけません。そのうえで、<figure> 要素と <figcaption> 要素を使うことでセマンティックに帰属を提示する方法が提示されています。
<figure>
<blockquote>
<p>
The truth may be puzzling. It may take some work to grapple with. It may be counterintuitive. It may contradict deeply held prejudices. It may not be
consonant with what we desperately want to be true. But our preferences do not determine what's true. We have a method, and that method helps us to reach
not absolute truth, only asymptotic approaches to the truth — never there, just closer and closer, always finding vast new oceans of undiscovered
possibilities. Cleverly designed experiments are the key.
</p>
</blockquote>
<figcaption>
Carl Sagan, in "<cite>Wonder and Skepticism</cite>", from the <cite>Skeptical Inquirer</cite> Volume 19, Issue 1 (January-February 1995)
</figcaption>
</figure>
ああ、美しいですねえ。このマークアップを見ているとうっとりします。これは別に唯一の解というわけではないので、帰属は単に <p> 要素などでマークアップしても構わないのですが、私はこの芸術性に逆らえず、HTML5 が普及して以来 <blockquote> は常に <figure> と組み合わせて使うことにしています。
ところで引用元が URL で表すことができる場合に専用の属性として cite 属性が用意されています。これが登場したのは HTML4 からですが、当初はその活用法が厳密に定められておらず解釈の余地があったところ、HTML5 の当初の仕様では
User agents should allow users to follow such citation links.
とされ、さらに2013年8月6日版からは
User agents may allow users to follow such citation links, but they are primarily intended for private use (e.g. by server-side scripts collecting statistics about a site's use of quotations), not for readers.
へ変更されて、現在の HTML Standard でもそれを踏襲しています。すなわち cite 属性値と <figcaption> 内の <a href> に同じ URL を記したところで、両者の役割には明確な違いがあることになります。
今の cite 属性は
- 値が機械可読である
- 画面上には描画されない
- 右クリック等でユーザーがアクセスすることも想定されていない(禁止されているわけではないのでそういうブラウザや拡張機能があっても良い)
- 支援技術が利用するわけでもない
という点から、<data value> や <time datetime> と似た匂いを感じます。ただ大きな違いは、場合によっては cite 属性だけのために独立したデータを持たなければならないケースもあることです。例えば書籍から引用する場合、cite 属性には ISBN を urn:ISBN:XXX 形式で記し、<figcaption> 内では出版社のページや Amazon の商品ページにリンクする、といった具合です。
前置きが長くなりましたが、本ブログでは冒頭に記した「Markdown のブロック引用では帰属情報が提示できない」点を、以下のような独自拡張を実装することで解消しています。
> 引用文
>
>- ?en
>- ?https://example.com/
>- ?引用元タイトル
引用文中の順不同リストの先頭に ? を付けることで、その後続の文字列が IETF 言語タグなら lang 属性、URL なら <figcaption> 要素内にリンクを設定、それ以外の文字列ならタイトルと見なす、といった具合です。
これまでは URL があれば同時に cite 属性にもそれを設定していました。しかし前述のとおり、書籍からの引用時など cite 属性値と <figcaption> 要素内のリンク先は常に同一とは限らないことからこの手法での運用には限界があり、ブログ開設から16年経って今さらではありますが、cite 属性の出力を止めた次第です。
理論的にはリンク先とは別に cite 属性値の文字列情報を持つことは可能なのですが、2つの URL を何かしらの方法で区別しなければなりません。そこまでして cite 属性を付けたところでユーザーに大きなメリットは生じず、なにより通常の方法では画面に表示されないため誤った URL を設定してしまっても気付きにくいデメリットすらあります。これは WAI-ARIA が No ARIA is better than Bad ARIA
と言われているのと同様に、「No cite is better than incorrect cite」と言えるでしょう(※私がいま考えました!)。
通常の Web コンテンツで <blockquote> 要素が使われることはまずあり得ず、ブログ記事や電子書籍での利用がほとんどだと思います。しかしそういった用途では引用元も一律ではなく、書籍、Web ページ、人の会話などさまざまなパターンが考えられるため cite 属性を機械的に設定するのは困難でしょう。実際私も16年間頑張ってきましたが、やはり無理がありました。かといって手動での設定は容易に検証できるような運用体制を構築することがやはり難しく、現実的でないと思います。実際のところ、cite 属性を使いこなせるケースってこの世に存在するのでしょうか。