Semantic search over a Markdown knowledge base, served over MCP.
この記録までは、.docx parser は段落が名指す style ID の綴りで見出しを決めていた:
<w:pStyle w:val="Heading1"> を小文字化し、heading で始まり数字で終わることが条件だった。
style ID は書いたアプリケーションが文書ごとに選ぶ識別子で、名前ではない。日本語 UI の Word は
組み込みの見出しを ID 1 .. 6 で書き、word/styles.xml で heading 1 .. heading 6 と
名付けるので、そう書かれた文書はどの見出しも見出しと認められず、1 chunk で索引されていた。
test の文書は word/styles.xml を持たず Heading1 形の ID を使っていたので、見えなかった。
問いは、段落が見出しだと何が決めるのか、そして使える style を持たない文書をどう読むのか。
Heading1 形の ID、styles パートの有無を問わず) は同じように分かれる。heading N という名前の style が見出し。却下:
見出し style を基にした独自 style が見出しにならないが、書いた人にとっては見出しである。w:basedOn の連鎖。派生側の style が outline level を 9 にしていれば見出しを
打ち消す (pandoc の規則 + 打ち消し)。採用。Heading... と綴られている限り覆る — 規則が 2 つになる。docProps/core.xml と同じく文書ごと失敗させる。却下: 今索引されている文書が、無くても
困らないパートのせいで索引から落ちる。word/styles.xml は固定 path で docProps/core.xml の後に、同じ展開 budget の下で
ooxml::read_optional_zip_part を通して読む。読むと文書が budget を超えるパートは
読み飛ばし (文書を失敗させない)、展開も残りの budget までに抑える。w:styles の直下にある段落 style (w:type="paragraph"、または
w:type 無し)。key は entity を解決した style ID で、バイト列の完全一致で比べる。ID の
重複は型を問わず最初の定義が勝つ。使える w:name を持たない style は ID を名前の代わりにする。w:basedOn を最大 16 style 辿る。最初に heading N
と名付けられた style (綴りと同じ関数で読む: 小文字化、heading、trim、1〜255 の数) が
レベルを与える。ただしそれより手前で最初に outline level を設定している style が 9 なら本文。
16 style 以内に見出しが無ければ (循環を含む) 本文。read_zip_part と同じく stderr に行を出さずに綴りの規則へ戻る。get_document は同じ関数で parse し、それぞれ自分の budget で読む。新しい設定は無い。heading 1 と名付けられた Heading1) は今までどおり分かれる。get_document の content から消える
(Heading1 形の文書では既にそうだった)。全文検索は chunk の見出しで引き続き当たる。TOC Heading がそう)。word/styles.xml が壊れた日本語版 Word の
文書は 1 chunk のまま。warning がその文書を名指す。[index].max_decompressed_size を変えた KB では、上限に近い .docx を索引は style で、
get_document は綴りで読む (あるいはその逆) ことがある — 読み出しは既定の budget のまま
だから。違いは見出しのテキストが content に入るかどうかだけ。w:basedOn でも届かない見出し
(outline level だけ、現地語の名前) があると分かった時。grooveseek/src/parser/docx.rs (表、連鎖、fallback、budget)、
grooveseek/src/parser/ooxml.rs (省略可能なパートの読み出し)、grooveseek/src/server.rs
(読み出し側)、grooveseek/tests/index_docx_heading_policy.rs (binary と stderr)。style、§17.7.4.9 name、§17.7.4.3 basedOn、
§17.3.1.20 outlineLvl。basedOn)、docling の issue #4106 (本文 style の outline level)。