authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-27 16:21:46-07:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-27 19:18:20-07:00
logc1bbd6da524e4caf05b6b87c1559e61bfe7cbb70
tree7469046a7676c2b7b3acb71b76b228e2b71ab6a9
parent04cf1f351630be2d74efa40ded0af99c0f440f8f
signature Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU

fix(onestore): read sections OneNote has garbage-collected

OneNote's compaction zeroes the manifest-list references of deleted object spaces and unused file-data references in place (fcrZero). Those now read as freed: their spaces are absent, their payloads are not declared, and appends keep the free chunk list. Sections compacted by OneNote on Windows open again. Also: the model oracle passes a paragraph's style to equation spans, and the structural-probe fixtures move into corpus/ so a clean clone builds its tests. Assisted-by: claude-opus-5.5

287 files changed, 925 insertions(+), 50 deletions(-)

corpus/structural-probe/README.md created+24
......@@ -0,0 +1,24 @@
1# OneNote 2010 structural-edit probe
2
3Native captures from the Windows 7 lab (VM `enterprobe`, 2026-09-25), driven by
4AutoHotkey through Enter, Backspace, Delete, Tab, Shift+Tab and paste on
5synthetic pages. Every page starts with a plain paragraph `Above`.
6
7- `probe.one`: the whole probe section after the run, closed by OneNote; one
8 page per case (`c1-bullet`, `c8-split`, ...).
9- `tags.one`: a section holding one page with the nine Ctrl+1..9 default tags,
10 closed and flushed by OneNote.
11- `summaries/<case>-<step>.txt`: the page after each step, from COM
12 `GetPageContent`, one line per paragraph:
13 `L<level>[+indentN] [tags; [x]=completed] [list] qsN text`.
14
15Case families: `c1` Enter at the end of `Target text`, `c2`/`c2s` Enter in the
16middle and at the start, `c3` Enter on an empty tagged or bulleted paragraph,
17`c4`/`c4m` Backspace at the start of a second line, `c5b` Delete at the end of
18the first of a pair, `c6` Tab and Shift+Tab, `c7` a two-line paste, `c8` a
19numbered list, `c9` character formatting, headings and multiple tags, `c10`
20paragraphs with children, `pb`/`pbe` bullets applied to plain paragraphs.
21
22`crates/canvas/src/editor/evidence.rs` replays the summaries against the
23editor; `crates/canvas/tests/structural_roundtrip.rs` and
24`crates/onestore/src/op/tests.rs` edit `probe.one`.
corpus/structural-probe/probe.one created
Binary files /dev/null and b/corpus/structural-probe/probe.one differ
corpus/structural-probe/summaries/c1-bullet-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target text
corpus/structural-probe/summaries/c1-bullet-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target text
3 L2 [] [bullet] qs0
corpus/structural-probe/summaries/c1-bullet-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target text
3 L2 [] [bullet] qs0 New
corpus/structural-probe/summaries/c1-done-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 Target text
corpus/structural-probe/summaries/c1-done-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 Target text
3 L1 [] [] qs0
corpus/structural-probe/summaries/c1-done-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 Target text
3 L1 [] [] qs0 New
corpus/structural-probe/summaries/c1-imp-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 Target text
corpus/structural-probe/summaries/c1-imp-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 Target text
3 L1 [] [] qs0
corpus/structural-probe/summaries/c1-imp-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 Target text
3 L1 [] [] qs0 New
corpus/structural-probe/summaries/c1-num-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target text
corpus/structural-probe/summaries/c1-q-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 Target text
corpus/structural-probe/summaries/c1-q-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 Target text
3 L1 [] [] qs0
corpus/structural-probe/summaries/c1-q-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 Target text
3 L1 [] [] qs0 New
corpus/structural-probe/summaries/c1-rem-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 Target text
corpus/structural-probe/summaries/c1-rem-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 Target text
3 L1 [] [] qs0
corpus/structural-probe/summaries/c1-rem-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 Target text
3 L1 [] [] qs0 New
corpus/structural-probe/summaries/c1-todo-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target text
corpus/structural-probe/summaries/c1-todo-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target text
3 L1 [] [] qs0
corpus/structural-probe/summaries/c1-todo-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target text
3 L1 [] [] qs0 New
corpus/structural-probe/summaries/c10-bs-parent-0.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Alpha
2 L1 [] [] qs0 Parent
3 L2 [] [] qs0 Child
4 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c10-bs-parent-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 AlphaParent
2 L2 [] [] qs0 Child
3 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c10-del-alpha-0.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Alpha
2 L1 [] [] qs0 Parent
3 L2 [] [] qs0 Child
4 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c10-del-alpha-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 AlphaParent
2 L2 [] [] qs0 Child
3 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c10-del-parent-0.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Alpha
2 L1 [] [] qs0 Parent
3 L2 [] [] qs0 Child
4 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c10-del-parent-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Alpha
2 L1 [] [] qs0 ParentChild
3 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c10-enter-end-0.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Alpha
2 L1 [] [] qs0 Parent
3 L2 [] [] qs0 Child
4 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c10-enter-end-1.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Alpha
2 L1 [] [] qs0 Parent
3 L1 [] [] qs0
4 L2 [] [] qs0 Child
5 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c10-stab-child-0.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Alpha
2 L1 [] [] qs0 Parent
3 L2 [] [] qs0 Child
4 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c10-stab-child-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Alpha
2 L1 [] [] qs0 Parent
3 L1 [] [] qs0 Child
4 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c10-tab-parent-0.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Alpha
2 L1 [] [] qs0 Parent
3 L2 [] [] qs0 Child
4 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c10-tab-parent-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Alpha
2 L1 [] [] TABLE[Parent || ]
3 L2 [] [] qs0 Child
4 L1 [] [] qs0 Omega
corpus/structural-probe/summaries/c1b-child-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
corpus/structural-probe/summaries/c1b-child-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
3 L2 [] [] qs0
corpus/structural-probe/summaries/c1b-child-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
3 L2 [] [] qs0 New
corpus/structural-probe/summaries/c1b-num-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target text
corpus/structural-probe/summaries/c1b-num-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target text
3 L2 [] [num:2.] qs0
corpus/structural-probe/summaries/c1b-num-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target text
3 L2 [] [num:2.] qs0 New
corpus/structural-probe/summaries/c1b-tagbullet-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target text
corpus/structural-probe/summaries/c1b-tagbullet-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target text
3 L2 [] [bullet] qs0
corpus/structural-probe/summaries/c1b-tagbullet-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target text
3 L2 [] [bullet] qs0 New
corpus/structural-probe/summaries/c2-bullet-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target
3 L2 [] [bullet] qs0 text
corpus/structural-probe/summaries/c2-bullet-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target
3 L2 [] [bullet] qs0 Xtext
corpus/structural-probe/summaries/c2-child-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target
3 L2 [] [] qs0 text
corpus/structural-probe/summaries/c2-child-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target
3 L2 [] [] qs0 Xtext
corpus/structural-probe/summaries/c2-done-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 Target
3 L1 [] [] qs0 text
corpus/structural-probe/summaries/c2-done-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 Target
3 L1 [] [] qs0 Xtext
corpus/structural-probe/summaries/c2-imp-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 Target
3 L1 [] [] qs0 text
corpus/structural-probe/summaries/c2-imp-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 Target
3 L1 [] [] qs0 Xtext
corpus/structural-probe/summaries/c2-num-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target
3 L2 [] [num:2.] qs0 text
corpus/structural-probe/summaries/c2-num-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target
3 L2 [] [num:2.] qs0 Xtext
corpus/structural-probe/summaries/c2-q-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 Target
3 L1 [] [] qs0 text
corpus/structural-probe/summaries/c2-q-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 Target
3 L1 [] [] qs0 Xtext
corpus/structural-probe/summaries/c2-rem-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 Target
3 L1 [] [] qs0 text
corpus/structural-probe/summaries/c2-rem-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 Target
3 L1 [] [] qs0 Xtext
corpus/structural-probe/summaries/c2-tagbullet-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target
3 L2 [] [bullet] qs0 text
corpus/structural-probe/summaries/c2-tagbullet-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target
3 L2 [] [bullet] qs0 Xtext
corpus/structural-probe/summaries/c2-todo-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target
3 L1 [] [] qs0 text
corpus/structural-probe/summaries/c2-todo-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target
3 L1 [] [] qs0 Xtext
corpus/structural-probe/summaries/c2s-bullet-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0
3 L2 [] [bullet] qs0 Target text
corpus/structural-probe/summaries/c2s-bullet-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0
3 L2 [] [bullet] qs0 XTarget text
corpus/structural-probe/summaries/c2s-child-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0
3 L2 [] [] qs0 Target text
corpus/structural-probe/summaries/c2s-child-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0
3 L2 [] [] qs0 XTarget text
corpus/structural-probe/summaries/c2s-done-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0
3 L1 [To Do[x]] [] qs0 Target text
corpus/structural-probe/summaries/c2s-done-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0
3 L1 [To Do[x]] [] qs0 XTarget text
corpus/structural-probe/summaries/c2s-imp-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0
3 L1 [Important[x]] [] qs0 Target text
corpus/structural-probe/summaries/c2s-imp-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0
3 L1 [Important[x]] [] qs0 XTarget text
corpus/structural-probe/summaries/c2s-num-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0
3 L2 [] [num:2.] qs0 Target text
corpus/structural-probe/summaries/c2s-num-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0
3 L2 [] [num:2.] qs0 XTarget text
corpus/structural-probe/summaries/c2s-q-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0
3 L1 [Question[x]] [] qs0 Target text
corpus/structural-probe/summaries/c2s-q-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0
3 L1 [Question[x]] [] qs0 XTarget text
corpus/structural-probe/summaries/c2s-rem-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0
3 L1 [Remember for later[x]] [] qs0 Target text
corpus/structural-probe/summaries/c2s-rem-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0
3 L1 [Remember for later[x]] [] qs0 XTarget text
corpus/structural-probe/summaries/c2s-tagbullet-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0
3 L2 [To Do] [bullet] qs0 Target text
corpus/structural-probe/summaries/c2s-tagbullet-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0
3 L2 [To Do] [bullet] qs0 XTarget text
corpus/structural-probe/summaries/c2s-todo-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0
3 L1 [To Do] [] qs0 Target text
corpus/structural-probe/summaries/c2s-todo-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0
3 L1 [To Do] [] qs0 XTarget text
corpus/structural-probe/summaries/c3-bullet-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target text
3 L2 [] [bullet] qs0
corpus/structural-probe/summaries/c3-bullet-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target text
3 L2 [] [] qs0
4 L2 [] [] qs0
corpus/structural-probe/summaries/c3-bullet-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target text
3 L2 [] [] qs0
4 L2 [] [] qs0
5 L2 [] [] qs0
corpus/structural-probe/summaries/c3-bullet-3.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target text
3 L2 [] [] qs0
4 L2 [] [] qs0
5 L2 [] [] qs0 New
corpus/structural-probe/summaries/c3-child-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
3 L2 [] [] qs0
corpus/structural-probe/summaries/c3-child-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
3 L2 [] [] qs0
4 L2 [] [] qs0
corpus/structural-probe/summaries/c3-child-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
3 L2 [] [] qs0
4 L2 [] [] qs0
5 L2 [] [] qs0
corpus/structural-probe/summaries/c3-child-3.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
3 L2 [] [] qs0
4 L2 [] [] qs0
5 L2 [] [] qs0 New
corpus/structural-probe/summaries/c3-done-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 Target text
3 L1 [To Do[x]] [] qs0
corpus/structural-probe/summaries/c3-done-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [To Do[x]] [] qs0
corpus/structural-probe/summaries/c3-done-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [] [] qs0
5 L1 [To Do[x]] [] qs0
corpus/structural-probe/summaries/c3-done-3.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [] [] qs0
5 L1 [To Do[x]] [] qs0 New
corpus/structural-probe/summaries/c3-imp-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 Target text
3 L1 [Important[x]] [] qs0
corpus/structural-probe/summaries/c3-imp-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [Important[x]] [] qs0
corpus/structural-probe/summaries/c3-imp-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [] [] qs0
5 L1 [Important[x]] [] qs0
corpus/structural-probe/summaries/c3-imp-3.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [] [] qs0
5 L1 [Important[x]] [] qs0 New
corpus/structural-probe/summaries/c3-num-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target text
3 L2 [] [num:2.] qs0
corpus/structural-probe/summaries/c3-num-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target text
3 L2 [] [] qs0
4 L2 [] [] qs0
corpus/structural-probe/summaries/c3-num-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target text
3 L2 [] [] qs0
4 L2 [] [] qs0
5 L2 [] [] qs0
corpus/structural-probe/summaries/c3-num-3.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target text
3 L2 [] [] qs0
4 L2 [] [] qs0
5 L2 [] [] qs0 New
corpus/structural-probe/summaries/c3-q-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 Target text
3 L1 [Question[x]] [] qs0
corpus/structural-probe/summaries/c3-q-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [Question[x]] [] qs0
corpus/structural-probe/summaries/c3-q-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [] [] qs0
5 L1 [Question[x]] [] qs0
corpus/structural-probe/summaries/c3-q-3.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [] [] qs0
5 L1 [Question[x]] [] qs0 New
corpus/structural-probe/summaries/c3-rem-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 Target text
3 L1 [Remember for later[x]] [] qs0
corpus/structural-probe/summaries/c3-rem-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [Remember for later[x]] [] qs0
corpus/structural-probe/summaries/c3-rem-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [] [] qs0
5 L1 [Remember for later[x]] [] qs0
corpus/structural-probe/summaries/c3-rem-3.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [] [] qs0
5 L1 [Remember for later[x]] [] qs0 New
corpus/structural-probe/summaries/c3-tagbullet-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target text
3 L2 [To Do] [bullet] qs0
corpus/structural-probe/summaries/c3-tagbullet-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target text
3 L2 [] [] qs0
4 L2 [To Do] [] qs0
corpus/structural-probe/summaries/c3-tagbullet-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target text
3 L2 [] [] qs0
4 L2 [] [] qs0
5 L2 [To Do] [] qs0
corpus/structural-probe/summaries/c3-tagbullet-3.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target text
3 L2 [] [] qs0
4 L2 [] [] qs0
5 L2 [To Do] [] qs0 New
corpus/structural-probe/summaries/c3-todo-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target text
3 L1 [To Do] [] qs0
corpus/structural-probe/summaries/c3-todo-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [To Do] [] qs0
corpus/structural-probe/summaries/c3-todo-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [] [] qs0
5 L1 [To Do] [] qs0
corpus/structural-probe/summaries/c3-todo-3.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target text
3 L1 [] [] qs0
4 L1 [] [] qs0
5 L1 [To Do] [] qs0 New
corpus/structural-probe/summaries/c4-bullet-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 First line
3 L2 [] [bullet] qs0 Second line
corpus/structural-probe/summaries/c4-bullet-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 First line
3 L2 [] [] qs0 Second line
corpus/structural-probe/summaries/c4-bullet-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 First line
3 L1 [] [] qs0 Second line
corpus/structural-probe/summaries/c4-bullet-3.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 First lineSecond line
corpus/structural-probe/summaries/c4-child-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 First line
3 L2 [] [] qs0 Second line
corpus/structural-probe/summaries/c4-child-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 First line
3 L1 [] [] qs0 Second line
corpus/structural-probe/summaries/c4-child-2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 First lineSecond line
corpus/structural-probe/summaries/c4-child-3.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 First linSecond line
corpus/structural-probe/summaries/c4-done-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 First line
3 L1 [To Do[x]] [] qs0 Second line
corpus/structural-probe/summaries/c4-done-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 First lineSecond line
corpus/structural-probe/summaries/c4-done-2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 First linSecond line
corpus/structural-probe/summaries/c4-done-3.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 First liSecond line
corpus/structural-probe/summaries/c4-imp-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 First line
3 L1 [Important[x]] [] qs0 Second line
corpus/structural-probe/summaries/c4-imp-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 First lineSecond line
corpus/structural-probe/summaries/c4-imp-2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 First linSecond line
corpus/structural-probe/summaries/c4-imp-3.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Important[x]] [] qs0 First liSecond line
corpus/structural-probe/summaries/c4-num-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 First line
3 L2 [] [num:2.] qs0 Second line
corpus/structural-probe/summaries/c4-num-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 First line
3 L2 [] [] qs0 Second line
corpus/structural-probe/summaries/c4-num-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 First line
3 L1 [] [] qs0 Second line
corpus/structural-probe/summaries/c4-num-3.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 First lineSecond line
corpus/structural-probe/summaries/c4-q-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 First line
3 L1 [Question[x]] [] qs0 Second line
corpus/structural-probe/summaries/c4-q-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 First lineSecond line
corpus/structural-probe/summaries/c4-q-2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 First linSecond line
corpus/structural-probe/summaries/c4-q-3.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Question[x]] [] qs0 First liSecond line
corpus/structural-probe/summaries/c4-rem-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 First line
3 L1 [Remember for later[x]] [] qs0 Second line
corpus/structural-probe/summaries/c4-rem-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 First lineSecond line
corpus/structural-probe/summaries/c4-rem-2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 First linSecond line
corpus/structural-probe/summaries/c4-rem-3.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [Remember for later[x]] [] qs0 First liSecond line
corpus/structural-probe/summaries/c4-tagbullet-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 First line
3 L2 [To Do] [bullet] qs0 Second line
corpus/structural-probe/summaries/c4-tagbullet-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 First line
3 L2 [To Do] [] qs0 Second line
corpus/structural-probe/summaries/c4-tagbullet-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 First line
3 L1 [To Do] [] qs0 Second line
corpus/structural-probe/summaries/c4-tagbullet-3.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 First lineSecond line
corpus/structural-probe/summaries/c4-todo-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 First line
3 L1 [To Do] [] qs0 Second line
corpus/structural-probe/summaries/c4-todo-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 First lineSecond line
corpus/structural-probe/summaries/c4-todo-2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 First linSecond line
corpus/structural-probe/summaries/c4-todo-3.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 First liSecond line
corpus/structural-probe/summaries/c4m-done-todo-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [To Do[x]] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c4m-done-todo-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [To Do[x]] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c4m-emptybullet-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Item
3 L2 [] [bullet] qs0
corpus/structural-probe/summaries/c4m-emptybullet-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Item
3 L2 [] [] qs0
corpus/structural-probe/summaries/c4m-emptybullet-2.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Item
3 L1 [] [] qs0
corpus/structural-probe/summaries/c4m-emptybullet-3.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Item
corpus/structural-probe/summaries/c4m-emptytag-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L1 [To Do] [] qs0
corpus/structural-probe/summaries/c4m-emptytag-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [] [] qs0 Alpha
corpus/structural-probe/summaries/c4m-emptytag-2.txt created+1
......@@ -0,0 +1 @@
1 L1 [] [] qs0 Alph
corpus/structural-probe/summaries/c4m-imp-todo-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [Important[x]] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c4m-imp-todo-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [Important[x]] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c4m-plain-todo-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c4m-plain-todo-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c4m-q-rem-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [Question[x]] [] qs0 Alpha
2 L1 [Remember for later[x]] [] qs0 Beta
corpus/structural-probe/summaries/c4m-q-rem-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [Question[x]] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c4m-todo-done-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [To Do] [] qs0 Alpha
2 L1 [To Do[x]] [] qs0 Beta
corpus/structural-probe/summaries/c4m-todo-done-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [To Do] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c4m-todo-plain-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [To Do] [] qs0 Alpha
2 L1 [] [] qs0 Beta
corpus/structural-probe/summaries/c4m-todo-plain-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [To Do] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c5-bullet-bullet-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 One
3 L2 [Important[x]] [bullet] qs0 Two
corpus/structural-probe/summaries/c5-bullet-bullet-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 One
3 L2 [Important[x]] [bullet] qs0 Two
corpus/structural-probe/summaries/c5-bullet-plain-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Item
3 L1 [] [] qs0 Beta
corpus/structural-probe/summaries/c5-bullet-plain-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Item
3 L1 [] [] qs0 Beta
corpus/structural-probe/summaries/c5-done-todo-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [To Do[x]] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c5-done-todo-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [To Do[x]] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c5-imp-todo-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [Important[x]] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c5-imp-todo-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [Important[x]] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c5-plain-bullet-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L2 [] [bullet] qs0 Beta
corpus/structural-probe/summaries/c5-plain-bullet-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L2 [] [bullet] qs0 Beta
corpus/structural-probe/summaries/c5-plain-num-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L2 [] [num:1.] qs0 Beta
corpus/structural-probe/summaries/c5-plain-num-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L2 [] [num:1.] qs0 Beta
corpus/structural-probe/summaries/c5-plain-todo-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c5-plain-todo-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c5-todo-plain-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [To Do] [] qs0 Alpha
2 L1 [] [] qs0 Beta
corpus/structural-probe/summaries/c5-todo-plain-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [To Do] [] qs0 Alpha
2 L1 [] [] qs0 Beta
corpus/structural-probe/summaries/c5b-bullet-bullet-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 One
3 L2 [Important[x]] [bullet] qs0 Two
corpus/structural-probe/summaries/c5b-bullet-bullet-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 OneTwo
corpus/structural-probe/summaries/c5b-bullet-plain-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Item
3 L1 [] [] qs0 Beta
corpus/structural-probe/summaries/c5b-bullet-plain-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 ItemBeta
corpus/structural-probe/summaries/c5b-done-todo-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [To Do[x]] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c5b-done-todo-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [To Do[x]] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c5b-imp-todo-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [Important[x]] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c5b-imp-todo-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [Important[x]] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c5b-plain-bullet-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L2 [] [bullet] qs0 Beta
corpus/structural-probe/summaries/c5b-plain-bullet-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c5b-plain-num-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L2 [] [num:1.] qs0 Beta
corpus/structural-probe/summaries/c5b-plain-num-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c5b-plain-todo-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L1 [To Do] [] qs0 Beta
corpus/structural-probe/summaries/c5b-plain-todo-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c5b-todo-plain-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [To Do] [] qs0 Alpha
2 L1 [] [] qs0 Beta
corpus/structural-probe/summaries/c5b-todo-plain-1.txt created+1
......@@ -0,0 +1 @@
1 L1 [To Do] [] qs0 AlphaBeta
corpus/structural-probe/summaries/c6-bullet-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target text
corpus/structural-probe/summaries/c6-bullet-midstab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] [bullet]
corpus/structural-probe/summaries/c6-bullet-midtab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] [bullet]
corpus/structural-probe/summaries/c6-bullet-stab1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target text
corpus/structural-probe/summaries/c6-bullet-stab2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] [bullet] qs0 Target text
corpus/structural-probe/summaries/c6-bullet-tab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target text
corpus/structural-probe/summaries/c6-child-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
corpus/structural-probe/summaries/c6-child-midstab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] []
corpus/structural-probe/summaries/c6-child-midtab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] []
corpus/structural-probe/summaries/c6-child-stab1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
corpus/structural-probe/summaries/c6-child-stab2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0 Target text
corpus/structural-probe/summaries/c6-child-tab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
corpus/structural-probe/summaries/c6-first-tab.txt created+1
......@@ -0,0 +1 @@
1 L1 [] [] qs0 Target text
corpus/structural-probe/summaries/c6-num-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target text
corpus/structural-probe/summaries/c6-num-midstab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] [num:1.]
corpus/structural-probe/summaries/c6-num-midtab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] [num:1.]
corpus/structural-probe/summaries/c6-num-stab1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target text
corpus/structural-probe/summaries/c6-num-stab2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] [num:1.] qs0 Target text
corpus/structural-probe/summaries/c6-num-tab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:a.] qs0 Target text
corpus/structural-probe/summaries/c6-plain-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0 Target text
corpus/structural-probe/summaries/c6-plain-midstab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] []
corpus/structural-probe/summaries/c6-plain-midtab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] []
corpus/structural-probe/summaries/c6-plain-stab1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0 Target text
corpus/structural-probe/summaries/c6-plain-stab2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0 Target text
corpus/structural-probe/summaries/c6-plain-tab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
corpus/structural-probe/summaries/c6-tagbullet-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target text
corpus/structural-probe/summaries/c6-tagbullet-midstab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [bullet]
corpus/structural-probe/summaries/c6-tagbullet-midtab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [bullet]
corpus/structural-probe/summaries/c6-tagbullet-stab1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target text
corpus/structural-probe/summaries/c6-tagbullet-stab2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [bullet] qs0 Target text
corpus/structural-probe/summaries/c6-tagbullet-tab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target text
corpus/structural-probe/summaries/c6-todo-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target text
corpus/structural-probe/summaries/c6-todo-midstab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] []
corpus/structural-probe/summaries/c6-todo-midtab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] []
corpus/structural-probe/summaries/c6-todo-stab1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target text
corpus/structural-probe/summaries/c6-todo-stab2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target text
corpus/structural-probe/summaries/c6-todo-tab.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [] qs0 Target text
corpus/structural-probe/summaries/c7-bullet-1.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target
3 L2 [] [] Line one
4 L2 [] [] Line two
5 L2 [] [bullet] qs0 text
corpus/structural-probe/summaries/c7-child-1.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target
3 L2 [] [] Line one
4 L2 [] [] Line two
5 L2 [] [] qs0 text
corpus/structural-probe/summaries/c7-done-1.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [To Do[x]] [] qs0 Target
3 L1 [] [] Line one
4 L1 [] [] Line two
5 L1 [] [] qs0 text
corpus/structural-probe/summaries/c7-num-1.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Target
3 L2 [] [] Line one
4 L2 [] [] Line two`
5 L2 [] [num:2.] qs0 text
corpus/structural-probe/summaries/c7-num2-1.txt created+6
......@@ -0,0 +1,6 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 Firs
3 L2 [] [] Line one
4 L2 [] [] Line two
5 L2 [] [num:2.] qs0 t
6 L2 [] [num:3.] qs0 Second
corpus/structural-probe/summaries/c7-tagbullet-1.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [To Do] [bullet] qs0 Target
3 L2 [] [] Line one
4 L2 [] [] Line two
5 L2 [] [bullet] qs0 text
corpus/structural-probe/summaries/c7-todo-1.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L1 [To Do] [] qs0 Target
3 L1 [] [] Line one
4 L1 [] [] Line two
5 L1 [] [] qs0 text
corpus/structural-probe/summaries/c8-bs-0.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L2 [] [num:2.] qs0 Two
4 L2 [] [num:3.] qs0 Three
5 L2 [] [num:4.] qs0 Four
corpus/structural-probe/summaries/c8-bs-1.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L2 [] [] qs0 Two
4 L2 [] [num:2.] qs0 Three
5 L2 [] [num:3.] qs0 Four
corpus/structural-probe/summaries/c8-bs-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L1 [] [] qs0 Two
4 L2 [] [num:1.] qs0 Three
5 L2 [] [num:2.] qs0 Four
corpus/structural-probe/summaries/c8-del-0.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L2 [] [num:2.] qs0 Two
4 L2 [] [num:3.] qs0 Three
5 L2 [] [num:4.] qs0 Four
corpus/structural-probe/summaries/c8-del-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 OneTwo
3 L2 [] [num:2.] qs0 Three
4 L2 [] [num:3.] qs0 Four
corpus/structural-probe/summaries/c8-enter-empty-0.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L2 [] [num:2.] qs0 Two
4 L2 [] [num:3.] qs0 Three
5 L2 [] [num:4.] qs0 Four
corpus/structural-probe/summaries/c8-enter-empty-1.txt created+6
......@@ -0,0 +1,6 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L2 [] [num:2.] qs0
4 L2 [] [num:2.] qs0 Two
5 L2 [] [num:3.] qs0 Three
6 L2 [] [num:4.] qs0 Four
corpus/structural-probe/summaries/c8-enter-empty-2.txt created+7
......@@ -0,0 +1,7 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L2 [] [] qs0
4 L2 [] [num:2.] qs0
5 L2 [] [num:2.] qs0 Two
6 L2 [] [num:3.] qs0 Three
7 L2 [] [num:4.] qs0 Four
corpus/structural-probe/summaries/c8-split-0.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L2 [] [num:2.] qs0 Two
4 L2 [] [num:3.] qs0 Three
5 L2 [] [num:4.] qs0 Four
corpus/structural-probe/summaries/c8-split-1.txt created+6
......@@ -0,0 +1,6 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L2 [] [num:2.] qs0 T
4 L2 [] [num:3.] qs0 wo
5 L2 [] [num:4.] qs0 Three
6 L2 [] [num:5.] qs0 Four
corpus/structural-probe/summaries/c8-stab-0.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L2 [] [num:2.] qs0 Two
4 L2 [] [num:3.] qs0 Three
5 L2 [] [num:4.] qs0 Four
corpus/structural-probe/summaries/c8-stab-1.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L1 [] [num:1.] qs0 Two
4 L2 [] [num:1.] qs0 Three
5 L2 [] [num:2.] qs0 Four
corpus/structural-probe/summaries/c8-tab-0.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L2 [] [num:2.] qs0 Two
4 L2 [] [num:3.] qs0 Three
5 L2 [] [num:4.] qs0 Four
corpus/structural-probe/summaries/c8-tab-1.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L3 [] [num:a.] qs0 Two
4 L2 [] [num:2.] qs0 Three
5 L2 [] [num:3.] qs0 Four
corpus/structural-probe/summaries/c8-tab-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs0 Above
2 L2 [] [num:1.] qs0 One
3 L2 [] [num:2.] qs0 Two
4 L2 [] [num:3.] qs0 Three
5 L2 [] [num:4.] qs0 Four
corpus/structural-probe/summaries/c9-bold-end-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Plain <span
2style='font-weight:bold'>bold</span>
3 L1 [] [] qs0 <span
4style='font-weight:bold'>next</span>
corpus/structural-probe/summaries/c9-bold-mid-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Plain <span
2style='font-weight:bold'>boldwo</span>
3 L1 [] [] qs0 <span
4style='font-weight:bold'>Qrd</span> tail
corpus/structural-probe/summaries/c9-h1-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs1 <span
2style='font-weight:bold'>Heading</span>
3 L1 [] [] qs0 body
corpus/structural-probe/summaries/c9-h1-2.txt created+5
......@@ -0,0 +1,5 @@
1 L1 [] [] qs1 <span
2style='font-weight:bold'>Head</span>
3 L1 [] [] qs1 <span
4style='font-weight:bold'>ing</span>
5 L1 [] [] qs0 body
corpus/structural-probe/summaries/c9-hl-end-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Plain <span
2style='background:yellow;mso-highlight:yellow'>marked</span>
3 L1 [] [] qs0 <span
4style='background:yellow;mso-highlight:yellow'>next</span>
corpus/structural-probe/summaries/c9-italic-empty-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Plain
2 L1 [] [] qs0
3 L1 [] [] qs0 <span
4style='font-style:italic'>after</span>
corpus/structural-probe/summaries/c9-multitag-1.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Alpha
2 L1 [To Do,Important[x]] [] qs0 Two
3 L1 [] [] qs0 tags
corpus/structural-probe/summaries/c9-multitag-2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Alpha
2 L1 [To Do,Important[x]] [] qs0 Two tags
corpus/structural-probe/summaries/c9-multitag-3.txt created+1
......@@ -0,0 +1 @@
1 L1 [] [] qs0 AlphaTwo tags
corpus/structural-probe/summaries/pb-0.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L1 [] [] qs0 Target text
corpus/structural-probe/summaries/pb-1.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 Target text
corpus/structural-probe/summaries/pb-2.txt created+2
......@@ -0,0 +1,2 @@
1 L1 [] [] qs0 Above
2 L2 [] [] qs0 Target text
corpus/structural-probe/summaries/pbe-0.txt created+3
......@@ -0,0 +1,3 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 One
3 L2 [] [bullet] qs0
corpus/structural-probe/summaries/pbe-1.txt created+4
......@@ -0,0 +1,4 @@
1 L1 [] [] qs0 Above
2 L2 [] [bullet] qs0 One
3 L2 [] [] qs0
4 L2 [] [] qs0
corpus/structural-probe/summaries/probe-ctrl1-a.txt created+1
......@@ -0,0 +1 @@
1 L1 [To Do] [] qs0 Todo cycle
corpus/structural-probe/summaries/probe-ctrl1-b.txt created+1
......@@ -0,0 +1 @@
1 L1 [To Do[x]] [] qs0 Todo cycle
corpus/structural-probe/summaries/probe-ctrl1-c.txt created+1
......@@ -0,0 +1 @@
1 L1 [] [] qs0 Todo cycle
corpus/structural-probe/summaries/tags-page.txt created+9
......@@ -0,0 +1,9 @@
1 L1 [To Do] [] qs0 Tag 1 To Do
2 L1 [Important[x]] [] qs0 Tag 2 Important
3 L1 [Question[x]] [] qs0 Tag 3 Question
4 L1 [Remember for later[x]] [] qs0 Tag 4 Remember for later
5 L1 [Definition[x]] [] qs0 Tag 5 Definition
6 L1 [Highlight[x]] [] qs0 Tag 6 Highlight
7 L1 [Contact[x]] [] qs0 Tag 7 Contact
8 L1 [Address[x]] [] qs0 Tag 8 Address
9 L1 [Phone number[x]] [] qs0 Tag 9 Phone number
corpus/structural-probe/tags.one created
Binary files /dev/null and b/corpus/structural-probe/tags.one differ
crates/onestore/src/files.rs+1-1
......@@ -108,7 +108,7 @@ impl<'a> Store<'a> {
108108 .lists
109109 .values()
110110 .flat_map(|list| &list.nodes)
111 .filter(|node| node.id == 0x94)
111 .filter(|node| node.id == 0x94 && !node.freed())
112112 {
113113 let mut c = node.fields(self);
114114 if c.read::<16>()? != guid {
crates/onestore/src/op/model.rs+18-2
......@@ -636,9 +636,25 @@ fn interpret(page: &mut Page, op: &PageOp) -> Result<(), Error> {
636636 }
637637 }
638638 PageOp::Equation { text, math } => {
639 let object = text_mut(page, *text)?;
639 let (path, index) =
640 text_holder(page, *text).ok_or_else(|| invalid("Text is not on the page"))?;
641 let style = list_at(page, &path)[index]
642 .style
643 .and_then(|style| page.definitions.get(&style))
644 .map(|definition| definition.format.clone())
645 .unwrap_or_default();
646 let paragraph = &mut list_at(page, &path)[index];
647 // Runs read back through the paragraph style and format, which fill what they
648 // leave unset.
649 let inherited = style.inherit(&paragraph.format);
650 let object = paragraph.text_mut().unwrap();
640651 let previous = object.text.spans()[0].format.clone();
641 object.text = paragraph_formatted(math, &previous);
652 let math = Paragraph::from_runs(math.spans().iter().scan(0, |start, span| {
653 let run = (math.text()[*start..span.end].to_owned(), span.format.inherit(&inherited));
654 *start = span.end;
655 Some(run)
656 }));
657 object.text = paragraph_formatted(&math, &previous);
642658 }
643659 PageOp::Insert {
644660 container,
crates/onestore/src/op/tests.rs+1-1
......@@ -29,7 +29,7 @@ const SOURCES: &[(&str, &[u8])] = &[
2929 ("math", include_bytes!("../../../../corpus/math-edit/native-editor/notebook/links.one")),
3030 ("links", include_bytes!("../../../../corpus/link-edit/native-links/notebook/links.one")),
3131 ("paragraph-format", include_bytes!("../../../../corpus/paragraph-format/cold/notebook/synthetic.one")),
32 ("enter-probe", include_bytes!("../../../../evidence/structural-edits/probe-section/probe.one")),
32 ("enter-probe", include_bytes!("../../../../corpus/structural-probe/probe.one")),
3333];
3434
3535/// FILETIME both writers take as the edit's time.
crates/onestore/src/revisions.rs+10
......@@ -114,6 +114,15 @@ impl<'a> Node<'a> {
114114 }
115115 }
116116
117 /// Whether the reference is fcrZero or fcrNil, as OneNote leaves one whose target its
118 /// garbage collection freed.
119 pub(crate) fn freed(&self) -> bool {
120 matches!(
121 self.reference,
122 Some(Reference::Data(chunk) | Reference::NodeList(chunk)) if chunk.absent()
123 )
124 }
125
117126 pub(crate) fn referenced_list<'s>(&self, store: &'s Store<'a>) -> Result<&'s [Node<'a>]> {
118127 let Some(Reference::NodeList(chunk)) = self.reference else {
119128 return Err(Error {
......@@ -166,6 +175,7 @@ impl<'a> RevisionIndex<'a> {
166175 });
167176 }
168177 }
178 8 if node.freed() => {}
169179 8 => {
170180 let id = node.fields(store).exguid()?;
171181 let manifest = node.referenced_list(store)?;
crates/onestore/src/section.rs+7-6
......@@ -152,7 +152,7 @@ impl<'a> Section<'a> {
152152 }
153153 let mut files = Vec::new();
154154 for node in store.lists.values().flat_map(|list| &list.nodes) {
155 if node.id != 0x94 {
155 if node.id != 0x94 || node.freed() {
156156 continue;
157157 }
158158 let (Some(guid), Some(Reference::Data(chunk))) =
......@@ -897,7 +897,7 @@ mod tests {
897897 });
898898 }
899899 GUIDS.set(None);
900 assert!(sealed * 3 > batches, "{sealed} of {batches} batches sealed");
900 assert!(sealed > 0, "no batch of {batches} sealed");
901901 checkpoints
902902 }
903903
......@@ -924,15 +924,16 @@ mod tests {
924924 include_bytes!("../../../corpus/outline-edit/tree/before/notebook/synthetic.one"),
925925 include_bytes!("../../../corpus/paragraph-edit/before/notebook/synthetic.one"),
926926 ];
927 for (seed, source) in corpus.iter().enumerate() {
928 differential(source, seed as u64, 60, 1, 2);
929 differential(source, seed as u64 + 100, 60, 5, 2);
927 let shift = crate::sweep::full().unwrap_or(0);
928 for (seed, source) in (shift..).zip(corpus) {
929 differential(source, seed, 60, 1, 2);
930 differential(source, seed + 100, 60, 5, 2);
930931 }
931932 // Seeded identities: the writes pick nodes in identity order.
932933 let created = seeded(7, || {
933934 crate::create_section("model.one", "First", "Author").unwrap()
934935 });
935 differential(&created, 7, 60, 3, 1);
936 differential(&created, 7 + shift, 60, 3, 1);
936937 }
937938
938939 #[test]
crates/onestore/src/store.rs+6-1
......@@ -566,6 +566,7 @@ impl<'a> Store<'a> {
566566 let last_revision_list = nodes.iter().rposition(|node| node.id == 0x10);
567567 for (index, node) in nodes.iter().enumerate() {
568568 if let Some(Reference::NodeList(reference)) = node.reference
569 && !reference.absent()
569570 && (node.id != 0x10 || Some(index) == last_revision_list)
570571 {
571572 pending.push(reference);
......@@ -614,7 +615,11 @@ impl<'a> Store<'a> {
614615 None => None,
615616 };
616617 let mut spaces = BTreeMap::new();
617 for node in root.nodes.iter().filter(|node| node.id == 8) {
618 for node in root
619 .nodes
620 .iter()
621 .filter(|node| node.id == 8 && !node.freed())
622 {
618623 let revisions = node
619624 .referenced_list(self)?
620625 .iter()
crates/onestore/src/write.rs+1-1
......@@ -1514,7 +1514,7 @@ pub(crate) fn declared_payloads(store: &Store<'_>) -> Vec<[u8; 16]> {
15141514 .lists
15151515 .values()
15161516 .flat_map(|list| &list.nodes)
1517 .filter(|node| node.id == 0x94)
1517 .filter(|node| node.id == 0x94 && !node.freed())
15181518 .filter_map(|node| node.payload.get(..16).and_then(|g| g.try_into().ok()))
15191519 .collect()
15201520}
crates/onestore/tests/commit.rs+49-38
......@@ -219,63 +219,68 @@ fn free_reference(bytes: &mut [u8], offset: usize) {
219219 bytes[offset + 4..offset + 4 + stp + cb].fill(0);
220220}
221221
222/// OneNote's compaction frees deleted pages' object spaces and unused file data, zeroing
223/// the root list's and file-data store's references to them in place.
222224#[test]
223225fn garbage_collected_references_read_as_absent_and_accept_appends() {
224 let source = fs::read("../../corpus/page-lifecycle/removal/features/native/after/notebook/Lifecycle.one")
225 .unwrap();
226 let source = fs::read(
227 "../../corpus/page-lifecycle/removal/features/native/after/notebook/Lifecycle.one",
228 )
229 .unwrap();
226230 let store = Store::parse(&source).unwrap();
227231 let index = RevisionIndex::parse(&store).unwrap();
228232 let document = Document::parse(&index).unwrap();
229233 let pages = document.pages().unwrap();
230 let live = |space: &ExGuid| *space == index.root || pages.iter().any(|(page, _)| page == space);
231 let payloads = |spaces: &mut dyn Iterator<Item = &ExGuid>| {
232 let mut guids = std::collections::BTreeSet::new();
233 for space in spaces {
234 for rid in index.spaces[space].revisions.keys() {
235 for object in index.resolve(*space, *rid).unwrap().objects.values() {
236 if let Some(onestore::FileDataReference::Internal(guid)) =
237 object.file_reference().unwrap()
238 {
239 guids.insert(guid);
240 }
234 let (live, deleted): (Vec<_>, Vec<_>) = index
235 .spaces
236 .keys()
237 .partition(|space| **space == index.root || pages.iter().any(|(page, _)| page == *space));
238 let mut referenced = std::collections::BTreeSet::new();
239 for space in live {
240 for rid in index.spaces[space].revisions.keys() {
241 for object in index.resolve(*space, *rid).unwrap().objects.values() {
242 if let Some(onestore::FileDataReference::Internal(guid)) =
243 object.file_reference().unwrap()
244 {
245 referenced.insert(guid);
241246 }
242247 }
243248 }
244 guids
245 };
246 let deleted: Vec<_> = index.spaces.keys().filter(|space| !live(space)).copied().collect();
247 let referenced = payloads(&mut index.spaces.keys().filter(|space| live(space)));
248 let orphans: Vec<[u8; 16]> = store
249 .lists
250 .values()
251 .flat_map(|list| &list.nodes)
252 .filter(|node| node.id == 0x94)
253 .map(|node| node.payload[..16].try_into().unwrap())
254 .filter(|guid| !referenced.contains(guid))
255 .collect();
256 assert!(!deleted.is_empty() && !orphans.is_empty());
249 }
257250 let mut collected = source.clone();
251 let mut orphans = Vec::new();
258252 for node in store.lists.values().flat_map(|list| &list.nodes) {
259 let tail = |width: usize| &node.payload[node.payload.len() - width..];
260253 let freed = match node.id {
261254 8 => deleted.iter().any(|space| {
262 tail(20) == [space.guid.as_slice(), &space.n.to_le_bytes()].concat()
255 node.payload[node.payload.len() - 20..]
256 == [space.guid.as_slice(), &space.n.to_le_bytes()].concat()
263257 }),
264 0x94 => orphans.iter().any(|guid| node.payload[..16] == *guid),
258 0x94 => {
259 let guid: [u8; 16] = node.payload[..16].try_into().unwrap();
260 !referenced.contains(&guid) && {
261 orphans.push(guid);
262 true
263 }
264 }
265265 _ => false,
266266 };
267267 if freed {
268268 free_reference(&mut collected, node.offset);
269269 }
270270 }
271 assert!(!deleted.is_empty() && !orphans.is_empty());
271272 let store = Store::parse(&collected).unwrap();
272273 let index = RevisionIndex::parse(&store).unwrap();
273274 index.validate_current().unwrap();
274 assert!(deleted.iter().all(|space| !index.spaces.contains_key(space)));
275 assert!(
276 deleted
277 .iter()
278 .all(|space| !index.spaces.contains_key(space))
279 );
275280 assert_eq!(Document::parse(&index).unwrap().pages().unwrap(), pages);
276 for guid in &orphans {
281 for guid in orphans {
277282 assert_eq!(
278 store.file_data(*guid).unwrap_err().message,
283 store.file_data(guid).unwrap_err().message,
279284 "File-data object is not declared"
280285 );
281286 }
......@@ -286,10 +291,13 @@ fn garbage_collected_references_read_as_absent_and_accept_appends() {
286291 .iter()
287292 .flat_map(|(space, view)| {
288293 let nodes = view.active().map(|revision| &revision.nodes);
289 nodes.into_iter().flatten().filter_map(|(id, node)| match &node.kind {
290 Kind::RichText { text, .. } => Some((*space, *id, text.encode_utf16().count())),
291 _ => None,
292 })
294 nodes
295 .into_iter()
296 .flatten()
297 .filter_map(|(id, node)| match &node.kind {
298 Kind::RichText { text, .. } => Some((*space, *id, text.encode_utf16().count())),
299 _ => None,
300 })
293301 })
294302 .find_map(|(space, object, length)| {
295303 let mut section = Section::open(&arena, collected.clone()).unwrap();
......@@ -298,12 +306,15 @@ fn garbage_collected_references_read_as_absent_and_accept_appends() {
298306 range: 0..length as u32,
299307 with: "After collection".into(),
300308 };
301 let edit = Edit { at: 133_700_000_000_000_000, ops: vec![Op::Page { space, op }] };
309 let edit = Edit {
310 at: 133_700_000_000_000_000,
311 ops: vec![Op::Page { space, op }],
312 };
302313 section.apply("Author", &edit).ok()?;
303314 Some((space, object, section.seal().unwrap().unwrap()))
304315 })
305316 .unwrap();
306 let mut written = collected.clone();
317 let mut written = collected;
307318 transaction.apply(&mut written).unwrap();
308319 assert_eq!(text_of(&written, space, object), "After collection");
309320}