From 02d45d734921e4a41dddbf7887dd3224bb4c7f4c Mon Sep 17 00:00:00 2001 From: clover caruso Date: Tue, 8 Sep 2026 02:40:37 -0700 Subject: [PATCH] feat: join ordinary paragraphs with native identity and tag semantics Preserve inherited character styles, nested child placement, history and unrelated objects while publishing the joined graph and title metadata atomically. Empty left paragraphs adopt the right text identity; left tags survive as verified in independent OneNote controls. Validate twenty Rust joins through cold native captures. Add preservation, invalid-target, property-reference remapping and interrupted-publication checks, plus stateful split/join fuzzing. Public gate passes 186 Rust tests, 8 doctests and 130 Python tests with fmt, Clippy and builds. Assisted-by: gpt-6-astra --- corpus/paragraph-edit/README.md | 16 +- .../before/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../join-tags/before/notebook/synthetic.one | Bin 0 -> 36936 bytes .../join-tags/before/read/environment.json | 7 + .../join-tags/before/read/hierarchy.xml | 2 + .../join-tags/before/read/page-000.xml | 5 + .../join-tags/before/read/page-001.xml | 5 + .../join-tags/before/read/page-002.xml | 20 + .../join-tags/before/read/page-003.xml | 5 + .../join-tags/before/read/payloads.json | 1 + corpus/paragraph-edit/join-tags/cases.json | 17 + .../joined/notebook/Open Notebook.onetoc2 | 1 + .../join-tags/joined/notebook/synthetic.one | Bin 0 -> 44032 bytes .../join-tags/joined/read/environment.json | 1 + .../join-tags/joined/read/hierarchy.xml | 2 + .../join-tags/joined/read/page-000.xml | 5 + .../join-tags/joined/read/page-001.xml | 5 + .../join-tags/joined/read/page-002.xml | 20 + .../join-tags/joined/read/page-003.xml | 5 + .../join-tags/joined/read/payloads.json | 1 + .../joined/ui/join-different-tags.ahk | 22 + .../joined/ui/join-different-tags.json | 13 + .../joined/ui/join-different-tags.png | Bin 0 -> 44891 bytes .../joined/ui/join-empty-left-right-tag.ahk | 22 + .../joined/ui/join-empty-left-right-tag.json | 13 + .../joined/ui/join-empty-left-right-tag.png | Bin 0 -> 44900 bytes .../joined/ui/join-empty-left-two-tags.ahk | 22 + .../joined/ui/join-empty-left-two-tags.json | 13 + .../joined/ui/join-empty-left-two-tags.png | Bin 0 -> 45283 bytes .../join-tags/joined/ui/selections.json | 20 + corpus/paragraph-edit/join-tags/run.json | 19 + corpus/paragraph-edit/join-tags/source.json | 1 + corpus/paragraph-edit/join-tags/teardown.json | 1 + .../inheritance/candidate/synthetic.one | Bin 0 -> 56344 bytes .../rust-join/inheritance/manifest.json | 47 ++ .../native/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../inheritance/native/notebook/synthetic.one | Bin 0 -> 56344 bytes .../inheritance/native/read/environment.json | 7 + .../inheritance/native/read/hierarchy.xml | 2 + .../inheritance/native/read/page-000.xml | 5 + .../inheritance/native/read/page-001.xml | 20 + .../inheritance/native/read/page-002.xml | 5 + .../inheritance/native/read/page-003.xml | 5 + .../inheritance/native/read/page-004.xml | 5 + .../inheritance/native/read/page-005.xml | 5 + .../inheritance/native/read/payloads.json | 1 + .../rust-join/inheritance/native/run.json | 18 + .../rust-join/inheritance/native/source.json | 8 + .../inheritance/native/teardown.json | 1 + .../rust-join/split/candidate/synthetic.one | Bin 0 -> 139752 bytes .../rust-join/split/manifest.json | 110 ++++ .../native/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../split/native/notebook/synthetic.one | Bin 0 -> 139752 bytes .../split/native/read/environment.json | 7 + .../rust-join/split/native/read/hierarchy.xml | 2 + .../rust-join/split/native/read/page-000.xml | 5 + .../rust-join/split/native/read/page-001.xml | 20 + .../rust-join/split/native/read/page-002.xml | 5 + .../rust-join/split/native/read/page-003.xml | 5 + .../rust-join/split/native/read/page-004.xml | 3 + .../rust-join/split/native/read/page-005.xml | 5 + .../rust-join/split/native/read/page-006.xml | 5 + .../rust-join/split/native/read/page-007.xml | 3 + .../rust-join/split/native/read/page-008.xml | 5 + .../rust-join/split/native/read/page-009.xml | 2 + .../rust-join/split/native/read/page-010.xml | 5 + .../rust-join/split/native/read/page-011.xml | 6 + .../rust-join/split/native/read/page-012.xml | 5 + .../rust-join/split/native/read/page-013.xml | 5 + .../rust-join/split/native/read/payloads.json | 1 + .../rust-join/split/native/run.json | 18 + .../rust-join/split/native/source.json | 8 + .../rust-join/split/native/teardown.json | 1 + .../rust-join/tags/candidate/synthetic.one | Bin 0 -> 41808 bytes .../rust-join/tags/manifest.json | 29 + .../native/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../tags/native/notebook/synthetic.one | Bin 0 -> 41808 bytes .../tags/native/read/environment.json | 7 + .../rust-join/tags/native/read/hierarchy.xml | 2 + .../rust-join/tags/native/read/page-000.xml | 20 + .../rust-join/tags/native/read/page-001.xml | 5 + .../rust-join/tags/native/read/page-002.xml | 5 + .../rust-join/tags/native/read/page-003.xml | 5 + .../rust-join/tags/native/read/payloads.json | 1 + .../rust-join/tags/native/run.json | 18 + .../rust-join/tags/native/source.json | 8 + .../rust-join/tags/native/teardown.json | 1 + crates/onestore/README.md | 9 + crates/onestore/src/commit.rs | 12 + crates/onestore/src/lib.rs | 2 +- crates/onestore/src/paragraph.rs | 551 +++++++++++++++--- crates/onestore/src/write.rs | 108 ++++ crates/onestore/src/write/tests.rs | 76 ++- crates/onestore/tests/paragraph.rs | 442 +++++++++++++- fuzz/fuzz_targets/paragraph.rs | 127 ++-- tools/native/paragraph-tag-joins.ps1 | 39 ++ tools/test_paragraph_edit.py | 146 +++-- 97 files changed, 2054 insertions(+), 178 deletions(-) create mode 100644 corpus/paragraph-edit/join-tags/before/notebook/Open Notebook.onetoc2 create mode 100644 corpus/paragraph-edit/join-tags/before/notebook/synthetic.one create mode 100644 corpus/paragraph-edit/join-tags/before/read/environment.json create mode 100644 corpus/paragraph-edit/join-tags/before/read/hierarchy.xml create mode 100644 corpus/paragraph-edit/join-tags/before/read/page-000.xml create mode 100644 corpus/paragraph-edit/join-tags/before/read/page-001.xml create mode 100644 corpus/paragraph-edit/join-tags/before/read/page-002.xml create mode 100644 corpus/paragraph-edit/join-tags/before/read/page-003.xml create mode 120000 corpus/paragraph-edit/join-tags/before/read/payloads.json create mode 100644 corpus/paragraph-edit/join-tags/cases.json create mode 120000 corpus/paragraph-edit/join-tags/joined/notebook/Open Notebook.onetoc2 create mode 100644 corpus/paragraph-edit/join-tags/joined/notebook/synthetic.one create mode 120000 corpus/paragraph-edit/join-tags/joined/read/environment.json create mode 100644 corpus/paragraph-edit/join-tags/joined/read/hierarchy.xml create mode 100644 corpus/paragraph-edit/join-tags/joined/read/page-000.xml create mode 100644 corpus/paragraph-edit/join-tags/joined/read/page-001.xml create mode 100644 corpus/paragraph-edit/join-tags/joined/read/page-002.xml create mode 100644 corpus/paragraph-edit/join-tags/joined/read/page-003.xml create mode 120000 corpus/paragraph-edit/join-tags/joined/read/payloads.json create mode 100644 corpus/paragraph-edit/join-tags/joined/ui/join-different-tags.ahk create mode 100644 corpus/paragraph-edit/join-tags/joined/ui/join-different-tags.json create mode 100644 corpus/paragraph-edit/join-tags/joined/ui/join-different-tags.png create mode 100644 corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-right-tag.ahk create mode 100644 corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-right-tag.json create mode 100644 corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-right-tag.png create mode 100644 corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-two-tags.ahk create mode 100644 corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-two-tags.json create mode 100644 corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-two-tags.png create mode 100644 corpus/paragraph-edit/join-tags/joined/ui/selections.json create mode 100644 corpus/paragraph-edit/join-tags/run.json create mode 120000 corpus/paragraph-edit/join-tags/source.json create mode 120000 corpus/paragraph-edit/join-tags/teardown.json create mode 100644 corpus/paragraph-edit/rust-join/inheritance/candidate/synthetic.one create mode 100644 corpus/paragraph-edit/rust-join/inheritance/manifest.json create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/notebook/Open Notebook.onetoc2 create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/notebook/synthetic.one create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/read/environment.json create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/read/hierarchy.xml create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/read/page-000.xml create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/read/page-001.xml create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/read/page-002.xml create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/read/page-003.xml create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/read/page-004.xml create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/read/page-005.xml create mode 120000 corpus/paragraph-edit/rust-join/inheritance/native/read/payloads.json create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/run.json create mode 100644 corpus/paragraph-edit/rust-join/inheritance/native/source.json create mode 120000 corpus/paragraph-edit/rust-join/inheritance/native/teardown.json create mode 100644 corpus/paragraph-edit/rust-join/split/candidate/synthetic.one create mode 100644 corpus/paragraph-edit/rust-join/split/manifest.json create mode 100644 corpus/paragraph-edit/rust-join/split/native/notebook/Open Notebook.onetoc2 create mode 100644 corpus/paragraph-edit/rust-join/split/native/notebook/synthetic.one create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/environment.json create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/hierarchy.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-000.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-001.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-002.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-003.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-004.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-005.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-006.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-007.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-008.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-009.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-010.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-011.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-012.xml create mode 100644 corpus/paragraph-edit/rust-join/split/native/read/page-013.xml create mode 120000 corpus/paragraph-edit/rust-join/split/native/read/payloads.json create mode 100644 corpus/paragraph-edit/rust-join/split/native/run.json create mode 100644 corpus/paragraph-edit/rust-join/split/native/source.json create mode 120000 corpus/paragraph-edit/rust-join/split/native/teardown.json create mode 100644 corpus/paragraph-edit/rust-join/tags/candidate/synthetic.one create mode 100644 corpus/paragraph-edit/rust-join/tags/manifest.json create mode 100644 corpus/paragraph-edit/rust-join/tags/native/notebook/Open Notebook.onetoc2 create mode 100644 corpus/paragraph-edit/rust-join/tags/native/notebook/synthetic.one create mode 100644 corpus/paragraph-edit/rust-join/tags/native/read/environment.json create mode 100644 corpus/paragraph-edit/rust-join/tags/native/read/hierarchy.xml create mode 100644 corpus/paragraph-edit/rust-join/tags/native/read/page-000.xml create mode 100644 corpus/paragraph-edit/rust-join/tags/native/read/page-001.xml create mode 100644 corpus/paragraph-edit/rust-join/tags/native/read/page-002.xml create mode 100644 corpus/paragraph-edit/rust-join/tags/native/read/page-003.xml create mode 120000 corpus/paragraph-edit/rust-join/tags/native/read/payloads.json create mode 100644 corpus/paragraph-edit/rust-join/tags/native/run.json create mode 100644 corpus/paragraph-edit/rust-join/tags/native/source.json create mode 120000 corpus/paragraph-edit/rust-join/tags/native/teardown.json create mode 100644 tools/native/paragraph-tag-joins.ps1 diff --git a/corpus/paragraph-edit/README.md b/corpus/paragraph-edit/README.md index bd0c08d60565a9d42b08016c4b3067b6c9966feb..162562834f34293f17959d97333e96bee9d54e71 100644 --- a/corpus/paragraph-edit/README.md +++ b/corpus/paragraph-edit/README.md @@ -34,8 +34,7 @@ directory comes from `ONESTORE_PARAGRAPH_OUTPUT`. Native character/style compari use both the keyboard-generated controls and the Rust-written notebooks. Empty typing checks extend the preexisting empty run in an independent expected model. -`tools/test_paragraph_edit.py` verifies these controls without a VM. The native -join captures establish behavior for subsequent join implementation. +`tools/test_paragraph_edit.py` verifies these controls without a VM. Identical captured files link to one canonical copy within this corpus. `join-edges`, authored with `tools/native/paragraph-joins.ps1`, adds five native @@ -48,3 +47,16 @@ The untouched parent's text gains a timestamp and `0x880034dd`, as in the earlie native controls; its content and other properties stay unchanged. The test fixes these observed graph, identity and metadata effects alongside independent native character-style comparisons. + +`join-tags`, authored with `tools/native/paragraph-tag-joins.ps1`, confirms the +left-tag rule for an empty untagged left paragraph, an empty tagged left paragraph +with a different right tag, and two nonempty paragraphs with different tags. +Right-side tags disappear in all three cases; only the left tag survives. + +`rust-join` retains twenty Rust joins across the original splits, inheritance +edges and additional tag controls. Each group has a cold OneNote capture and +saved notebook. Public tests compare the Rust and native-saved images to native +XML, preserve exact child/content identities across reopening, and compare +the native-rendered result to the corresponding keyboard-generated control. +`export_native_paragraph_joins` regenerates candidates in a new directory specified +by `ONESTORE_PARAGRAPH_JOIN_OUTPUT`. diff --git a/corpus/paragraph-edit/join-tags/before/notebook/Open Notebook.onetoc2 b/corpus/paragraph-edit/join-tags/before/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..064330348dfb7dd96b98ad3f0271099cba301e34 GIT binary patch literal 4800 zcmZ3e|KIuM`!b(-j|5(YE0x8!>lm19U1{LDqkE#8dmcLz0~)ZuJ4--%;#be57sMyN zJ+bbFG*BKH!<7FA0uY-OCIF>j;%LGsT#yJmm3h@xRi zVk;kE;REYph!o&%1WCVWXqdi0kiA;j%ze_eCr9G4cQJy>N^Ic4QZuen`@2wiMUjRE z1{Gk?gOo#^&{F`}JUu(YhWC zy(btMVI?rIY;H+m=t1@f$V3oWA8F9g08=LeH1fXyLjzcbXyO1LR4EGs1FZf4iZp;k zfsO&2&cyIdhCyYY41);Bd0Xb)14%+a0}I0xSq7P%K)Gxn4N?QDZ8BZm3K!ODdQG4D zC28IYL)5Z@_Y(_&CeR4GU+W21f&i-jj?hTtG*#VvU;`O@?2f_y8F{3PwX< OGz4&k0CKSgD}Mkp4>}(J literal 0 HcmV?d00001 diff --git a/corpus/paragraph-edit/join-tags/before/notebook/synthetic.one b/corpus/paragraph-edit/join-tags/before/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..fd8f46b91324c8903165bf061b93f60d8381f329 GIT binary patch literal 36936 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 ZeIFV**8Z#hM?L;I+;H^N!2t&c{tq(dUDf~q literal 0 HcmV?d00001 diff --git a/corpus/paragraph-edit/join-tags/before/read/environment.json b/corpus/paragraph-edit/join-tags/before/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..071b20d3dd9ce19fa79bfc9f7e55dbf524246b93 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/before/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-57E1FB2A", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/paragraph-edit/join-tags/before/read/hierarchy.xml b/corpus/paragraph-edit/join-tags/before/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..593493e32f7c5cb4c5abcb2505a132c6ec2c9cc5 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/before/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/paragraph-edit/join-tags/before/read/page-000.xml b/corpus/paragraph-edit/join-tags/before/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..1d7a403358436a0e4b3eb3b42b4d9a1d9521bb57 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/before/read/page-000.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/join-tags/before/read/page-001.xml b/corpus/paragraph-edit/join-tags/before/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..fc636e01a16d90ec85fb0d7e9f9ecb723582ca97 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/before/read/page-001.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/join-tags/before/read/page-002.xml b/corpus/paragraph-edit/join-tags/before/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d727eb5dd1a3515795c1ff680c1ef288e37519b --- /dev/null +++ b/corpus/paragraph-edit/join-tags/before/read/page-002.xml @@ -0,0 +1,20 @@ + +Bold 🦀 italic é color 東京
+End
]]>
Fictitious: café, 東京, مرحبا]]>
diff --git a/corpus/paragraph-edit/join-tags/before/read/page-003.xml b/corpus/paragraph-edit/join-tags/before/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..d4206f1d03b81dac0ce27b398d4192217c46cb27 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/before/read/page-003.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/join-tags/before/read/payloads.json b/corpus/paragraph-edit/join-tags/before/read/payloads.json new file mode 120000 index 0000000000000000000000000000000000000000..3cf45dc1acb611d7f764e0340d73e87192f81407 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/before/read/payloads.json @@ -0,0 +1 @@ +../../../before/read/payloads.json \ No newline at end of file diff --git a/corpus/paragraph-edit/join-tags/cases.json b/corpus/paragraph-edit/join-tags/cases.json new file mode 100644 index 0000000000000000000000000000000000000000..56d9b3d53dbe3a1c2ba1a84b037700a289ecec77 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/cases.json @@ -0,0 +1,17 @@ +[ + { + "body": "\u003cone:OE\u003e\u003cone:T\u003e\u003c![CDATA[]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e\u003cone:OE\u003e\u003cone:Tag index=\"1\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003e\u003c![CDATA[\u003cb\u003eBold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e 🦀 é \u003cspan style=\"color:#123456\"\u003etail\u003c/span\u003e]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e", + "name": "Join empty left right tag", + "page": "{110D64A5-F4AB-4699-B620-CF39E7595E3D}{1}{B0}" + }, + { + "body": "\u003cone:OE\u003e\u003cone:Tag index=\"0\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003e\u003c![CDATA[]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e\u003cone:OE\u003e\u003cone:Tag index=\"1\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003e\u003c![CDATA[\u003cb\u003eBold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e 🦀 é \u003cspan style=\"color:#123456\"\u003etail\u003c/span\u003e]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e", + "name": "Join empty left two tags", + "page": "{4D3539F2-613D-47F1-AD5A-6D8EAD9D9901}{1}{B0}" + }, + { + "body": "\u003cone:OE\u003e\u003cone:Tag index=\"0\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003eLeft\u003c/one:T\u003e\u003c/one:OE\u003e\u003cone:OE\u003e\u003cone:Tag index=\"1\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003e\u003c![CDATA[\u003cb\u003eBold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e 🦀 é \u003cspan style=\"color:#123456\"\u003etail\u003c/span\u003e]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e", + "name": "Join different tags", + "page": "{8266EEF9-BFB3-4061-B62F-67D83F1A49FF}{1}{B0}" + } +] diff --git a/corpus/paragraph-edit/join-tags/joined/notebook/Open Notebook.onetoc2 b/corpus/paragraph-edit/join-tags/joined/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..a6c7d197861f52dda5ecaf4da2ab7e471f409518 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../before/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/paragraph-edit/join-tags/joined/notebook/synthetic.one b/corpus/paragraph-edit/join-tags/joined/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..858448c79a0ad1bc5f50a95f163873f9e62040a9 GIT binary patch literal 44032 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 + diff --git a/corpus/paragraph-edit/join-tags/joined/read/page-000.xml b/corpus/paragraph-edit/join-tags/joined/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..84e778b834e7190545c998832644e5d83c98b8c0 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/read/page-000.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/join-tags/joined/read/page-001.xml b/corpus/paragraph-edit/join-tags/joined/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..0fdc79afba55934ca76360ee627a657709889a9e --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/read/page-001.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/join-tags/joined/read/page-002.xml b/corpus/paragraph-edit/join-tags/joined/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..291c17183d5b531f4dad9c71f2ed65cf64b91a11 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/read/page-002.xml @@ -0,0 +1,20 @@ + +Bold 🦀 italic é color 東京
+End
]]>
Fictitious: café, 東京, مرحبا]]>
diff --git a/corpus/paragraph-edit/join-tags/joined/read/page-003.xml b/corpus/paragraph-edit/join-tags/joined/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..98134b3e8ee9aa22f1ddb6b4e695d04af80c1a40 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/read/page-003.xml @@ -0,0 +1,5 @@ + +LeftBold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/join-tags/joined/read/payloads.json b/corpus/paragraph-edit/join-tags/joined/read/payloads.json new file mode 120000 index 0000000000000000000000000000000000000000..3cf45dc1acb611d7f764e0340d73e87192f81407 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/read/payloads.json @@ -0,0 +1 @@ +../../../before/read/payloads.json \ No newline at end of file diff --git a/corpus/paragraph-edit/join-tags/joined/ui/join-different-tags.ahk b/corpus/paragraph-edit/join-tags/joined/ui/join-different-tags.ahk new file mode 100644 index 0000000000000000000000000000000000000000..4cd99f2353e5997f4bb7efb5d1f1927705e40cdd --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/ui/join-different-tags.ahk @@ -0,0 +1,22 @@ +#Requires AutoHotkey v2.0 +OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1))) +dm := Buffer(220, 0) +NumPut("UShort", 220, dm, 68) +if !DllCall("EnumDisplaySettingsW", "Ptr", 0, "UInt", 0xFFFFFFFF, "Ptr", dm) + throw Error("Cannot inspect display mode") +NumPut("UInt", NumGet(dm, 72, "UInt") | 0x180000, dm, 72) +NumPut("UInt", 1280, dm, 172) +NumPut("UInt", 720, dm, 176) +if DllCall("ChangeDisplaySettingsW", "Ptr", dm, "UInt", 0, "Int") != 0 + throw Error("Display mode rejected") +app := ComObject("OneNote.Application") +app.NavigateTo("{B93EF35F-621E-4F9A-90D4-B55A0CF7E4AA}{1}{B0}", "{998EEB43-1A80-48BB-B928-2AE6052587A2}{46}{B0}", false) +hwnd := WinWait("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE",, 10) +if !hwnd + throw Error("OneNote window did not appear") +WinMaximize(hwnd) +WinActivate(hwnd) +if !WinWaitActive(hwnd,, 10) + throw Error("OneNote window did not become active") +Sleep 300 +Send "{Left}{Backspace}" diff --git a/corpus/paragraph-edit/join-tags/joined/ui/join-different-tags.json b/corpus/paragraph-edit/join-tags/joined/ui/join-different-tags.json new file mode 100644 index 0000000000000000000000000000000000000000..a7131b561a3dc5e5afc8eae4b4100e6b42e02e20 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/ui/join-different-tags.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 1280, + "h": 720, + "error": null, + "win": { + "title": "Join different tags - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/paragraph-edit/join-tags/joined/ui/join-different-tags.png b/corpus/paragraph-edit/join-tags/joined/ui/join-different-tags.png new file mode 100644 index 0000000000000000000000000000000000000000..7afde0130f593b6762527cc1f73a16739e2aa2eb GIT binary patch literal 44891 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℘ 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 D_#xbC literal 0 HcmV?d00001 diff --git a/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-right-tag.ahk b/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-right-tag.ahk new file mode 100644 index 0000000000000000000000000000000000000000..49844f898faf78fab6c63bbda071c3c6e0d6eed8 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-right-tag.ahk @@ -0,0 +1,22 @@ +#Requires AutoHotkey v2.0 +OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1))) +dm := Buffer(220, 0) +NumPut("UShort", 220, dm, 68) +if !DllCall("EnumDisplaySettingsW", "Ptr", 0, "UInt", 0xFFFFFFFF, "Ptr", dm) + throw Error("Cannot inspect display mode") +NumPut("UInt", NumGet(dm, 72, "UInt") | 0x180000, dm, 72) +NumPut("UInt", 1280, dm, 172) +NumPut("UInt", 720, dm, 176) +if DllCall("ChangeDisplaySettingsW", "Ptr", dm, "UInt", 0, "Int") != 0 + throw Error("Display mode rejected") +app := ComObject("OneNote.Application") +app.NavigateTo("{2A557903-2906-4962-90DB-1DBBD4B4F368}{1}{B0}", "{DB20B227-1FF5-4341-9621-D7C3E0EEE79B}{46}{B0}", false) +hwnd := WinWait("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE",, 10) +if !hwnd + throw Error("OneNote window did not appear") +WinMaximize(hwnd) +WinActivate(hwnd) +if !WinWaitActive(hwnd,, 10) + throw Error("OneNote window did not become active") +Sleep 300 +Send "{Left}{Backspace}" diff --git a/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-right-tag.json b/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-right-tag.json new file mode 100644 index 0000000000000000000000000000000000000000..1b7b1e5e4f0dbdca9c6dff38dbf3dd087b547a96 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-right-tag.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 1280, + "h": 720, + "error": null, + "win": { + "title": "Join empty left right tag - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-right-tag.png b/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-right-tag.png new file mode 100644 index 0000000000000000000000000000000000000000..7def31a3e394687523edf16b4d9537af80862ff4 GIT binary patch literal 44900 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⪙Jj2TUInh&bvT`` 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 ff-KD6cO=hM=DCBeB literal 0 HcmV?d00001 diff --git a/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-two-tags.ahk b/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-two-tags.ahk new file mode 100644 index 0000000000000000000000000000000000000000..c851fdf2c0e3272bb51e512cb3269632ffe07273 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-two-tags.ahk @@ -0,0 +1,22 @@ +#Requires AutoHotkey v2.0 +OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1))) +dm := Buffer(220, 0) +NumPut("UShort", 220, dm, 68) +if !DllCall("EnumDisplaySettingsW", "Ptr", 0, "UInt", 0xFFFFFFFF, "Ptr", dm) + throw Error("Cannot inspect display mode") +NumPut("UInt", NumGet(dm, 72, "UInt") | 0x180000, dm, 72) +NumPut("UInt", 1280, dm, 172) +NumPut("UInt", 720, dm, 176) +if DllCall("ChangeDisplaySettingsW", "Ptr", dm, "UInt", 0, "Int") != 0 + throw Error("Display mode rejected") +app := ComObject("OneNote.Application") +app.NavigateTo("{766D2454-BC90-480A-8BA1-BF0C9E703454}{1}{B0}", "{5237862E-022E-4FC4-8E36-D9C8E010D9E1}{47}{B0}", false) +hwnd := WinWait("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE",, 10) +if !hwnd + throw Error("OneNote window did not appear") +WinMaximize(hwnd) +WinActivate(hwnd) +if !WinWaitActive(hwnd,, 10) + throw Error("OneNote window did not become active") +Sleep 300 +Send "{Left}{Backspace}" diff --git a/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-two-tags.json b/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-two-tags.json new file mode 100644 index 0000000000000000000000000000000000000000..1faac657daf930348836578a92c8d73bf39fa538 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-two-tags.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 1280, + "h": 720, + "error": null, + "win": { + "title": "Join empty left two tags - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-two-tags.png b/corpus/paragraph-edit/join-tags/joined/ui/join-empty-left-two-tags.png new file mode 100644 index 0000000000000000000000000000000000000000..07207d8ae0b7612aea91a6c1717b3e79b0700281 GIT binary patch literal 45283 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 WI#_H|hHv~`f=pRnU9MKfJmNpAG901+ literal 0 HcmV?d00001 diff --git a/corpus/paragraph-edit/join-tags/joined/ui/selections.json b/corpus/paragraph-edit/join-tags/joined/ui/selections.json new file mode 100644 index 0000000000000000000000000000000000000000..0ef76b57c78091049b0d48d0920bef1a3c9a4eb1 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/joined/ui/selections.json @@ -0,0 +1,20 @@ +[ + { + "case": "Join empty left right tag", + "page": "{2A557903-2906-4962-90DB-1DBBD4B4F368}{1}{B0}", + "object": "{DB20B227-1FF5-4341-9621-D7C3E0EEE79B}{46}{B0}", + "keys": "{Left}{Backspace}" + }, + { + "case": "Join empty left two tags", + "page": "{766D2454-BC90-480A-8BA1-BF0C9E703454}{1}{B0}", + "object": "{5237862E-022E-4FC4-8E36-D9C8E010D9E1}{47}{B0}", + "keys": "{Left}{Backspace}" + }, + { + "case": "Join different tags", + "page": "{B93EF35F-621E-4F9A-90D4-B55A0CF7E4AA}{1}{B0}", + "object": "{998EEB43-1A80-48BB-B928-2AE6052587A2}{46}{B0}", + "keys": "{Left}{Backspace}" + } +] \ No newline at end of file diff --git a/corpus/paragraph-edit/join-tags/run.json b/corpus/paragraph-edit/join-tags/run.json new file mode 100644 index 0000000000000000000000000000000000000000..6ba9afe3f14a07d8fb9b73fcae81069719dbd9c4 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/run.json @@ -0,0 +1,19 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/formatted-insertion/native-paragraph/candidate", + "expected_pages": 4, + "author": "evidence/m10/native-paragraph-tag-joins.ps1", + "author_timeout_seconds": 600, + "inspect": true, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "f975577d6abdb21e6cc8e2a6f605ab239047108e6da2e2f804ab8197991d86e7", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/paragraph-edit/join-tags/source.json b/corpus/paragraph-edit/join-tags/source.json new file mode 120000 index 0000000000000000000000000000000000000000..4a9bb6bad713be61d465b5795764dd2e121941a8 --- /dev/null +++ b/corpus/paragraph-edit/join-tags/source.json @@ -0,0 +1 @@ +../join-edges/source.json \ No newline at end of file diff --git a/corpus/paragraph-edit/join-tags/teardown.json b/corpus/paragraph-edit/join-tags/teardown.json new file mode 120000 index 0000000000000000000000000000000000000000..e7edcabb62ab061e4e24fd304ce5b814f51c282e --- /dev/null +++ b/corpus/paragraph-edit/join-tags/teardown.json @@ -0,0 +1 @@ +../join-edges/teardown.json \ No newline at end of file diff --git a/corpus/paragraph-edit/rust-join/inheritance/candidate/synthetic.one b/corpus/paragraph-edit/rust-join/inheritance/candidate/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..1711afce11399174743d602c7c9a66789f663343 GIT binary patch literal 56344 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

Hf}> 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 literal 0 HcmV?d00001 diff --git a/corpus/paragraph-edit/rust-join/inheritance/manifest.json b/corpus/paragraph-edit/rust-join/inheritance/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..5a7e1cd0111c4dea215677704946a71105260cbd --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/manifest.json @@ -0,0 +1,47 @@ +[ + { + "case": "Join inherited styles", + "intent": { + "author": "Rust join author", + "left": "{10952FC5-A849-0DE5-03A7-5D9304627DA7},44", + "right": "{10952FC5-A849-0DE5-03A7-5D9304627DA7},50" + }, + "space": "{D6CEB12D-D1B7-033B-20A2-E9B6FF501602},1" + }, + { + "case": "Join empty left tag", + "intent": { + "author": "Rust join author", + "left": "{8BAFC64A-8457-0253-3906-57D27F8546B7},45", + "right": "{8BAFC64A-8457-0253-3906-57D27F8546B7},51" + }, + "space": "{F6E7A6F0-805F-0858-2B5A-4B1260940CF9},1" + }, + { + "case": "Join right tag", + "intent": { + "author": "Rust join author", + "left": "{2E9A20A9-1E0E-0F04-0FCE-8497CF032068},44", + "right": "{2E9A20A9-1E0E-0F04-0FCE-8497CF032068},49" + }, + "space": "{04EE80E5-584B-04E0-1F05-07D86902DFA1},1" + }, + { + "case": "Join both tags", + "intent": { + "author": "Rust join author", + "left": "{7A5195E3-F792-0C49-1F3C-EBBFCE774FE6},44", + "right": "{7A5195E3-F792-0C49-1F3C-EBBFCE774FE6},50" + }, + "space": "{631A0B54-DBB1-0988-22E1-96E8B1202B59},1" + }, + { + "case": "Join both children", + "intent": { + "author": "Rust join author", + "left": "{0384F5F6-5F0B-0164-32C6-6E97A4F1B661},49", + "right": "{0384F5F6-5F0B-0164-32C6-6E97A4F1B661},54" + }, + "space": "{D7D982D1-A3D3-0690-1181-A9703CF717E5},1" + } +] \ No newline at end of file diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/notebook/Open Notebook.onetoc2 b/corpus/paragraph-edit/rust-join/inheritance/native/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..b0893a34c508a3537f3d2854a0f0e040034a97e8 GIT binary patch literal 4800 zcmZ3e|KIuM`!b(-j|5(YE0x8sxH5^6<*$p^LfI?V&q`jYV?YD;cV`JmPyFh+^n&=r zw;)KmcO1!UUi+OdL%Zg$q&x0$@Q7s1ys324N5Y(hwC8H3x(s!Z7k_ zN3lVo+BW|MHUEo`9z3hh4V7qF*BGhK$LO}8R61Bv{>w&~dTjI-&4v8P7@L|=vC$A1 z>LGCC%lEGvtHPEDKs~~d!!WghQRN|Xc{A&wpAP-!9~d2W9ZfQ<(xld?p|k1Y(dF2&Z?>@&)lh;-IP)CT^2_ zZ!w6^1r;;R7D)#2MWFl?9WQqva}c>x)QsY@7DAc}@5 ziLHEug%7NYAyR<55hVShpJ8vp`sXvKti%Q`OfYaRv%kv-kyjLH zXkbtQ20cir&nBsx=cPovS6!TFr@$Opr6JJJ&;yiHv=?=W|FYh9$yKxHg*%ovgS6^; zF!Y{aWQ3K#z_Pg|g`o%8BOnt&V11-PLjz2m4A98`0t^jc8KQ{;d{Ct<3=FXP11Qn} z5(PR2Y&sLeHyH+%eKHIpAm?qFcMl{90Szn+Q)C%rb^_(Hfiy@BsJ1!jH817i)hNH^ z+|8S_1sUT&`ecB(n4yv(kD-JigCP}2W-=r*=rQC2MN)xsAP)j5AV7{EkWNq>JecLX znPJC4hed9&IfByNl^}6!@sdy&jVlgLwyj=tB}BlnS=v$5s_d?tDlqVXrhuzHSbSJF z*ev+UV(Qw@vHqq!&kAjjHK6!7%g7B2XP^d01BTv{j4WJ0SyrrZQ=`f73ltw9<43`0 Q2#kgRt`I;j)?noi04Sh882|tP literal 0 HcmV?d00001 diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/notebook/synthetic.one b/corpus/paragraph-edit/rust-join/inheritance/native/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..9df4b97872e8ecc4b5ca09e2924edf639639e2ba GIT binary patch literal 56344 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 literal 0 HcmV?d00001 diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/read/environment.json b/corpus/paragraph-edit/rust-join/inheritance/native/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..a131c4590186f953625489f6ee0491aa2bbb4782 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-36919857", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/read/hierarchy.xml b/corpus/paragraph-edit/rust-join/inheritance/native/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..43d800750395b12aa75a91372e4b9c71a0bef23c --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/read/page-000.xml b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..190bc6162af54e692b4f3f5ff984bb7ddcb2b694 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-000.xml @@ -0,0 +1,5 @@ + +LeftBold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/read/page-001.xml b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9f4e7f4664373221d9be021e23c8037e981272a --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-001.xml @@ -0,0 +1,20 @@ + +Bold 🦀 italic é color 東京
+End
]]>
Fictitious: café, 東京, مرحبا]]>
diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/read/page-002.xml b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..bead0314c4f44865b27916f59f3571c91c851c5f --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-002.xml @@ -0,0 +1,5 @@ + +LeftBold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/read/page-003.xml b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..d14c76a42aed7d91c2a05b10de9214c850b82690 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-003.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/read/page-004.xml b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..8a02d17b989865a26a76c6c2b19fc04e5288172a --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-004.xml @@ -0,0 +1,5 @@ + +Left childBold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/read/page-005.xml b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..3a1c39eba71067e803c41b44105816ffde404fc4 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/read/page-005.xml @@ -0,0 +1,5 @@ + +LeftRight italic]]> diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/read/payloads.json b/corpus/paragraph-edit/rust-join/inheritance/native/read/payloads.json new file mode 120000 index 0000000000000000000000000000000000000000..787b4bae85038cda922f8befac6c8ed361fa8035 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/read/payloads.json @@ -0,0 +1 @@ +../../../../before/read/payloads.json \ No newline at end of file diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/run.json b/corpus/paragraph-edit/rust-join/inheritance/native/run.json new file mode 100644 index 0000000000000000000000000000000000000000..c2f772a0b8978fa99392d3d82049a03eeb6848ba --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/paragraph-rust-join-01/inheritance/candidate", + "expected_pages": 6, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/source.json b/corpus/paragraph-edit/rust-join/inheritance/native/source.json new file mode 100644 index 0000000000000000000000000000000000000000..4ff673f31d5c63ccbca4e09520e1f20459168b94 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 56344, + "sha256": "50318b4b3d4f4850dd578518eea4cc7649d29cc0c84b0d6a9b41811f91e6e2e1", + "mtime_ns": 1788860404399203298 + } +] diff --git a/corpus/paragraph-edit/rust-join/inheritance/native/teardown.json b/corpus/paragraph-edit/rust-join/inheritance/native/teardown.json new file mode 120000 index 0000000000000000000000000000000000000000..4a260ae81ad209364b9d4ace600eec3f48f27aba --- /dev/null +++ b/corpus/paragraph-edit/rust-join/inheritance/native/teardown.json @@ -0,0 +1 @@ +../../../join-edges/teardown.json \ No newline at end of file diff --git a/corpus/paragraph-edit/rust-join/split/candidate/synthetic.one b/corpus/paragraph-edit/rust-join/split/candidate/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..f6e260945fd148d5bf3002a9fb3605c51de2e865 GIT binary patch literal 139752 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 N1aO4_adWV literal 0 HcmV?d00001 diff --git a/corpus/paragraph-edit/rust-join/split/native/notebook/synthetic.one b/corpus/paragraph-edit/rust-join/split/native/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..c628f10eb6e05aa86b8b8303798be23bb3fd6bb9 GIT binary patch literal 139752 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 + diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-000.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..9c5b5e5620baf4d2875b475c2e32ab7eb3228f15 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-000.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-001.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..ffd2fc371f4b506d2b9c50ee8b3f513074920f82 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-001.xml @@ -0,0 +1,20 @@ + +Bold 🦀 italic é color 東京
+End
]]>
Fictitious: café, 東京, مرحبا]]>
diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-002.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..42ce5dc2d35a421f95c5ff57d1656fd8bc15facf --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-002.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-003.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..f44f5a693145d9cd3e7f13915dd75976865eda0d --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-003.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-004.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..d3e9383b0cd0c25408c0fe4287b01935d20e2d6a --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-004.xml @@ -0,0 +1,3 @@ + +Link label
tail]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-005.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..c2ea1f1da0663e0195e7cd66a40115d4c0b801cf --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-005.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-006.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..a978087ea853f5223c0747101fc5becef4c63c79 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-006.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-007.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..d2c17cb3894672743c763c7ed7496409498cba06 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-007.xml @@ -0,0 +1,3 @@ + + +soft break]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-008.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..f3257b00d3350ab51c1309c37c19d2b683261b0b --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-008.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-009.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-009.xml new file mode 100644 index 0000000000000000000000000000000000000000..22eed272f83abbc4a9d75c3f456c051dce48c9ea --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-009.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-010.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-010.xml new file mode 100644 index 0000000000000000000000000000000000000000..6cacd112a07fcceeea14d9e3bf2d55cc453e8bda --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-010.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-011.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-011.xml new file mode 100644 index 0000000000000000000000000000000000000000..c120a78c84de6cc5ddd62e849aef3c184149054c --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-011.xml @@ -0,0 +1,6 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-012.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-012.xml new file mode 100644 index 0000000000000000000000000000000000000000..c008ca62bde4526513ce51503a8bda59e9c7bf5f --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-012.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/page-013.xml b/corpus/paragraph-edit/rust-join/split/native/read/page-013.xml new file mode 100644 index 0000000000000000000000000000000000000000..37af0f5ceb319734cf8300e9ccaf64274a5ca054 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/page-013.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/split/native/read/payloads.json b/corpus/paragraph-edit/rust-join/split/native/read/payloads.json new file mode 120000 index 0000000000000000000000000000000000000000..787b4bae85038cda922f8befac6c8ed361fa8035 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/read/payloads.json @@ -0,0 +1 @@ +../../../../before/read/payloads.json \ No newline at end of file diff --git a/corpus/paragraph-edit/rust-join/split/native/run.json b/corpus/paragraph-edit/rust-join/split/native/run.json new file mode 100644 index 0000000000000000000000000000000000000000..e75fc623f38ae54ac646344148893cc773e4c830 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/paragraph-rust-join-01/split/candidate", + "expected_pages": 14, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/paragraph-edit/rust-join/split/native/source.json b/corpus/paragraph-edit/rust-join/split/native/source.json new file mode 100644 index 0000000000000000000000000000000000000000..bfe81953672ef7d652c7c15c9b6a293083899bc6 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 139752, + "sha256": "6677af274e17de1ac194b2b18bc96d3eb33c04968881c272383f7cc47b10c5de", + "mtime_ns": 1788860404345967341 + } +] diff --git a/corpus/paragraph-edit/rust-join/split/native/teardown.json b/corpus/paragraph-edit/rust-join/split/native/teardown.json new file mode 120000 index 0000000000000000000000000000000000000000..4a260ae81ad209364b9d4ace600eec3f48f27aba --- /dev/null +++ b/corpus/paragraph-edit/rust-join/split/native/teardown.json @@ -0,0 +1 @@ +../../../join-edges/teardown.json \ No newline at end of file diff --git a/corpus/paragraph-edit/rust-join/tags/candidate/synthetic.one b/corpus/paragraph-edit/rust-join/tags/candidate/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..71430622d67679d3cf2ba34cb5c46ce06b6f0842 GIT binary patch literal 41808 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 + diff --git a/corpus/paragraph-edit/rust-join/tags/native/read/page-000.xml b/corpus/paragraph-edit/rust-join/tags/native/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..5cdd251abfb245b33b76c801b4011c91dcb61958 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/tags/native/read/page-000.xml @@ -0,0 +1,20 @@ + +Bold 🦀 italic é color 東京
+End
]]>
Fictitious: café, 東京, مرحبا]]>
diff --git a/corpus/paragraph-edit/rust-join/tags/native/read/page-001.xml b/corpus/paragraph-edit/rust-join/tags/native/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..6a6d722dd3bd9b3e18c7ee18ace84160023ce944 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/tags/native/read/page-001.xml @@ -0,0 +1,5 @@ + +LeftBold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/tags/native/read/page-002.xml b/corpus/paragraph-edit/rust-join/tags/native/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..6979a01a5cbe465260ce7c593d333a93a325509b --- /dev/null +++ b/corpus/paragraph-edit/rust-join/tags/native/read/page-002.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/tags/native/read/page-003.xml b/corpus/paragraph-edit/rust-join/tags/native/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..7013b491ac10291da4085a978aa404d6f0476818 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/tags/native/read/page-003.xml @@ -0,0 +1,5 @@ + +Bold italic 🦀 é tail]]> diff --git a/corpus/paragraph-edit/rust-join/tags/native/read/payloads.json b/corpus/paragraph-edit/rust-join/tags/native/read/payloads.json new file mode 120000 index 0000000000000000000000000000000000000000..787b4bae85038cda922f8befac6c8ed361fa8035 --- /dev/null +++ b/corpus/paragraph-edit/rust-join/tags/native/read/payloads.json @@ -0,0 +1 @@ +../../../../before/read/payloads.json \ No newline at end of file diff --git a/corpus/paragraph-edit/rust-join/tags/native/run.json b/corpus/paragraph-edit/rust-join/tags/native/run.json new file mode 100644 index 0000000000000000000000000000000000000000..74bec79c775e24e11e08a5162d26b1176db2860b --- /dev/null +++ b/corpus/paragraph-edit/rust-join/tags/native/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/paragraph-rust-join-01/tags/candidate", + "expected_pages": 4, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/paragraph-edit/rust-join/tags/native/source.json b/corpus/paragraph-edit/rust-join/tags/native/source.json new file mode 100644 index 0000000000000000000000000000000000000000..e9dd9e3f2cadc7bbf354bb48d1389f7ef70b4dce --- /dev/null +++ b/corpus/paragraph-edit/rust-join/tags/native/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 41808, + "sha256": "04f5dd05df411fdb228ff7cb80e02ca24744d40b6f0bd485b688aa8c0d6e8ac3", + "mtime_ns": 1788860404422342545 + } +] diff --git a/corpus/paragraph-edit/rust-join/tags/native/teardown.json b/corpus/paragraph-edit/rust-join/tags/native/teardown.json new file mode 120000 index 0000000000000000000000000000000000000000..4a260ae81ad209364b9d4ace600eec3f48f27aba --- /dev/null +++ b/corpus/paragraph-edit/rust-join/tags/native/teardown.json @@ -0,0 +1 @@ +../../../join-edges/teardown.json \ No newline at end of file diff --git a/crates/onestore/README.md b/crates/onestore/README.md index e029c43cadc0257e54ea518ef6d1e30f6632f27c..3bc5ce49fa5859bd51d2f536a316032009bcddf4 100644 --- a/crates/onestore/README.md +++ b/crates/onestore/README.md @@ -50,6 +50,7 @@ harness also accepts `--client-profile release`. | `replace_text`, `commit_text`, `commit_file_text` | Replace a UTF-16 range across ordinary text runs; publish text, run boundaries and modification time together | | `Insertion`, `PreparedEdit::insert` | Insert paragraphs into editable containers or positioned outlines into a page, retaining intent identities across rebases | | `ParagraphSplit`, `PreparedEdit::split` | Split ordinary text at a UTF-16 scalar boundary, retaining the original left identities and moving children to the right | +| `ParagraphJoin`, `PreparedEdit::join` | Join adjacent ordinary text while preserving inherited character styles and native text-identity rules | | `TextAttribute`, `PreparedEdit::format` | Change character formatting over a UTF-16 range while sharing immutable styles; preserve unselected runs | | `PreparedEdit::commit`, `PreparedEdit::commit_file` | Publish the exact prepared image under caller-held exclusion or the conservative filesystem adapter | | `read_file` | Read a snapshot under whole-file exclusion | @@ -85,6 +86,14 @@ the complete child graph and title metadata; repeating an existing identity requ reconciliation. Title containers, generated fields, recording-linked text and associated run metadata are rejected before I/O. Native split controls and subsequent typing checks reside in [the paragraph corpus](../../corpus/paragraph-edit/README.md). +Joins retain the left paragraph. Nonempty left text keeps its identity; empty left +text adopts the right text identity. **The left tags win: right-side tags are removed +from active text even when the left text is empty.** History retains the original +objects. Select the preceding leaf text; where that leaf is deeper than the right +paragraph, right children move to its ancestor at the right paragraph's level. +Ambiguous ancestry, unsupported indentation transitions and unknown implicit +font/language inheritance reject before I/O. This is a logical join, so keyboard +actions that only change list or indentation state remain separate operations. Generated fields, protected targets and unsupported run-data boundary changes are rejected before publication. Local caches expose text, insertion and formatting edits; the [document-writer acceptance](../../evidence/MILESTONE9.md#document-writer-and-offline-acceptance) diff --git a/crates/onestore/src/commit.rs b/crates/onestore/src/commit.rs index dbc621e4e78b394a7cf6df0fd6cf7a56099b682c..6bd5ed03294cfd1ec4434876863b98cd958cfce9 100644 --- a/crates/onestore/src/commit.rs +++ b/crates/onestore/src/commit.rs @@ -183,6 +183,18 @@ pub struct PreparedEdit<'a> { } impl<'a> PreparedEdit<'a> { + /// Joins adjacent ordinary paragraphs with native left-tag and text-identity semantics. + pub fn join( + source: &'a [u8], + space: ExGuid, + join: &crate::ParagraphJoin, + ) -> Result { + Ok(Self { + source, + written: join.apply(source, space)?, + }) + } + /// Splits a paragraph and updates its children, lists, tags and title metadata atomically. /// Fields and associated run metadata are rejected before I/O. pub fn split( diff --git a/crates/onestore/src/lib.rs b/crates/onestore/src/lib.rs index 9eac9aa570e7f35e36f497f9f2d791d773d38af8..379b01a43e63d64f37c057beb4eaf16c02cb894c 100644 --- a/crates/onestore/src/lib.rs +++ b/crates/onestore/src/lib.rs @@ -32,7 +32,7 @@ pub use files::FileDataReference; pub use formatting::TextAttribute; pub use insertion::Insertion; pub use objects::{Object, ObjectData, ObjectReferences, ResolvedRevision}; -pub use paragraph::ParagraphSplit; +pub use paragraph::{ParagraphJoin, ParagraphSplit}; pub use properties::{IdStream, Property, PropertySets, Value}; pub use revisions::{ExGuid, ObjectSpace, Revision, RevisionIndex}; pub use snapshot::{read_snapshot, read_storage_snapshot}; diff --git a/crates/onestore/src/paragraph.rs b/crates/onestore/src/paragraph.rs index 0d96074ac3ecbddf7b3f14376fb6d2c37914d625..d122deeebd33fee4774f7559c2d732aa6293a0f7 100644 --- a/crates/onestore/src/paragraph.rs +++ b/crates/onestore/src/paragraph.rs @@ -76,7 +76,7 @@ impl ParagraphSplit { .into_iter() .filter_map(|(sid, page)| (sid == space).then_some(page)) .collect(); - let [page] = pages.as_slice() else { + let [_] = pages.as_slice() else { return Err(invalid("Splitting requires a single active page")); }; let semantic = document @@ -84,7 +84,7 @@ impl ParagraphSplit { .remove(&space) .ok_or_else(|| invalid("The active page is unavailable"))?; let rid = semantic.contexts[&ExGuid::default()]; - let mut view = semantic + let view = semantic .revisions .into_iter() .find_map(|(id, view)| (id == rid).then_some(view)) @@ -134,48 +134,9 @@ impl ParagraphSplit { } pending.extend(parents.get(&id).into_iter().flatten().copied()); } + let raw = index.resolve(space, rid)?; + let (text, runs) = ordinary_text(&view, &raw, self.text)?; let node = &view.nodes[&self.text]; - let Kind::RichText { - text, - runs, - boilerplate, - .. - } = &node.kind - else { - return Err(invalid("Select ordinary paragraph text")); - }; - if *boilerplate || !node.media_ids.is_empty() || node.media_time_ms.is_some() { - return Err(invalid( - "Generated or recording-linked text cannot be split", - )); - } - for run in view.text_runs(self.text)? { - if [ - run.format.hidden, - run.format.hyperlink, - run.format.math, - run.format.embedded_object, - ] - .contains(&Some(true)) - || run.text.contains(['\u{fffc}', '\u{fddf}']) - { - return Err(invalid( - "This paragraph contains a field or embedded object that cannot be split", - )); - } - } - let raw = index.resolve(space, rid)?; - let ObjectData::Properties(blob) = raw.objects[&self.text].data else { - unreachable!() - }; - if PropertySets::parse(blob)?.sets[0] - .iter() - .any(|p| matches!(p.id, 0x40003499 | 0x24003458)) - { - return Err(invalid( - "This paragraph contains run metadata that cannot be split", - )); - } let length = u32::try_from(text.encode_utf16().count()) .map_err(|_| invalid("Paragraph exceeds the UTF-16 offset range"))?; if self.offset > length || lists.len() > 251 { @@ -286,39 +247,7 @@ impl ParagraphSplit { }; object.set(&[(0x14001d7a, &modified)])?; } - for (id, object) in &changed { - view.nodes.insert( - *id, - Element::parse( - &Object { - jcid: object.jcid, - reference_count: 0, - data: ObjectData::Properties(&object.bytes), - global_ids: Arc::clone(&object.global_ids), - }, - &store, - )?, - ); - } - let title = page_title(&view, &pages, None)?; - drop(view); - if let Some((_, automatic, title)) = title { - let metadata = raw - .roots - .get(&2) - .ok_or_else(|| invalid("Page title metadata is unavailable"))?; - if raw.objects[metadata].jcid != 0x20030 { - return Err(invalid("Page title metadata is unavailable")); - } - let title = string(&title); - let mut object = PropertyObject::from_object(&raw.objects[metadata])?; - object.set(&[(0x1c001cf3, &title)])?; - changed.insert(*metadata, object); - changed - .get_mut(page) - .unwrap() - .set(&[(0x1c001d3c, if automatic { &title } else { &[0, 0] })])?; - } + update_title(&store, &raw, view, &pages, &mut changed)?; write_revision(source, space, |_| Ok(changed)) } } @@ -381,3 +310,473 @@ fn fragment( ])?; Ok(object) } + +fn ordinary_text<'a>( + view: &'a crate::document::Revision<'_>, + raw: &crate::ResolvedRevision<'_>, + id: ExGuid, +) -> Result<(&'a str, &'a [crate::document::TextRun]), Error> { + let node = &view.nodes[&id]; + let Kind::RichText { + text, + runs, + boilerplate, + .. + } = &node.kind + else { + return Err(invalid("Select ordinary paragraph text")); + }; + if *boilerplate || !node.media_ids.is_empty() || node.media_time_ms.is_some() { + return Err(invalid( + "Generated or recording-linked text cannot be split or joined", + )); + } + for run in view.text_runs(id)? { + if [ + run.format.hidden, + run.format.hyperlink, + run.format.math, + run.format.embedded_object, + ] + .contains(&Some(true)) + || run.text.contains(['\u{fffc}', '\u{fddf}']) + { + return Err(invalid( + "This paragraph contains a field or embedded object that cannot be split or joined", + )); + } + } + let ObjectData::Properties(blob) = raw.objects[&id].data else { + unreachable!() + }; + if PropertySets::parse(blob)?.sets[0] + .iter() + .any(|p| matches!(p.id, 0x40003499 | 0x24003458)) + { + return Err(invalid( + "This paragraph contains run metadata that cannot be split or joined", + )); + } + Ok((text, runs)) +} + +fn update_title( + store: &Store<'_>, + raw: &crate::ResolvedRevision<'_>, + view: crate::document::Revision<'_>, + pages: &[ExGuid], + changed: &mut BTreeMap, +) -> Result<(), Error> { + // Shorten the moved view's lifetime to the changed property buffers. + let mut view = view; + for (id, object) in changed.iter() { + view.nodes.insert( + *id, + Element::parse( + &Object { + jcid: object.jcid, + reference_count: 0, + data: ObjectData::Properties(&object.bytes), + global_ids: Arc::clone(&object.global_ids), + }, + store, + )?, + ); + } + let title = page_title(&view, pages, None)?; + drop(view); + if let Some((_, automatic, title)) = title { + let metadata = raw + .roots + .get(&2) + .ok_or_else(|| invalid("Page title metadata is unavailable"))?; + if raw.objects[metadata].jcid != 0x20030 { + return Err(invalid("Page title metadata is unavailable")); + } + let title = string(&title); + let mut object = PropertyObject::from_object(&raw.objects[metadata])?; + object.set(&[(0x1c001cf3, &title)])?; + changed.insert(*metadata, object); + changed + .get_mut(&pages[0]) + .unwrap() + .set(&[(0x1c001d3c, if automatic { &title } else { &[0, 0] })])?; + } + Ok(()) +} + +/// Joins adjacent ordinary text in one outline or table cell. +/// The left paragraph survives. Empty left text adopts the right text identity; +/// otherwise the left text survives. The left paragraph's tags are retained. +/// Right-side tags are removed from active text, including when the left text is empty. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct ParagraphJoin { + left: ExGuid, + right: ExGuid, + author: String, +} + +impl ParagraphJoin { + /// Select the preceding leaf paragraph's text and the following paragraph's text. + pub fn new(left: ExGuid, right: ExGuid, author: &str) -> Result { + if left == right || left.guid == [0; 16] || right.guid == [0; 16] || author.contains('\0') { + return Err(invalid( + "Choose two distinct text objects and an author name without NUL", + )); + } + Ok(Self { + left, + right, + author: author.to_owned(), + }) + } + + pub(crate) fn apply(&self, source: &[u8], space: ExGuid) -> Result, Error> { + if self.left == self.right + || self.left.guid == [0; 16] + || self.right.guid == [0; 16] + || self.author.contains('\0') + { + return Err(invalid( + "Choose two distinct text objects and an author name without NUL", + )); + } + let store = Store::parse(source)?; + let index = RevisionIndex::parse(&store)?; + index.validate_current()?; + let mut document = Document::parse(&index)?; + let pages: Vec<_> = document + .pages()? + .into_iter() + .filter_map(|(sid, page)| (sid == space).then_some(page)) + .collect(); + if pages.len() != 1 { + return Err(invalid("Joining requires a single active page")); + } + let semantic = document + .spaces + .remove(&space) + .ok_or_else(|| invalid("The active page is unavailable"))?; + let rid = semantic.contexts[&ExGuid::default()]; + let view = semantic + .revisions + .into_iter() + .find_map(|(id, view)| (id == rid).then_some(view)) + .unwrap(); + let parents = editable_parents(&view, &pages, self.left)?; + editable_parents(&view, &pages, self.right)?; + let parent = |id| -> Result { + let [parent] = parents.get(&id).map(Vec::as_slice).unwrap_or_default() else { + return Err(invalid("Select text with a unique editable parent")); + }; + Ok(*parent) + }; + let left = parent(self.left)?; + let right = parent(self.right)?; + for (paragraph, text) in [(left, self.left), (right, self.right)] { + if !matches!(view.nodes[¶graph].kind, Kind::Paragraph { .. }) + || view.nodes[¶graph].content != [text] + { + return Err(invalid("Select ordinary paragraph text")); + } + let mut at = paragraph; + while at != pages[0] { + if matches!(view.nodes[&at].kind, Kind::Title) { + return Err(invalid( + "Title containers cannot be joined with ordinary paragraphs", + )); + } + at = parent(at)?; + } + } + if !view.nodes[&left].children.is_empty() { + return Err(invalid("Select the preceding paragraph's last descendant")); + } + let right_parent = parent(right)?; + if !matches!( + view.nodes[&right_parent].kind, + Kind::Outline { .. } | Kind::OutlineGroup | Kind::Paragraph { .. } | Kind::Cell { .. } + ) { + return Err(invalid("Select paragraphs in one outline or table cell")); + } + let mut stem = left; + while parent(stem)? != right_parent { + let previous = stem; + stem = parent(stem)?; + if !matches!( + view.nodes[&stem].kind, + Kind::Paragraph { .. } | Kind::OutlineGroup + ) || view.nodes[&stem].children.last() != Some(&previous) + { + return Err(invalid( + "Select adjacent text within one outline or table cell", + )); + } + } + let siblings = &view.nodes[&right_parent].children; + if !siblings.windows(2).any(|pair| pair == [stem, right]) { + return Err(invalid("Select adjacent paragraph text in document order")); + } + let children = &view.nodes[&right].children; + if !children.is_empty() + && !view.nodes[&stem].children.is_empty() + && view.nodes[&stem].child_level != view.nodes[&right].child_level + { + return Err(invalid( + "Joining these child indentation levels requires a hierarchy edit", + )); + } + let raw = index.resolve(space, rid)?; + let (a, a_runs) = ordinary_text(&view, &raw, self.left)?; + let (b, b_runs) = ordinary_text(&view, &raw, self.right)?; + let length = u32::try_from(a.encode_utf16().count()) + .map_err(|_| invalid("Paragraph exceeds the UTF-16 offset range"))?; + let right_length = u32::try_from(b.encode_utf16().count()) + .map_err(|_| invalid("Paragraph exceeds the UTF-16 offset range"))?; + length + .checked_add(right_length) + .ok_or_else(|| invalid("Joined text exceeds the UTF-16 offset range"))?; + let modified = current_timestamps()?.0.to_le_bytes(); + let mut changed = BTreeMap::new(); + let (survivor, mut text) = if a.is_empty() { + let mut target = PropertyObject::from_object(&raw.objects[&self.right])?; + target.copy_property( + &PropertyObject::from_object(&raw.objects[&self.left])?, + 0x40003489, + )?; + (self.right, target) + } else { + let mut target = PropertyObject::from_object(&raw.objects[&self.left])?; + let mut styles = BTreeMap::new(); + let mut ends = Vec::new(); + let mut references = Vec::new(); + let mut empty_style = None; + for run in a_runs.iter().filter(|run| run.start < run.end) { + let id = if let Some(id) = run.format { + id + } else if let Some(id) = empty_style { + id + } else { + let id = ExGuid { + guid: fresh_guid()?, + n: 1, + }; + changed.insert( + id, + PropertyObject { + jcid: 0x12004d, + bytes: properties(&[])?, + global_ids: Arc::new(BTreeMap::from([(0, id.guid)])), + }, + ); + empty_style = Some(id); + id + }; + references.extend_from_slice(&target.reference(id)?); + ends.extend_from_slice(&run.end.to_le_bytes()); + } + let left_base = character_properties(&view, &raw, self.left)?; + let right_base = character_properties(&view, &raw, self.right)?; + for (i, run) in b_runs.iter().enumerate() { + if run.start == run.end && i != b_runs.len() - 1 { + continue; + } + let id = if let Some(id) = styles.get(&run.format) { + *id + } else { + let mut style = if let Some(id) = run.format { + PropertyObject::from_object(&raw.objects[&id])? + } else { + PropertyObject { + jcid: 0x12004d, + bytes: properties(&[])?, + global_ids: Arc::new(BTreeMap::new()), + } + }; + if left_base != right_base { + let mut values = right_base.clone(); + for property in &PropertySets::parse(&style.bytes)?.sets[0] { + let key = property.id & 0x7fffffff; + if is_character_property(key) { + let value = match property.value { + crate::Value::NoData => &[][..], + crate::Value::Bytes(bytes) => bytes, + _ => unreachable!(), + }; + values.insert(key, (property.id, value.to_vec())); + } + } + for key in left_base.keys() { + if values.contains_key(key) { + continue; + } + let value = match key >> 26 & 31 { + 2 => Vec::new(), + _ if matches!(*key, 0x14001c0c | 0x14001c0d) => { + 0xff000000_u32.to_le_bytes().to_vec() + } + _ => { + return Err(invalid( + "The right paragraph's implicit font or language cannot be preserved under the left style", + )); + } + }; + values.insert(*key, (*key, value)); + } + style.set( + &values + .values() + .map(|(id, value)| (*id, value.as_slice())) + .collect::>(), + )?; + } + let id = if let Some(id) = run + .format + .filter(|id| raw.objects[id].data == ObjectData::Properties(&style.bytes)) + { + id + } else { + let id = ExGuid { + guid: fresh_guid()?, + n: 1, + }; + style.reference(id)?; + changed.insert(id, style); + id + }; + styles.insert(run.format, id); + id + }; + references.extend_from_slice(&target.reference(id)?); + ends.extend_from_slice(&(length + run.end).to_le_bytes()); + } + ends.truncate(ends.len() - 4); + if ends + .chunks_exact(4) + .map(|bytes| u32::from_le_bytes(bytes.try_into().unwrap())) + .collect::>() + .windows(2) + .any(|pair| pair[0] >= pair[1]) + { + return Err(invalid("Text-run boundaries must be strictly increasing")); + } + target.set(&[ + (0x1c001c22, &string(&format!("{a}{b}"))), + (0x1c001e12, &ends), + (0x24001e13, &references), + ])?; + (self.left, target) + }; + text.set(&[(0x14001d7a, &modified)])?; + changed.insert(survivor, text); + let author = ExGuid { + guid: fresh_guid()?, + n: 1, + }; + changed.insert( + author, + PropertyObject { + jcid: 0x120001, + bytes: properties(&[(0x1c001d75, string(&self.author))])?, + global_ids: Arc::new(BTreeMap::from([(0, author.guid)])), + }, + ); + let mut left_object = PropertyObject::from_object(&raw.objects[&left])?; + let content = left_object.reference(survivor)?; + let author = left_object.reference(author)?; + left_object.set(&[(0x24001c1f, &content), (0x20001d79, &author)])?; + changed.insert(left, left_object); + if !children.is_empty() { + let target = match changed.entry(stem) { + std::collections::btree_map::Entry::Occupied(entry) => entry.into_mut(), + std::collections::btree_map::Entry::Vacant(entry) => { + entry.insert(PropertyObject::from_object(&raw.objects[&stem])?) + } + }; + let mut references = Vec::new(); + for id in view.nodes[&stem].children.iter().chain(children) { + references.extend_from_slice(&target.reference(*id)?); + } + target.set(&[(0x24001c20, &references)])?; + target.copy_property( + &PropertyObject::from_object(&raw.objects[&right])?, + 0x0c001c03, + )?; + } + let mut container = PropertyObject::from_object(&raw.objects[&right_parent])?; + let mut references = Vec::new(); + for id in siblings.iter().filter(|id| **id != right) { + references.extend_from_slice(&container.reference(*id)?); + } + container.set(&[(0x24001c20, &references)])?; + changed.insert(right_parent, container); + let mut pending = vec![left, right_parent]; + let mut ancestors = BTreeSet::new(); + while let Some(id) = pending.pop() { + if !ancestors.insert(id) { + continue; + } + let object = match changed.entry(id) { + std::collections::btree_map::Entry::Occupied(entry) => entry.into_mut(), + std::collections::btree_map::Entry::Vacant(entry) => { + entry.insert(PropertyObject::from_object(&raw.objects[&id])?) + } + }; + object.set(&[(0x14001d7a, &modified)])?; + pending.extend(parents.get(&id).into_iter().flatten().copied()); + } + update_title(&store, &raw, view, &pages, &mut changed)?; + write_revision(source, space, |_| Ok(changed)) + } +} + +fn is_character_property(id: u32) -> bool { + matches!( + id, + 0x08001c04 + ..=0x08001c09 + | 0x08001e16 + | 0x08001e14 + | 0x08001e19 + | 0x08003401 + | 0x08001e22 + | 0x08003476 + | 0x1c001c0a + | 0x10001c0b + | 0x14001c0c + | 0x14001c0d + | 0x14001c3b + ) +} + +fn character_properties( + view: &crate::document::Revision<'_>, + raw: &crate::ResolvedRevision<'_>, + text: ExGuid, +) -> Result)>, Error> { + let Kind::RichText { + paragraph_style, .. + } = view.nodes[&text].kind + else { + unreachable!() + }; + let mut values = BTreeMap::new(); + for id in paragraph_style.into_iter().chain([text]) { + let ObjectData::Properties(bytes) = raw.objects[&id].data else { + unreachable!() + }; + for property in &PropertySets::parse(bytes)?.sets[0] { + let key = property.id & 0x7fffffff; + if is_character_property(key) { + let value = match property.value { + crate::Value::NoData => &[][..], + crate::Value::Bytes(bytes) => bytes, + _ => unreachable!(), + }; + values.insert(key, (property.id, value.to_vec())); + } + } + } + Ok(values) +} diff --git a/crates/onestore/src/write.rs b/crates/onestore/src/write.rs index 581a72460722c325de61b9e9bbef0b5e00bcf1a3..fb7dcd9f2162f4860f7ff3884b9989901eb9ff63 100644 --- a/crates/onestore/src/write.rs +++ b/crates/onestore/src/write.rs @@ -472,6 +472,114 @@ impl PropertyObject { } compact(id, &self.global_ids) } + + pub fn copy_property(&mut self, source: &Self, id: u32) -> Result<()> { + let properties = PropertySets::parse(&source.bytes)?; + let mut target = Self { + jcid: self.jcid, + bytes: self.bytes.clone(), + global_ids: Arc::clone(&self.global_ids), + }; + target.remove(&[id])?; + let lengths = property_set_lengths(&properties); + let mut offset = properties.root_ids.as_ptr().addr() - source.bytes.as_ptr().addr() + + properties.root_ids.len(); + let mut selected = None; + for property in &properties.sets[0] { + let end = offset + field_length(property, &lengths); + if property.id & 0x7fffffff == id & 0x7fffffff { + selected = Some((property, &source.bytes[offset..end])); + break; + } + offset = end; + } + if let Some((property, field)) = selected { + let mut added: [Vec; 3] = std::array::from_fn(|_| Vec::new()); + let mut pending = vec![property]; + while let Some(property) = pending.pop() { + match &property.value { + Value::References { + stream, + compact_ids, + } => { + let index = match stream { + crate::IdStream::Objects => 0, + crate::IdStream::ObjectSpaces => 1, + crate::IdStream::Contexts => 2, + }; + let mut cursor = crate::bytes::Cursor { + bytes: compact_ids, + offset: 0, + }; + while cursor.offset < cursor.bytes.len() { + let id = cursor.compact(&source.global_ids)?; + added[index].extend_from_slice(&target.reference(id)?); + } + } + Value::Sets(children) => { + for child in children.clone().rev() { + pending.extend(properties.sets[child].iter().rev()); + } + } + _ => {} + } + } + let old = PropertySets::parse(&target.bytes)?; + let count = u16::try_from(old.sets[0].len() + 1).map_err(|_| Error { + offset: 0, + message: "Root property count exceeds the format limit", + })?; + let streams = crate::properties::reference_streams(&mut crate::bytes::Cursor { + bytes: &target.bytes, + offset: 0, + })?; + let stream_count = (0..3) + .rev() + .find(|i| streams[*i].offset != 0 || !added[*i].is_empty()) + .unwrap() + + 1; + let mut bytes = Vec::new(); + for i in 0..stream_count { + let stream = &streams[i]; + let count = u32::try_from((stream.bytes.len() + added[i].len()) / 4) + .ok() + .filter(|n| *n <= 0xffffff) + .ok_or(Error { + offset: 0, + message: "Reference stream exceeds the format limit", + })?; + let reserved = if stream.offset == 0 { + 0 + } else { + u32::from_le_bytes( + target.bytes[stream.offset - 4..stream.offset] + .try_into() + .unwrap(), + ) & 0x3f000000 + }; + let flags = match (i, stream_count) { + (0, 1) => 0x80000000, + (0 | 1, 3) => 0x40000000, + _ => 0, + }; + bytes.extend_from_slice(&(count | reserved | flags).to_le_bytes()); + bytes.extend_from_slice(stream.bytes); + bytes.extend_from_slice(&added[i]); + } + bytes.extend_from_slice(&count.to_le_bytes()); + bytes.extend_from_slice(old.root_ids); + bytes.extend_from_slice(&property.id.to_le_bytes()); + let start = + old.root_ids.as_ptr().addr() - target.bytes.as_ptr().addr() + old.root_ids.len(); + bytes.extend_from_slice(&target.bytes[start..target.bytes.len() - old.padding.len()]); + bytes.extend_from_slice(field); + bytes.resize(bytes.len().next_multiple_of(8), 0); + PropertySets::parse(&bytes)?; + target.bytes = bytes; + } + *self = target; + Ok(()) + } } pub(crate) fn write_revision( diff --git a/crates/onestore/src/write/tests.rs b/crates/onestore/src/write/tests.rs index 5e996875596247be4c62f01f55f8f8c6c619c30a..ae67fe251d1d4d1eaac1938f39cdb402e32fe6b6 100644 --- a/crates/onestore/src/write/tests.rs +++ b/crates/onestore/src/write/tests.rs @@ -29,8 +29,11 @@ fn document_insertions_and_formatting_respect_readonly_ancestors() { )) }) .unwrap(); + let right = Insertion::paragraph(outline, None, "Right", "Author").unwrap(); + let expanded = PreparedEdit::insert(&source, sid, &right).unwrap(); + let source = expanded.as_bytes(); for blocked in [page, outline, paragraph] { - let protected = write_revision(&source, sid, |raw| { + let protected = write_revision(source, sid, |raw| { let mut object = PropertyObject::from_object(&raw.objects[&blocked])?; object.set(&[(0x88001cde, &[])])?; Ok(BTreeMap::from([(blocked, object)])) @@ -48,6 +51,8 @@ fn document_insertions_and_formatting_respect_readonly_ancestors() { .unwrap(); let split = crate::ParagraphSplit::new(text, 1, "Author").unwrap(); assert!(PreparedEdit::split(&protected, sid, &split).is_err()); + let join = crate::ParagraphJoin::new(text, right.text_object(), "Author").unwrap(); + assert!(PreparedEdit::join(&protected, sid, &join).is_err()); assert!( PreparedEdit::format( &protected, @@ -63,6 +68,18 @@ fn document_insertions_and_formatting_respect_readonly_ancestors() { assert!(PreparedEdit::insert(&protected, sid, &outline).is_err()); } } + let protected = write_revision(source, sid, |raw| { + let mut object = PropertyObject::from_object(&raw.objects[&right.object()])?; + object.set(&[(0x88001cde, &[])])?; + Ok(BTreeMap::from([(right.object(), object)])) + }) + .unwrap(); + let document = crate::document::Document::parse(&index).unwrap(); + let space = &document.spaces[&sid]; + let view = &space.revisions[&space.contexts[&ExGuid::default()]]; + let text = view.nodes[¶graph].content[0]; + let join = crate::ParagraphJoin::new(text, right.text_object(), "Author").unwrap(); + assert!(PreparedEdit::join(&protected, sid, &join).is_err()); } fn add_paragraph(source: &[u8], number: u32) -> Vec { @@ -572,6 +589,56 @@ fn nested_fields_and_other_reference_streams_remain_byte_exact() { object.remove(&ids).unwrap(); assert_eq!(object.bytes, before); } + let source = super::PropertyObject { + jcid: 0x6000e, + bytes: original.clone(), + global_ids: std::sync::Arc::new(std::collections::BTreeMap::from([(0, [1; 16])])), + }; + let mut target = super::PropertyObject { + jcid: 0x6000e, + bytes: properties(&[(0x20000001, vec![6, 0, 0, 0])]).unwrap(), + global_ids: std::sync::Arc::new(std::collections::BTreeMap::from([(0, [9; 16])])), + }; + target.copy_property(&source, 0x40000002).unwrap(); + let copied = PropertySets::parse(&target.bytes).unwrap(); + assert_eq!(target.global_ids[&0], [9; 16]); + assert_eq!(target.global_ids[&1], [1; 16]); + assert_eq!( + copied.sets[0][0].value, + Value::References { + stream: crate::IdStream::Objects, + compact_ids: &[6, 0, 0, 0], + } + ); + for (i, n) in [2, 4, 5].into_iter().enumerate() { + let Value::References { compact_ids, .. } = copied.sets[1][i].value else { + panic!() + }; + assert_eq!(compact_ids, &[n, 1, 0, 0]); + } + assert_eq!(copied.sets[1][3], previous.sets[1][3]); + assert_eq!( + target + .bytes + .windows(nested.len()) + .filter(|b| *b == nested) + .count(), + 1 + ); + let before = target.bytes.clone(); + target.copy_property(&source, 0x40000002).unwrap(); + assert_eq!(target.bytes, before); + target.copy_property(&source, 0x20000001).unwrap(); + assert_eq!(PropertySets::parse(&target.bytes).unwrap().sets[0].len(), 1); + let before = target.bytes.clone(); + let ids = std::sync::Arc::clone(&target.global_ids); + let invalid = super::PropertyObject { + global_ids: Default::default(), + ..source + }; + assert!(target.copy_property(&invalid, 0x40000002).is_err()); + assert_eq!(target.bytes, before); + assert_eq!(target.global_ids, ids); } #[test] @@ -599,6 +666,13 @@ fn deep_property_splices_do_not_use_the_call_stack() { let parsed = PropertySets::parse(&object.bytes).unwrap(); assert_eq!(parsed.sets.len(), 100_001); assert_eq!(&object.bytes[..bytes.len()], &bytes); + let mut copied = super::PropertyObject { + jcid: object.jcid, + bytes: properties(&[]).unwrap(), + global_ids: Default::default(), + }; + copied.copy_property(&object, 0x44000001).unwrap(); + assert_eq!(copied.bytes, object.bytes); object.remove(&[0x44000001]).unwrap(); let parsed = PropertySets::parse(&object.bytes).unwrap(); assert_eq!(parsed.sets.len(), 1); diff --git a/crates/onestore/tests/paragraph.rs b/crates/onestore/tests/paragraph.rs index 4767022d053c4b677a6cd49151b564757c906bd9..e2f754a9d7ea6eab32f97f177ea7c930be7a673c 100644 --- a/crates/onestore/tests/paragraph.rs +++ b/crates/onestore/tests/paragraph.rs @@ -1,5 +1,5 @@ use onestore::{ - ExGuid, ParagraphSplit, PreparedEdit, RevisionIndex, Store, + ExGuid, ParagraphJoin, ParagraphSplit, PreparedEdit, RevisionIndex, Store, document::{Document, Kind, Revision}, }; use serde_json::Value; @@ -25,6 +25,270 @@ fn characters(view: &Revision<'_>, id: ExGuid) -> Vec<(char, Value)> { .collect() } +const JOIN_FIXTURES: [(&[u8], &[u8], bool); 3] = [ + ( + include_bytes!("../../../corpus/paragraph-edit/split/notebook/synthetic.one").as_slice(), + include_bytes!("../../../corpus/paragraph-edit/joined/notebook/synthetic.one").as_slice(), + true, + ), + ( + include_bytes!("../../../corpus/paragraph-edit/join-edges/before/notebook/synthetic.one") + .as_slice(), + include_bytes!("../../../corpus/paragraph-edit/join-edges/joined/notebook/synthetic.one") + .as_slice(), + false, + ), + ( + include_bytes!("../../../corpus/paragraph-edit/join-tags/before/notebook/synthetic.one") + .as_slice(), + include_bytes!("../../../corpus/paragraph-edit/join-tags/joined/notebook/synthetic.one") + .as_slice(), + false, + ), +]; + +fn join_targets(document: &Document<'_>, split_cases: bool) -> Vec<(String, ExGuid, ExGuid)> { + let mut cases = Vec::new(); + if split_cases { + let manifest: Value = + serde_json::from_str(include_str!("../../../corpus/paragraph-edit/manifest.json")) + .unwrap(); + for case in manifest["cases"].as_array().unwrap() { + cases.push(( + case["case"].as_str().unwrap().to_owned(), + serde_json::from_value::(case["original_text"].clone()).unwrap(), + serde_json::from_value::(case["new_text"].clone()).unwrap(), + )); + } + } else { + for (sid, page) in document.pages().unwrap() { + let s = &document.spaces[&sid]; + let view = &s.revisions[&s.contexts[&ExGuid::default()]]; + let Kind::Metadata { + title: Some(name), .. + } = &view.nodes[&view.roots[&2]].kind + else { + panic!() + }; + if !name.starts_with("Join ") { + continue; + } + let outline = view.nodes[&page] + .children + .iter() + .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. })) + .unwrap(); + let mut left = view.nodes[outline].children[0]; + while let Some(child) = view.nodes[&left].children.last() { + left = *child; + } + let right = view.nodes[outline].children[1]; + cases.push(( + name.clone(), + view.nodes[&left].content[0], + view.nodes[&right].content[0], + )); + } + } + assert_eq!(cases.len(), document.pages().unwrap().len() - 1); + cases +} + +#[test] +fn joins_match_native_graphs_tags_and_inherited_character_styles() { + for (source, native, split_cases) in JOIN_FIXTURES { + let store = Store::parse(source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let native_store = Store::parse(native).unwrap(); + let native_index = RevisionIndex::parse(&native_store).unwrap(); + let native_document = Document::parse(&native_index).unwrap(); + let cases = join_targets(&document, split_cases); + for (name, left, right) in cases { + let (sid, space) = document + .spaces + .iter() + .find(|(_, space)| { + space.revisions[&space.contexts[&ExGuid::default()]] + .nodes + .contains_key(&left) + }) + .unwrap(); + let intent = ParagraphJoin::new(left, right, "Join author").unwrap(); + let restored = serde_json::from_value(serde_json::to_value(&intent).unwrap()).unwrap(); + assert_eq!(intent, restored); + let edited = PreparedEdit::join(source, *sid, &restored); + if name == "Split before hyperlink" { + assert!(edited.is_err()); + continue; + } + let edited = edited.unwrap_or_else(|error| panic!("{name}: {error}")); + let current_store = Store::parse(edited.as_bytes()).unwrap(); + assert_eq!( + current_store.header.transaction_count, + store.header.transaction_count + 1 + ); + let current_index = RevisionIndex::parse(¤t_store).unwrap(); + current_index.validate_current().unwrap(); + let current_document = Document::parse(¤t_index).unwrap(); + let current = ¤t_document.spaces[sid]; + let current = ¤t.revisions[¤t.contexts[&ExGuid::default()]]; + let expected = &native_document.spaces[sid]; + let expected = &expected.revisions[&expected.contexts[&ExGuid::default()]]; + let (_, page) = document + .pages() + .unwrap() + .into_iter() + .find(|(id, _)| id == sid) + .unwrap(); + let before = &space.revisions[&space.contexts[&ExGuid::default()]]; + let left_paragraph = *before + .nodes + .iter() + .find(|(_, node)| node.content == [left]) + .unwrap() + .0; + let right_paragraph = *before + .nodes + .iter() + .find(|(_, node)| node.content == [right]) + .unwrap() + .0; + let right_parent = *before + .nodes + .iter() + .find(|(_, node)| node.children.contains(&right_paragraph)) + .unwrap() + .0; + let survivor = if characters(before, left).is_empty() { + right + } else { + left + }; + let mut changed = std::collections::BTreeSet::from([survivor, before.roots[&2]]); + let mut ancestors = vec![left_paragraph, right_parent]; + while let Some(id) = ancestors.pop() { + if !changed.insert(id) || id == page { + continue; + } + ancestors.extend(before.nodes.iter().filter_map(|(parent, node)| { + node.children + .iter() + .chain(&node.content) + .chain(&node.structure) + .any(|child| *child == id) + .then_some(*parent) + })); + } + let old_raw = index + .resolve(*sid, space.contexts[&ExGuid::default()]) + .unwrap(); + let current_rid = current_document.spaces[sid].contexts[&ExGuid::default()]; + let new_raw = current_index.resolve(*sid, current_rid).unwrap(); + for (id, object) in old_raw.objects { + if !changed.contains(&id) { + assert_eq!( + object.data, new_raw.objects[&id].data, + "{name} untouched {id}" + ); + } + } + let mut pending: Vec<_> = expected.nodes[&page] + .children + .iter() + .filter(|id| matches!(expected.nodes[id].kind, Kind::Outline { .. })) + .copied() + .collect(); + while let Some(id) = pending.pop() { + let node = &expected.nodes[&id]; + assert_eq!( + current.nodes[&id].children, node.children, + "{name} children {id}" + ); + assert_eq!( + current.nodes[&id].content, node.content, + "{name} content {id}" + ); + assert_eq!( + current.nodes[&id].child_level, node.child_level, + "{name} indentation {id}" + ); + pending.extend( + node.children + .iter() + .chain(&node.content) + .chain(&node.structure) + .copied(), + ); + if matches!(node.kind, Kind::RichText { .. }) { + assert_eq!( + serde_json::to_value(¤t.nodes[&id].tags).unwrap(), + serde_json::to_value(&node.tags).unwrap(), + "{name} tags {id}" + ); + let normalize = |view, id| { + characters(view, id) + .into_iter() + .map(|(c, mut style)| { + let fields = style.as_object_mut().unwrap(); + for key in + ["alignment", "space_before", "space_after", "line_spacing"] + { + fields.remove(key); + } + for key in [ + "bold", + "italic", + "underline", + "strike", + "superscript", + "subscript", + "hidden", + "hyperlink", + "hyperlink_label", + "math", + "embedded_object", + "rtl", + ] { + if fields[key].is_null() { + fields.insert(key.into(), false.into()); + } + } + for key in ["color", "highlight"] { + if fields[key].is_null() { + fields.insert(key.into(), 0xff000000_u32.into()); + } + } + (c, style) + }) + .collect::>() + }; + assert_eq!( + normalize(current, id), + normalize(expected, id), + "{name} styles {id}" + ); + } + } + for (sid, old) in &index.spaces { + for revision in old.revisions.keys() { + let old = index.resolve(*sid, *revision).unwrap(); + let retained = current_index.resolve(*sid, *revision).unwrap(); + assert_eq!(old.roots, retained.roots); + for (id, object) in old.objects { + assert_eq!(object.data, retained.objects[&id].data); + } + } + } + assert!(PreparedEdit::join(edited.as_bytes(), *sid, &intent).is_err()); + assert_eq!( + space.contexts.len(), + current_document.spaces[sid].contexts.len() + ); + } + } +} + #[test] fn splits_partition_native_paragraphs_at_every_scalar_boundary() { let manifest: Value = @@ -341,3 +605,179 @@ fn interrupted_splits_publish_a_complete_graph_or_retain_the_original() { } } } + +#[test] +#[ignore = "exports paragraph joins for independent native validation"] +fn export_native_paragraph_joins() { + use std::{fs, path::PathBuf}; + let output = PathBuf::from(std::env::var_os("ONESTORE_PARAGRAPH_JOIN_OUTPUT").unwrap()); + assert!(output.is_absolute()); + fs::create_dir(&output).unwrap(); + for (number, (source, _, split_cases)) in JOIN_FIXTURES.into_iter().enumerate() { + let store = Store::parse(source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let cases = join_targets(&document, split_cases); + let mut source = source.to_vec(); + let mut manifest = Vec::new(); + for (name, left, right) in cases { + if name == "Split before hyperlink" { + continue; + } + let sid = *document + .spaces + .iter() + .find(|(_, space)| { + space.revisions[&space.contexts[&ExGuid::default()]] + .nodes + .contains_key(&left) + }) + .unwrap() + .0; + let intent = ParagraphJoin::new(left, right, "Rust join author").unwrap(); + let edit = PreparedEdit::join(&source, sid, &intent).unwrap(); + source = edit.as_bytes().to_vec(); + manifest.push(serde_json::json!({"case":name,"space":sid,"intent":intent})); + } + let folder = output.join(["split", "inheritance", "tags"][number]); + fs::create_dir_all(folder.join("candidate")).unwrap(); + fs::write(folder.join("candidate/synthetic.one"), source).unwrap(); + fs::write( + folder.join("manifest.json"), + serde_json::to_vec_pretty(&manifest).unwrap(), + ) + .unwrap(); + } +} + +#[test] +fn interrupted_joins_preserve_complete_graphs_and_empty_text_adoption() { + let source = onestore::create_section("join.one", "Left", "Author").unwrap(); + let store = Store::parse(&source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let (sid, page) = document.pages().unwrap()[0]; + let space = &document.spaces[&sid]; + let view = &space.revisions[&space.contexts[&ExGuid::default()]]; + let outline = *view.nodes[&page] + .children + .iter() + .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. })) + .unwrap(); + let left = view.nodes[&view.nodes[&outline].children[0]].content[0]; + let right = onestore::Insertion::paragraph(outline, None, "Right 🦀", "Author") + .unwrap() + .with_formatting(0..5, &[onestore::TextAttribute::Bold(true)]) + .unwrap(); + let inserted = PreparedEdit::insert(&source, sid, &right).unwrap(); + let child = + onestore::Insertion::paragraph(right.object(), None, "Retained child", "Author").unwrap(); + let original = PreparedEdit::insert(inserted.as_bytes(), sid, &child).unwrap(); + let original = original.as_bytes(); + let empty = onestore::replace_text(original, sid, left, 0..4, "").unwrap(); + let checkpoint = checkpoint::pending(original, sid, left, 0x14001d7a); + for source in [original, &empty, &checkpoint] { + let intent = ParagraphJoin::new(left, right.text_object(), "Join author").unwrap(); + let edit = PreparedEdit::join(source, sid, &intent).unwrap(); + let before = current::current(source); + let after = current::current(edit.as_bytes()); + for write_limit in [17, 4096] { + let disk = |fail_at| disk::Disk { + visible: source.to_vec(), + durable: source.to_vec(), + operation: 0, + fail_at, + write_limit, + random: 917, + }; + let mut successful = disk(None); + edit.commit(&mut successful).unwrap(); + assert_eq!(successful.durable, edit.as_bytes()); + for at in std::iter::once(1).chain(source.len().div_ceil(193)..=successful.operation) { + let mut interrupted = disk(Some(at)); + let error = edit.commit(&mut interrupted).unwrap_err(); + let recovered = current::current(&interrupted.durable); + assert!( + recovered == before || recovered == after, + "interruption {at}" + ); + match error.state { + onestore::CommitState::NotCommitted => assert_eq!(recovered, before), + onestore::CommitState::Committed => assert_eq!(recovered, after), + onestore::CommitState::Unknown => {} + } + } + } + } +} + +#[test] +fn joins_reject_invalid_identities_wrong_order_and_unrelated_pages() { + let (source, _, _) = JOIN_FIXTURES[0]; + let store = Store::parse(source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let cases = join_targets(&document, true); + let (_, left, right) = &cases[0]; + let (sid, space) = document + .spaces + .iter() + .find(|(_, space)| { + space.revisions[&space.contexts[&ExGuid::default()]] + .nodes + .contains_key(left) + }) + .unwrap(); + assert!(ParagraphJoin::new(*left, *left, "Author").is_err()); + assert!(ParagraphJoin::new(ExGuid::default(), *right, "Author").is_err()); + assert!(ParagraphJoin::new(*left, *right, "a\0b").is_err()); + let intent = ParagraphJoin::new(*left, *right, "Author").unwrap(); + for (field, value) in [ + ("left", serde_json::to_value(ExGuid::default()).unwrap()), + ("right", serde_json::to_value(left).unwrap()), + ("author", serde_json::json!("a\0b")), + ] { + let mut encoded = serde_json::to_value(&intent).unwrap(); + encoded[field] = value; + let invalid = serde_json::from_value(encoded).unwrap(); + assert!(PreparedEdit::join(source, *sid, &invalid).is_err()); + } + for intent in [ + ParagraphJoin::new(*right, *left, "Author").unwrap(), + ParagraphJoin::new(*left, cases[1].2, "Author").unwrap(), + ] { + assert!(PreparedEdit::join(source, *sid, &intent).is_err()); + } + let view = &space.revisions[&space.contexts[&ExGuid::default()]]; + let paragraph = *view + .nodes + .iter() + .find(|(_, node)| node.content == [*left]) + .unwrap() + .0; + let parent = view + .nodes + .values() + .find(|node| node.children.contains(¶graph)) + .unwrap(); + let last = view.nodes[parent.children.last().unwrap()].content[0]; + let nonadjacent = ParagraphJoin::new(*left, last, "Author").unwrap(); + assert!(PreparedEdit::join(source, *sid, &nonadjacent).is_err()); + let title = view + .nodes + .iter() + .find_map(|(_, node)| matches!(node.kind, Kind::Title).then_some(node)) + .unwrap(); + let mut pending = title.children.clone(); + let mut rejected = 0; + while let Some(id) = pending.pop() { + let node = &view.nodes[&id]; + pending.extend(node.children.iter().chain(&node.content).copied()); + if matches!(node.kind, Kind::RichText { .. }) { + let intent = ParagraphJoin::new(id, *right, "Author").unwrap(); + assert!(PreparedEdit::join(source, *sid, &intent).is_err()); + rejected += 1; + } + } + assert!(rejected > 0); +} diff --git a/fuzz/fuzz_targets/paragraph.rs b/fuzz/fuzz_targets/paragraph.rs index fcc5b46163d65f926a61b277abe432623a0410df..a7600901c0d5118d31963e56b19ea365bced0b32 100644 --- a/fuzz/fuzz_targets/paragraph.rs +++ b/fuzz/fuzz_targets/paragraph.rs @@ -1,8 +1,8 @@ #![no_main] use libfuzzer_sys::fuzz_target; use onestore::{ - CommitState, ExGuid, Insertion, ParagraphSplit, PreparedEdit, RevisionIndex, Store, - TextAttribute as A, + CommitState, ExGuid, Insertion, ParagraphJoin, ParagraphSplit, PreparedEdit, RevisionIndex, + Store, TextAttribute as A, document::{Document, Kind}, }; use std::sync::LazyLock; @@ -43,6 +43,11 @@ fuzz_target!(|input: &[u8]| { { current::current(edit.as_bytes()); } + if let Ok(intent) = serde_json::from_slice::(input) + && let Ok(edit) = PreparedEdit::join(source, *sid, &intent) + { + current::current(edit.as_bytes()); + } let mut persisted = source.clone(); let mut caches = std::array::from_fn::<_, 12, _>(|_| source.clone()); for step in input.chunks_exact(8).take(20) { @@ -65,57 +70,91 @@ fuzz_target!(|input: &[u8]| { paragraphs.push(id); } } - let paragraph = paragraphs[usize::from(step[2]) % paragraphs.len()]; - let text = view.nodes[¶graph].content[0]; - let characters: Vec<_> = view - .text_runs(text) - .unwrap() - .into_iter() - .flat_map(|run| { - let style = serde_json::to_value(run.format).unwrap(); - run.text.chars().map(move |c| (c, style.clone())) + let characters = |view: &onestore::document::Revision<'_>, id| { + view.text_runs(id) + .unwrap() + .into_iter() + .flat_map(|run| { + let style = serde_json::to_value(run.format).unwrap(); + run.text.chars().map(move |c| (c, style.clone())) + }) + .collect::>() + }; + let pairs: Vec<_> = view + .nodes + .iter() + .flat_map(|(parent, node)| { + node.children.windows(2).filter_map(|pair| { + (paragraphs.contains(&pair[0]) + && paragraphs.contains(&pair[1]) + && view.nodes[&pair[0]].children.is_empty()) + .then_some((*parent, pair[0], pair[1])) + }) }) .collect(); - let offsets: Vec = std::iter::once(0) - .chain(characters.iter().scan(0, |n, (c, _)| { - *n += u32::try_from(c.len_utf16()).unwrap(); - Some(*n) - })) - .collect(); - let offset = u32::from(step[3]) % (offsets.last().unwrap() + 2); - let intent = ParagraphSplit::new(text, offset, "Paragraph fuzz").unwrap(); - let intent = serde_json::from_value(serde_json::to_value(intent).unwrap()).unwrap(); - let edit = PreparedEdit::split(source, *sid, &intent); - let Some(position) = offsets.iter().position(|n| *n == offset) else { - assert!(edit.is_err()); - continue; + let mut expected_text = Vec::new(); + let mut expected_graph = Vec::new(); + let edit = if step[1] & 8 != 0 && !pairs.is_empty() { + let (parent, left, right) = pairs[usize::from(step[2]) % pairs.len()]; + let a = view.nodes[&left].content[0]; + let b = view.nodes[&right].content[0]; + let mut expected = characters(view, a); + let survivor = if expected.is_empty() { b } else { a }; + expected.extend(characters(view, b)); + expected_text.push((survivor, expected)); + let children: Vec<_> = view.nodes[&parent] + .children + .iter() + .filter(|id| **id != right) + .copied() + .collect(); + expected_graph.push((parent, children, view.nodes[&parent].content.clone())); + expected_graph.push((left, view.nodes[&right].children.clone(), vec![survivor])); + let intent = ParagraphJoin::new(a, b, "Paragraph fuzz").unwrap(); + let restored = serde_json::from_value(serde_json::to_value(&intent).unwrap()).unwrap(); + assert_eq!(intent, restored); + PreparedEdit::join(source, *sid, &restored).unwrap() + } else { + let paragraph = paragraphs[usize::from(step[2]) % paragraphs.len()]; + let text = view.nodes[¶graph].content[0]; + let before = characters(view, text); + let offsets: Vec = std::iter::once(0) + .chain(before.iter().scan(0, |n, (c, _)| { + *n += u32::try_from(c.len_utf16()).unwrap(); + Some(*n) + })) + .collect(); + let offset = u32::from(step[3]) % (offsets.last().unwrap() + 2); + let intent = ParagraphSplit::new(text, offset, "Paragraph fuzz").unwrap(); + let restored = serde_json::from_value(serde_json::to_value(&intent).unwrap()).unwrap(); + assert_eq!(intent, restored); + let edit = PreparedEdit::split(source, *sid, &restored); + let Some(position) = offsets.iter().position(|n| *n == offset) else { + assert!(edit.is_err()); + continue; + }; + expected_text.push((text, before[..position].to_vec())); + expected_text.push((intent.text_object(), before[position..].to_vec())); + expected_graph.push((paragraph, vec![], vec![text])); + expected_graph.push(( + intent.object(), + view.nodes[¶graph].children.clone(), + vec![intent.text_object()], + )); + edit.unwrap() }; - let edit = edit.unwrap(); let after_store = Store::parse(edit.as_bytes()).unwrap(); let after_index = RevisionIndex::parse(&after_store).unwrap(); let after_document = Document::parse(&after_index).unwrap(); let space = &after_document.spaces[sid]; let after_view = &space.revisions[&space.contexts[&ExGuid::default()]]; - for (id, expected) in [ - (text, &characters[..position]), - (intent.text_object(), &characters[position..]), - ] { - let actual: Vec<_> = after_view - .text_runs(id) - .unwrap() - .into_iter() - .flat_map(|run| { - let style = serde_json::to_value(run.format).unwrap(); - run.text.chars().map(move |c| (c, style.clone())) - }) - .collect(); - assert_eq!(actual, expected); + for (id, expected) in expected_text { + assert_eq!(characters(after_view, id), expected); + } + for (id, children, content) in expected_graph { + assert_eq!(after_view.nodes[&id].children, children); + assert_eq!(after_view.nodes[&id].content, content); } - assert!(after_view.nodes[¶graph].children.is_empty()); - assert_eq!( - after_view.nodes[&intent.object()].children, - view.nodes[¶graph].children - ); let before = current::current(&persisted); let after = current::current(edit.as_bytes()); let mut disk = disk::Disk { diff --git a/tools/native/paragraph-tag-joins.ps1 b/tools/native/paragraph-tag-joins.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..023be19ffda21fb41d2fd9655a659df98be2c82b --- /dev/null +++ b/tools/native/paragraph-tag-joins.ps1 @@ -0,0 +1,39 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) + $mixed = 'Bold italic ' + [char]::ConvertFromUtf32(0x1F980) + ' e' + [char]0x0301 + ' tail' + $text = '' + $child = 'Preserved child' + $tag = '' + $rightTag = $tag.Replace('index="0"', 'index="1"') + $cases = @( + @{ name = 'Join empty left right tag'; body = '' + $rightTag + $text + '' }, + @{ name = 'Join empty left two tags'; body = '' + $tag + '' + $rightTag + $text + '' }, + @{ name = 'Join different tags'; body = '' + $tag + 'Left' + $rightTag + $text + '' } + ) + $inputs = Join-Path $Root 'inputs' + New-Item -ItemType Directory -Path $inputs | Out-Null + foreach ($case in $cases) { + $page = '' + $app.CreateNewPage($section, [ref]$page, 0) + $xml = '' + $case.name + '' + $case.body + 'Preserved sibling' + [IO.File]::WriteAllText((Join-Path $inputs ($case.name + '.xml')), $xml, [Text.Encoding]::UTF8) + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $true) + $case.page = $page + } + $cases | ConvertTo-Json -Depth 6 | Set-Content (Join-Path $Root 'cases.json') -Encoding UTF8 + $app.SyncHierarchy($notebook) +} finally { + if ($notebook) { $app.CloseNotebook($notebook, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/tools/test_paragraph_edit.py b/tools/test_paragraph_edit.py index 4813b927f421f18a8c24b9859ec77d372412985b..dd58f808b585e7a2b4e84e921ab4decab224f1bd 100644 --- a/tools/test_paragraph_edit.py +++ b/tools/test_paragraph_edit.py @@ -17,60 +17,100 @@ compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare'] class ParagraphEditTest(unittest.TestCase): + def test_rust_joins_match_native_controls_and_retain_cold_graph_identities(self): + for name, control in [('split', FIXTURE / 'joined/read'), + ('inheritance', FIXTURE / 'join-edges/joined/read'), + ('tags', FIXTURE / 'join-tags/joined/read')]: + fixture = FIXTURE / 'rust-join' / name + manifest = json.loads((fixture / 'manifest.json').read_text()) + with self.subTest(fixture=name), TemporaryDirectory() as temporary: + models = [] + for source in ('candidate', 'native/notebook'): + folder = Path(temporary) / source.replace('/', '-') + shutil.copytree(fixture / 'native/read', folder / 'read') + compare(fixture / source, folder / 'read') + subprocess.run([EXPORTER, fixture / source / 'synthetic.one', folder / 'model'], check=True) + document = json.loads((folder / 'model/document.json').read_text()) + models.append({r['nodes'][r['roots']['2']]['kind']['title']: (r, page) + for _, _, r, page in ordered_pages(document)}) + self.assertEqual(models[0].keys(), models[1].keys()) + for title, (old, page) in models[0].items(): + saved, saved_page = models[1][title] + self.assertEqual(page, saved_page) + for outline in old['nodes'][page]['children']: + if old['nodes'][outline]['kind']['type'] != 'Outline': continue + for oid, node in walk(old, outline): + self.assertEqual(saved['nodes'][oid]['children'], node['children']) + self.assertEqual(saved['nodes'][oid]['content'], node['content']) + captures = [] + for folder in (control, fixture / 'native/read'): + captures.append({page.get('name'): native_characters(page, page.findall('one:Outline', ns)) + for path in folder.glob('page-*.xml') for page in [ET.parse(path).getroot()]}) + self.assertEqual(len(manifest), {'split': 12, 'inheritance': 5, 'tags': 3}[name]) + for case in manifest: + for a, b in zip(captures[0][case['case']], captures[1][case['case']], strict=True): + for (x, old), (y, new) in zip(a, b, strict=True): + self.assertEqual(x, y) + for key in old.keys() | new.keys(): + default = 'automatic' if key in ('color', 'highlight') else False + self.assertEqual(old.get(key, default), new.get(key, default)) + def test_native_joins_preserve_inherited_styles_and_follow_tag_and_child_rules(self): - fixture = FIXTURE / 'join-edges' - models, captures = {}, {} - with TemporaryDirectory() as temporary: - for phase in ('before', 'joined'): - folder = Path(temporary) / phase - shutil.copytree(fixture / phase / 'read', folder / 'read') - compare(fixture / phase / 'notebook', folder / 'read') - subprocess.run([EXPORTER, fixture / phase / 'notebook/synthetic.one', folder / 'model'], check=True) - model = json.loads((folder / 'model/document.json').read_text()) - models[phase] = {r['nodes'][r['roots']['2']]['kind']['title']: (r, page) - for _, _, r, page in ordered_pages(model)} - captures[phase] = {} - for path in (folder / 'read').glob('page-*.xml'): - page = ET.parse(path).getroot() - captures[phase][page.get('name')] = native_characters(page, page.findall('one:Outline', ns)) - self.assertEqual(len(models[phase]), 6) - cases = json.loads((fixture / 'cases.json').read_text(encoding='utf-8-sig')) - self.assertEqual(len(cases), 5) - for case in cases: - name = case['name'] - with self.subTest(case=name): - old, page = models['before'][name] - new, new_page = models['joined'][name] - self.assertEqual(page, new_page) - outline, = [oid for oid in old['nodes'][page]['children'] if old['nodes'][oid]['kind']['type'] == 'Outline'] - left, right, sibling = old['nodes'][outline]['children'] - self.assertEqual(new['nodes'][outline]['children'], [left, sibling]) - target = old['nodes'][left]['children'][-1] if name == 'Join both children' else left - a, = old['nodes'][target]['content'] - b, = old['nodes'][right]['content'] - empty = old['nodes'][a]['kind']['text'] == '' - survivor = b if empty else a - self.assertEqual(new['nodes'][target]['content'], [survivor]) - self.assertEqual(new['nodes'][survivor]['kind']['text'], old['nodes'][a]['kind']['text'] + old['nodes'][b]['kind']['text']) - self.assertEqual(new['nodes'][survivor]['tags'], old['nodes'][a]['tags']) - children = old['nodes'][left]['children'] + old['nodes'][right]['children'] - self.assertEqual(new['nodes'][left]['children'], children) - self.assertEqual(new['nodes'][sibling], old['nodes'][sibling]) - if name == 'Join both children': - parent_text, = old['nodes'][left]['content'] - original = old['nodes'][parent_text] - current = new['nodes'][parent_text] - self.assertGreater(current['modified'], original['modified']) - expected = {**original, 'modified': current['modified'], - 'extra': [original['extra'][0] + [{'id': 0x880034dd, 'value': 'NoData'}]]} - self.assertEqual(current, expected) - before = [v for paragraph in captures['before'][name] for v in paragraph] - after = [v for paragraph in captures['joined'][name] for v in paragraph] - for (a, old_style), (b, new_style) in zip(before, after, strict=True): - self.assertEqual(a, b) - for key in old_style.keys() | new_style.keys(): - default = 'automatic' if key in ('color', 'highlight') else False - self.assertEqual(old_style.get(key, default), new_style.get(key, default)) + for fixture_name, expected_cases in [('join-edges', 5), ('join-tags', 3)]: + fixture = FIXTURE / fixture_name + models, captures = {}, {} + with TemporaryDirectory() as temporary: + for phase in ('before', 'joined'): + folder = Path(temporary) / phase + shutil.copytree(fixture / phase / 'read', folder / 'read') + compare(fixture / phase / 'notebook', folder / 'read') + subprocess.run([EXPORTER, fixture / phase / 'notebook/synthetic.one', folder / 'model'], check=True) + model = json.loads((folder / 'model/document.json').read_text()) + models[phase] = {r['nodes'][r['roots']['2']]['kind']['title']: (r, page) + for _, _, r, page in ordered_pages(model)} + captures[phase] = {} + for path in (folder / 'read').glob('page-*.xml'): + page = ET.parse(path).getroot() + captures[phase][page.get('name')] = native_characters(page, page.findall('one:Outline', ns)) + self.assertEqual(len(models[phase]), expected_cases + 1) + cases = json.loads((fixture / 'cases.json').read_text(encoding='utf-8-sig')) + self.assertEqual(len(cases), expected_cases) + for case in cases: + name = case['name'] + with self.subTest(case=name): + old, page = models['before'][name] + new, new_page = models['joined'][name] + self.assertEqual(page, new_page) + outline, = [oid for oid in old['nodes'][page]['children'] if old['nodes'][oid]['kind']['type'] == 'Outline'] + left, right, sibling = old['nodes'][outline]['children'] + self.assertEqual(new['nodes'][outline]['children'], [left, sibling]) + target = old['nodes'][left]['children'][-1] if name == 'Join both children' else left + a, = old['nodes'][target]['content'] + b, = old['nodes'][right]['content'] + empty = old['nodes'][a]['kind']['text'] == '' + survivor = b if empty else a + self.assertEqual(new['nodes'][target]['content'], [survivor]) + self.assertEqual(new['nodes'][survivor]['kind']['text'], old['nodes'][a]['kind']['text'] + old['nodes'][b]['kind']['text']) + self.assertEqual(new['nodes'][survivor]['tags'], old['nodes'][a]['tags']) + children = old['nodes'][left]['children'] + old['nodes'][right]['children'] + self.assertEqual(new['nodes'][left]['children'], children) + self.assertEqual(new['nodes'][sibling], old['nodes'][sibling]) + if name == 'Join both children': + parent_text, = old['nodes'][left]['content'] + original = old['nodes'][parent_text] + current = new['nodes'][parent_text] + self.assertGreater(current['modified'], original['modified']) + expected = {**original, 'modified': current['modified'], + 'extra': [original['extra'][0] + [{'id': 0x880034dd, 'value': 'NoData'}]]} + self.assertEqual(current, expected) + before = [v for paragraph in captures['before'][name] for v in paragraph] + after = [v for paragraph in captures['joined'][name] for v in paragraph] + for (a, old_style), (b, new_style) in zip(before, after, strict=True): + self.assertEqual(a, b) + for key in old_style.keys() | new_style.keys(): + default = 'automatic' if key in ('color', 'highlight') else False + self.assertEqual(old_style.get(key, default), new_style.get(key, default)) + def test_rust_splits_match_native_controls_and_preserve_empty_typing_styles(self): fixture = FIXTURE / 'rust-split' -- 2.54.0