[MS-ONE]: OneNote File Format
https://msdn.microsoft.com/en-us/library/dd924743(v=office.12).aspx
[MS-ONESTORE]: OneNote Revision Store File Format
https://msdn.microsoft.com/en-us/library/dd951288(v=office.12).aspx
ファイル形式について:
- 完全にバイナリ。容易に可読できる形式には直りません。
- 概念が複雑。階層が深いし、内部参照も多い。
XML に変換すると、多少分かり易くなるかもしれません。サンプル
仕様書と、サンプルの one ファイルと、解析結果の XML ファイルを見れば、解析作業を助けると思います。
読み込むだけであれば、まだ楽です。
よく現れる構造体 ExtendedGUID につきまして。
ExtendedGUID = GUID + int32 です。
例: Root Extended GUID: MUST be "{{ 4A3717F8- 1C14-49E7-9526-81D942DE1741 }, 1}".
GUID はそのままですが、int32 の意味は利用場所によって異なります。要は ID なので、(名前空間 + 整理番号) のような使われ方が基本です。もっと砕けば(一意なフォルダ番号 + ファイル番号) のような感じです
- CompactID。出来上がりは ExtendedGUID ですが、中身は int8 + int24 です。
- 2 つ目の int24 で、GlobalIdTable 中の GUID を 1 つ指定、
- 1 つ目の int8 で、ExtendedGUID の int32 を埋めます。
- ObjectID。CompactID の配列。他の FileNode を参照。FileNode の oid と一致する物を参照します。FileNode は兄弟とは限りません。後記するリビジョン管理の為、親戚(親の子)の場合も有ります。
- ContextID。CompactID の配列
- ObjectSpaceID。CompactID の配列
one ファイルは、多数のチャンク(オフセット+バイト数)が散りばめられた、
ファイルシステムのような構造を呈しております。
ファイルやフォルダーのような階層構造の概念があり、FileNode を使って表します。
FileNode の形式には 3 種類有り、
- None。可変データ fnd が有ります。
- Node。子 FileNode を持っています。可変データ fnd も有ります。
- Data。ファイル中のチャンクへの参照(ObjectSpaceObjectPropSet 等)が有ります。可変データ fnd も有ります。
FileDataStoreObjectReferenceFND であれば、チャンクの中身は、添付ファイル+αの情報です。
ObjectDeclaration2RefCountFND 等には、oid と jcid が有ります。oid と jcid が付いている FileNode は、有用なデータを含みます。oid は、CompactID。ObjectID 中の CompactID として、他の FileNode から参照されます。
jcid は、FileNode の抽象的な意味です。jcidRichTextOENode とか、jcidOutlineElementNode とか、jcidOutlineNode とか、jcidPageNode とか。
リビジョン管理が有ります。
「ページのバージョンを表示」で、古いバージョンを参照できたりします。
新しいリビジョンは、前のリビジョンにちょっと変更を加えた程度のものと考えてください。古い FileNode を置き換える為に、同じ oid を指定します。
RevisionManifestStart6FND または RevisionManifestStart7FND で始まります。
rid と ridDependent を持っていて、親子関係を形成します。ridDependent が無くなるか、ridDependent が空になるまで遡ります。
Start と End の間に ObjectGroupListReferenceFND が有り、この FileNode の中に、起点となる jcidPageManifestNode (ObjectDeclaration2RefCountFND) が出て参ります。最初のリビジョンにだけ出現し、後の方のリビジョンには通常出て来ません。
jcidPageSeriesNode を収めています RevisionManifestListReferenceFND の中も ObjectGroupListReferenceFND が使われていますので、リビジョン管理の必要が有ります。