mdmark

索引と被参照

索引を正にし、被参照を描くときに算出し、ずれを点検で見つける仕組み

使う側が書いた索引から、本文の用語のツールチップと、文書を参照している文書の一覧が描かれるまでの考え方。 書き方は 索引と用語集を書く。

索引が正

文書のメタデータ(題・概要・別名・関連)と用語の意味は、使う側が書く索引の YAML だけに持つ。 索引の形は 索引。 mdmark はブラウザでファイルを読まない。 使う側のサーバーが索引と文書を読み、読んだオブジェクトを mount・render と、参照の表を作る collectReferences、本文の参照を取り出す collectMatches、ずれを見つける checkIndex に渡す。

用語は、索引の terms のほかに、文書の用語集の表(用語集の表)からも入る。 同じ語が複数あるときは、索引の terms、描く文書の表、ほかの文書の表(索引の docs で先に並ぶ文書)の順に優先する。 同じ語かどうかは、NFKC・英字の小文字化・前後の空白の除去で正規化した後で比べる。

タグは、索引の docs[].tags に書き、最上位の tags にタグの語彙(名前・グループ・説明・別名・振り替え先)を任意で置ける。 文書のタグには、その文書の主題を表す印(main: true)を付けられる。 タグは文書を描くことには使わず、Claude Code が find_docs で文書を引くときの絞り込みと並びに使う(Claude Code に使い方を渡す仕組み)。 語彙を置いた索引では、文書のタグを語彙の名前と別名に突き合わせ、点検がずれを知らせる(ずれの点検)。

被参照は保存しない

ある文書を参照している文書(被参照)は、どこにも書かずに、描くときに算出する。 参照は、次のどれかで数える。

参照 数え方
related 参照元の文書の related に、参照先の id がある(オブジェクトの要素は to が参照先の id)
本文のリンク 参照元の本文のリンクが、参照先の path を指す
文書の別名 参照元の本文に、参照先の aliases が出る

文書の別名の出現は、別名と本文の文字を正規化して比べて数える。 自分自身は数えない。 参照される側の文書に、参照元を書き足す必要は無い。 文書を書き換えると、参照の表を作り直した次の描画から反映される。

関連は片側だけに記載する

索引の related の要素は、相手(to)・関係の種類(type)・いつ読むか(when)を持つ。 記載するのは関連を持つ側の文書だけで、逆向きは保存せず、描くときと引くときに算出する。 描くときは、相手の文書の末尾の関連文書の一覧に、その文書を参照している文書として並ぶ。 引くときは、find_docs の related_to が、向きと逆向きの名前(required_by など)つきで返す。 change_together だけは、両側に記載する。

参照の表

被参照を描く文書が、ほかの文書の本文を読まずに済むよう、使う側が全ての文書から参照の表を作って渡す(参照の表を作る)。 参照の表は、文書ごとの被参照と、各文書の用語集の表から入れた用語を持つ。 参照の表を渡さないときは、被参照を索引の related だけから出し、ほかの文書の用語集の表の用語を照合しない。

描かれ方

描く文書の本文に出た用語の語・別名と、文書の別名に、破線の下線を引き、意味と関連文書のツールチップを付ける。 索引の用語と用語集の表のやめた言い方が本文に出たときは、波線のマーカーを引き、代わりの用語の語と意味のツールチップを付ける。 やめた言い方は参照先を持たないため、被参照の一覧にも collectMatches の byDocument・targets にも数えない。 文書の末尾には、その文書を参照している文書の一覧を、題「関連文書」で置く。 索引を渡さないときは、用語集の表から入れた用語だけにツールチップを付け、被参照の一覧を出さない。 索引も用語集の表も無い文書は、これまでどおりに描く。

索引が Schema に合わなくても、用語集の表の列名が表に無くても、本文の描画は止まらない。 合わない文書・用語は除いて使い、用語集の表の誤りはその箇所の書き方の警告で知らせる。

画面を出さない参照の取り出し

下線とツールチップは画面に描くものだが、使う側の処理が同じ補足を画面なしで受け取りたいことがある(AI へ本文を返すときなど)。 collectMatches は、索引と文書の本文を渡すと、描いた文書の下線・ツールチップと同じ照合で、本文に出た用語・文書の別名の一致を返す(本文の参照を取り出す)。 返すのは、参照先の種類・id・タイトル・短い説明と、一致した文字列・本文の中の位置。 一致した文字列は索引・用語集の表に記載した表記で返し、本文の表記は本文の中の位置から引く。 本文に出たやめた言い方は、byDocument・targets には入れず、代わりの用語(種類・id・タイトル・短い説明)と一致した文字列・本文の中の位置つきで avoided に返す。 同じ実行環境で描いた文書の下線と同じ語が一致し、ツールチップの節ごとの最初の 1 回の制限は効かず、同じ参照先の出現を全て返す。

ずれの点検

索引と文書は別々に書くため、文書を移した・消したときにずれが出る。 checkIndex が、索引に無い文書・索引にあって消えた文書・related の切れた id・文字列の関連・片側だけの change_together・本文のリンクと重なる関連・用語の重複・本文に出た用語のやめた言い方・Schema に合わない索引を、ファイル・場所・種類・内容の一覧で返す(索引を点検する)。 ずれの種類は 点検が返すずれ。

change_together の組のうち片方の文書だけが変わった直し忘れは、比べる基準から変わった文書のパスを渡したときだけ点検する。 mdmark check は --base に渡した git の ref と HEAD の merge-base から、変わったファイルを引く。

索引がタグの語彙を置いているときは、語彙に無いタグ(未登録の候補)・やめたタグ・語彙の name の重複・別名の重なり・振り替え先の切れも返す。 文書の読み込みと描画は止めない。 語彙を置いていない索引では、タグのずれを返さない。