註記:作業中です。最終的に固まるまで公式の仕様ではありません。公式のものは以下の別の場所にあります。
本文書は「gemtext」ハイパーテキスト形式を指定します。GemtextはGeminiファイル転送プロトコルの「生来の」応答形式としてサーバーから送られることを目的としています。HTMLがHTTP [RFC7230]の生来の応答形式であることと同様です。ただし相応しいものであれば他の目的でも利用できます。Gemtextは未登録のMIME種別text/geminiを使ってGeminiを介してサーバーから送られます。
本文書中のキーワード「しなければならない (MUST)」「してはならない (MUST NOT)」「必須である (REQUIRED)」「することになっている (SHALL)」「しないことになっている (SHALL NOT)」「すべき (SHOULD)」「すべきでない (SHOULD NOT)」「推奨する (RECOMMENDED)」「してもよい (MAY)」「省略できる (OPTIONAL)」は [BCP14] 中に記載されているように解釈されます。
Gemtextは単一の電子文書に対応するために設計されています。他のオンラインの資材と関連付けられ、多種多様な形や大きさの画面を持つ機器で簡単快適に読むことに資するように表示できます。固定数文字で「強固に折り返された」素のテキスト(クライアントの画面では長過ぎたり短過ぎたりして充分とは言い難い可能性があります)よりも改善された利用者の体験を齎します。また、素のテキストでは利用者が手作業で文書からURLを複製して利用者代行器のインターフェースの貼り付けなければなりませんでした。
形式は手で書く上で単純であることと実践的に構文解析上単純であることをもとに設計されました。gemtext文書の欠かせない構造は、平板で階層的でなく単一であり、上から下に正しく処理が走って構文解析と呈示が行えるところにあります。
形式は文書の表示のされかたについて文書の執筆者による精密で複製可能な制御に役立てられることを意図していません。装飾は利用者代行器の専用の制御のもとに行われます。
「text」最上位メディア種別の副種別である「text/gemini」は、[RFC2046] に定義されている「charset」引数を継承します。しかしながら、Geminiを介して転送される「text」内容の「charset」の既定値は「UTF-8」です。
「text/gemini」副種別で個別に定義されている追加の引数が1つあります。それは「lang」引数です。「lang」の値は「text/gemini」文書のテキスト内容が書かれている自然言語を示すものです。「lang」引数の存在は省略できます。「lang」引数があるとき、その解釈は完全にクライアントで定義されます。例えばクライアントは「lang」の値を使って内容の役物を改善しても構いません。「lang」引数が無い場合、何らの既定値も仮定されず、(テキストから音声への変換を行う画面読み上げ器といった)内容を処理するための言語の検知が必要なクライアントは「lang」引数が欠落している場合にどのように処理を続ければ良いか決定するための利用者の入力に依存すべきです。
「lang」引数の妥当な値は [BCP47] に定義される1つ以上の言語札のコンマ区切のリストです。例えば以下です。
Gemtextは行指向の形式です。文書は1行以上からなります。6つの独立する行の種類があります。各行は明確に1つの種類に属し、行の最初の3文字を調べることでこの種類を曖昧さなく判定することが可能です。行の種類と構文解析状態(後述)を合わせることで利用者にどのように表示されるかを決定します。特定の行の種類に関連付けられる表示や呈示の詳細は厳密に各個別の行の範疇において制限されます。gemtext文書は個別に各行を扱うことで最初から最後の行まで1回通すことにより正しく構文解析と呈示が行えます。
6つの種類は以下の通りです。
本仕様に準拠する上では、gemtext文書を構文解析し表示するソフトウェアはテキスト行、リンク行、書式化切替え行を以下に記述する通りに扱わなければなりません。これらは「中核の」行の種類です。
利用者の体験を向上させるために、ソフトウェアは追加で見出し行、箇条書の項目、引用行を後述するように扱っても構いません。これらの行を記述されている通りに扱わないソフトウェアはあたかもテキスト行であるかのうように扱わなければなりません。
準拠するgemtext構文解析器は単一ビットの内部状態を保持しなければなりません。これは「通常モード」と「書式化済みモード」のどちらに構文解析器があるのかを制御する構文解析器の状態です。構文解析器の状態は行をどのように認識するか、行がその種類であったときにどう扱われるかを制御します。構文解析器は文書の構文解析を開始する時点では「通常モード」でなければなりません。構文解析器はこの特定の目的を与える行の種類に遭遇したときに2つのモードの間を切り替えます。文書の末尾での構文解析器の状態には何らの意味もなく結果を齎すこともありません。
テキスト行は「既定」の行の種類です。これは、その他全ての行の種類が特定の識別用前置詞から始まることによる効果から認識されるという意味です。そのような前置詞から始まらないいかなる行もテキスト行です。典型的なgemtext文書では行の多数はこのテキスト行となることでしょう。
テキスト行には何ら特別な意味論は無く、一般的な読み方をする上で視覚的に見やすいように利用者に表示されるべきです。細かい意味合いについてはクライアント側に裁量があるということです。例えば可変幅のフォントが使われても良いですし、空白が正規化されても良いですし、単語間の空白より文の間の空白が長くなるようにしても良い、といった感じで表示上の工夫を適用するのは構いません。クライアントはフォントの大きさや背景色などを変えることによって、テキスト行の見た目を独自のものにしたりすることを利用者に許しても構いません。著者はテキストの内容に専念し、テキスト行の精密な呈示について管理できるとは思わないことです。
クライアントの機器の画面に収まる分より長いテキスト行は収まるように「折り返される」べきです。つまり、長い行は機器に適切な幅の複数の連続する行に(理想的には空白やハイフンのところで)分割されるべきです。この折り返しはテキストの各行に独立して適用されます。しかし、クライアントの機器の画面より短い複数の連続するテキスト行は、より少ない数でより長い行に結合されるべきではありません。Gemtext文書中の個々の行は独立した実体なのです。
空行はテキスト行に含まれ、特別な意味はありません。それぞれについて垂直な空の空間として目に見えない形で呈示されるべきです。連続する空白行はより少ない空白行に縮めるべきではありません。
「=>」の2文字から始まる全ての行はリンク行です。リンク行ではGemtext文書から他のオンラインの資材へリンクを張ることができます。この資材には他のGemtext文書も含まれます。リンク行には以下の構文があります。
=>[<空白>]<URL>[<空白><利用者に親しみやすいリンクの名前>]
ここで、次の通りです。
以下の例は全て妥当なリンク行です。
=> gemini://example.org/ => gemini://example.org/ リンクの一例 An example link => gemini://example.org/foo 同じホストにある別のリンクの例 => foo/bar/baz.txt 相対リンク => gopher://example.org:70/1 gopherのリンク
リンク行内のURLはRFC 3986にしたがって予約された文字と空白はパーセント文字で符号化されなければなりません。
クライアントはクライアントの著者が望む通りのやり方でリンクを表示できます。しかしクライアントはスキームがネットワークプロトコルに対応するリンク(例えばgemini://、gopher://、https://、ftp://などから始まるリンク)の表示にあたっていかなる自動的なネットワーク接続もしてはなりません。
最初の3文字が「```」である(つまり先頭に空白なく3つの連続する逆引用符がある)任意の行は、行の切り替えを実施します。これらの行は利用者に表示する呈示された出力に含めるべきではありません。その代わり、構文解析器を「通常モード」から「書式化済み」モードに切り替えます。
書式化済み切替え行の先頭の「```」以降のテキストは、クライアントによって「代替テキスト」と解釈されて構いません。このテキストは当該切替え行以降の書式化済みテキスト行に付随するものです。代替テキストの使用はクライアントの裁量にあり、単純なクライアントは無視して構いません。代替テキストはASCIIアートやテキストでない内容のようにすることが勧められます。例えば、画面読み上げ器を通じて呈示される際に意味のあるものとして捉えられることが無いようにしたり、検索エンジンにより索引として有効活用されるようにしたりということです。代替テキストにプログラミング言語を指定してコンピュータのソースコードに使い、発展的なクライアントが構文彩色に使えるようにしても良いでしょう。
「#」から始まる行は見出し行です。見出し行は1、2、3個の連続する「#」文字から構成され、任意で空白が続き、その後ろに見出しのテキストが来ます。#文字の数は見出しの「水準」を示します。#行は見出しであり、##行は子見出しであり、###行は孫見出しです。
見出しテキストの内容は利用者に表示されるべきであり、クライアントは特別な書式化を使って構いません。例えば見出しになっていることを示すためにより大きかったり太かったりするフォントを使ったり、違う色を使ったりするなどです。しかし、見出し行の主眼の目的は装飾のためでなく意味論的なものであり、具体的には文書の内部構造の機械で読み取れる表現を提供することなのです。発展的なクライアントはこの情報を使って、例えば長い文書については画面脇に階層的に書式化された「目次」を自動的に生成して表示して構いません。こうすると利用者は簡単に特定の節に飛ぶことができ、スクロールしまくらなくて良くなります。ディレクトリ内の全てのgemtext文書の一覧を自動的に生成するツールやgemtext文書のディレクトリ用のAtom/RSSフィードを作成するツールについては、ファイル中の見出しを人間が親しみやすい題名として使えます。
「* 」から始まる行はリスト項目です。この行の種類は純粋に装飾上の理由から存在しています。*は発展的なクライアントでは点の記号で置き換えても構いません。「* 」の後のテキストはあたかもテキスト行のように利用者に表示されるべきです。つまり、目に見える範囲に収まるように折り返し、「いい感じ」に書式化するのです。発展的なクライアントは点の記号の空白を考慮に入れて、長いリスト項目を折り返すときにその項目に対応する全ての行が画面端から等しい距離で間が空くようにすることもできます。
「>」から始まる行は引用行です。この行の種類が存在しているのは、発展的なクライアントが読者のために装飾の区別ができるようにするためです。特定のテキストが外部の資料から引用されたものだというような、重要な意味論的な情報が読者に伝わります。例えば、長い行を目に見える範囲に折り返すとき、結果的に表示される各行には前方に「>」記号が置かれていても構いません。
「```」の3文字から始まらない行はテキスト行です。書式化済みモードではテキスト行は利用者に対して「中立」に表示されるべきです。中立とは、空白の変更や装飾的な改善なしに固定幅フォントを使うなどです。グラフィカルなクライアントはクライアントの目に見える範囲よりも長い書式化済みテキスト行の表示については、折り返すよりかは画面スクロールの仕組みを使うべきです。書式化済みテキスト行を表示する上で、クライアントはASCIIアートやコンピュータのソースコードのような活用例を念頭に置くべきです。具体的には空白が重要な言語で書かれたソースコード(例えばPython)はクライアントでファイルに切り貼りして特に問題なく解釈やコンパイルができるようにすべきです。クライアントが表示するやり方で問題が起こらないようにすべきです。
最初の3文字が「```」である行(つまり先頭に空白のない3つの連続する逆引用符)は書式化済み切替え行です。この行は利用者に表示する呈示される出力に含まれるべきではありません。その代わりに構文解析器は「書式化済みモード」から「通常モ���ド」に切り替わります。
書式化済み切替え行の先頭の「```」に続くテキストはクライアントで無視されなければなりません。
以下はgemtext文書の拡張BNF仕様です。
gemtext-document = *1gemtext-line gemtext-line = text-line / link-line / preformat-toggle gemtext-line =/ heading / list-item / quote-line link-line = "=>" *SP URI-reference [1*SP 1*(SP / VCHAR)] *SP CRLF heading = ( "#" / "##" / "###" ) text-line list-item = "*" SP text-line quote-line = ">" text-line preformat-toggle = "```" text-line text-line = *(SP / VCHAR) CRLF ; URI-reference [STD66]から ; ; CRLF [STD68]から ; SP [STD68]から ; VCHAR [STD68]から