From 49bc9b2d95d93ceb9f25de3e238e89ce6fbfb21e Mon Sep 17 00:00:00 2001 From: clover caruso Date: Mon, 7 Sep 2026 21:38:05 -0700 Subject: [PATCH] feat: publish formatted insertions as one durable intent Add nonoverlapping UTF-16 styles to paragraph and outline insertion without a second revision or offline queue entry. Preserve intent identities through serialization, replay and placement review; reject malformed spans before source parsing. Validate native cold reads, controlled reverse edits and direct keyboard editing, empty-style continuation, historical preservation, interrupted publication, old-cache compatibility, twelve-client mixed editing and offline recovery. Retain public native fixtures and stateful sanitizer coverage. Assisted-by: gpt-6-astra --- corpus/formatted-insertion/README.md | 31 + .../empty-typed/candidate/synthetic.one | Bin 0 -> 6016 bytes .../empty-typed/cold/notebook/synthetic.one | Bin 0 -> 7496 bytes .../empty-typed/cold/read/environment.json | 7 + .../empty-typed/cold/read/hierarchy.xml | 2 + .../empty-typed/cold/read/page-000.xml | 3 + .../empty-typed/cold/read/payloads.json | 3 + .../empty-typed/cold/run.json | 18 + .../empty-typed/cold/source.json | 8 + .../empty-typed/cold/teardown.json | 1 + .../empty-typed/reverse/control-before.xml | 3 + .../empty-typed/reverse/control-update.xml | 2 + .../empty-typed/reverse/edit-before.xml | 3 + .../empty-typed/reverse/edit-update.xml | 2 + .../reverse/notebook/synthetic.one | Bin 0 -> 10240 bytes .../empty-typed/reverse/read/environment.json | 7 + .../empty-typed/reverse/read/hierarchy.xml | 2 + .../empty-typed/reverse/read/page-000.xml | 3 + .../empty-typed/reverse/read/payloads.json | 3 + .../reverse/reverse-verification.json | 5 + .../empty-typed/reverse/run.json | 19 + .../empty-typed/reverse/source.json | 8 + .../empty-typed/reverse/teardown.json | 1 + .../empty/candidate/synthetic.one | Bin 0 -> 5624 bytes .../empty/cold/notebook/synthetic.one | Bin 0 -> 5624 bytes .../empty/cold/read/environment.json | 7 + .../empty/cold/read/hierarchy.xml | 2 + .../empty/cold/read/page-000.xml | 2 + .../empty/cold/read/payloads.json | 3 + .../formatted-insertion/empty/cold/run.json | 18 + .../empty/cold/source.json | 8 + .../empty/cold/teardown.json | 1 + .../typed-after-cold/candidate/synthetic.one | Bin 0 -> 6728 bytes .../typed-after-cold/read/environment.json | 7 + .../empty/typed-after-cold/read/hierarchy.xml | 2 + .../empty/typed-after-cold/read/page-000.xml | 3 + .../empty/typed-after-cold/read/payloads.json | 3 + corpus/formatted-insertion/manifest.json | 963 ++++++++++++++++++ .../native-cell/candidate/synthetic.one | Bin 0 -> 27800 bytes .../native-cell/cold/notebook/synthetic.one | Bin 0 -> 27800 bytes ...0b7c57eb3b6110a06aa2114e06d69a7.attachment | 1 + .../native-cell/cold/read/environment.json | 7 + .../native-cell/cold/read/hierarchy.xml | 2 + .../native-cell/cold/read/page-000.xml | 21 + .../native-cell/cold/read/payloads.json | 10 + .../native-cell/cold/run.json | 18 + .../native-cell/cold/source.json | 8 + .../native-cell/cold/teardown.json | 1 + .../native-cell/reverse/control-before.xml | 21 + .../native-cell/reverse/control-update.xml | 14 + .../native-cell/reverse/edit-before.xml | 23 + .../native-cell/reverse/edit-update.xml | 16 + .../reverse/notebook/synthetic.one | Bin 0 -> 32304 bytes ...0b7c57eb3b6110a06aa2114e06d69a7.attachment | 1 + .../native-cell/reverse/read/environment.json | 7 + .../native-cell/reverse/read/hierarchy.xml | 2 + .../native-cell/reverse/read/page-000.xml | 23 + .../native-cell/reverse/read/payloads.json | 10 + .../reverse/reverse-verification.json | 5 + .../native-cell/reverse/run.json | 19 + .../native-cell/reverse/source.json | 8 + .../native-cell/reverse/teardown.json | 1 + ...0b7c57eb3b6110a06aa2114e06d69a7.attachment | 1 + .../ui/before-read/environment.json | 7 + .../native-cell/ui/before-read/hierarchy.xml | 2 + .../native-cell/ui/before-read/page-000.xml | 21 + .../native-cell/ui/before-read/payloads.json | 10 + .../native-cell/ui/edit.ahk | 10 + .../native-cell/ui/edit.json | 13 + .../native-cell/ui/edit.png | Bin 0 -> 46121 bytes .../native-cell/ui/navigate.ahk | 20 + .../native-cell/ui/navigate.json | 13 + .../native-cell/ui/notebook/synthetic.one | Bin 0 -> 32744 bytes ...0b7c57eb3b6110a06aa2114e06d69a7.attachment | 1 + .../native-cell/ui/read/environment.json | 7 + .../native-cell/ui/read/hierarchy.xml | 2 + .../native-cell/ui/read/page-000.xml | 21 + .../native-cell/ui/read/payloads.json | 10 + .../native-cell/ui/run.json | 18 + .../native-cell/ui/source.json | 8 + .../native-cell/ui/teardown.json | 1 + .../native-paragraph/candidate/synthetic.one | Bin 0 -> 18672 bytes .../cold/notebook/synthetic.one | Bin 0 -> 19160 bytes .../cold/read/environment.json | 7 + .../native-paragraph/cold/read/hierarchy.xml | 2 + .../native-paragraph/cold/read/page-000.xml | 20 + .../native-paragraph/cold/read/payloads.json | 3 + .../native-paragraph/cold/run.json | 18 + .../native-paragraph/cold/source.json | 8 + .../native-paragraph/cold/teardown.json | 1 + .../reverse/control-before.xml | 20 + .../reverse/control-update.xml | 19 + .../native-paragraph/reverse/edit-before.xml | 22 + .../native-paragraph/reverse/edit-update.xml | 21 + .../reverse/notebook/synthetic.one | Bin 0 -> 23176 bytes .../reverse/read/environment.json | 7 + .../reverse/read/hierarchy.xml | 2 + .../reverse/read/page-000.xml | 22 + .../reverse/read/payloads.json | 3 + .../reverse/reverse-verification.json | 5 + .../native-paragraph/reverse/run.json | 19 + .../native-paragraph/reverse/source.json | 8 + .../native-paragraph/reverse/teardown.json | 1 + .../outline/candidate/synthetic.one | Bin 0 -> 7776 bytes .../outline/cold/notebook/synthetic.one | Bin 0 -> 9256 bytes .../outline/cold/read/environment.json | 7 + .../outline/cold/read/hierarchy.xml | 2 + .../outline/cold/read/page-000.xml | 15 + .../outline/cold/read/payloads.json | 3 + .../formatted-insertion/outline/cold/run.json | 18 + .../outline/cold/source.json | 8 + .../outline/cold/teardown.json | 1 + .../outline/reverse/control-before.xml | 15 + .../outline/reverse/control-update.xml | 14 + .../outline/reverse/edit-before.xml | 17 + .../outline/reverse/edit-update.xml | 16 + .../outline/reverse/notebook/synthetic.one | Bin 0 -> 12616 bytes .../outline/reverse/read/environment.json | 7 + .../outline/reverse/read/hierarchy.xml | 2 + .../outline/reverse/read/page-000.xml | 17 + .../outline/reverse/read/payloads.json | 3 + .../outline/reverse/reverse-verification.json | 5 + .../outline/reverse/run.json | 19 + .../outline/reverse/source.json | 8 + .../outline/reverse/teardown.json | 1 + crates/onestore-offline/README.md | 10 +- .../examples/smb_offline_client.rs | 9 +- crates/onestore-offline/tests/cache.rs | 15 +- crates/onestore-offline/tests/sync.rs | 40 +- crates/onestore/README.md | 4 +- crates/onestore/src/formatting.rs | 48 +- crates/onestore/src/insertion.rs | 110 ++ crates/onestore/tests/insertion.rs | 358 ++++++- fuzz/Cargo.toml | 7 + fuzz/fuzz_targets/insert.rs | 135 +++ tools/native/formatted-insertion.ps1 | 53 + tools/native/read.ps1 | 5 +- tools/offline_document_history.py | 7 +- tools/test_formatted_insertion.py | 57 ++ tools/test_offline_document_history.py | 28 + 140 files changed, 2765 insertions(+), 40 deletions(-) create mode 100644 corpus/formatted-insertion/README.md create mode 100644 corpus/formatted-insertion/empty-typed/candidate/synthetic.one create mode 100644 corpus/formatted-insertion/empty-typed/cold/notebook/synthetic.one create mode 100644 corpus/formatted-insertion/empty-typed/cold/read/environment.json create mode 100644 corpus/formatted-insertion/empty-typed/cold/read/hierarchy.xml create mode 100644 corpus/formatted-insertion/empty-typed/cold/read/page-000.xml create mode 100644 corpus/formatted-insertion/empty-typed/cold/read/payloads.json create mode 100644 corpus/formatted-insertion/empty-typed/cold/run.json create mode 100644 corpus/formatted-insertion/empty-typed/cold/source.json create mode 100644 corpus/formatted-insertion/empty-typed/cold/teardown.json create mode 100644 corpus/formatted-insertion/empty-typed/reverse/control-before.xml create mode 100644 corpus/formatted-insertion/empty-typed/reverse/control-update.xml create mode 100644 corpus/formatted-insertion/empty-typed/reverse/edit-before.xml create mode 100644 corpus/formatted-insertion/empty-typed/reverse/edit-update.xml create mode 100644 corpus/formatted-insertion/empty-typed/reverse/notebook/synthetic.one create mode 100644 corpus/formatted-insertion/empty-typed/reverse/read/environment.json create mode 100644 corpus/formatted-insertion/empty-typed/reverse/read/hierarchy.xml create mode 100644 corpus/formatted-insertion/empty-typed/reverse/read/page-000.xml create mode 100644 corpus/formatted-insertion/empty-typed/reverse/read/payloads.json create mode 100644 corpus/formatted-insertion/empty-typed/reverse/reverse-verification.json create mode 100644 corpus/formatted-insertion/empty-typed/reverse/run.json create mode 100644 corpus/formatted-insertion/empty-typed/reverse/source.json create mode 100644 corpus/formatted-insertion/empty-typed/reverse/teardown.json create mode 100644 corpus/formatted-insertion/empty/candidate/synthetic.one create mode 100644 corpus/formatted-insertion/empty/cold/notebook/synthetic.one create mode 100644 corpus/formatted-insertion/empty/cold/read/environment.json create mode 100644 corpus/formatted-insertion/empty/cold/read/hierarchy.xml create mode 100644 corpus/formatted-insertion/empty/cold/read/page-000.xml create mode 100644 corpus/formatted-insertion/empty/cold/read/payloads.json create mode 100644 corpus/formatted-insertion/empty/cold/run.json create mode 100644 corpus/formatted-insertion/empty/cold/source.json create mode 100644 corpus/formatted-insertion/empty/cold/teardown.json create mode 100644 corpus/formatted-insertion/empty/typed-after-cold/candidate/synthetic.one create mode 100644 corpus/formatted-insertion/empty/typed-after-cold/read/environment.json create mode 100644 corpus/formatted-insertion/empty/typed-after-cold/read/hierarchy.xml create mode 100644 corpus/formatted-insertion/empty/typed-after-cold/read/page-000.xml create mode 100644 corpus/formatted-insertion/empty/typed-after-cold/read/payloads.json create mode 100644 corpus/formatted-insertion/manifest.json create mode 100644 corpus/formatted-insertion/native-cell/candidate/synthetic.one create mode 100644 corpus/formatted-insertion/native-cell/cold/notebook/synthetic.one create mode 120000 corpus/formatted-insertion/native-cell/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment create mode 100644 corpus/formatted-insertion/native-cell/cold/read/environment.json create mode 100644 corpus/formatted-insertion/native-cell/cold/read/hierarchy.xml create mode 100644 corpus/formatted-insertion/native-cell/cold/read/page-000.xml create mode 100644 corpus/formatted-insertion/native-cell/cold/read/payloads.json create mode 100644 corpus/formatted-insertion/native-cell/cold/run.json create mode 100644 corpus/formatted-insertion/native-cell/cold/source.json create mode 100644 corpus/formatted-insertion/native-cell/cold/teardown.json create mode 100644 corpus/formatted-insertion/native-cell/reverse/control-before.xml create mode 100644 corpus/formatted-insertion/native-cell/reverse/control-update.xml create mode 100644 corpus/formatted-insertion/native-cell/reverse/edit-before.xml create mode 100644 corpus/formatted-insertion/native-cell/reverse/edit-update.xml create mode 100644 corpus/formatted-insertion/native-cell/reverse/notebook/synthetic.one create mode 120000 corpus/formatted-insertion/native-cell/reverse/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment create mode 100644 corpus/formatted-insertion/native-cell/reverse/read/environment.json create mode 100644 corpus/formatted-insertion/native-cell/reverse/read/hierarchy.xml create mode 100644 corpus/formatted-insertion/native-cell/reverse/read/page-000.xml create mode 100644 corpus/formatted-insertion/native-cell/reverse/read/payloads.json create mode 100644 corpus/formatted-insertion/native-cell/reverse/reverse-verification.json create mode 100644 corpus/formatted-insertion/native-cell/reverse/run.json create mode 100644 corpus/formatted-insertion/native-cell/reverse/source.json create mode 100644 corpus/formatted-insertion/native-cell/reverse/teardown.json create mode 120000 corpus/formatted-insertion/native-cell/ui/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment create mode 100644 corpus/formatted-insertion/native-cell/ui/before-read/environment.json create mode 100644 corpus/formatted-insertion/native-cell/ui/before-read/hierarchy.xml create mode 100644 corpus/formatted-insertion/native-cell/ui/before-read/page-000.xml create mode 100644 corpus/formatted-insertion/native-cell/ui/before-read/payloads.json create mode 100644 corpus/formatted-insertion/native-cell/ui/edit.ahk create mode 100644 corpus/formatted-insertion/native-cell/ui/edit.json create mode 100644 corpus/formatted-insertion/native-cell/ui/edit.png create mode 100644 corpus/formatted-insertion/native-cell/ui/navigate.ahk create mode 100644 corpus/formatted-insertion/native-cell/ui/navigate.json create mode 100644 corpus/formatted-insertion/native-cell/ui/notebook/synthetic.one create mode 120000 corpus/formatted-insertion/native-cell/ui/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment create mode 100644 corpus/formatted-insertion/native-cell/ui/read/environment.json create mode 100644 corpus/formatted-insertion/native-cell/ui/read/hierarchy.xml create mode 100644 corpus/formatted-insertion/native-cell/ui/read/page-000.xml create mode 100644 corpus/formatted-insertion/native-cell/ui/read/payloads.json create mode 100644 corpus/formatted-insertion/native-cell/ui/run.json create mode 100644 corpus/formatted-insertion/native-cell/ui/source.json create mode 100644 corpus/formatted-insertion/native-cell/ui/teardown.json create mode 100644 corpus/formatted-insertion/native-paragraph/candidate/synthetic.one create mode 100644 corpus/formatted-insertion/native-paragraph/cold/notebook/synthetic.one create mode 100644 corpus/formatted-insertion/native-paragraph/cold/read/environment.json create mode 100644 corpus/formatted-insertion/native-paragraph/cold/read/hierarchy.xml create mode 100644 corpus/formatted-insertion/native-paragraph/cold/read/page-000.xml create mode 100644 corpus/formatted-insertion/native-paragraph/cold/read/payloads.json create mode 100644 corpus/formatted-insertion/native-paragraph/cold/run.json create mode 100644 corpus/formatted-insertion/native-paragraph/cold/source.json create mode 100644 corpus/formatted-insertion/native-paragraph/cold/teardown.json create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/control-before.xml create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/control-update.xml create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/edit-before.xml create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/edit-update.xml create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/notebook/synthetic.one create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/read/environment.json create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/read/hierarchy.xml create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/read/page-000.xml create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/read/payloads.json create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/reverse-verification.json create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/run.json create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/source.json create mode 100644 corpus/formatted-insertion/native-paragraph/reverse/teardown.json create mode 100644 corpus/formatted-insertion/outline/candidate/synthetic.one create mode 100644 corpus/formatted-insertion/outline/cold/notebook/synthetic.one create mode 100644 corpus/formatted-insertion/outline/cold/read/environment.json create mode 100644 corpus/formatted-insertion/outline/cold/read/hierarchy.xml create mode 100644 corpus/formatted-insertion/outline/cold/read/page-000.xml create mode 100644 corpus/formatted-insertion/outline/cold/read/payloads.json create mode 100644 corpus/formatted-insertion/outline/cold/run.json create mode 100644 corpus/formatted-insertion/outline/cold/source.json create mode 100644 corpus/formatted-insertion/outline/cold/teardown.json create mode 100644 corpus/formatted-insertion/outline/reverse/control-before.xml create mode 100644 corpus/formatted-insertion/outline/reverse/control-update.xml create mode 100644 corpus/formatted-insertion/outline/reverse/edit-before.xml create mode 100644 corpus/formatted-insertion/outline/reverse/edit-update.xml create mode 100644 corpus/formatted-insertion/outline/reverse/notebook/synthetic.one create mode 100644 corpus/formatted-insertion/outline/reverse/read/environment.json create mode 100644 corpus/formatted-insertion/outline/reverse/read/hierarchy.xml create mode 100644 corpus/formatted-insertion/outline/reverse/read/page-000.xml create mode 100644 corpus/formatted-insertion/outline/reverse/read/payloads.json create mode 100644 corpus/formatted-insertion/outline/reverse/reverse-verification.json create mode 100644 corpus/formatted-insertion/outline/reverse/run.json create mode 100644 corpus/formatted-insertion/outline/reverse/source.json create mode 100644 corpus/formatted-insertion/outline/reverse/teardown.json create mode 100644 fuzz/fuzz_targets/insert.rs create mode 100644 tools/native/formatted-insertion.ps1 create mode 100644 tools/test_formatted_insertion.py diff --git a/corpus/formatted-insertion/README.md b/corpus/formatted-insertion/README.md new file mode 100644 index 0000000000000000000000000000000000000000..ad8b82021cc3c21a2f2bf8fecbbd027073cfa1ff --- /dev/null +++ b/corpus/formatted-insertion/README.md @@ -0,0 +1,31 @@ +# Atomic formatted insertions + +Synthetic Rust paragraph/outline insertions with independent OneNote 2010 cold +reads. The native paragraph and table inputs descend from the public +`native/20260905-05` corpus. `manifest.json` records stable intents and file hashes; +each capture retains its native environment and run provenance. Attachment exports +link to existing identical public payloads. + +Generate new candidates with the ignored `export_native_formatted_insertions` test +and `ONESTORE_INSERT_OUTPUT` set to a new absolute directory. Each child directory +is a separate notebook: the candidates can share source section identities. +Use `tools/native_runner.py` with one child directory and `--expected-pages 1`. +`tools/native/formatted-insertion.ps1` performs an unchanged native HTML round trip +followed by a native prefix edit for the four nonempty cases. + +The unchanged round trip establishes native font substitution before checking the +edit's exact character styles. Table updates omit the outline's measured `Size`: +resubmitting it made two unlocked columns oscillate in native XML, including after +a fresh cache reopen. Those unsettled captures are excluded. The retained table +reverse capture omits that measurement; paragraph and ordinary outline captures +retain it. + +`native-cell/ui` records a direct keyboard prefix edit, without HTML resubmission. +Its native XML settles, preserves every prior character's style, and the resulting +file passes the same model oracle. The capture includes the keyboard script and +screenshot. + +COM omits the empty outline. Its cold-reopened file retains the empty rich-text +object and style; `empty/typed-after-cold` adds text to that retained object and +verifies the 18-point italic result in another independent native cold read. +`tools/test_formatted_insertion.py` checks these captures without a live VM. diff --git a/corpus/formatted-insertion/empty-typed/candidate/synthetic.one b/corpus/formatted-insertion/empty-typed/candidate/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..5b2a46d40debafcf9c499c4140447db1f4ccbe1e GIT binary patch literal 6016 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 literal 0 HcmV?d00001 diff --git a/corpus/formatted-insertion/empty-typed/cold/read/environment.json b/corpus/formatted-insertion/empty-typed/cold/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..81c0a7c8ec62f9c53f6146ec8133408ea8c7c45d --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/cold/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-7135C1A2", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/formatted-insertion/empty-typed/cold/read/hierarchy.xml b/corpus/formatted-insertion/empty-typed/cold/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..0d2fa43e89d3a0bdc75007f82c85d83e5a91b07a --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/cold/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/formatted-insertion/empty-typed/cold/read/page-000.xml b/corpus/formatted-insertion/empty-typed/cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..d97ce299694f9a94759e3a7ac41b3ba826777024 --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/cold/read/page-000.xml @@ -0,0 +1,3 @@ + +Typed café 🦀]]> diff --git a/corpus/formatted-insertion/empty-typed/cold/read/payloads.json b/corpus/formatted-insertion/empty-typed/cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/formatted-insertion/empty-typed/cold/run.json b/corpus/formatted-insertion/empty-typed/cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..74732718857f2351183efd113137f242db48ea00 --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/empty-typed", + "expected_pages": 1, + "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": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/formatted-insertion/empty-typed/cold/source.json b/corpus/formatted-insertion/empty-typed/cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..b1e1853877c2d36db5c3289b86965dc8e1c8bf4f --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/cold/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 6016, + "sha256": "855460055414c52034d0cf62b2e855b460deaedc17d1f276d6b3738458608f2e", + "mtime_ns": 1788842844349962032 + } +] diff --git a/corpus/formatted-insertion/empty-typed/cold/teardown.json b/corpus/formatted-insertion/empty-typed/cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/formatted-insertion/empty-typed/reverse/control-before.xml b/corpus/formatted-insertion/empty-typed/reverse/control-before.xml new file mode 100644 index 0000000000000000000000000000000000000000..29b567bed2e6bcad406ce6e70b1323b6ea20c9dd --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/reverse/control-before.xml @@ -0,0 +1,3 @@ + +Typed café 🦀]]> diff --git a/corpus/formatted-insertion/empty-typed/reverse/control-update.xml b/corpus/formatted-insertion/empty-typed/reverse/control-update.xml new file mode 100644 index 0000000000000000000000000000000000000000..044be53b9e918217202755dd1314cf85743cd494 --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/reverse/control-update.xml @@ -0,0 +1,2 @@ +Typed café 🦀]]> \ No newline at end of file diff --git a/corpus/formatted-insertion/empty-typed/reverse/edit-before.xml b/corpus/formatted-insertion/empty-typed/reverse/edit-before.xml new file mode 100644 index 0000000000000000000000000000000000000000..045b78c7927a7138aa963a08fdf41f77dfcc60ff --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/reverse/edit-before.xml @@ -0,0 +1,3 @@ + +Typed café 🦀]]> diff --git a/corpus/formatted-insertion/empty-typed/reverse/edit-update.xml b/corpus/formatted-insertion/empty-typed/reverse/edit-update.xml new file mode 100644 index 0000000000000000000000000000000000000000..1697afd71d7da49fbcd16e18203a356535d50fca --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/reverse/edit-update.xml @@ -0,0 +1,2 @@ +<span +style='font-style:italic'>Native Typed café &#129408;</span> \ No newline at end of file diff --git a/corpus/formatted-insertion/empty-typed/reverse/notebook/synthetic.one b/corpus/formatted-insertion/empty-typed/reverse/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..c1da8e5d8a2bb4943419e48fee7edfb0ae7d827f GIT binary patch literal 10240 zcmeHM4RBP|6~3Fz&xRx&Q|7jvqvq8nzI9^V!%@dN4*WV}$FA%{MHiL}Pf9si z5f;7TTE@oOs1+A$w$&v;!JT#eCJ^r}dV_Y=+x6z*kJLFXWoBho-couWUy>NoJu>}? z+8`;Nj!WNQc|RJLAzFJ0?rDdlN)x1xFv)BG?-tx_%=u@gv$u80)x5ZQp_+L6z9~^3 z&a@6)QGGCJ#FWadT63!xXX5%$om*A%3cMcpKlT7pMq!GXMY2uUrrJaoyG_K0q2=Dv zwYT$+zLiy#e|>t~#JW5YDdICzPMWkNLqD@v6eFxl9m2ZTCag?C@*A7a;+I5CsyEwy zHby)^+l>X?)4#1>GGN)_qg!tIcFeiMwm8^u{o2l=F&n5&a!wY?bn9BvsFj@tuUsB7 z^{`(?C)$q-6G}W})YY!pJ~1}AdZjLt8qL45eMgxn zE7!(U3!#yxiVH-E#7qq}H6u4KPFpp>U^MgytsBYc5V%9wINdhq+ZkGpdtb6H*t?O`NJB;+R14e{B+8;ZXgyH^pvdOS8EE*Z;=o}g{7G!%9|k+o~A^Rc%p z683OJSz@-BA)W)jD00OMXwjorwX8)tn&|;03RhoI1e?r_xiP}l51ezcb}Y3!g44uY zF-J@nGhtT<<2OJ6qP;G-T3q(bHWAzzW49uQBEZpL8(6n*vdC`i4N_7hXQx%H?wW$! z5=vJz-=nd=YL`Bu-FY#>J|7&2vAgW?Mjb~q`p9|3;r-#UBL22bgi&lf1I{*3i!$6Q zCP81^Ie*AVz=y{%j}EXM1iS3X^%$Ufe1@2!u7N=6ll1%uSD$3QkKD84(5*lB7`*-W zi+A-Lf4YJ1{~`Il*0yiN;CD>iK zUlS5z_}&nAVWTEYg@B9LQ5Syb1ORc}L3S`#*TlGD()}bk^0WItzE%?YFULDQQeqZR zd7P%43^|uIlgjkhm){TDJN}yU;>4YQ{PnMDm>NIM$sblnhUyRGB zFNf0BIx-MR)k@1q@(doz-Gj$7UYZauRk|@`us#waFY(BsTsA_7;3?fOd4 zFTg56Q`Fgq#|7gLb zan^2<`!N*seg}@X?q>U0{gT8lGB=yKtcz(fQ0GaB?K*?1Tbgm!V2qOBENd| z>2G^Q|D)3fE7ArZZT0&E?^F1#=BL&V_j=GdR@ORtQI5;42DosW@I~VM!}s^vFsJbF zh>edvzh~j<>*ejuKOTLkQyI9TL(ss6jIxJ5{xosh`h49l76ufEQ|BmLFsaVQI1iww z)@>7RjBB^Fbhouz&u=0ziSyijE93l-^ydbz{o1F`!0wxldCt=_Z}oY4<~iFrn%3f? zPMbgDqDA#-WByQ8d|T9CKbt6Ntp>-t){(`7#QEK`{L0g_DqbG;?!l&2*A}Ml@|>U1 zdNCU7v<-JM?68lk7_BME`o-STD}@m~b3Yk0DgC21#;^NZM|sv95&l$WLY&r$(mSxC<2Uh&1(|tEoMv3}nd{H8MZXi8>C2y6 zW?Zo0NxF$$xDt-|d?l^#RX$4u0%{Hw<$UJnJ>{Ptx$zjEX`j!R-gESh z!IhJwUEZ_(SZUQyaq*JZ16~jONFH$iR-{SfSv&Qf89!Rg7X@Of$P;#a|Ky5k;v3xc zuTxISOl|%W(D9nRNKVv`_bN_3b#qX+^wRKx>>G89W-_aHtnLnn;W|kG zNF9gKpmY$d&5^Ofvc(}RR$RGX=HA&9BZ5t6^8@>X<6Zl2-QUDhj(y3F}(R@R;uEC0^sm(BhO>ux>ls84nr7+!VGzu#Xsv3Y^n|J9oN_RR>nzA4#f zQXl8~<@s#>)Eu&Qt`>-C+rMZLe)cLljk0R3fNJwzDfnpy#*Dp6Ja5h2 + diff --git a/corpus/formatted-insertion/empty-typed/reverse/read/page-000.xml b/corpus/formatted-insertion/empty-typed/reverse/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..764acda1d3451afd2a0ba4f724574669785cbcda --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/reverse/read/page-000.xml @@ -0,0 +1,3 @@ + +Native Typed café 🦀]]> diff --git a/corpus/formatted-insertion/empty-typed/reverse/read/payloads.json b/corpus/formatted-insertion/empty-typed/reverse/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/reverse/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/formatted-insertion/empty-typed/reverse/reverse-verification.json b/corpus/formatted-insertion/empty-typed/reverse/reverse-verification.json new file mode 100644 index 0000000000000000000000000000000000000000..c70ef0aaa3d5e0377597d673edefc1198517e912 --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/reverse/reverse-verification.json @@ -0,0 +1,5 @@ +{ + "paragraphs": 2, + "characters": 27, + "exact_native_character_styles_after_control": true +} diff --git a/corpus/formatted-insertion/empty-typed/reverse/run.json b/corpus/formatted-insertion/empty-typed/reverse/run.json new file mode 100644 index 0000000000000000000000000000000000000000..810bee75a113c5051eded466b57f95f61496df3e --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/reverse/run.json @@ -0,0 +1,19 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/empty-typed", + "expected_pages": 1, + "author": "evidence/m10/formatted-reverse-controlled.ps1", + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "4362d0ba551eb00b2eca1c5563d76352469f85d3981155bf2682c159a03ddedb", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "df4244a18ab3e9c21083b8df61b08b863e8cce0ec4bf0c9cd742a8ee6f79877d" + } +} diff --git a/corpus/formatted-insertion/empty-typed/reverse/source.json b/corpus/formatted-insertion/empty-typed/reverse/source.json new file mode 100644 index 0000000000000000000000000000000000000000..b1e1853877c2d36db5c3289b86965dc8e1c8bf4f --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/reverse/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 6016, + "sha256": "855460055414c52034d0cf62b2e855b460deaedc17d1f276d6b3738458608f2e", + "mtime_ns": 1788842844349962032 + } +] diff --git a/corpus/formatted-insertion/empty-typed/reverse/teardown.json b/corpus/formatted-insertion/empty-typed/reverse/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/formatted-insertion/empty-typed/reverse/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/formatted-insertion/empty/candidate/synthetic.one b/corpus/formatted-insertion/empty/candidate/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..2ba1e5a1323d980d05cf2a75fbe1c0e42761d60f GIT binary patch literal 5624 zcmeHKdr(wm6hDj0it<`;0gZ)_RwXrBM@gr2csOFH2m_fIT9AsUO=8H5Vvj2-Zc2qr z89p*bC8=o?jLh+gWFzL_(2yfpj!k2eGYnw~x|NU4?>?5x@_~Q&R}*LE+k5YK9`~H{ zo%1_)ucggjThg*W`9Mwj>ZZrHHLs7EacPRj^|%w)b51o!H%}!uioLSK9J;kLsj?|# zYg@yCmeI`DFHQVD6Yf2<4fU$+yKTE3YgkM+; z$~Qku$e3|q(}I~L>n^?(=5cd`=0lzLt-{^!zL>N}+IXk&boAx!TK!M`8TkKYz(6FS z#RibwO4h|z8X93Go0)fpm+ZQ?ym4E~k>$5@BQskTQ83w(W3L!kLm_DZ6@`&y%LKBV zw2~!?cd<5CT~h@h3Gpu53&UtEY&-KFOK5H1H1(b0#?S5={pRzYo%& z+ANZCExQcqWdYO6-t%4jt!GjI>_?hOvM~=bl}{a9nVS9Nw6AXFoVq_NrU?6xxzK*D zYWCI9iN(v8wOqY7%O1r#m8-}>Mrbj{@EXi(Aem%;3Cu|^DrB4Jje;<; zPUbbgt!XZ#{dmPw0j;83TETXS#BX2*6YLG;tC!2(04w=GwW0)Fb41S)ia$cGmaTJL_dxBO)Ucu&YdZO7f#oJxH5tOl*N?Ymo}AZN+m=~#de82~@oxg4^eEttPsj@h z_~ee8um=J@h5V8o67->zQrVvQT}%7tg&I$h==xRmflm(AMJ^i>oosLT^wI46dJzV} zQ&<=AaDZL-RF1M^%3^W%c(qSQ;FBm`GvkvNppfZ?auMQ_R=-L$bANNh8EQ$PYDCxv z8K-I+GNShz*)NeUT=se2{47Z3RQ;&HDR*bu!3DILTM^9)rC#6ZT;zd!_> z4)(Q^KwcQD2!25hC)XB}9PHEvq7GM#-EhOxN{-&J!{)*b^cJX=^Hs9w*x$pm=1lvv z^%H;7wMH+zOOG3y(tJA_k1dVg9+3D)`n-jE@jZYhDpmh$*jXMrt|r>)NO}8Y$)EW_ z(b*RgUrIPDPkC`(I5v4+82Cm!GZ1}G%tZcrPNgnf1U!Hc-|6f5Q&#%zPTnFrILs}1#vxP?$Bg-e%1Gl$zmVs11kWD*r0&Wu5Eg{| zt_V1qwXDRLc)WU!?*`N5-(gT+KfUG)$I66WhEBIZP@yt02#_GxAVB4{sLUv4AW9e3 zTP_9vv~EG`_|V@1PHc^z-Y92Y)Q|i=3E$eD^8DA&^T2TBTLoEE{L;;ESN~vWfDr%q z<99mhJ%3Fs+P7$2!I$1+9u&V;U!uOk*K&iuVjH2u3)h(IqmDE@)leQYr+mZ})0m0Y zgu^jI&hMYNK|9s0dO062Q(v>YlaOz U%a?xY&p>|${-YVt&kTg{FDMb&KL7v# literal 0 HcmV?d00001 diff --git a/corpus/formatted-insertion/empty/cold/notebook/synthetic.one b/corpus/formatted-insertion/empty/cold/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..6d33cf8d437c8dc0fe0941484190e6e1204f2f03 GIT binary patch literal 5624 zcmeHKdr(wm6hEuWit<`;c^C_!Zi$a<9VML7;o*ofiZGZdq6I$jF^VEHiq+gmaaAg` zQha2ll3=A^q>itUY{VQK8f#)K$8v0{aW*VLxAM{X-N$lSKJX9!a)vYWaqoWT@tt$N zbAIP?J$=UN;>P_c2dgHpY#6xZ($Sgu&LQjV<3FRiC5snd+e#i3cV)Xdd{awuSwrY1 zXWhZZLCn`LP5c29-n(fV>Qmd-w&RkffAa3E1CuH;a>MQ{tBC0zk~q4-N8#r1W2CS0 z{vtodtNRXR%l+3C?0%JBV*luIsDHj+V#V@bMhskXYP3;h*ZABn*!A|y$$O-=ck9m# zz1&u-{jchQ9|dTuJ-2J8D+7;z1`I?JTC6+Stz?~RrLZU~+04Atw|M9MMfF=!k1e{B z(=W4e4uy~{CGLuWH58J%Q(**IHjW_6X)9Txc^7L#`E^wQk`QmTJv)Miz_u&5f8vd% zbz|Ntsy}eg=s%;KZ93b0r=_akrG1bFRcDcuW7%n#yg6{(=6C$&e&dxK2>boaB-xk; znX=~&ElbOOcI?qx^S*pAF{Tjvkh$1&zI@WvK}ki67B*hJKhYk|I%O-!K`JneWSL&P zdXP!>m%tpUGNYIQ+!+QagEcUxsmyr(jqG`|W;Za8v1tOvf%rE~I6l1atKiy=T0DW+ zWU}P44<7!)04TDKq&K}bgzoU(k?{WB#LP&0?PiUqNVNV{_A5)Mq*V2(ftjLAt;r>a z;+Nu?X5&BSy!WOHyg^1_UBp8|fb3R;+iAQ(ECurAyAZ`|j;E3wFGc32@(|i%Poxm$ z8|X={&o>D4$kP4lQN7MB)>e!329@ z{PcF)>ux3AAoktDJrv9ciVlsLLeVMUG&1 zWdud7;?_<53C~@`U^Ls~yO^@FQwnpk5rz&_uYVThfWk79-8rUGtPgMelIsE z#*u#uuULJ**Qm@aX5f3muJ8A#9=yYp#tZ)X=rwb7Oq7bRo>`+ZfiXDOPtSCz%y?$t z68$yi*VPO_xOb)~UbtNY>IzNwj6LN0r!TZP0{$7Xdq7;oYY?8M3fq~FYfXVL^7Z5G z38yn!s-2ltXZGxxoA5dSN{<4b_=LQGfKQ&d340*mQ|Ptq(BQ37YFSg}w~bAo7HB+0 zqV=z`4}5Z{E^^tB=w>^@rw=CO)rv3(p2E6_hYM`Qr&5$1Qx=PR#;big0-r?jni-$G z0fkIAm4^_YwE9)5nfsd~o~D)*sz!u;ka4NDAtO59$bN}*;Yw%sh(ZL_N^L92vv|PQ z7msJXz=r4?q_ih5%rjIm5Ca)U{{j(kJJ{E50(oJqBKQS4+?+EeCB&r-L>;ae+u(+m zl^h*mhs})}=q*q+=c{3+@iCl(}Z3rzZJa>nev z_#QwLm8kz~*jXMr?k3vdNL_!r`0u>nq1hLcUP(MBPkC`(I5v4+82CjzGZ1}y%tZd$ zPo-8|1U!Hc-U9!7pToHS2=k5N*#a-!e1nfD4=iQAVV+^WVa{nY4s%PMaR?Q} zF=IZVGSYd{&*u3Y#j{60sax|4gaskLO9PK*Ei5)BovfVVx5jk&PZ-qKPlx%!wKAcX zq0?p%>{gi=1W1s35TNoJRc16Z5TzUIEkA_(^v28^!^3|IJhdrdT)mumQ9tr|627&) zsVh@RUPRECtfPT`SJ%7>z48o-AYIL@L%~hXGI}? sqbo3;fGZfxsDC_B2f%IQ9ng$iuIkh496!3KD+65_cuX^(pBV_@e~Jp?8vp + diff --git a/corpus/formatted-insertion/empty/cold/read/page-000.xml b/corpus/formatted-insertion/empty/cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..ff3c9ab7a5343a439d3b7c95b70001d7401565b4 --- /dev/null +++ b/corpus/formatted-insertion/empty/cold/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/formatted-insertion/empty/cold/read/payloads.json b/corpus/formatted-insertion/empty/cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/formatted-insertion/empty/cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/formatted-insertion/empty/cold/run.json b/corpus/formatted-insertion/empty/cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..474dda4dfb0fc5c51a5f4f067812ec9dce238d67 --- /dev/null +++ b/corpus/formatted-insertion/empty/cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/empty", + "expected_pages": 1, + "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": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/formatted-insertion/empty/cold/source.json b/corpus/formatted-insertion/empty/cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..771e0026ba3fd91a3827e6123b56fdb304dd7101 --- /dev/null +++ b/corpus/formatted-insertion/empty/cold/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 5624, + "sha256": "bd592be42dc93e95444174ceceb19d1fc718fbe53c08403f87b6dec3207dc38d", + "mtime_ns": 1788842844347041269 + } +] diff --git a/corpus/formatted-insertion/empty/cold/teardown.json b/corpus/formatted-insertion/empty/cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/formatted-insertion/empty/cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/formatted-insertion/empty/typed-after-cold/candidate/synthetic.one b/corpus/formatted-insertion/empty/typed-after-cold/candidate/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..17346445e96fd59d30a9d7bd5253140ff426a784 GIT binary patch literal 6728 zcmeHLe@s<%6#qW?Am6LL73wV1|i4yw%|lAte3>3r^w$K`P!+Uk$mINN#m-tYNw&pF@o zJ?Grl5gETNzwKyPW%bf6t&{g&Kf5BUYuYaF&=ag_!}|5N_b~(TZ!fWPE$mxZ-s)V~ z)l}Iwh3HZg+4~7_Zz3)TS8-ij_77hE`G>2HFF6*Q?(%TcG2e+!LGxNId1@+MW?S+1 z%jgm+tZVrt{cq@V`djWMZI4&a%I2uh!w+gA>N`TB%>;5xeC^HY9`geWeM;u|Z9Xw^ zu+-3}+R2A(MI1^USs97I|33l>#xyu$Cd^yKRLLslqE<0aJ6f5LU-~4iWp8+0+QU?j zxV9wb#5}|N+Z80igT{pAxG`m(4^uX%n9_?@fx9a@1O{+|eL(kWH#QBrb?Fm>?sV^* z|9)=E@yDh%@k4a8%e@c#s<*yz1l)ky1g1$LW`u zPDEF*=P5r2MMGoG`4PrliHcb{knKu3Lym;5gepQ&zrunSgEWE0pT~&6lKtcT(O)&=X&EgLXwKVW;CdAGvkXJZ#FL^tC|Kim?t?lnVWt05fwu3oFVD=_DwlxgQ zh}X>riyC74YP;g9FMfJ3Iq+>1C}|ZitWSsw0QJeRZbBab^~w2mqO;>ZO?Y{C+_!Dr zUu+d=JjcKaWr4!QRrq+GE|FDe3d2kYWaATIb8fL-9j&UN{QIqAfP zD5)!^gX)HvifN724o`jEz}W)SQoQn$&OMrt5VhdgozHB|J6bI8E@|D^8EM_ya&B$l ze*55_rLn6IV;;aEDiFRkyonz&`a^U;8@{U{|F;as>512ZR|Z|-y1aZ`$TzNEDCkDM zXTbZRH52h0+LZ?CBFX~*{$2bvW8Nm4gJGpn(_AXv%1klz&oEy+Nd`QI`Gs{@(|mbq zwds3)3pK5Fx+|Vtr^NXv!WwUssd~fsPw%0+{}1{b3m^@IlKuu8ksd(4zoDO@zoE~G zJq~?~>v3=uKt7{CAu}SW)32uftft;0?bHMD6+a;n-;MV53G4DrgU?q*S?@5vaTf}u z`C~L**j56ZWylO_1Z4sdjQ|1CHv(i{n?Up;0=(4MdgTvJKfbf#&P>-|?7u7w3~Ava zFLxg4eHzT#W?cW5_Hze!epW#gdAlS%Tz`JhGyw2_=J`K+8_ha{bB-j<$U1E~^=bZ# z`6YL*FfBLP^19(VtkAc)Ve&|pZxp+S}Fp+FAq1>(* zlZXA7&HD*ywiSwpngS#CKb#7*Cy>yXk^i_N4^X!eca&ztGJE{kD=NBz?nVf@yKn^` zbbwEruqKu+BQO$ykqG?9A|UM5qDpf_>=THS z@wo!N%pu8TESsgXWR}D*VWrT2A<6W0ujc+;$)wrqO?p<-N;3UJ0=^CO^je#y-S|9$ z{sKTeZ0biJx>45|e7=4AyjR`tHz;Ubnn#B5c-lOoM)M;`C*-qS_}_1sd=d8v{SGpi zM^vhs(mm~|0SA@2j!`{vHn2->M!`BikAw<4gn2^lbPU(eF%NJ@mSoEa<+8+>d{Lc` YJ>&}n&x=W3E~>`l#d(6n2;}nQFGu7MSpWb4 literal 0 HcmV?d00001 diff --git a/corpus/formatted-insertion/empty/typed-after-cold/read/environment.json b/corpus/formatted-insertion/empty/typed-after-cold/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..42ddb9f651edfa0c158724e69628cf9b27f98cc3 --- /dev/null +++ b/corpus/formatted-insertion/empty/typed-after-cold/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-2A09ABA3", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/formatted-insertion/empty/typed-after-cold/read/hierarchy.xml b/corpus/formatted-insertion/empty/typed-after-cold/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..1b169347a442e3e5673a58c50a2c89acff3a6745 --- /dev/null +++ b/corpus/formatted-insertion/empty/typed-after-cold/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/formatted-insertion/empty/typed-after-cold/read/page-000.xml b/corpus/formatted-insertion/empty/typed-after-cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..ca9eafad77a31fb7619e7a180645929b95c4abd9 --- /dev/null +++ b/corpus/formatted-insertion/empty/typed-after-cold/read/page-000.xml @@ -0,0 +1,3 @@ + +Typed after native reopen 🦀]]> diff --git a/corpus/formatted-insertion/empty/typed-after-cold/read/payloads.json b/corpus/formatted-insertion/empty/typed-after-cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/formatted-insertion/empty/typed-after-cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/formatted-insertion/manifest.json b/corpus/formatted-insertion/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..f1b605d73d029a93e72488a66a3871b541d277d3 --- /dev/null +++ b/corpus/formatted-insertion/manifest.json @@ -0,0 +1,963 @@ +{ + "generator": "crates/onestore/tests/insertion.rs:export_native_formatted_insertions", + "cases": [ + { + "intent": { + "author": "Rich author", + "created": 1473310044, + "formats": [ + { + "attributes": [ + { + "Bold": true + }, + { + "Underline": true + } + ], + "guid": [ + 207, + 169, + 223, + 216, + 230, + 235, + 235, + 75, + 185, + 94, + 69, + 228, + 117, + 205, + 151, + 134 + ], + "range": { + "end": 4, + "start": 0 + } + }, + { + "attributes": [ + { + "Font": "Arial" + }, + { + "FontSize": 13.5 + } + ], + "guid": [ + 233, + 34, + 183, + 44, + 7, + 99, + 201, + 75, + 140, + 220, + 83, + 226, + 209, + 176, + 83, + 88 + ], + "range": { + "end": 7, + "start": 5 + } + }, + { + "attributes": [ + { + "Italic": true + }, + { + "Strike": true + } + ], + "guid": [ + 30, + 196, + 121, + 136, + 27, + 75, + 93, + 79, + 181, + 130, + 25, + 17, + 13, + 139, + 35, + 217 + ], + "range": { + "end": 14, + "start": 8 + } + }, + { + "attributes": [ + { + "Superscript": true + } + ], + "guid": [ + 101, + 236, + 26, + 203, + 134, + 120, + 215, + 67, + 170, + 155, + 81, + 250, + 86, + 214, + 214, + 111 + ], + "range": { + "end": 17, + "start": 15 + } + }, + { + "attributes": [ + { + "Color": [ + 12, + 34, + 56 + ] + }, + { + "Highlight": [ + 255, + 255, + 0 + ] + } + ], + "guid": [ + 57, + 2, + 72, + 237, + 92, + 155, + 100, + 72, + 130, + 100, + 120, + 181, + 179, + 69, + 97, + 11 + ], + "range": { + "end": 23, + "start": 18 + } + }, + { + "attributes": [ + { + "Subscript": true + } + ], + "guid": [ + 189, + 73, + 14, + 147, + 222, + 140, + 144, + 65, + 176, + 86, + 229, + 249, + 220, + 119, + 252, + 192 + ], + "range": { + "end": 26, + "start": 24 + } + }, + { + "attributes": [ + { + "Bold": false + }, + { + "Italic": false + }, + { + "Color": null + }, + { + "Highlight": null + } + ], + "guid": [ + 165, + 80, + 86, + 53, + 207, + 121, + 164, + 68, + 169, + 152, + 106, + 34, + 115, + 110, + 230, + 151 + ], + "range": { + "end": 30, + "start": 27 + } + } + ], + "guid": [ + 205, + 161, + 237, + 192, + 33, + 131, + 161, + 64, + 168, + 94, + 233, + 150, + 178, + 37, + 36, + 190 + ], + "parent": "{71AF36A5-6150-452F-B7F3-66BFFF4C3582},22", + "placement": { + "Outline": { + "x": 72.0, + "y": 144.0 + } + }, + "text": "Bold \ud83e\udd80 italic e\u0301 color \u6771\u4eac\rEnd" + }, + "name": "outline", + "space": "{A8C9EFCE-DF4E-462A-866B-6AD8DFFE4C30},1", + "candidate_sha256": "76f6b743caa9dc2b5ab342d6e6a742125ecbcd0ca2372062b42acbd08b5ebb4c", + "cold_sha256": "151a49d8cf2e607a10a9c948286ce7eb3eb754fa90e9557a74a2cb1f1f0204cb", + "reverse_sha256": "8127b63d52ecbc2ad88a0d4f0eccb7fc8b086983f25db40b5f3396616f39cc53", + "omitted_table_outline_size": false + }, + { + "intent": { + "author": "Rich author", + "created": 1473310044, + "formats": [ + { + "attributes": [ + { + "Bold": true + }, + { + "Underline": true + } + ], + "guid": [ + 141, + 194, + 83, + 170, + 169, + 68, + 33, + 76, + 139, + 83, + 12, + 156, + 72, + 95, + 145, + 140 + ], + "range": { + "end": 4, + "start": 0 + } + }, + { + "attributes": [ + { + "Font": "Arial" + }, + { + "FontSize": 13.5 + } + ], + "guid": [ + 168, + 249, + 0, + 182, + 1, + 200, + 117, + 66, + 179, + 210, + 69, + 6, + 83, + 62, + 157, + 171 + ], + "range": { + "end": 7, + "start": 5 + } + }, + { + "attributes": [ + { + "Italic": true + }, + { + "Strike": true + } + ], + "guid": [ + 152, + 84, + 172, + 67, + 218, + 72, + 77, + 67, + 143, + 158, + 58, + 16, + 177, + 251, + 222, + 20 + ], + "range": { + "end": 14, + "start": 8 + } + }, + { + "attributes": [ + { + "Superscript": true + } + ], + "guid": [ + 29, + 165, + 47, + 217, + 107, + 120, + 31, + 79, + 148, + 67, + 148, + 232, + 78, + 245, + 157, + 68 + ], + "range": { + "end": 17, + "start": 15 + } + }, + { + "attributes": [ + { + "Color": [ + 12, + 34, + 56 + ] + }, + { + "Highlight": [ + 255, + 255, + 0 + ] + } + ], + "guid": [ + 165, + 189, + 67, + 237, + 2, + 56, + 67, + 70, + 169, + 71, + 239, + 10, + 236, + 192, + 119, + 48 + ], + "range": { + "end": 23, + "start": 18 + } + }, + { + "attributes": [ + { + "Subscript": true + } + ], + "guid": [ + 116, + 118, + 37, + 115, + 74, + 111, + 247, + 70, + 172, + 126, + 100, + 131, + 159, + 151, + 38, + 234 + ], + "range": { + "end": 26, + "start": 24 + } + }, + { + "attributes": [ + { + "Bold": false + }, + { + "Italic": false + }, + { + "Color": null + }, + { + "Highlight": null + } + ], + "guid": [ + 32, + 151, + 42, + 7, + 76, + 55, + 143, + 75, + 178, + 217, + 234, + 71, + 135, + 25, + 75, + 145 + ], + "range": { + "end": 30, + "start": 27 + } + } + ], + "guid": [ + 191, + 62, + 177, + 4, + 17, + 246, + 2, + 68, + 130, + 157, + 199, + 46, + 35, + 34, + 28, + 139 + ], + "parent": "{03D49648-056C-0F08-32C9-0424E8496E7D},10", + "placement": { + "Paragraph": { + "before": "{03D49648-056C-0F08-32C9-0424E8496E7D},11" + } + }, + "text": "Bold \ud83e\udd80 italic e\u0301 color \u6771\u4eac\rEnd" + }, + "name": "native-paragraph", + "space": "{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1", + "candidate_sha256": "202823512283be980b6a139adcf5f4f369d15f17d60ed7b23f9f2289513aa4e9", + "cold_sha256": "efb61aaedbe12cb00434f7e581259d112480158cacb66961d4168081b77a1112", + "reverse_sha256": "753b320528748faa1ae11ee5eb710530d15636361674aab37f4c442ee5b9dd7b", + "omitted_table_outline_size": false + }, + { + "intent": { + "author": "Rich author", + "created": 1473310044, + "formats": [ + { + "attributes": [ + { + "Bold": true + }, + { + "Underline": true + } + ], + "guid": [ + 148, + 53, + 156, + 113, + 44, + 188, + 95, + 71, + 170, + 198, + 38, + 41, + 148, + 201, + 99, + 234 + ], + "range": { + "end": 4, + "start": 0 + } + }, + { + "attributes": [ + { + "Font": "Arial" + }, + { + "FontSize": 13.5 + } + ], + "guid": [ + 17, + 187, + 223, + 32, + 237, + 203, + 222, + 66, + 134, + 24, + 65, + 131, + 32, + 188, + 202, + 177 + ], + "range": { + "end": 7, + "start": 5 + } + }, + { + "attributes": [ + { + "Italic": true + }, + { + "Strike": true + } + ], + "guid": [ + 201, + 233, + 230, + 86, + 91, + 117, + 20, + 68, + 142, + 220, + 224, + 178, + 139, + 52, + 180, + 203 + ], + "range": { + "end": 14, + "start": 8 + } + }, + { + "attributes": [ + { + "Superscript": true + } + ], + "guid": [ + 145, + 203, + 90, + 115, + 34, + 107, + 73, + 66, + 160, + 157, + 25, + 141, + 249, + 128, + 72, + 159 + ], + "range": { + "end": 17, + "start": 15 + } + }, + { + "attributes": [ + { + "Color": [ + 12, + 34, + 56 + ] + }, + { + "Highlight": [ + 255, + 255, + 0 + ] + } + ], + "guid": [ + 53, + 51, + 180, + 64, + 45, + 92, + 153, + 70, + 163, + 88, + 171, + 172, + 200, + 222, + 35, + 19 + ], + "range": { + "end": 23, + "start": 18 + } + }, + { + "attributes": [ + { + "Subscript": true + } + ], + "guid": [ + 249, + 231, + 26, + 88, + 247, + 6, + 107, + 65, + 131, + 6, + 89, + 211, + 188, + 246, + 100, + 155 + ], + "range": { + "end": 26, + "start": 24 + } + }, + { + "attributes": [ + { + "Bold": false + }, + { + "Italic": false + }, + { + "Color": null + }, + { + "Highlight": null + } + ], + "guid": [ + 136, + 160, + 124, + 20, + 185, + 141, + 156, + 75, + 163, + 89, + 177, + 152, + 149, + 251, + 1, + 204 + ], + "range": { + "end": 30, + "start": 27 + } + } + ], + "guid": [ + 245, + 178, + 40, + 105, + 54, + 125, + 175, + 68, + 190, + 59, + 54, + 206, + 186, + 206, + 134, + 87 + ], + "parent": "{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14", + "placement": { + "Paragraph": { + "before": null + } + }, + "text": "Bold \ud83e\udd80 italic e\u0301 color \u6771\u4eac\rEnd" + }, + "name": "native-cell", + "space": "{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1", + "candidate_sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351", + "cold_sha256": "b7324075349e45f31d9e9fb8638691f58efff1989be65f12f7711dc359898a64", + "reverse_sha256": "04134b8db9b52aaf43dc5dfc90464d54802890e5d4966e7163a977e2ebd77e1e", + "omitted_table_outline_size": true, + "ui_sha256": "d67b70016af71db07a8012b85a5016897c08b715c6db8953e1fc45cfe008bc27" + }, + { + "intent": { + "author": "Rich author", + "created": 1473310044, + "formats": [ + { + "attributes": [ + { + "Italic": true + }, + { + "FontSize": 18.0 + } + ], + "guid": [ + 135, + 82, + 13, + 244, + 205, + 187, + 105, + 65, + 153, + 17, + 70, + 241, + 83, + 89, + 99, + 163 + ], + "range": { + "end": 0, + "start": 0 + } + } + ], + "guid": [ + 201, + 196, + 43, + 177, + 4, + 133, + 60, + 73, + 128, + 208, + 16, + 248, + 199, + 36, + 237, + 179 + ], + "parent": "{71AF36A5-6150-452F-B7F3-66BFFF4C3582},22", + "placement": { + "Outline": { + "x": 72.0, + "y": 144.0 + } + }, + "text": "" + }, + "name": "empty", + "space": "{A8C9EFCE-DF4E-462A-866B-6AD8DFFE4C30},1", + "candidate_sha256": "bd592be42dc93e95444174ceceb19d1fc718fbe53c08403f87b6dec3207dc38d", + "cold_sha256": "a0a59d1c5676e2b6742e13791f888c91a3e0494c980b66fb6ef0a3bf324fac7a" + }, + { + "intent": { + "author": "Rich author", + "created": 1473310044, + "formats": [ + { + "attributes": [ + { + "Italic": true + }, + { + "FontSize": 18.0 + } + ], + "guid": [ + 183, + 9, + 145, + 10, + 11, + 69, + 244, + 73, + 144, + 49, + 203, + 207, + 41, + 174, + 161, + 107 + ], + "range": { + "end": 0, + "start": 0 + } + } + ], + "guid": [ + 38, + 199, + 125, + 238, + 88, + 20, + 244, + 67, + 146, + 95, + 200, + 15, + 97, + 115, + 247, + 221 + ], + "parent": "{71AF36A5-6150-452F-B7F3-66BFFF4C3582},22", + "placement": { + "Outline": { + "x": 72.0, + "y": 144.0 + } + }, + "text": "" + }, + "name": "empty-typed", + "space": "{A8C9EFCE-DF4E-462A-866B-6AD8DFFE4C30},1", + "candidate_sha256": "855460055414c52034d0cf62b2e855b460deaedc17d1f276d6b3738458608f2e", + "cold_sha256": "12dcec5c696b989e0f78d76db6af8542104dec82e90b705269d53a8c52332871", + "reverse_sha256": "bc64aba71aba93596edff6ed270ea8ff17285c31cb79e357a5640edf6e934112", + "omitted_table_outline_size": false + } + ], + "native_author": "tools/native/formatted-insertion.ps1" +} diff --git a/corpus/formatted-insertion/native-cell/candidate/synthetic.one b/corpus/formatted-insertion/native-cell/candidate/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..28f0762ec463d819e00c9543089c830ccb592ad0 GIT binary patch literal 27800 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 + diff --git a/corpus/formatted-insertion/native-cell/cold/read/page-000.xml b/corpus/formatted-insertion/native-cell/cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..1f4ca301fb93b8076d16146e331c520316168da2 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/cold/read/page-000.xml @@ -0,0 +1,21 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII=Bold 🦀 italic é color 東京
+End
]]>
diff --git a/corpus/formatted-insertion/native-cell/cold/read/payloads.json b/corpus/formatted-insertion/native-cell/cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..42adb50e7552b696fff97155eb43f177b2455af0 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/cold/read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{A5A01D50-6C3A-4B67-9D41-B0CB3EEF1DF4}{11}{B0}", + "kind": "InsertedFile", + "page": "{2CEF1916-B4F8-48E4-9BD8-7292BDC39B61}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/formatted-insertion/native-cell/cold/run.json b/corpus/formatted-insertion/native-cell/cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..740c015f17cdad0bf3230e4d95f9e66ed2b5c2cf --- /dev/null +++ b/corpus/formatted-insertion/native-cell/cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-cell", + "expected_pages": 1, + "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": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/formatted-insertion/native-cell/cold/source.json b/corpus/formatted-insertion/native-cell/cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..9adbf16c785dee7d9e5fab579f7d7a7b97ba9f9a --- /dev/null +++ b/corpus/formatted-insertion/native-cell/cold/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 27800, + "sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351", + "mtime_ns": 1788842844345306887 + } +] diff --git a/corpus/formatted-insertion/native-cell/cold/teardown.json b/corpus/formatted-insertion/native-cell/cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/formatted-insertion/native-cell/reverse/control-before.xml b/corpus/formatted-insertion/native-cell/reverse/control-before.xml new file mode 100644 index 0000000000000000000000000000000000000000..4241dd8845f8db99f3f7046a27d2ff9db76b0b66 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/reverse/control-before.xml @@ -0,0 +1,21 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII=Bold 🦀 italic é color 東京
+End
]]>
diff --git a/corpus/formatted-insertion/native-cell/reverse/control-update.xml b/corpus/formatted-insertion/native-cell/reverse/control-update.xml new file mode 100644 index 0000000000000000000000000000000000000000..0b3cff200e4b739992a164db9d2d7f9d0c6254da --- /dev/null +++ b/corpus/formatted-insertion/native-cell/reverse/control-update.xml @@ -0,0 +1,14 @@ +Bold 🦀 italic é color 東京
+End
]]>
\ No newline at end of file diff --git a/corpus/formatted-insertion/native-cell/reverse/edit-before.xml b/corpus/formatted-insertion/native-cell/reverse/edit-before.xml new file mode 100644 index 0000000000000000000000000000000000000000..cbdd9391c0d01a439d2ef5aa7934eb73c6276a64 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/reverse/edit-before.xml @@ -0,0 +1,23 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII=Bold 🦀 italic é color 東京
+End
]]>
diff --git a/corpus/formatted-insertion/native-cell/reverse/edit-update.xml b/corpus/formatted-insertion/native-cell/reverse/edit-update.xml new file mode 100644 index 0000000000000000000000000000000000000000..b5f3873d5efba57cbc999f303235e28d0b334c3b --- /dev/null +++ b/corpus/formatted-insertion/native-cell/reverse/edit-update.xml @@ -0,0 +1,16 @@ +<span style='font-weight:bold; +text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Native Bold</span><span +style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span +style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span +style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span +style='font-style:italic;text-decoration:line-through;font-family:Calibri; +font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri; +font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super; +font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span +style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span +style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; +mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri; +font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub; +font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span +style='font-family:Calibri;font-size:11.0pt' lang=en-US><br> +End</span> \ No newline at end of file diff --git a/corpus/formatted-insertion/native-cell/reverse/notebook/synthetic.one b/corpus/formatted-insertion/native-cell/reverse/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..ed7adc9bbe97e090f46a41f4e4986c81b7e53114 GIT binary patch literal 32304 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 + diff --git a/corpus/formatted-insertion/native-cell/reverse/read/page-000.xml b/corpus/formatted-insertion/native-cell/reverse/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..a0471c21595e14c8a16ae9168f270e67166fa91c --- /dev/null +++ b/corpus/formatted-insertion/native-cell/reverse/read/page-000.xml @@ -0,0 +1,23 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII=Native Bold 🦀 italic é color 東京
+End
]]>
diff --git a/corpus/formatted-insertion/native-cell/reverse/read/payloads.json b/corpus/formatted-insertion/native-cell/reverse/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..a32deb8d0773237cbef61e65e6ca206ab9c8cb6f --- /dev/null +++ b/corpus/formatted-insertion/native-cell/reverse/read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{171BB2E8-2F2E-44E4-A1DA-8D153C23106A}{11}{B0}", + "kind": "InsertedFile", + "page": "{9E54B6AE-F7EC-4767-A743-4F4CBF0F96FF}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/formatted-insertion/native-cell/reverse/reverse-verification.json b/corpus/formatted-insertion/native-cell/reverse/reverse-verification.json new file mode 100644 index 0000000000000000000000000000000000000000..bfac04a17d784c5af8031c413dfb20b497019831 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/reverse/reverse-verification.json @@ -0,0 +1,5 @@ +{ + "paragraphs": 5, + "characters": 112, + "exact_native_character_styles_after_control": true +} diff --git a/corpus/formatted-insertion/native-cell/reverse/run.json b/corpus/formatted-insertion/native-cell/reverse/run.json new file mode 100644 index 0000000000000000000000000000000000000000..3036799f2a1d714490c95f0bc60ca5ed81c09be6 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/reverse/run.json @@ -0,0 +1,19 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-cell", + "expected_pages": 1, + "author": "evidence/m10/formatted-reverse-auto-size.ps1", + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "c5ebc74731fd4813803623b014ce9d6dbd6d2564918189865731807e6c458f9a", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "df4244a18ab3e9c21083b8df61b08b863e8cce0ec4bf0c9cd742a8ee6f79877d" + } +} diff --git a/corpus/formatted-insertion/native-cell/reverse/source.json b/corpus/formatted-insertion/native-cell/reverse/source.json new file mode 100644 index 0000000000000000000000000000000000000000..9adbf16c785dee7d9e5fab579f7d7a7b97ba9f9a --- /dev/null +++ b/corpus/formatted-insertion/native-cell/reverse/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 27800, + "sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351", + "mtime_ns": 1788842844345306887 + } +] diff --git a/corpus/formatted-insertion/native-cell/reverse/teardown.json b/corpus/formatted-insertion/native-cell/reverse/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/reverse/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/formatted-insertion/native-cell/ui/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/formatted-insertion/native-cell/ui/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 120000 index 0000000000000000000000000000000000000000..643deb5931b7cff2017653974a315859cebaff6a --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +../../../../append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment \ No newline at end of file diff --git a/corpus/formatted-insertion/native-cell/ui/before-read/environment.json b/corpus/formatted-insertion/native-cell/ui/before-read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..d8ebe73f1d9519e534f42aad1326b1ef551cb38a --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/before-read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-1DC21C3F", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/formatted-insertion/native-cell/ui/before-read/hierarchy.xml b/corpus/formatted-insertion/native-cell/ui/before-read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6e1e0e211ba17dea4e64ab4dc59d03f02abf9728 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/before-read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/formatted-insertion/native-cell/ui/before-read/page-000.xml b/corpus/formatted-insertion/native-cell/ui/before-read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..2d0fb5a433b8cf70523be39d89cb71c799a16dc1 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/before-read/page-000.xml @@ -0,0 +1,21 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII=Bold 🦀 italic é color 東京
+End
]]>
diff --git a/corpus/formatted-insertion/native-cell/ui/before-read/payloads.json b/corpus/formatted-insertion/native-cell/ui/before-read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..7a7c79073c927aa687b6610b1725e9cb407a3dde --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/before-read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{DB6763F6-1002-4C0E-A310-04011D46220A}{11}{B0}", + "kind": "InsertedFile", + "page": "{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/formatted-insertion/native-cell/ui/edit.ahk b/corpus/formatted-insertion/native-cell/ui/edit.ahk new file mode 100644 index 0000000000000000000000000000000000000000..dea6451fe8769ca35fee08c4e69c255f33bf19f4 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/edit.ahk @@ -0,0 +1,10 @@ +#Requires AutoHotkey v2.0 +OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1))) +hwnd := WinExist("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE") +if !hwnd + throw Error("OneNote window is missing") +WinActivate(hwnd) +if !WinWaitActive(hwnd,, 5) + throw Error("OneNote window is not active") +Send "{Left}" +SendText "UI " diff --git a/corpus/formatted-insertion/native-cell/ui/edit.json b/corpus/formatted-insertion/native-cell/ui/edit.json new file mode 100644 index 0000000000000000000000000000000000000000..fb01ed19f95f03323b71f2a6163d84cfd209c255 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/edit.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 1280, + "h": 720, + "error": null, + "win": { + "title": "Fictitious: caf\u00e9, \u6771\u4eac, \u0645\u0631\u062d\u0628\u0627 - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/formatted-insertion/native-cell/ui/edit.png b/corpus/formatted-insertion/native-cell/ui/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..af5911ca6cc6f2daf620c8d7e87d31ee0b8d3e12 GIT binary patch literal 46121 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 (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("{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}", "{5F18EBB1-FBEF-079C-2689-78693371A9D4}{1}{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") diff --git a/corpus/formatted-insertion/native-cell/ui/navigate.json b/corpus/formatted-insertion/native-cell/ui/navigate.json new file mode 100644 index 0000000000000000000000000000000000000000..fb01ed19f95f03323b71f2a6163d84cfd209c255 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/navigate.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 1280, + "h": 720, + "error": null, + "win": { + "title": "Fictitious: caf\u00e9, \u6771\u4eac, \u0645\u0631\u062d\u0628\u0627 - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/formatted-insertion/native-cell/ui/notebook/synthetic.one b/corpus/formatted-insertion/native-cell/ui/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..924b0e72abe4aaf362cdc259abc627fcfd021c0a GIT binary patch literal 32744 zcmeHQ2V4}#_uu1=J2<*xK><%Z6%`FCAU325s32DC1q49}q5_KbR7C707VKy=DjGyZ ze|C)(V{fsb#zbOoMC|SVzPq>FaW0@y^GkkzhR@vY)Hm~H_Py_$*&TA)b{jtB;;Ml3 z4ef@WsxkNM?=!_$y|&2$le33R${TNeozZd4t}ZaIIP)F&*sZN#9)j;bWVK};?9ykPVkH)XY z&1f*!_2%^@Uh8c#nyibT*075@X>Zq%cSD~n@S8OM#4j+Fvdk>AhQ@!G zqa>z;1OI*w9LRhAbi=TYE6mkhF^FR3s6@&^$J_XwIlR90_HK&kdk^M`MU*V*rBVsS zqe!NnGS97iAFIIK#!VY1zb|)wvNej#ux9318t{+vzn@zrJt*P8zn24?#^iKn%kA~Y z?k}@%GXLD;Y4vl;YDpHR6zacs||U+Kg)JD_!IGHR~C4amp$FR9eL<_PosYc*%u2$X}|u1ubv3lpT_rx9;Y-i|!(L1(h>q>)wViuR)n zu2so{UN!O<|LWuskFvPdP+x%$5w1lZMk%{EJ=vKTVn z^m(we-_B~Ivy5xiHN?CSa$I}{L8mh!rSJW>{rZG=2;7u%DCv(0`qPn^*oT>--5|D- zSzDbfx=;&(t!lVgJxXo4J*CCSDia(ZV@Bg?7E0r1m9@D_g%;*b?k786b-TpO|kU~GYwb{Al^e*p7$L|CO zHJJP=Llw|HugO)eI@F^QGh=NS%gIiR?v&urLAb&(<|5i2Orgp4%4o-&FGFMtng;0o)AgEu)1KG2oYH#DYztq#1U-gOV*D`&xmsM@YebBz@uS~{s)t(U zEbloQrTLNOYeZgtyrE0sFy3uf?@1Yx>LaRgwR-8ju|X*)t3BQa-(@tn8X6Qh>6@PI zj_2;q!#qG9T?+*9XpzJy@9?8?Su)9xKP?-?y_tr1=(@t@P5K?x(JHs>{O1|9p8P}Y za*t3qrioNfj$6n4dGl6eh_NuBc_U^g(le1vPBmj9i9UTI35_?;AIKjNhr}?~Qwp&t zQAlFEeh@yJfAV+Cuiaz$;9w)G_yslAZHlbG@=QP)AfBTnk|-;T$f$1O+2*NNyj49nJ-72Mw;K}D z%p;Q}CtG!a7D6GRG-x8E^RjbD+GV>|9`8g|x{n-L=3ZA;3{vt3j%%SdKJ$Yi0!K+a zUZ9W)QRGM$^17PW#2Wnz8w3veSE#$%`d7DiJl+~Ub-R4Vu~$CR*JfDlepTTvdJMh! zR!@vhHqY0aZ}ddyag%=m-lArz%$Z??bFNr3$M2i>#gj-=#^?bd`m7w_F61d}{*2tPrHswKc|NKtF}IHRcl1ME%%8?$ zIqeDR;{$TDvs&u1zg`^7F*?q6DOcWX?#6gBe*Q~kZx0Urx-K-PtPyE4s zEaD5RpW}o=UwLTuuRFF~YHiZUXU?D<^DD7HO^_2mdE6M!%ffDk4;`xLm0v3T%KF16jCkdM`VsW zp0L-XjtdX|dd|eMQNqr2LuE~*2{i`s9N}1*a((AfmCkNR)3=PU8G&C-h5mxoV_d)f)bh1#K^>1v=1?w-B>dwCaQN0+`C zk6VQO%F-OFMU%_TFvD#YG%%rnlqc8Tt-;FZ(Z}^__NaAaNSnx7$SBkVt^&;G?S@K+ zs&D2uv%A44Eqgr;8hQT>5)*~U9jkdU9bGiw$(_I4^h~aehmq;+hB;fxZY_9>BLg!fplOPHVi4BWj+F3)+|Wp_A_Yw( zUeBW0`JQgRj(v?)$L35V6UxNWFZ=)|jiD9Cc-V~0e`&cH78A`v%4U7I`Y;oSs z#5y?~HF-<&Wytew#%d9?8#!Pna_)2`Pc;R3ESPV_ z_6Y5wM^pu|2M@6zW$7f?Fp8n%4T%?^1003A+4?CLi^x?_3(yZTwv2-lqj+b{n5Q^V z`)nDd8?`4<-6lf`?2qP=p|O#%kptoeD`KL0M@B1R!-mGzL3O-G&Ho#YmlxO{f!o)O znJUwlPK&Ftc4(6}H>B?ajhNiqcMxr&Zz^lP(zV9oOz&(@S#;)**QXI(QD5KSQR@A$ zDcx_o%0@Sca4Nk9(SxM&idUc6?HqhTw&&T#N6tsC~M{xDknnK5t@H zsm6C!&g*`|<8m-z^b97wn6A7Z9n3y?R&OFoV-gq~^ zn@?_+dy`lj(R!w4w~jkkd3-1^XV0yDRTn6kTZpzWH4_aqy0+hVz&G*LpEWevQ7aeG z3RAP)O{{hf-kCk!Vcw(J!;B?W5Ix6KIwq^?o=B7Ds~q)uHppByy+6mtlHU>z{L?s4 zm_9UM%GxppX-)^hc}MaxN;9D}L%JG}M>R1VTL{t-EGDcIMQA648AQL_E-{y^{(VnZl^z58 z8+JI#!-_6wTO%(o$M~fa;2t4UMH~0%+FHC_>o@nDI7;8Ztlklc^0t5UNFLu*TsQu{ z_0S=K$*w-ev7zOAK^q)MWF;Wfk_ayg=;_KrWFW~29Tb2JB3&7Z3?y-(ptuaWvKJ64 zRAL0JXG(fc#O_dZlgOZMP1pz>c&w-ij*ugE@wir-KU9vzWkC{SKoaBpN}VLuytU0y zsVXtkSnOX9sIiSL`6=N*2?xFe2ZZE2p80%FH($rDbtNi7c5Nd@LAGvhCY-rLZw4ut zfqmBn;_4%2ZBXc`ZBlfc`(!&i(twi5T*)uzNp;Bba~aCls>$qwL>ZgoR?%c6;GA z@Xd@6_bt7SVmE=c%|S=o4lYIOkcHd9s9$3T(>sc+9bB5qSdz!J40(eBHnAOHxKg$S z?PAnpDES=z08`+-2lN#7HBcNL6!`yPr!ry)BPXk|buzFua59gtftR&0cBQ}sMntUH z2zGg}fEeId<5Y6(`dF;4U7v1U`I!ALv;$?6Oo?U=49?L9vu!-{cbT7KSG^7p zdZxt#Olb~1>nY2)xW54V$@Sr!Q5 zZ14y38-<%nwXixO9Hk}&fp=-CO+nzTC$%U6-fHfaTuM0bkK}+5&L$y2a++`eJ^WvO zt$!ftVxmCqORV*Oj!viUeInjL+aVEIyz`sq6}r_~^B-h=%l+(&-M~BUYtw4FQw|RA z&=vcE*hMNF@1TB`28b{i2W%u_)uiZkf0Qwl;5!WMb^if_u>%kt)<-cQE;cGMI_xvo z|9QO$I&jdNLi^0xdQ*2DieI1V-l9*3hFd!5+mB9K*UD#-6R$UQ^(?P9rBS{CtsD9J zrB)wm@AY^irY5^?MXOF=PvNUhAu?m|T(j!bRi>lK0%baytgg()n0SvDHVS=nR_M7Q zGAeeASv-22)(%gQZ)VLXUemhY8}h(S<82s&m$cWz@7Z7<=Om>8xAvy%AR5cHX=zR1 zpHVN-(^FFx|0*hT+G5HuW^e0#^X?&TZEw{JyI*}gH^=RbKhZA@x)(EsoOw9?P!N=3qP9`OoK7_N$-jvq?30VE<0>`fgc4@p!`W^nSY3+-0}VrO~U_j^5)?YGC+5 zHy#m!1Mr3t1^pK16vbtrbWnu-j#>*kZF>c5F8uk$*uirzs8daZTR+8~V#`tqR=)f$ zBwyB%Oi81e!O532cgoDl7d#Mn{~L1q%gb!Ei?~4Uzb&)ThFfKC>{J>2&{J z?ou@4?-S^q?%8Xs-Ky6E6U>ZS>?l2PR!7hNN?!g|LMC#vY4ePh*zK)CpLGh1Xt}k! z%b6>K%WhZ7f+4C+5lzTa z4JRwL5B<6^!)Y1Ph5qW(*Fg=LdWhu?<3QBS)(--#9cM!MP2pKyETs3nwCw}f1-f>?BC-V*ljrRO)JGO& zGkBojk3+srL_eI=itbyQwP`0Smi~HEN(3#BhLLK(Tbi-#+nO9#gwXI`t#1^y!;5Le zbfdRKqlsE=q7+7Ni^h`gMhnGQoW)%|Qd#v#jX9Fab0oD^oBi!Z?Ho*hVe0&UrAHVF zb~rx3kLLg^besTwR8SU$0S*EfJZxAVT||T1`g$_yC#>(#7*7M3?Bx5PW9tE>JS;~W z9kr`A%lTplkL9QJvc(e;04g@jKq9T&miCSj_j|yh%BBYbtgUOM^8Mho9cF}CwQ4tE z^5mA=*NsgL^lq_QeC}>uUak9&_E`LIcFktLjMgbHN4S|SxA$C=XIWwDA(>MR#hL6y zy>8wqlTxj6aB#D%+}ytP-X{bY?>ESc>)!WOY?Q0@tRsCqU%lOZDavJfOzzn^*jx(5Ac$hOXTs3?$(*t z@|2Uwpl#MYeEe_6@9@n!;CpUVR;ZnmQN*e7MknjK_chEL*0j@)9m`MoA*_ynsXm)J zpScrz`QqE8tTG0U z`IBRI^tpa%nsM?_(~HI_iyShnHoOyC{oZU>1CKa+ai`SZ8$J$pyuM;qY1#cX4K7{m zb7-Qd?rG!4kFx!%j<$ZW>Cn=CDWZveQl&|~=e29SWrM|(QPtybm##f&eqxwt_|CHpu+H%#t`RFTer_JqYo*7s5{{Ba{{jv-$ zUz_7Fa9P8#ThiZ15BcX!nDxGGbDE}w+B3R#R4ruIagTQF(OOdK9UI#_G~(N^=vYPg zfI*7r-m#JKVT#ZJgJR+a*I^2?mny64ggqei(!RDmAcXtz)C%E#Jhnpi1BqE?W24{) z*>jtkHD2E0huJSpCc>_ORxHd;D0O;q_@%UrR#Ucj-)lT8=^AK$Nju?jAXNxQjnK6R zz#q_K?Ez}MOJVka6N~*FNhH=Kj1TPZNH#)U!uYTZoawGP-MP}$i>!j$R1s_dSNe6O z6fer{Nj5^me0zWs_8<$@RHzwJpNxs-w4LWdBw&oxCgRRS)Pp5kpDJ}!lXX(ZA+HzZ zXh8Wv-ih+m%O}g3A+Q}P8rFj%b!Ke`L|7Wij3`25T^JY|<12QJ{qf4c6xc}~-O)ss(^UTQHbE?5N1{gVpRj&MvQA}0{rotb zjs9ksGG)0G@0s7$H;vgGyhZ6efzA{>2- z{Pu!|_V*_<={*ddCd-R&qXl_UaKEWcetkmUnV>$lPPUb3-^cAYp^Tvfy>1m29;*lq zi()^N(&;Y+RaW`*i|vo#dN=r@J)SoC^?mvN;8|=N**BuF4)N=oc4!ni;2EK>0{>1t z^Sf8_{+7>oNt9`;pX^L~b`m%TPkLcE=Wh10%rVb@^qjJ?lEb^x6Lw?Bpm=|l%fVXB zHral;3}dI!#M|YDn7B$-S2KI*8*9s2V3Hf11 z=e;Q@4cRPq{Hl0x^qOZ|5oj-4|r?i8aO!D5YNafD+LK*Hw0J=%YQOL|KE`&gbnZ7OldM&rTdd@Qq!$>K{pzj( zr%QqUELodYKRSJn z(>%$Fvx`So@+_i1e;=;w_TbdN7FVL};PBVLm8e^TtB8u~<8dY5E?~mX!Ih{7b!g^i zRW=0N!lc;>k{XPm zPIT=_H{=xLHHd@)>SvGc3Y`7V;~?UP3K&O3YsH-HA%uPT@hKe3^Kzvc2$93M)%U$4 zKN{xMVs?7e)bUyGPW)5H4RRYxvf z6evQjQL0K-Ku+`DZx%1FsVt;5E3tXL;v8T&@Kw6;hS9I~4n8}^#`SFzKDVkaUz1Zu zSZAvYEjq@_YefiG2l|0B`TEEH$1P2IE;#({ije&?g4{1h7t^nT`iH(V zO~&`8(4WHk2UPif*dss={b-vK+cWd|eV@#c71OKd)n*TF(bl6gk9HYs*WceWb+Ogd zmnuJcFP+n)FVy|OQ&ONGX%&2%jGwi;@l{h)7zlj%F)kL*WHt$x^#h;vWMeeRuRZ#`nk!a3{-YTDy*y6Y*f6Qz_J8r+62`%eYVssLN71W53dZfC z>Z*c90lT&M(ma&n!WfYl-y?O3?f#AL!y=yqtZqMQLq_R(SE#!M@VV|dLH;9;?sJNG zV$lb99`VF7M)!F@JbIujw-AqB>EdX_WAI+ys?h1Vw7UYcp1eD$#LkT zt>KhN?i6{nk6W;yn5nLVobC9op;)9zWZPX)WONT2~yY{TRxT=VL@Z*i|+R%5~EJjr}XqCTb zrvojQg3Jg1in+9Pyq7UJp9u^G&a+iFW}28D&Jxx^SIS^Mc>3(`-*))(_peyiH@ zL3ttTskri;)Mzb+nk0m73oC!3LS!w_H}B202(Ob1p{&Bn^X-oa;mV`^LTIA6@{VfF zh4MmLytwi&w8{%<&*IAOh1ej+@?St}6<7Xx7+3xxU4*21Vda;dahm}CC->#b+Y|qV zq)lPvdH&y4KM82R(9={@d22#J+-~oSIIa~82^}8KQ-j>G=Sa?-?n&}OszQ$rv0=(X zf8yNB#!pWL^QVa;7mK4<87N|a|G79e;UjolbZvFJb|d%_5q$m(K|?g=Bsp39*vIrwoQ(yG$z_oO((1?RM|vX`#fXTbn} zma%1wc^d)eyFg~+d>GyDSJ4~ROejmrlkUyQ>z?mIQ9NDt?3g0x8hkR{iX2_tH8YlG zLAop+Eu_DnPWRLM%i1S8eEvJ=8o)04%XIl=yHD>g=5pEC=p@&-yB@=B;X3vh%0AH=wjC_!m^Nq-jt&QU zPE0b;-`790gnGoTYnc=9E_mjG?m2{4sZ9pNLqkbXd#Zn>zM}S=|4Mzf;GEW3i68mR zB3sZj*$cs-8)&jbfOeq5{=i__yDuBUQ(Tz4NB^+2bkOYYjxuGBA<#s`n#yfxWYh-Liv%hNr-iS0 z{=ohK_Q1K$;-SW^?I#=So4*oAZ7@7>8}x+E%ST_hLywo6D22dLVsZb8Bt0%``0|y$ zvg#3ay8IIV$QzV|tRD@fg{DfO;Y$=cUU_xcAE)$DC4`PhdxUi@QGSF!v}m~z*4+U^ zesD|IGUP}2Lra<);SVixl?oQKu7!<}PkgL(dNV{Y+}U{(-OwWfdibHSWf3uZ@CPG; zQI3W0{L{XL_=|!#?OSM+k*14Q`TRoTf;3&UintQ@Pvn3Qj_03$$VZGE{VRiV{6dCHTm~o75<0fwVI<#%G?I*G5{I$}nX$uZ?_TY6Bd= zi6#)C6H);=xFtZ{vr>_PPF4l-;8t05&saqUI*}EMfXkqJHY+mFNv^2x@XT8YiUu*5?8{3ufzeN=O52}zNeed zIoI!>fRlN7=BVZ&@Sf1W`O-!MU+P@H8Y3#VZq{u<%WBE9RXh<9ka}I&h^`4 K_Fp^K@BaV_f&sh$ literal 0 HcmV?d00001 diff --git a/corpus/formatted-insertion/native-cell/ui/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/formatted-insertion/native-cell/ui/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 120000 index 0000000000000000000000000000000000000000..643deb5931b7cff2017653974a315859cebaff6a --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +../../../../append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment \ No newline at end of file diff --git a/corpus/formatted-insertion/native-cell/ui/read/environment.json b/corpus/formatted-insertion/native-cell/ui/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..01b16b980543732e06a632f9c2827d148608584e --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-1DC21C3F", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/formatted-insertion/native-cell/ui/read/hierarchy.xml b/corpus/formatted-insertion/native-cell/ui/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..ed1afb9654c771d5286a0ca841451a26ef363857 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/formatted-insertion/native-cell/ui/read/page-000.xml b/corpus/formatted-insertion/native-cell/ui/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..e87283eb4d1986bb756b9fa5ec66eb7aefe9a07d --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/read/page-000.xml @@ -0,0 +1,21 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII=UI Bold 🦀 italic é color 東京
+End
]]>
diff --git a/corpus/formatted-insertion/native-cell/ui/read/payloads.json b/corpus/formatted-insertion/native-cell/ui/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..7a7c79073c927aa687b6610b1725e9cb407a3dde --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{DB6763F6-1002-4C0E-A310-04011D46220A}{11}{B0}", + "kind": "InsertedFile", + "page": "{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/formatted-insertion/native-cell/ui/run.json b/corpus/formatted-insertion/native-cell/ui/run.json new file mode 100644 index 0000000000000000000000000000000000000000..d9c130e3a1e9e524610cb879fb0c17ce2c242bd6 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/formatted-insertion/native-cell/candidate", + "expected_pages": 1, + "author": null, + "author_timeout_seconds": 600, + "inspect": true, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "df4244a18ab3e9c21083b8df61b08b863e8cce0ec4bf0c9cd742a8ee6f79877d" + } +} diff --git a/corpus/formatted-insertion/native-cell/ui/source.json b/corpus/formatted-insertion/native-cell/ui/source.json new file mode 100644 index 0000000000000000000000000000000000000000..31fdab6427665482f7ae934711db6ed6c634b24a --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 27800, + "sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351", + "mtime_ns": 1788844254905915500 + } +] diff --git a/corpus/formatted-insertion/native-cell/ui/teardown.json b/corpus/formatted-insertion/native-cell/ui/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/formatted-insertion/native-cell/ui/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/formatted-insertion/native-paragraph/candidate/synthetic.one b/corpus/formatted-insertion/native-paragraph/candidate/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..a694c2bd2cf955a627dd4c1b2fb02b5b3480904d GIT binary patch literal 18672 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 literal 0 HcmV?d00001 diff --git a/corpus/formatted-insertion/native-paragraph/cold/notebook/synthetic.one b/corpus/formatted-insertion/native-paragraph/cold/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..31b88c12bd4e274c0343a60bd46c1f873e3708d6 GIT binary patch literal 19160 zcmeHO30zgx*57yLG6{kMa*-=u6EqDIl@JgR6h#mv^vfJ^NQ;N45b%^ZB`S$H^f_Q( z&Y(HwKxEFD10^O}IiqCtUI6+T?Tl46m-Uta`4n*~;M@CzTG80=c0)u<0n5s6Dm;U9%oE`8Hbz5(`))V3EL|MFPT(DeRdMJ37Ae zd87T=;=0Fb4Y{${1#vl{BO%g&>IDH#h$FqBF%9YGFO2AfxQ5V)5L-3Ur(O*nfOH!| zXF^*-r2o2ikwYWnJK9kg-+eoIBqJU5H#VlB{HTb7{)pQX!j3@wO$kvi@>Bd0cvri#Trpo9B=HU0E~D45BKK2y*y0jb-uOJzNF|}(3+0- z!QVIca7m4hn)$-8n4`D$lw%&CjJXGbbo5ARQ-1hnlOl~W<+gK|-4X8z5b1Nv1S3 zn^Njt61%KHlg63lh2GbWAXBm>=q9nHJ|TvsXKdr_y>6@w?fik$DG*7uUe(g~Dnq|J z-QRS1F;E`(ZNv`S$@esMYH8{wwqWMFISSY0m~F>1CVvegsn)An>Y_D#zTigV^f+I& zK6KEyo`<$}tF)UyO0wf^BB0brk*>p4tc*k`BZ2ENR*`goLl;J*N1pGnCF zd9Z#yY1?#wb)%D34Y%eNbw0l4pr99!TOE{q6xx<43|&i3#J{xbE4e;)amRvN2S0hF zzJLvu(aUkd8?M@r`SZTWRvzm!2)hu7r1G#6Az##;DeKO9^a=i5)^bRCdZTNv@@kN> z9|EC=ruJDloKXN}iS`1;I3y9!UMTL>;!a$(|BC1I*ng$iHQj&BxfAWJ$vHc$=NA7O zHfQ~2mp#8Wy9$o6Z~i7%fXN<}`{sSQ3>^Fa1?(-z&4K-$?3{BtmNlEO5814dgi(Zj z31x(G!li`E2$vJCAWU{+x}OQ((=n@r---uPMco8sK~!r{bk3S!#x@Z$N(XX*Kv<%a zSOOc*Qs@n%979O548l1IK@j8$b4zjk4S zA(qJ-c1<~SAvF%YFr6m{3IkeuuS`?>E?e?R^grJ#h24cRHO-&&ErpHT_Ad(KS|(ol zqSt_Ml*Rn%s<4K=US)UrDP%aq2qg&!27D)l3S#S0X^0sVj*ym3z09!M^bqocc=d@y&QRR&YNQd$N59I{VZCrXVI(x5{V+O%1E zA-|)2pf2tDyQ_oVL3&N~3zE>Q42S0bW9O%5`r7%0Ett4-v3nwjBqi}#@WpAOE*z}A z;ob7+FB+R0L)RtDIe7&{QmrFhXemc+IJ@QZ<4p#Y+BoM&rG4a>AHlb@+{BxPG6IyI zUD&W8avkX*bHE!KHdU!8W&w)?s!5Y#bZOlIRH> z&ys1k(6dAq&qh!@f!>qYXqHM(l!ixN7hhcTGjUE1fPR;9{Y>@ylltMJ-QaWodZMy} zXZW`1{hQwy&>=*|^f3i!)lT8BgQUgz5mw@_cadF_|OMq`0YlgF-hqjWxhIFpvq+_-ULRYe* zbcD`?jR?g)IYFa?AGNgNVZei zYkK7SdMzmk{Vqh4P>@n_9LcUKmDSDV*GJD9a@kjt(PgZU(^@1?R9m~Azw5DU(kac} zyIXH|@|iFV$y3ytqbrI%1IC@X_-S@oUSr44t|57<+FJWR>(dr4dwa}}ujPAk-Y=&M z{joeP60k_%=}4fa{m_avZqBUM`7kSI3cHdnl({im8O2qEYC^41N%Q^S?AajFol5eD zRfK9nTcWWheQ!g0wLRSjy+G(qsG&SN%F|M4MTlw=1!l-PXRJHfI`L%f#IcF=6uue| zvW?FN6moI~{~LZd=;1|I_pMP@)MMh&3G5yzSH;xsG557Zzczf~H;QxV7s;B6U;mveH%!GfW#%*wWjhRI^HgeR@%ZO zv8}AsN2wFNZK0J`$_7;)d;J+|d}l2Wiv%nZcp4Ir((_pJl}Io3(iquXn7Mq_kik8>gWFF#)$;-m+*U^L?W1f;1e6Nb)Ed* z-DC?T8vXW~ec*p>jteRregwA(yl;+nO#R@7bZlO;AB_5|{9yVDY;SNDrik5>64@_|i(?;gM@{A*ZoSSY|}7&se7HgcBHw$6fW4Le!1uVF8n z+Su+#DTb|3E)LJKdg|jv=%BZ}d#214$l4 zy^HTz0nocr2lb|Ux2|?J>~ETqY|SfY2ClyrZliS_HGXmA@nxd@y=Kddd%gVpT}xn*z@JhAQg$|V zlv6S2c=0@h&ONel{sEm@^O=XJSMgr}pkO%T+GYGOZ9;6Ds9hdEcIdNf>ul%~5BiSR zKzS(RmjA+;H&WgE&hI||a@3tAp`Mg?uz+P{y@XuGuxEotP;2zEu31n2Y47c6@qfPS zHvcnE(|^10QE*LsXsYocp7&tS;m>p)#ShMHfR*Pm?uZb8ucH+m%kN)}>zO%m)yblM z@=$ZW^o!bP`gEBSvGvT=o-f=LWlZCUXx{Z%s=mO72&s%}7bS}|H=Ir-e{Zq*=t<3pIdb8D}-sA7}*zneH*`N69@%})Qa^_+72i9H zd~ElxVLX~%Yaev#jHb9@Tztjk<%zzJ#YgSy#MZ-?{(lzQ7T14E6Mp=BBA@<@z=VP4ep^rg-Xw;z_#jxo<_xlAr&_e)E2R_zNqP6(xsk zI}xUi30$&X>~}PIIskmtR;}NghAvHW`k_y0#+t!FYhyp&@Q8lHKO#eoQD=D+{3Fx* zLEIPO-f(bP$v|M`2l1SY;f%Q{QT8XZcO)Cj^mJyCOgHdj>3)79rSm}FoSW+Rx~(_- zw*`RyyAbusrR%E>hHab}Git!BezxZF*&Db;>3CNj`p%NW?OS^2vLT=RB+^pdggQjM zAsqfv8k9aRP5}@em={i?>Bad}<8yBhxz^G3lH=}q!99(M+bmITFfXJcM&3I~GRH$ta@6 zw^CXqc!B`XBK~N!B7`f0zx(jx3p~*#gcxVsdI~oN;`)1zQUDmInOE#O&KNzQ$L>N^ z+hY|6<`KKq^rHDVVP8fWbA5?)%t`Zkk8~0lGuKN<2M6Z+JJP|G`MO6s2G4xILAr+0 zrS?A#WAl>JA>uq-Bg2@Wr*%Ig z6Xgaq2*5gi@zcPQy{Fvny(ivlLgo)Su1{NTkSEr$xjqo}_VQ4^E3}Ky`5-keT)0u> z5$jCk1LtLsK=UHTW%OL>=(=)t*y^vwG>J+-M##QZ zeMUwb7>;|B#`5t1yAShytlqSQ9sD_jZ9iaXi^t%YQ>%^}S|u J?SJha>)*kH`QQKm literal 0 HcmV?d00001 diff --git a/corpus/formatted-insertion/native-paragraph/cold/read/environment.json b/corpus/formatted-insertion/native-paragraph/cold/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..55c8c159d552592a4f276fa4192d060b0fb540f4 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/cold/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-3A29493B", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/formatted-insertion/native-paragraph/cold/read/hierarchy.xml b/corpus/formatted-insertion/native-paragraph/cold/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..7e8627c8f82f41a3adf20b024c34471fd76dfd90 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/cold/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/formatted-insertion/native-paragraph/cold/read/page-000.xml b/corpus/formatted-insertion/native-paragraph/cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..f9eb17b59d5e3c2f72ce8616cc84e85b8d65479d --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/cold/read/page-000.xml @@ -0,0 +1,20 @@ + +Bold 🦀 italic é color 東京
+End
]]>
Fictitious: café, 東京, مرحبا]]>
diff --git a/corpus/formatted-insertion/native-paragraph/cold/read/payloads.json b/corpus/formatted-insertion/native-paragraph/cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/formatted-insertion/native-paragraph/cold/run.json b/corpus/formatted-insertion/native-paragraph/cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..90180cd6d148e07f8bdab094f2cf065a19ac7e98 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-paragraph", + "expected_pages": 1, + "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": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/formatted-insertion/native-paragraph/cold/source.json b/corpus/formatted-insertion/native-paragraph/cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..121a3ad6c342abe6014035e54a75ab17a9064003 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/cold/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 18672, + "sha256": "202823512283be980b6a139adcf5f4f369d15f17d60ed7b23f9f2289513aa4e9", + "mtime_ns": 1788842844336692559 + } +] diff --git a/corpus/formatted-insertion/native-paragraph/cold/teardown.json b/corpus/formatted-insertion/native-paragraph/cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/formatted-insertion/native-paragraph/reverse/control-before.xml b/corpus/formatted-insertion/native-paragraph/reverse/control-before.xml new file mode 100644 index 0000000000000000000000000000000000000000..0472ef125290b184b05b9523541c744b14250d04 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/reverse/control-before.xml @@ -0,0 +1,20 @@ + +Bold 🦀 italic é color 東京
+End
]]>
Fictitious: café, 東京, مرحبا]]>
diff --git a/corpus/formatted-insertion/native-paragraph/reverse/control-update.xml b/corpus/formatted-insertion/native-paragraph/reverse/control-update.xml new file mode 100644 index 0000000000000000000000000000000000000000..06fe75fb88aaf963f88327b7da7eb2150f0dbb90 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/reverse/control-update.xml @@ -0,0 +1,19 @@ +Bold 🦀 italic é color 東京
+End
]]>
Fictitious: café, 東京, مرحبا]]>
\ No newline at end of file diff --git a/corpus/formatted-insertion/native-paragraph/reverse/edit-before.xml b/corpus/formatted-insertion/native-paragraph/reverse/edit-before.xml new file mode 100644 index 0000000000000000000000000000000000000000..55f4900f49e01ab52f424c48579719299ae56b60 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/reverse/edit-before.xml @@ -0,0 +1,22 @@ + +Bold 🦀 italic é color 東京
+End
]]>
Fictitious: café, 東京, مرحبا]]>
diff --git a/corpus/formatted-insertion/native-paragraph/reverse/edit-update.xml b/corpus/formatted-insertion/native-paragraph/reverse/edit-update.xml new file mode 100644 index 0000000000000000000000000000000000000000..e35989ca0611eeb338fa00bd9c220bed23ceacf7 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/reverse/edit-update.xml @@ -0,0 +1,21 @@ +<span style='font-weight:bold; +text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Native Bold</span><span +style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span +style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span +style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span +style='font-style:italic;text-decoration:line-through;font-family:Calibri; +font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri; +font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super; +font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span +style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span +style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; +mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri; +font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub; +font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span +style='font-family:Calibri;font-size:11.0pt' lang=en-US><br> +End</span>Fictitious: café, 東京, مرحبا]]> \ No newline at end of file diff --git a/corpus/formatted-insertion/native-paragraph/reverse/notebook/synthetic.one b/corpus/formatted-insertion/native-paragraph/reverse/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..7add17ab4529e68d9371074e788420b883ce65a0 GIT binary patch literal 23176 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 + diff --git a/corpus/formatted-insertion/native-paragraph/reverse/read/page-000.xml b/corpus/formatted-insertion/native-paragraph/reverse/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..51769896f4e5a27849bc0ebfbcbf06ce46982c90 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/reverse/read/page-000.xml @@ -0,0 +1,22 @@ + +Native Bold 🦀 italic é color 東京
+End
]]>
Fictitious: café, 東京, مرحبا]]>
diff --git a/corpus/formatted-insertion/native-paragraph/reverse/read/payloads.json b/corpus/formatted-insertion/native-paragraph/reverse/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/reverse/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/formatted-insertion/native-paragraph/reverse/reverse-verification.json b/corpus/formatted-insertion/native-paragraph/reverse/reverse-verification.json new file mode 100644 index 0000000000000000000000000000000000000000..cb4c314d1a5da15e703f55d906b917c03eeefd20 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/reverse/reverse-verification.json @@ -0,0 +1,5 @@ +{ + "paragraphs": 2, + "characters": 63, + "exact_native_character_styles_after_control": true +} diff --git a/corpus/formatted-insertion/native-paragraph/reverse/run.json b/corpus/formatted-insertion/native-paragraph/reverse/run.json new file mode 100644 index 0000000000000000000000000000000000000000..8f8ea51728dcb5e8c8c3e8bd93f04c1efd279ae7 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/reverse/run.json @@ -0,0 +1,19 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-paragraph", + "expected_pages": 1, + "author": "evidence/m10/formatted-reverse-controlled.ps1", + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "4362d0ba551eb00b2eca1c5563d76352469f85d3981155bf2682c159a03ddedb", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/formatted-insertion/native-paragraph/reverse/source.json b/corpus/formatted-insertion/native-paragraph/reverse/source.json new file mode 100644 index 0000000000000000000000000000000000000000..121a3ad6c342abe6014035e54a75ab17a9064003 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/reverse/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 18672, + "sha256": "202823512283be980b6a139adcf5f4f369d15f17d60ed7b23f9f2289513aa4e9", + "mtime_ns": 1788842844336692559 + } +] diff --git a/corpus/formatted-insertion/native-paragraph/reverse/teardown.json b/corpus/formatted-insertion/native-paragraph/reverse/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/formatted-insertion/native-paragraph/reverse/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/formatted-insertion/outline/candidate/synthetic.one b/corpus/formatted-insertion/outline/candidate/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..0ae354b150488aa376c134c5ead70e300a9d2d1f GIT binary patch literal 7776 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 SPU9XJ_rU+z1G+UURQV5zf?$UL literal 0 HcmV?d00001 diff --git a/corpus/formatted-insertion/outline/cold/notebook/synthetic.one b/corpus/formatted-insertion/outline/cold/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..8e2d6497c5eaba4154ad0d7fd37026dea435fca4 GIT binary patch literal 9256 zcmeHM4Nz6r5kAPjfbx&Z10RSLQ=?cVC2HaWBxv}JC}>3s2nmWIsAxn?yhV#tF+r_@ zq9#UAR76xnGy##A3D%I{7#07bwUTHFgH@^6B+~uv&*O351#C0vOlR1c!@2C9-MhPI zch8>t?o5qN&u-WoQgS$AS^e-W7m`>DH)40$t0yuqMvgbXF^9=u;*D+A&Kp{%6xKU! zXs#`3c#i10Lt5TWfM-JqAV&UGDULJ6GoMRK=`8R<;1vnu}3J zkDLL6FZAsv8i4AC8R=UJCk*Fa8HnE>X{H%-$5cZuwO#{1YfVe`^J@4gs@mJ?sv-&?7`{A&O zF7IIR3~{j+(Xp)|SPXw%`)5$q%+|8zS%*)5v@^l?T@)y#{F3|+zW`95?oeL+i!QqrNDyXU6pz7rp%Muk?{SXbD7I7`|rX>=I z_~4V?YlbzxaB}2-Yd8D>ZR&P4SG%p+r74De6~>HSq&!K8h8 z^W7IGf14}qYaWUo!DJfX(bfgegXI%`zwPrk3*tV_3D;ar?!m6kb%Amyi*o51^T-tn z5Mck-=hrw#?fiA<(VcZAyLKE}D7T|>O219tWas#nMm9dV{`Qa6k{v1HB}6ZemPWmF zZrq%_^6A$HR-P(u*xQXA^e*b}enub5G$etBP9KXH!ZCm$^s(q$(Z`~nm3mq9r+hC9 za{-i#=tEKYr&32hm-=uu^_aRHc}M&Y=2-;)nMV((T@^dt|5(D-*-KY{87TK(SMltF zBqP9?4W3R7UzSLObKxLu!-tclS|oZB0aj{zI{V9x*Z(lPX^iuCHkBKE1M7ItE1mCD z$~oMrovE8bZQy5m4?mMgex~~rKU4p~&s2Mi`FnwGpKt3b++kiOJ^bkAvVg^t-(GIu zZm7wNsbZHtmv9Npz)($o#Twjj)NJ7!#i3R#fNoFmyotCMc!@UQGKXS^b`SLl$&Y}8 z=}t7TPdE*P3M}QPnlJ#wbxxC6$l#B{{XdD?`u*uE?NiCzPUp6KUr>Lr=Bs@-8@_F7 z3OX?-;Leh|+)Sx1-E%)a!gTK0pzP}rx6hYG%m5x+BR~Iv$F9iFAK+n?{Cou-EuK8j zfHx(4p{$Mo53k726RA#?ikF{yT7z8BUI)6#Ls};5GpJ5xnLKm9XzufdaHT`Q3+R62n@4uvXme{N#8^NQk=OuG?rrF&N zzO!;~v}WJ*W5wO*Eyb^N8^PUZkKbP3ruOz%vfn&DGReDQ0%R-Qmw;ysccWUdNSLMH6z#A~;P zLPDwfb;U2)-zH`t^jFH_p7=|}OaQ-9Hg(4@d;=s##rr6#J!&NGF_=;LF{ApUMxq}@ zO+!(EuKKj~Ncb8syM{)M=-O(2T1zHWFVafe+63dm~M~(CdL- z5B!fjpxd+JmB>Twpa&y{-+-jwn*7EJ-}0?#Rgb?3aV8Ak_`!?s`_i|5eCJ2`)xY&Z zs{HFebnz62^s5v7tL-aLM*w9p9M|rC)#>vmnN|bLQ(F7BPFe?EcWaJ*Z{j$tX&)84 zHuT;ZqtPoXQ;n~tH2{w_^6vt`qo337`#3I}Xj?x%^PW#+M998HE^CG@u?vQbf=O)s zMMFzG3SXju_`=ZKk_6$`CPRY?(uAnL0O; + diff --git a/corpus/formatted-insertion/outline/cold/read/page-000.xml b/corpus/formatted-insertion/outline/cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..fdd3713cb7d3b3ac8d8ea565918e21d020a0aa7a --- /dev/null +++ b/corpus/formatted-insertion/outline/cold/read/page-000.xml @@ -0,0 +1,15 @@ + +Bold 🦀 italic é color 東京
+End
]]>
diff --git a/corpus/formatted-insertion/outline/cold/read/payloads.json b/corpus/formatted-insertion/outline/cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/formatted-insertion/outline/cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/formatted-insertion/outline/cold/run.json b/corpus/formatted-insertion/outline/cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..bc688c6de22d1b61f2abcb62990dc7543ed5afdc --- /dev/null +++ b/corpus/formatted-insertion/outline/cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/outline", + "expected_pages": 1, + "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": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/formatted-insertion/outline/cold/source.json b/corpus/formatted-insertion/outline/cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..97b70503780f0a46280992b2ae4ef6fe155f6896 --- /dev/null +++ b/corpus/formatted-insertion/outline/cold/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 7776, + "sha256": "76f6b743caa9dc2b5ab342d6e6a742125ecbcd0ca2372062b42acbd08b5ebb4c", + "mtime_ns": 1788842844332249915 + } +] diff --git a/corpus/formatted-insertion/outline/cold/teardown.json b/corpus/formatted-insertion/outline/cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/formatted-insertion/outline/cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/formatted-insertion/outline/reverse/control-before.xml b/corpus/formatted-insertion/outline/reverse/control-before.xml new file mode 100644 index 0000000000000000000000000000000000000000..9665eaf19e88ee23167cd355a640c0dc319656bb --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/control-before.xml @@ -0,0 +1,15 @@ + +Bold 🦀 italic é color 東京
+End
]]>
diff --git a/corpus/formatted-insertion/outline/reverse/control-update.xml b/corpus/formatted-insertion/outline/reverse/control-update.xml new file mode 100644 index 0000000000000000000000000000000000000000..e004773441a3f300ddbb0f6841aedb5a870e3e0d --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/control-update.xml @@ -0,0 +1,14 @@ +Bold 🦀 italic é color 東京
+End
]]>
\ No newline at end of file diff --git a/corpus/formatted-insertion/outline/reverse/edit-before.xml b/corpus/formatted-insertion/outline/reverse/edit-before.xml new file mode 100644 index 0000000000000000000000000000000000000000..7962c00a827691815be37a776b035c3863d589dd --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/edit-before.xml @@ -0,0 +1,17 @@ + +Bold 🦀 italic é color 東京
+End
]]>
diff --git a/corpus/formatted-insertion/outline/reverse/edit-update.xml b/corpus/formatted-insertion/outline/reverse/edit-update.xml new file mode 100644 index 0000000000000000000000000000000000000000..60a96d8ad31eb5f904b19593565e2184ec8f9e92 --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/edit-update.xml @@ -0,0 +1,16 @@ +<span style='font-weight:bold; +text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Native Bold</span><span +style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span +style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span +style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span +style='font-style:italic;text-decoration:line-through;font-family:Calibri; +font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri; +font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super; +font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span +style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span +style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; +mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri; +font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub; +font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span +style='font-family:Calibri;font-size:11.0pt' lang=en-US><br> +End</span> \ No newline at end of file diff --git a/corpus/formatted-insertion/outline/reverse/notebook/synthetic.one b/corpus/formatted-insertion/outline/reverse/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..e5a75cf4cf8beb25339ea2c0a9f01d802bf37166 GIT binary patch literal 12616 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 literal 0 HcmV?d00001 diff --git a/corpus/formatted-insertion/outline/reverse/read/environment.json b/corpus/formatted-insertion/outline/reverse/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..943cae9509c3b41401e79b1e2623b234808dbf37 --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-129C20F7", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/formatted-insertion/outline/reverse/read/hierarchy.xml b/corpus/formatted-insertion/outline/reverse/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..306e4d27131ed097fcfe338c5dec32e9e8536064 --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/formatted-insertion/outline/reverse/read/page-000.xml b/corpus/formatted-insertion/outline/reverse/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..127576e2c2620bcf5d0c5f4827dfddf8b8b40710 --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/read/page-000.xml @@ -0,0 +1,17 @@ + +Native Bold 🦀 italic é color 東京
+End
]]>
diff --git a/corpus/formatted-insertion/outline/reverse/read/payloads.json b/corpus/formatted-insertion/outline/reverse/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/formatted-insertion/outline/reverse/reverse-verification.json b/corpus/formatted-insertion/outline/reverse/reverse-verification.json new file mode 100644 index 0000000000000000000000000000000000000000..071812591fea6f0fadd5972162733ab1d5372e56 --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/reverse-verification.json @@ -0,0 +1,5 @@ +{ + "paragraphs": 2, + "characters": 44, + "exact_native_character_styles_after_control": true +} diff --git a/corpus/formatted-insertion/outline/reverse/run.json b/corpus/formatted-insertion/outline/reverse/run.json new file mode 100644 index 0000000000000000000000000000000000000000..5cf1f1fe27801601e6711caae16edd4f87bf725e --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/run.json @@ -0,0 +1,19 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/outline", + "expected_pages": 1, + "author": "evidence/m10/formatted-reverse-controlled.ps1", + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "4362d0ba551eb00b2eca1c5563d76352469f85d3981155bf2682c159a03ddedb", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/formatted-insertion/outline/reverse/source.json b/corpus/formatted-insertion/outline/reverse/source.json new file mode 100644 index 0000000000000000000000000000000000000000..97b70503780f0a46280992b2ae4ef6fe155f6896 --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 7776, + "sha256": "76f6b743caa9dc2b5ab342d6e6a742125ecbcd0ca2372062b42acbd08b5ebb4c", + "mtime_ns": 1788842844332249915 + } +] diff --git a/corpus/formatted-insertion/outline/reverse/teardown.json b/corpus/formatted-insertion/outline/reverse/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/formatted-insertion/outline/reverse/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/crates/onestore-offline/README.md b/crates/onestore-offline/README.md index e338af2d44764e80cdeb7ad5c72c062cb0648f76..bae1c8bdb444b6cdb1156697916e728d9da5077f 100644 --- a/crates/onestore-offline/README.md +++ b/crates/onestore-offline/README.md @@ -26,7 +26,8 @@ assert_eq!(pending.last().map(|edit| edit.id), local_id); ``` `insert` accepts the core library's `Insertion` value and durably retains its -object identities. Keep that value across retries; its `text_object()` identifies +intent identities. `Insertion::with_formatting` queues text and +its styles as one intent and one publication. Keep that value across retries; its `text_object()` identifies the new text for subsequent offline edits. Pending entries expose `Operation::Text(TextEdit)`, `Operation::Insert(Insertion)` or `Operation::Format(FormatEdit)` through their @@ -47,12 +48,9 @@ use onestore::{ExGuid, Insertion, TextAttribute}; use onestore_offline::{EditStatus, Replica}; # fn add_outline(cache: &Replica, space: ExGuid, page: ExGuid) # -> Result<(), Box> { -let outline = Insertion::outline(page, 144.0, 216.0, "Offline outline", "Author")?; +let outline = Insertion::outline(page, 144.0, 216.0, "Offline outline", "Author")? + .with_formatting(0..7, &[TextAttribute::Bold(true)])?; let id = cache.insert(&cache.snapshot()?, space, &outline)?; -cache.format( - &cache.snapshot()?, space, outline.text_object(), 0..7, - &[TextAttribute::Bold(true)], -)?; if let Some(id) = id { // A running worker may already have advanced this state. match cache.status(id)? { diff --git a/crates/onestore-offline/examples/smb_offline_client.rs b/crates/onestore-offline/examples/smb_offline_client.rs index db8bfbcfd7a648c3e465600572ba36c6bbe2ff9c..4cea5e7d44f8dd4ffd85d0db8a51f20d8bc4832d 100644 --- a/crates/onestore-offline/examples/smb_offline_client.rs +++ b/crates/onestore-offline/examples/smb_offline_client.rs @@ -301,7 +301,14 @@ fn queue_document( &text, "Offline document writer", )? - }; + } + .with_formatting( + 0..u32::try_from(text.encode_utf16().count())?, + &[ + TextAttribute::FontSize(13.5), + TextAttribute::Color(Some([0x44, 0x55, 0x66])), + ], + )?; let parent = if operation.is_multiple_of(2) { insertion.object() } else { diff --git a/crates/onestore-offline/tests/cache.rs b/crates/onestore-offline/tests/cache.rs index 31f727a97413e28cc255bcae111b8ef8bc8f580a..a0f9025d8e4b3f02e6fc53ef6d45e8b9fe0aad2b 100644 --- a/crates/onestore-offline/tests/cache.rs +++ b/crates/onestore-offline/tests/cache.rs @@ -609,7 +609,9 @@ fn twelve_local_clients_preserve_inserted_identities_and_dependent_edits() { "Author", ) .unwrap() - }; + } + .with_formatting(0..6, &[onestore::TextAttribute::Italic(true)]) + .unwrap(); loop { assert!( Instant::now() < deadline, @@ -691,6 +693,17 @@ fn twelve_local_clients_preserve_inserted_identities_and_dependent_edits() { format!("Edited Paragraph {client}:{sequence}") }; assert!(matches!(&v.nodes[id].kind,Kind::RichText{text,..} if *text==wanted)); + let runs = v.text_runs(*id).unwrap(); + assert_eq!(runs[0].format.italic, Some(true)); + assert_eq!( + runs[0].text, + if sequence == 0 { + "Client" + } else { + "Edited Paragr" + } + ); + assert!(runs[1..].iter().all(|run| run.format.italic != Some(true))); } } } diff --git a/crates/onestore-offline/tests/sync.rs b/crates/onestore-offline/tests/sync.rs index 5128b17829f84f71916c3c548d437ee866feca4b..8cc2aada4ffffdfa93bcb5e201d3e640ef9579eb 100644 --- a/crates/onestore-offline/tests/sync.rs +++ b/crates/onestore-offline/tests/sync.rs @@ -1736,8 +1736,10 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() { let doc = Document::parse(&index).unwrap(); let (_, page) = doc.pages().unwrap()[0]; let cache = Replica::create(&path, &source).unwrap(); - let outline = - Insertion::outline(page, 72.0, 144.0, "Offline outline", "Offline author").unwrap(); + let outline = Insertion::outline(page, 72.0, 144.0, "Offline outline", "Offline author") + .unwrap() + .with_formatting(0..7, &[onestore::TextAttribute::Italic(true)]) + .unwrap(); let first = cache.insert(&source, sid, &outline).unwrap().unwrap(); let snapshot = cache.snapshot().unwrap(); let paragraph = Insertion::paragraph( @@ -1746,6 +1748,8 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() { "Offline paragraph 🦀", "Offline author", ) + .unwrap() + .with_formatting(8..17, &[onestore::TextAttribute::Bold(true)]) .unwrap(); let second = cache.insert(&snapshot, sid, ¶graph).unwrap().unwrap(); let third = cache @@ -1786,6 +1790,12 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() { ] { assert!(matches!(&v.nodes[&id].kind,Kind::RichText{text,..} if text==wanted)); } + let outline_runs = v.text_runs(outline.text_object()).unwrap(); + assert_eq!(outline_runs[0].text, "Offline"); + assert_eq!(outline_runs[0].format.italic, Some(true)); + let runs = v.text_runs(paragraph.text_object()).unwrap(); + assert_eq!(runs[1].text, "paragraph"); + assert_eq!(runs[1].format.bold, Some(true)); assert_eq!( v.nodes[&outline.object()].children.last(), Some(¶graph.object()) @@ -1811,8 +1821,12 @@ fn uncertain_insertions_reconcile_the_original_revision_without_duplicate_object let doc = Document::parse(&index).unwrap(); let (sid, page) = doc.pages().unwrap()[0]; let cache = Replica::create(&path, &source).unwrap(); - let insertion = - Insertion::outline(page, 144.0, 144.0, "Uncertain insertion", "Author").unwrap(); + let insertion = Insertion::outline(page, 144.0, 144.0, "Uncertain insertion", "Author") + .unwrap() + .with_formatting(0..9, &[onestore::TextAttribute::Bold(true)]) + .unwrap() + .with_formatting(10..19, &[onestore::TextAttribute::Italic(true)]) + .unwrap(); let id = cache.insert(&source, sid, &insertion).unwrap().unwrap(); let local = cache.snapshot().unwrap(); let mut server = Server::new(&source); @@ -1860,6 +1874,15 @@ fn uncertain_insertions_reconcile_the_original_revision_without_duplicate_object let v = &s.revisions[&s.contexts[&ExGuid::default()]]; assert_eq!(v.nodes.values().filter(|node|matches!(&node.kind,Kind::RichText{text,..} if text=="Uncertain insertion")).count(),1); assert!(v.nodes.contains_key(&insertion.object())); + let runs = v.text_runs(insertion.text_object()).unwrap(); + assert_eq!(runs.len(), 3); + assert_eq!(runs[0].text, "Uncertain"); + assert_eq!(runs[0].format.bold, Some(true)); + assert_eq!(runs[1].text, " "); + assert_ne!(runs[1].format.bold, Some(true)); + assert_ne!(runs[1].format.italic, Some(true)); + assert_eq!(runs[2].text, "insertion"); + assert_eq!(runs[2].format.italic, Some(true)); assert!(cache.pending().unwrap().is_empty()); } } @@ -2668,7 +2691,9 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() { Insertion::outline(page, 144.0, 144.0, "Offline", "Author").unwrap() } else { Insertion::paragraph(parent, Some(anchor.object()), "Offline", "Author").unwrap() - }; + } + .with_formatting(0..7, &[A::Italic(true)]) + .unwrap(); let cache = Replica::create(&path, &source).unwrap(); let first = cache.insert(&source, sid, &insertion).unwrap().unwrap(); let second = cache @@ -2754,6 +2779,10 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() { }; assert_eq!(rebased.object(), insertion.object()); assert_eq!(rebased.text_object(), insertion.text_object()); + assert_eq!( + serde_json::to_value(&rebased).unwrap()["formats"], + serde_json::to_value(&insertion).unwrap()["formats"] + ); assert_eq!(cache.status(first).unwrap(), Some(EditStatus::Pending)); drop(cache); let cache = Replica::open(&path).unwrap(); @@ -2775,6 +2804,7 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() { "Offline 🦀" ); assert!(runs.iter().all(|r| r.format.bold == Some(true))); + assert!(runs.iter().all(|r| r.format.italic == Some(true))); if outline_case { assert_eq!( ( diff --git a/crates/onestore/README.md b/crates/onestore/README.md index d6344cf19746fb4dc9617dbb7fdaf67d20d22a08..77cf64f3c7bd8e0d0e9545af30ad7fd043f03a7b 100644 --- a/crates/onestore/README.md +++ b/crates/onestore/README.md @@ -71,7 +71,9 @@ passwords, unsupported protection profiles and work-limit failures remain distin The source stays encrypted; protected writes are rejected. Insertions update child references, reference counts, modification times and automatic titles atomically. Paragraphs can be nested or inserted into table cells; outline -coordinates use points. Retain the `Insertion` value for rebasing: creating another +coordinates use points. `Insertion::with_formatting` includes nonoverlapping UTF-16 +spans in that same publication; gaps keep the default insertion style. Empty text +accepts one `0..0` span for subsequent typing. Retain the `Insertion` value for rebasing: creating another value creates different object identities. Duplicate insertion identities require reconciliation. Formatting accepts explicit attributes, preserves inherited values, and gives retired immutable styles zero current references while retaining history. diff --git a/crates/onestore/src/formatting.rs b/crates/onestore/src/formatting.rs index 5d40d1eff4a55274dd75a8889253507376d898d8..2056257ebc1c7ec761798c5e611542230379929d 100644 --- a/crates/onestore/src/formatting.rs +++ b/crates/onestore/src/formatting.rs @@ -91,26 +91,7 @@ pub(crate) fn format_text( "Select a text range and at least one formatting attribute", )); } - let mut values = Vec::new(); - let mut seen = BTreeSet::new(); - for attribute in attributes { - let (id, value) = attribute.property()?; - if !seen.insert(id & 0x7fffffff) { - return Err(invalid("Specify each formatting attribute once")); - } - values.push((id, value)); - } - if attributes.contains(&TextAttribute::Superscript(true)) - && attributes.contains(&TextAttribute::Subscript(true)) - { - return Err(invalid("Text cannot be both superscript and subscript")); - } - // Setting either script position clears its mutually exclusive counterpart. - for (set, opposite) in [(0x88001c08, 0x08001c09), (0x88001c09, 0x08001c08)] { - if values.iter().any(|(id, _)| *id == set) && !seen.contains(&opposite) { - values.push((opposite, Vec::new())); - } - } + let values = attribute_values(attributes)?; let store = Store::parse(source)?; let index = RevisionIndex::parse(&store)?; index.validate_current()?; @@ -286,3 +267,30 @@ pub(crate) fn format_text( Ok(changed) }) } + +pub(crate) fn attribute_values(attributes: &[TextAttribute]) -> Result)>, Error> { + if attributes.is_empty() { + return Err(invalid("Choose at least one formatting attribute")); + } + let mut values = Vec::new(); + let mut seen = BTreeSet::new(); + for attribute in attributes { + let (id, value) = attribute.property()?; + if !seen.insert(id & 0x7fffffff) { + return Err(invalid("Specify each formatting attribute once")); + } + values.push((id, value)); + } + if attributes.contains(&TextAttribute::Superscript(true)) + && attributes.contains(&TextAttribute::Subscript(true)) + { + return Err(invalid("Text cannot be both superscript and subscript")); + } + // Setting either script position clears its mutually exclusive counterpart. + for (set, opposite) in [(0x88001c08, 0x08001c09), (0x88001c09, 0x08001c08)] { + if values.iter().any(|(id, _)| *id == set) && !seen.contains(&opposite) { + values.push((opposite, Vec::new())); + } + } + Ok(values) +} diff --git a/crates/onestore/src/insertion.rs b/crates/onestore/src/insertion.rs index a6589165b4ecf1acadb90afd88f54c1bcd23c3e5..8543533ec3a70cf6c945fcc7ebc7241aedc8d6ed 100644 --- a/crates/onestore/src/insertion.rs +++ b/crates/onestore/src/insertion.rs @@ -8,6 +8,7 @@ use crate::{ use serde::{Deserialize, Serialize}; use std::{ collections::{BTreeMap, BTreeSet}, + ops::Range, sync::Arc, }; @@ -22,6 +23,14 @@ enum Placement { Outline { x: f32, y: f32 }, } +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +struct FormatSpan { + guid: [u8; 16], + range: Range, + attributes: Vec, +} + /// A paragraph or outline insertion with stable object identities and creation time. /// Retain this intent across rebases; constructing another intent allocates different identities. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] @@ -33,9 +42,29 @@ pub struct Insertion { text: String, author: String, created: u32, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + formats: Vec, } impl Insertion { + /// Adds a nonoverlapping UTF-16 formatting span, retaining all existing identities. + /// Gaps use the ordinary insertion style; only empty text accepts a zero-length span. + pub fn with_formatting( + &self, + range: Range, + attributes: &[crate::TextAttribute], + ) -> Result { + let mut intent = self.clone(); + intent.formats.push(FormatSpan { + guid: fresh_guid()?, + range, + attributes: attributes.to_vec(), + }); + intent.formats.sort_by_key(|span| span.range.start); + intent.validate()?; + Ok(intent) + } + /// Inserts before a direct child, or appends when `before` is None. /// The parent must be an editable outline, paragraph, outline group or table cell. /// Carriage returns represent soft line breaks; line feeds and embedded-field markers are rejected. @@ -89,6 +118,7 @@ impl Insertion { text: text.to_owned(), author: author.to_owned(), created: current_timestamps()?.0, + formats: Vec::new(), }; intent.validate()?; Ok(intent) @@ -125,6 +155,37 @@ impl Insertion { { return Err(invalid("Outline coordinates must be finite")); } + if !self.formats.is_empty() { + let units: Vec<_> = self.text.encode_utf16().collect(); + let length = u32::try_from(units.len()) + .map_err(|_| invalid("Text exceeds UTF-16 offset range"))?; + let mut identities = BTreeSet::from([self.guid]); + let mut end = 0; + for span in &self.formats { + if span.guid == [0; 16] || !identities.insert(span.guid) { + return Err(invalid("Formatting identities must be distinct")); + } + if span.range.start > span.range.end + || span.range.end > length + || span.range.start < end + || (span.range.is_empty() && (!units.is_empty() || self.formats.len() != 1)) + { + return Err(invalid( + "Formatting spans must be nonoverlapping ranges within the new text", + )); + } + for boundary in [span.range.start, span.range.end] { + if boundary > 0 + && boundary < length + && (0xd800..=0xdbff).contains(&units[boundary as usize - 1]) + { + return Err(invalid("Formatting boundary splits a surrogate pair")); + } + } + crate::formatting::attribute_values(&span.attributes)?; + end = span.range.end; + } + } Ok(()) } @@ -243,6 +304,55 @@ impl Insertion { }, ); } + if !self.formats.is_empty() { + let default = ExGuid { + guid: self.guid, + n: 5, + }; + let mut segments = Vec::new(); + let mut end = 0; + for span in &self.formats { + if end < span.range.start { + segments.push((span.range.start, default)); + } + let id = ExGuid { + guid: span.guid, + n: 1, + }; + let mut style = PropertyObject { + jcid: 0x12004d, + bytes: properties(&default_text_style())?, + global_ids: Arc::new(BTreeMap::from([(0, span.guid)])), + }; + let values = crate::formatting::attribute_values(&span.attributes)?; + style.set( + &values + .iter() + .map(|(id, value)| (*id, value.as_slice())) + .collect::>(), + )?; + new.insert(id, style); + segments.push((span.range.end, id)); + end = span.range.end; + } + let length = u32::try_from(self.text.encode_utf16().count()) + .map_err(|_| invalid("Text exceeds UTF-16 offset range"))?; + if end < length { + segments.push((length, default)); + } + if !segments.iter().any(|(_, id)| *id == default) { + new.remove(&default); + } + let target = new.get_mut(&self.text_object()).unwrap(); + let mut references = Vec::new(); + let mut ends = Vec::new(); + for (end, id) in segments { + references.extend_from_slice(&target.reference(id)?); + ends.extend_from_slice(&end.to_le_bytes()); + } + ends.truncate(ends.len() - 4); + target.set(&[(0x24001e13, &references), (0x1c001e12, &ends)])?; + } if let Placement::Outline { x, y } = self.placement { new.insert( self.object(), diff --git a/crates/onestore/tests/insertion.rs b/crates/onestore/tests/insertion.rs index 379b11a674a504f638b945b472cd855f1137e54b..2b215f02768379f4a4961f46f47f90f3c1e68097 100644 --- a/crates/onestore/tests/insertion.rs +++ b/crates/onestore/tests/insertion.rs @@ -6,7 +6,7 @@ mod current; mod disk; use onestore::{ - ExGuid, Insertion, PreparedEdit, RevisionIndex, Store, + ExGuid, Insertion, PreparedEdit, RevisionIndex, Store, TextAttribute as A, document::{Document, Kind}, }; @@ -28,6 +28,335 @@ fn targets(source: &[u8]) -> (ExGuid, ExGuid, ExGuid, ExGuid, ExGuid) { (sid, page, outline, paragraph, text) } +#[test] +fn atomic_formatted_insertions_match_a_character_model_and_preserve_history() { + use serde_json::json; + let source = onestore::create_section("rich.one", "Original", "Author").unwrap(); + let (sid, page, outline, _, _) = targets(&source); + let text = "ab🦀 e\u{301} 東京\rEnd\t!"; + let plain = Insertion::paragraph(outline, None, text, "Author").unwrap(); + assert!( + serde_json::to_value(&plain) + .unwrap() + .get("formats") + .is_none() + ); + let restored: Insertion = serde_json::from_slice(&serde_json::to_vec(&plain).unwrap()).unwrap(); + assert_eq!(plain, restored); + let base = PreparedEdit::insert(&source, sid, &plain).unwrap(); + let base_store = Store::parse(base.as_bytes()).unwrap(); + let base_index = RevisionIndex::parse(&base_store).unwrap(); + let base_doc = Document::parse(&base_index).unwrap(); + let base_space = &base_doc.spaces[&sid]; + let base_view = &base_space.revisions[&base_space.contexts[&ExGuid::default()]]; + let default = + serde_json::to_value(&base_view.text_runs(plain.text_object()).unwrap()[0].format).unwrap(); + let offsets: Vec = std::iter::once(0) + .chain(text.chars().scan(0, |n, c| { + *n += c.len_utf16() as u32; + Some(*n) + })) + .collect(); + let old_store = Store::parse(&source).unwrap(); + let old_index = RevisionIndex::parse(&old_store).unwrap(); + for seed in 1..=48_u64 { + let mut random = seed; + let mut expected: Vec<_> = text.chars().map(|c| (c, default.clone())).collect(); + let mut intent = if seed % 2 == 0 { + Insertion::outline(page, 72.0, 144.0, text, "Author").unwrap() + } else { + plain.clone() + }; + // Descending construction also exercises persisted ordering independently of call order. + for i in (0..expected.len()).rev() { + random ^= random << 13; + random ^= random >> 7; + random ^= random << 17; + let (attributes, values) = match random % 8 { + 0 => continue, + 1 => ( + vec![A::Bold(true), A::Underline(true)], + json!({"bold":true,"underline":true}), + ), + 2 => ( + vec![A::Italic(true), A::Strike(true)], + json!({"italic":true,"strike":true}), + ), + 3 => ( + vec![A::Font("Arial".into()), A::FontSize(13.5)], + json!({"font":"Arial","font_size":13.5}), + ), + 4 => ( + vec![ + A::Color(Some([12, 34, 56])), + A::Highlight(Some([255, 255, 0])), + ], + json!({"color":0x38220c,"highlight":0x00ffff}), + ), + 5 => ( + vec![A::Superscript(true)], + json!({"superscript":true,"subscript":false}), + ), + 6 => ( + vec![A::Subscript(true)], + json!({"subscript":true,"superscript":false}), + ), + _ => ( + vec![A::Bold(false), A::Color(None), A::Highlight(None)], + json!({"bold":false,"color":0xff000000_u32,"highlight":0xff000000_u32}), + ), + }; + intent = intent + .with_formatting(offsets[i]..offsets[i + 1], &attributes) + .unwrap(); + for (key, value) in values.as_object().unwrap() { + expected[i].1[key] = value.clone(); + } + } + let restored: Insertion = + serde_json::from_slice(&serde_json::to_vec(&intent).unwrap()).unwrap(); + assert_eq!(restored, intent); + let edited = PreparedEdit::insert(&source, sid, &restored).unwrap(); + let store = Store::parse(edited.as_bytes()).unwrap(); + assert_eq!( + store.header.transaction_count, + old_store.header.transaction_count + 1 + ); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + assert_eq!( + index.spaces[&sid].revisions.len(), + old_index.spaces[&sid].revisions.len() + 1 + ); + for (space, old) in &old_index.spaces { + for revision in old.revisions.keys() { + assert_eq!( + format!("{:?}", old_index.resolve(*space, *revision).unwrap()), + format!("{:?}", index.resolve(*space, *revision).unwrap()) + ); + } + } + let document = Document::parse(&index).unwrap(); + let space = &document.spaces[&sid]; + let view = &space.revisions[&space.contexts[&ExGuid::default()]]; + let actual: Vec<_> = view + .text_runs(intent.text_object()) + .unwrap() + .into_iter() + .flat_map(|run| { + let format = serde_json::to_value(run.format).unwrap(); + run.text.chars().map(move |c| (c, format.clone())) + }) + .collect(); + assert_eq!(actual, expected, "seed {seed}"); + } +} + +#[test] +fn invalid_or_forged_insertion_formats_fail_before_source_parsing() { + use serde_json::json; + let source = onestore::create_section("invalid-rich.one", "Original", "Author").unwrap(); + let (sid, _, outline, _, _) = targets(&source); + let plain = Insertion::paragraph(outline, None, "a🦀e\u{301}b", "Author").unwrap(); + for (start, end) in [(0, 0), (2, 3), (1, 2), (4, 3), (0, 7)] { + let range = start..end; + assert!(plain.with_formatting(range, &[A::Bold(true)]).is_err()); + } + for attributes in [ + vec![], + vec![A::Bold(true), A::Bold(false)], + vec![A::FontSize(f32::NAN)], + vec![A::FontSize(5.5)], + vec![A::Font("a\0b".into())], + vec![A::Superscript(true), A::Subscript(true)], + ] { + assert!(plain.with_formatting(1..3, &attributes).is_err()); + } + let formatted = plain.with_formatting(1..3, &[A::Bold(true)]).unwrap(); + for range in [0..3, 1..3, 1..4] { + assert!( + formatted + .with_formatting(range, &[A::Italic(true)]) + .is_err() + ); + } + let encoded = serde_json::to_value(&formatted).unwrap(); + for mutate in 0..6 { + let mut value = encoded.clone(); + match mutate { + 0 => value["formats"][0]["guid"] = serde_json::to_value([0; 16]).unwrap(), + 1 => value["formats"][0]["guid"] = value["guid"].clone(), + 2 => { + let duplicate = value["formats"][0].clone(); + value["formats"].as_array_mut().unwrap().push(duplicate); + } + 3 => value["formats"][0]["range"] = json!({"start":2,"end":3}), + 4 => value["formats"][0]["attributes"] = json!([]), + _ => value["formats"][0]["range"] = json!({"start":0,"end":u32::MAX}), + } + let forged: Insertion = serde_json::from_value(value).unwrap(); + let error = PreparedEdit::insert(&[], sid, &forged).err().unwrap(); + assert_eq!( + error, + PreparedEdit::insert(&source, sid, &forged).err().unwrap() + ); + } +} + +#[test] +fn formatted_empty_insertions_preserve_the_insertion_style_for_later_typing() { + let source = onestore::create_section("empty-rich.one", "Original", "Author").unwrap(); + let (sid, page, outline, _, _) = targets(&source); + for plain in [ + Insertion::outline(page, 72.0, 144.0, "", "Author").unwrap(), + Insertion::paragraph(outline, None, "", "Author").unwrap(), + ] { + let intent = plain + .with_formatting(0..0, &[A::Italic(true), A::FontSize(18.0)]) + .unwrap(); + assert!(intent.with_formatting(0..0, &[A::Bold(true)]).is_err()); + let inserted = PreparedEdit::insert(&source, sid, &intent).unwrap(); + let typed = PreparedEdit::text( + inserted.as_bytes(), + sid, + intent.text_object(), + 0..0, + "Typed 🦀", + ) + .unwrap(); + for (bytes, text) in [(inserted.as_bytes(), ""), (typed.as_bytes(), "Typed 🦀")] { + let store = Store::parse(bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + let document = Document::parse(&index).unwrap(); + let space = &document.spaces[&sid]; + let view = &space.revisions[&space.contexts[&ExGuid::default()]]; + let runs = view.text_runs(intent.text_object()).unwrap(); + assert_eq!(runs.len(), 1); + assert_eq!(runs[0].text, text); + assert_eq!(runs[0].format.italic, Some(true)); + assert_eq!(runs[0].format.font_size, Some(18.0)); + } + } +} + +#[test] +#[ignore = "exports formatted insertion candidates for cold native validation"] +fn export_native_formatted_insertions() { + use std::{fs, path::PathBuf}; + let output = PathBuf::from(std::env::var_os("ONESTORE_INSERT_OUTPUT").unwrap()); + assert!(output.is_absolute()); + fs::create_dir(&output).unwrap(); + let generated = onestore::create_section("rich.one", "Original", "Author").unwrap(); + let unicode = include_bytes!( + "../../../corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one" + ); + let table = include_bytes!( + "../../../corpus/native/20260905-05/snapshots/07-table/notebook/synthetic.one" + ); + let text = "Bold 🦀 italic e\u{301} color 東京\rEnd"; + let mut manifest = Vec::new(); + for (name, source, empty) in [ + ("outline", generated.as_slice(), false), + ("native-paragraph", unicode.as_slice(), false), + ("native-cell", table.as_slice(), false), + ("empty", generated.as_slice(), true), + ("empty-typed", generated.as_slice(), true), + ] { + let (sid, page, outline, paragraph, _) = targets(source); + let insertion = match name { + "native-paragraph" => { + Insertion::paragraph(outline, Some(paragraph), text, "Rich author") + } + "native-cell" => { + let store = Store::parse(source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let space = &document.spaces[&sid]; + let view = &space.revisions[&space.contexts[&ExGuid::default()]]; + let cell = *view + .nodes + .iter() + .find(|(_, node)| matches!(node.kind, Kind::Cell { .. })) + .unwrap() + .0; + Insertion::paragraph(cell, None, text, "Rich author") + } + _ => Insertion::outline( + page, + 72.0, + 144.0, + if empty { "" } else { text }, + "Rich author", + ), + } + .unwrap(); + let mut intent = insertion; + if empty { + intent = intent + .with_formatting(0..0, &[A::Italic(true), A::FontSize(18.0)]) + .unwrap(); + } else { + for (label, attributes) in [ + ("Bold", vec![A::Bold(true), A::Underline(true)]), + ("🦀", vec![A::Font("Arial".into()), A::FontSize(13.5)]), + ("italic", vec![A::Italic(true), A::Strike(true)]), + ("e\u{301}", vec![A::Superscript(true)]), + ( + "color", + vec![ + A::Color(Some([12, 34, 56])), + A::Highlight(Some([255, 255, 0])), + ], + ), + ("東京", vec![A::Subscript(true)]), + ( + "End", + vec![ + A::Bold(false), + A::Italic(false), + A::Color(None), + A::Highlight(None), + ], + ), + ] { + let start = text[..text.find(label).unwrap()].encode_utf16().count() as u32; + intent = intent + .with_formatting( + start..start + label.encode_utf16().count() as u32, + &attributes, + ) + .unwrap(); + } + } + let inserted = PreparedEdit::insert(source, sid, &intent).unwrap(); + let bytes = if name == "empty-typed" { + PreparedEdit::text( + inserted.as_bytes(), + sid, + intent.text_object(), + 0..0, + "Typed café 🦀", + ) + .unwrap() + .as_bytes() + .to_vec() + } else { + inserted.as_bytes().to_vec() + }; + current::current(&bytes); + let notebook = output.join(name); + fs::create_dir(¬ebook).unwrap(); + fs::write(notebook.join("synthetic.one"), &bytes).unwrap(); + manifest.push(serde_json::json!({"name":name,"space":sid,"intent":intent})); + } + fs::write( + output.join("manifest.json"), + serde_json::to_vec_pretty(&manifest).unwrap(), + ) + .unwrap(); +} + #[test] fn paragraph_and_outline_insertions_publish_metadata_and_references_together() { let source = onestore::create_section("insertion.one", "Original", "Original author").unwrap(); @@ -165,11 +494,15 @@ fn repeated_insertions_and_formatting_share_immutable_objects() { fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits() { let source = onestore::create_section("rebase.one", "Original", "Author").unwrap(); let (sid, _, outline, paragraph, text) = targets(&source); - let intent = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author").unwrap(); + let intent = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author") + .unwrap() + .with_formatting(0..3, &[A::Bold(true), A::Color(Some([12, 34, 56]))]) + .unwrap(); let encoded = serde_json::to_vec(&intent).unwrap(); let restored: Insertion = serde_json::from_slice(&encoded).unwrap(); assert_eq!(intent.object(), restored.object()); assert_eq!(intent.text_object(), restored.text_object()); + assert_eq!(intent, restored); let original_preparation = PreparedEdit::insert(&source, sid, &intent).unwrap(); let remote = PreparedEdit::text(&source, sid, text, 0..0, "Remote ").unwrap(); let updated = PreparedEdit::insert(remote.as_bytes(), sid, &restored).unwrap(); @@ -188,6 +521,12 @@ fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits( assert!( matches!(&view.nodes[&restored.text_object()].kind, Kind::RichText { text, .. } if text == "Inserted") ); + let runs = view.text_runs(restored.text_object()).unwrap(); + assert_eq!(runs[0].text, "Ins"); + assert_eq!(runs[0].format.bold, Some(true)); + assert_eq!(runs[0].format.color, Some(0x38220c)); + assert_eq!(runs[1].text, "erted"); + assert_ne!(runs[1].format.bold, Some(true)); assert!(PreparedEdit::insert(original_preparation.as_bytes(), sid, &restored).is_err()); assert!(PreparedEdit::insert(updated.as_bytes(), sid, &restored).is_err()); } @@ -196,8 +535,14 @@ fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits( fn repositioning_preserves_intent_identity_and_kind() { let source = onestore::create_section("placement.one", "Original", "Author").unwrap(); let (sid, page, outline, paragraph, _) = targets(&source); - let p = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author").unwrap(); - let o = Insertion::outline(page, 144.0, 144.0, "Inserted", "Author").unwrap(); + let p = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author") + .unwrap() + .with_formatting(1..4, &[A::Italic(true)]) + .unwrap(); + let o = Insertion::outline(page, 144.0, 144.0, "Inserted", "Author") + .unwrap() + .with_formatting(0..8, &[A::FontSize(18.0)]) + .unwrap(); assert!(p.reposition_outline(page, 72.0, 72.0).is_err()); assert!(o.reposition_paragraph(outline, None).is_err()); assert!(p.reposition_paragraph(ExGuid::default(), None).is_err()); @@ -344,6 +689,11 @@ fn insertion_publication_faults_expose_only_complete_graphs_and_title_caches() { Insertion::paragraph(outline, Some(paragraph), "First 🦀", "New author").unwrap(), Insertion::outline(page, 0.0, 0.0, "First 🦀", "New author").unwrap(), ] { + let intent = intent + .with_formatting(0..3, &[A::Bold(true), A::FontSize(18.0)]) + .unwrap() + .with_formatting(6..8, &[A::Italic(true), A::Highlight(Some([255, 255, 0]))]) + .unwrap(); let edit = PreparedEdit::insert(source, sid, &intent).unwrap(); let before = current::current(source); let after = current::current(edit.as_bytes()); diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index f898a806d40f6d2e347328f85e1cc012fd9f309c..edaf899d52a4762dbc9615ddefbf58c2baed74ef 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -77,3 +77,10 @@ path = "fuzz_targets/edit_text.rs" test = false doc = false bench = false + +[[bin]] +name = "insert" +path = "fuzz_targets/insert.rs" +test = false +doc = false +bench = false diff --git a/fuzz/fuzz_targets/insert.rs b/fuzz/fuzz_targets/insert.rs new file mode 100644 index 0000000000000000000000000000000000000000..ea3546f0ebe51c625a7f045288eabdd4b994abb7 --- /dev/null +++ b/fuzz/fuzz_targets/insert.rs @@ -0,0 +1,135 @@ +#![no_main] +use libfuzzer_sys::fuzz_target; +use onestore::{ + CommitState, ExGuid, Insertion, PreparedEdit, RevisionIndex, Store, TextAttribute as A, + document::{Document, Kind}, +}; +use std::sync::LazyLock; + +#[path = "../../crates/onestore/tests/support/current.rs"] +mod current; +#[path = "../../crates/onestore/tests/support/disk.rs"] +mod disk; + +static SOURCE: LazyLock<(Vec, ExGuid, ExGuid, ExGuid)> = LazyLock::new(|| { + let bytes = include_bytes!( + "../../corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one" + ) + .to_vec(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let (space, page) = document.pages().unwrap()[0]; + let s = &document.spaces[&space]; + let view = &s.revisions[&s.contexts[&ExGuid::default()]]; + let outline = *view.nodes[&page] + .children + .iter() + .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. })) + .unwrap(); + (bytes, space, page, outline) +}); + +fuzz_target!(|input: &[u8]| { + let (source, space, page, outline) = &*SOURCE; + if let Ok(intent) = serde_json::from_slice::(input) + && let Ok(prepared) = PreparedEdit::insert(source, *space, &intent) + { + current::current(prepared.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(12) { + let actor = usize::from(step[0]) % caches.len(); + if step[1] % 4 == 0 { + caches[actor].clone_from(&persisted); + } + let source = &caches[actor]; + let text = + ["", "ab", "🦀e\u{301}東京\rEnd", "same style same style"][usize::from(step[2]) % 4]; + let offsets: Vec = std::iter::once(0) + .chain(text.chars().scan(0, |n, c| { + *n += c.len_utf16() as u32; + Some(*n) + })) + .collect(); + let first = usize::from(step[3]) % offsets.len(); + let second = usize::from(step[4]) % offsets.len(); + let (start, end) = (first.min(second), first.max(second)); + let plain = if step[1] & 1 == 0 { + Insertion::paragraph(*outline, None, text, "Insertion fuzz").unwrap() + } else { + Insertion::outline(*page, 72.0, 144.0, text, "Insertion fuzz").unwrap() + }; + let enabled = step[5] & 1 != 0; + let intent = if start != end || text.is_empty() { + plain + .with_formatting( + offsets[start]..offsets[end], + &[A::Bold(enabled), A::FontSize(18.0)], + ) + .unwrap() + } else { + plain + }; + let encoded = serde_json::to_vec(&intent).unwrap(); + let intent: Insertion = serde_json::from_slice(&encoded).unwrap(); + let edit = PreparedEdit::insert(source, *space, &intent).unwrap(); + let store = Store::parse(edit.as_bytes()).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let s = &document.spaces[space]; + let view = &s.revisions[&s.contexts[&ExGuid::default()]]; + let actual: Vec<_> = view + .text_runs(intent.text_object()) + .unwrap() + .into_iter() + .flat_map(|run| { + run.text.chars().map(move |c| { + ( + c, + run.format.bold.unwrap_or(false), + run.format.font_size.unwrap(), + ) + }) + }) + .collect(); + let expected: Vec<_> = text + .chars() + .enumerate() + .map(|(i, c)| { + if (start..end).contains(&i) { + (c, enabled, 18.0) + } else { + (c, false, 11.0) + } + }) + .collect(); + assert_eq!(actual, expected); + let before = current::current(&persisted); + let after = current::current(edit.as_bytes()); + let mut disk = disk::Disk { + visible: persisted.clone(), + durable: persisted.clone(), + operation: 0, + fail_at: (step[6] != 0).then_some(usize::from(step[6])), + write_limit: if step[7] & 1 == 0 { 17 } else { 4096 }, + random: u64::from(step[7]) + 1, + }; + let result = edit.commit(&mut disk); + let observed = current::current(&disk.durable); + match result { + Ok(()) => assert_eq!(observed, after), + Err(error) => { + assert!(observed == before || observed == after); + if error.state == CommitState::NotCommitted { + assert_eq!(observed, before); + } + if error.state == CommitState::Committed { + assert_eq!(observed, after); + } + } + } + persisted = disk.durable; + } +}); diff --git a/tools/native/formatted-insertion.ps1 b/tools/native/formatted-insertion.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..f767ae400bde912d46bc8f1d624088668c784fec --- /dev/null +++ b/tools/native/formatted-insertion.ps1 @@ -0,0 +1,53 @@ +param([Parameter(Mandatory=$true)][string]$Root, [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) + $deadline = [DateTime]::UtcNow.AddSeconds(60) + do { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$tree = $hierarchy + $pages = @($tree.SelectNodes('//*[local-name()="Page"]')) + if ($pages.Count -eq 1) { break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if ($pages.Count -ne 1) { throw 'Expected one fixture page.' } + $pageId = $pages[0].GetAttribute('ID') + foreach ($phase in @('control', 'edit')) { + $content = '' + $app.GetPageContent($pageId, [ref]$content, 1, 1) + [IO.File]::WriteAllText((Join-Path $Root ($phase + '-before.xml')), $content, [Text.Encoding]::UTF8) + [xml]$page = $content + $matches = @($page.SelectNodes('//*[local-name()="T"]') | Where-Object { + $plain = [regex]::Replace($_.InnerText, '<[^>]*>', '') + $plain.StartsWith('Bold ') -or $plain.StartsWith('Typed ') + }) + if ($matches.Count -ne 1) { throw 'Expected one inserted rich paragraph.' } + $target = $matches[0] + if ($phase -eq 'edit') { $target.InnerText = $target.InnerText.Replace('Bold', 'Native Bold').Replace('Typed', 'Native Typed') } + $outline = $target + while ($outline.LocalName -ne 'Outline') { $outline = $outline.ParentNode } + $update = '' + foreach ($style in $page.SelectNodes('/*/*[local-name()="QuickStyleDef"]')) { $update += $style.OuterXml } + if ($outline.SelectSingleNode('.//*[local-name()="Table"]')) { + # Resubmitting measured outline size constrains native table auto-fit. + foreach ($size in @($outline.SelectNodes('*[local-name()="Size"]'))) { [void]$outline.RemoveChild($size) } + } + $update += $outline.OuterXml + '' + [IO.File]::WriteAllText((Join-Path $Root ($phase + '-update.xml')), $update, [Text.Encoding]::UTF8) + $app.UpdatePageContent($update, [DateTime]::MinValue, 1, $false) + } + $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/native/read.ps1 b/tools/native/read.ps1 index d61ba414eb59a498d2d686422b476d3263f77b48..476094ab1e0c47077988a6461db2080cf208642b 100644 --- a/tools/native/read.ps1 +++ b/tools/native/read.ps1 @@ -40,6 +40,7 @@ try { } $deadline = [DateTime]::UtcNow.AddSeconds(300) $previous = '' + $lastChange = '' $stableSince = [DateTime]::UtcNow $settled = $false do { @@ -62,6 +63,7 @@ try { } $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) if ($signature -ne $previous) { + $lastChange = $previous $previous = $signature $stableSince = [DateTime]::UtcNow } @@ -71,6 +73,7 @@ try { Start-Sleep -Milliseconds 250 } while ([DateTime]::UtcNow -lt $deadline) if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) $index = 0 foreach ($id in @($pages.Keys | Sort-Object)) { [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) @@ -79,7 +82,7 @@ try { $hierarchy = '' $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) - throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." } $index = 0 $payloads = @() diff --git a/tools/offline_document_history.py b/tools/offline_document_history.py index c1fd88a48abcb84d5cd91f3f33e1233d7ebea36e..23f0f8cc469866ebf280ff378958e2451d55bcc6 100644 --- a/tools/offline_document_history.py +++ b/tools/offline_document_history.py @@ -80,6 +80,11 @@ def document_history(logs, operations): assert formatted['range'] == [1, len(text.encode('utf-16-le')) // 2 - 2] assert formatted['attributes'] == [{'Bold': True}, {'FontSize': 18 + number % 9}, {'Color': [18, 52, 86]}] old = [(char, False, 11, 0xff000000) for char in text] + if insertion.get('formats'): + span, = insertion['formats'] + assert span['range'] == {'start': 0, 'end': len(text.encode('utf-16-le')) // 2}, 'Initial formatting range differs from workload' + assert span['attributes'] == [{'FontSize': 13.5}, {'Color': [68, 85, 102]}], 'Initial formatting attributes differ from workload' + old = [(char, False, 13.5, 0x665544) for char in text] new = [(char, True, 18 + number % 9, 0x563412) if 0 < i < len(text)-1 else old[i] for i, char in enumerate(text)] assert target not in documents, 'Two insertion intents share an object identity' created, changed = linked[inserted['id']], linked[formatted['id']] @@ -158,6 +163,6 @@ def verify_native(paragraphs, documents): if color == 0xff000000: assert native_color in ('automatic', None), 'Native automatic color changed' else: - assert ImageColor.getrgb(native_color) == (18, 52, 86), 'Native color differs from intent' + assert ImageColor.getrgb(native_color) == (color & 255, (color >> 8) & 255, (color >> 16) & 255), 'Native color differs from intent' checks += 3 return checks diff --git a/tools/test_formatted_insertion.py b/tools/test_formatted_insertion.py new file mode 100644 index 0000000000000000000000000000000000000000..15082a034f5568215370e9239dc530e56d2e50a1 --- /dev/null +++ b/tools/test_formatted_insertion.py @@ -0,0 +1,57 @@ +import json +from pathlib import Path +import runpy +import shutil +from tempfile import TemporaryDirectory +import unittest +import xml.etree.ElementTree as ET + +from native_format import native_characters +from native_xml import ns + +ROOT = Path(__file__).resolve().parent.parent +FIXTURE = ROOT / 'corpus/formatted-insertion' +compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare'] + + +class FormattedInsertionTest(unittest.TestCase): + def test_cold_native_content_and_formatting(self): + manifest = json.loads((FIXTURE / 'manifest.json').read_text()) + for case in manifest['cases']: + with self.subTest(case=case['name']), TemporaryDirectory() as temporary: + fixture = FIXTURE / case['name'] + native = Path(temporary) / 'read' + shutil.copytree(fixture / 'cold/read', native) + compare(fixture / 'candidate', native) + with TemporaryDirectory() as temporary: + fixture = FIXTURE / 'empty/typed-after-cold' + native = Path(temporary) / 'read' + shutil.copytree(fixture / 'read', native) + compare(fixture / 'candidate', native) + + def test_native_edits_preserve_the_observed_character_styles(self): + manifest = json.loads((FIXTURE / 'manifest.json').read_text()) + for case in manifest['cases']: + for variant, before_file, prefix in [('reverse', 'edit-before.xml', 'Native '), + ('ui', 'before-read/page-000.xml', 'UI ')]: + if variant + '_sha256' not in case: + continue + with self.subTest(case=case['name'], variant=variant), TemporaryDirectory() as temporary: + fixture = FIXTURE / case['name'] / variant + native = Path(temporary) / 'read' + shutil.copytree(fixture / 'read', native) + compare(fixture / 'notebook', native) + before = ET.parse(fixture / before_file).getroot() + after = ET.parse(native / 'page-000.xml').getroot() + expected = native_characters(before, before.findall('one:Outline', ns)) + changed = 0 + for index, paragraph in enumerate(expected): + if ''.join(char for char, _ in paragraph).startswith(('Bold ', 'Typed ')): + expected[index] = [(char, paragraph[0][1]) for char in prefix] + paragraph + changed += 1 + self.assertEqual(changed, 1) + self.assertEqual(native_characters(after, after.findall('one:Outline', ns)), expected) + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/test_offline_document_history.py b/tools/test_offline_document_history.py index f25d7c486041cf40e7fbb93cda00eaff1ebe553e..4bea175efc829711e9cce266f0558ffde284c3f5 100644 --- a/tools/test_offline_document_history.py +++ b/tools/test_offline_document_history.py @@ -60,6 +60,34 @@ class DocumentHistoryTests(unittest.TestCase): events.remove(next(row for row in events if row['event'] == name)) with self.subTest(event=name), self.assertRaises(AssertionError): document_history(logs, 2) + def test_formatted_insertions_are_atomic_in_every_observed_snapshot(self): + for events in self.logs.values(): + for row in events: + insertion = row.get('insertion') + if insertion: + insertion['formats'] = [{'guid': list(uuid.uuid4().bytes_le), + 'range': {'start': 0, 'end': len(insertion['text'].encode('utf-16-le')) // 2}, + 'attributes': [{'FontSize': 13.5}, {'Color': [68, 85, 102]}]}] + for key in ('documents', 'document_changes'): + for document in (row.get(key) or {}).values(): + for run in document['runs']: + if run['size'] == 11: + run['size'] = 13.5 + run['color'] = 0x665544 + documents = document_history(self.logs, 2) + paragraphs = [[(char, {'bold': bold, 'font_size': size, + 'color': '#123456' if color == 0x563412 else '#445566'}) + for char, bold, size, color in row['new']] for row in documents.values()] + self.assertEqual(verify_native(paragraphs, documents), sum(len(row['new'])*3 for row in documents.values())) + baseline = copy.deepcopy(self.logs) + for event, key in [('remote_attempt', 'document_changes'), ('read', 'documents')]: + for field, value in [('size', 11), ('color', 0xff000000)]: + logs = copy.deepcopy(baseline) + row = next(row for row in logs['w0'] if row['event'] == event) + next(iter(row[key].values()))['runs'][0][field] = value + with self.subTest(event=event, field=field), self.assertRaises(AssertionError): + document_history(logs, 2) + def test_retired_format_receipt_requires_current_revision_and_exact_observed_effect(self): events = self.logs['w0'] attempt = next(row for row in events if row['event'] == 'remote_attempt' and row['revision'] == 'revision-3') -- 2.54.0