| author | |
| committer | |
| log | 49bc9b2d95d93ceb9f25de3e238e89ce6fbfb21e |
| tree | d1a7020f27ecc5ceebf8cf1e7c8b2d3b316bb55c |
| parent | 3a32cbb2aad5a83965908734e6595ea252557f7f |
| signature | Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU |
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-astra140 files changed, 2765 insertions(+), 40 deletions(-)
corpus/formatted-insertion/README.md created+31| ... | @@ -0,0 +1,31 @@ | ||
| 1 | # Atomic formatted insertions | ||
| 2 | |||
| 3 | Synthetic Rust paragraph/outline insertions with independent OneNote 2010 cold | ||
| 4 | reads. The native paragraph and table inputs descend from the public | ||
| 5 | `native/20260905-05` corpus. `manifest.json` records stable intents and file hashes; | ||
| 6 | each capture retains its native environment and run provenance. Attachment exports | ||
| 7 | link to existing identical public payloads. | ||
| 8 | |||
| 9 | Generate new candidates with the ignored `export_native_formatted_insertions` test | ||
| 10 | and `ONESTORE_INSERT_OUTPUT` set to a new absolute directory. Each child directory | ||
| 11 | is a separate notebook: the candidates can share source section identities. | ||
| 12 | Use `tools/native_runner.py` with one child directory and `--expected-pages 1`. | ||
| 13 | `tools/native/formatted-insertion.ps1` performs an unchanged native HTML round trip | ||
| 14 | followed by a native prefix edit for the four nonempty cases. | ||
| 15 | |||
| 16 | The unchanged round trip establishes native font substitution before checking the | ||
| 17 | edit's exact character styles. Table updates omit the outline's measured `Size`: | ||
| 18 | resubmitting it made two unlocked columns oscillate in native XML, including after | ||
| 19 | a fresh cache reopen. Those unsettled captures are excluded. The retained table | ||
| 20 | reverse capture omits that measurement; paragraph and ordinary outline captures | ||
| 21 | retain it. | ||
| 22 | |||
| 23 | `native-cell/ui` records a direct keyboard prefix edit, without HTML resubmission. | ||
| 24 | Its native XML settles, preserves every prior character's style, and the resulting | ||
| 25 | file passes the same model oracle. The capture includes the keyboard script and | ||
| 26 | screenshot. | ||
| 27 | |||
| 28 | COM omits the empty outline. Its cold-reopened file retains the empty rich-text | ||
| 29 | object and style; `empty/typed-after-cold` adds text to that retained object and | ||
| 30 | verifies the 18-point italic result in another independent native cold read. | ||
| 31 | `tools/test_formatted_insertion.py` checks these captures without a live VM. | ||
corpus/formatted-insertion/empty-typed/candidate/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/empty-typed/candidate/synthetic.one differ | |||
corpus/formatted-insertion/empty-typed/cold/notebook/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/empty-typed/cold/notebook/synthetic.one differ | |||
corpus/formatted-insertion/empty-typed/cold/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-7135C1A2", | ||
| 5 | "cold": true, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/empty-typed/cold/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{B38138D7-F157-4B10-8B91-349F1179632C}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:49:19.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{A42E0040-CACE-0692-3494-76901850CE52}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:49:19.000Z" color="#8AA8E4"><one:Page ID="{7D48D92B-74D0-0597-050C-7AF738E2B7E0}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:49:19.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/empty-typed/cold/read/page-000.xml created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{7D48D92B-74D0-0597-050C-7AF738E2B7E0}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:49:19.000Z" pageLevel="1" style="font-family:Calibri;font-size:11.0pt" lang="en-US"><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{A42E0040-CACE-0692-3494-76901850CE52}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{A42E0040-CACE-0692-3494-76901850CE52}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline style="font-family:Calibri;font-size:18.0pt" author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{3BFCF1C3-BFC6-0049-1138-D820866F0C0D}{1}{B0}"><one:Position x="72.0" y="144.0" z="1"/><one:Size width="158.7714996337891" height="21.9726734161377"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{3BFCF1C3-BFC6-0049-1138-D820866F0C0D}{3}{B0}" alignment="left"><one:T><![CDATA[<span | ||
| 3 | style='font-style:italic'>Typed café &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/empty-typed/cold/read/payloads.json created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | [ | ||
| 2 | |||
| 3 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/empty-typed/cold/run.json created+18| ... | @@ -0,0 +1,18 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/empty-typed", | ||
| 3 | "expected_pages": 1, | ||
| 4 | "author": null, | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": false, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 16 | "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" | ||
| 17 | } | ||
| 18 | } | ||
corpus/formatted-insertion/empty-typed/cold/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 6016, | ||
| 5 | "sha256": "855460055414c52034d0cf62b2e855b460deaedc17d1f276d6b3738458608f2e", | ||
| 6 | "mtime_ns": 1788842844349962032 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/formatted-insertion/empty-typed/cold/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
corpus/formatted-insertion/empty-typed/reverse/control-before.xml created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{16390213-3B15-03C0-2FEB-38DCB7F70E1A}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:06:46.000Z" pageLevel="1" style="font-family:Calibri;font-size:11.0pt" lang="en-US"><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{CF5FDB78-850B-00C5-1E73-34BB974577A8}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{CF5FDB78-850B-00C5-1E73-34BB974577A8}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline style="font-family:Calibri;font-size:18.0pt" author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{1}{B0}"><one:Position x="72.0" y="144.0" z="1"/><one:Size width="158.7714996337891" height="21.9726734161377"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{3}{B0}" alignment="left"><one:T><![CDATA[<span | ||
| 3 | style='font-style:italic'>Typed café &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/empty-typed/reverse/control-update.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{16390213-3B15-03C0-2FEB-38DCB7F70E1A}{1}{B0}"><one:Outline style="font-family:Calibri;font-size:18.0pt" author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{1}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="72.0" y="144.0" z="1" /><one:Size width="158.7714996337891" height="21.9726734161377" /><one:Indents><one:Indent level="0" indent="0.0" /></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{3}{B0}" alignment="left"><one:T><![CDATA[<span | ||
| 2 | style='font-style:italic'>Typed café &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/empty-typed/reverse/edit-before.xml created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{16390213-3B15-03C0-2FEB-38DCB7F70E1A}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:06:46.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{CF5FDB78-850B-00C5-1E73-34BB974577A8}{23}{B0}"><one:Position x="36.0" y="36.0" z="1"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{CF5FDB78-850B-00C5-1E73-34BB974577A8}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{1}{B0}"><one:Position x="72.0" y="144.0" z="0"/><one:Size width="158.7714996337891" height="21.9726734161377"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{3}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:18.0pt"><one:T><![CDATA[<span | ||
| 3 | style='font-style:italic'>Typed café &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/empty-typed/reverse/edit-update.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{16390213-3B15-03C0-2FEB-38DCB7F70E1A}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{1}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="72.0" y="144.0" z="0" /><one:Size width="158.7714996337891" height="21.9726734161377" /><one:Indents><one:Indent level="0" indent="0.0" /></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{3}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:18.0pt"><one:T>&lt;span | ||
| 2 | style='font-style:italic'&gt;Native Typed café &amp;#129408;&lt;/span&gt;</one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/empty-typed/reverse/notebook/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/empty-typed/reverse/notebook/synthetic.one differ | |||
corpus/formatted-insertion/empty-typed/reverse/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-8F1E54CA", | ||
| 5 | "cold": false, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/empty-typed/reverse/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{F9BA22F6-DA01-4734-87A1-B4C6DD99C88D}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:07:07.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{3639FAA6-1E08-0FC0-3700-B846335A2C86}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:07:07.000Z" color="#8AA8E4"><one:Page ID="{EF5F23CD-A016-0CC5-0698-B42113E85534}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:07:07.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/empty-typed/reverse/read/page-000.xml created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{EF5F23CD-A016-0CC5-0698-B42113E85534}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:07:07.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{3639FAA6-1E08-0FC0-3700-B846335A2C86}{23}{B0}"><one:Position x="36.0" y="36.0" z="1"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{3639FAA6-1E08-0FC0-3700-B846335A2C86}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{A9EB0B25-6B00-091B-12AC-16F6AD65EED9}{1}{B0}"><one:Position x="72.0" y="144.0" z="0"/><one:Size width="158.7714996337891" height="43.9453468322754"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{A9EB0B25-6B00-091B-12AC-16F6AD65EED9}{3}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:18.0pt"><one:T><![CDATA[<span | ||
| 3 | style='font-style:italic'>Native Typed café &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/empty-typed/reverse/read/payloads.json created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | [ | ||
| 2 | |||
| 3 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/empty-typed/reverse/reverse-verification.json created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | { | ||
| 2 | "paragraphs": 2, | ||
| 3 | "characters": 27, | ||
| 4 | "exact_native_character_styles_after_control": true | ||
| 5 | } | ||
corpus/formatted-insertion/empty-typed/reverse/run.json created+19| ... | @@ -0,0 +1,19 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/empty-typed", | ||
| 3 | "expected_pages": 1, | ||
| 4 | "author": "evidence/m10/formatted-reverse-controlled.ps1", | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": false, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "author.ps1": "4362d0ba551eb00b2eca1c5563d76352469f85d3981155bf2682c159a03ddedb", | ||
| 16 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 17 | "read.ps1": "df4244a18ab3e9c21083b8df61b08b863e8cce0ec4bf0c9cd742a8ee6f79877d" | ||
| 18 | } | ||
| 19 | } | ||
corpus/formatted-insertion/empty-typed/reverse/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 6016, | ||
| 5 | "sha256": "855460055414c52034d0cf62b2e855b460deaedc17d1f276d6b3738458608f2e", | ||
| 6 | "mtime_ns": 1788842844349962032 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/formatted-insertion/empty-typed/reverse/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
corpus/formatted-insertion/empty/candidate/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/empty/candidate/synthetic.one differ | |||
corpus/formatted-insertion/empty/cold/notebook/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/empty/cold/notebook/synthetic.one differ | |||
corpus/formatted-insertion/empty/cold/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-6DB25082", | ||
| 5 | "cold": true, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/empty/cold/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{A60F5D0F-AE39-49B1-B687-94A26771424E}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:49:17.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{8EAF1BA2-D0D2-0DEF-0CDD-B07549372B65}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:49:17.000Z" color="#8AA8E4"><one:Page ID="{57C9C2C9-6ECC-0EEA-3D45-BC12698552D7}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:49:17.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/empty/cold/read/page-000.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{57C9C2C9-6ECC-0EEA-3D45-BC12698552D7}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:49:17.000Z" pageLevel="1" style="font-family:Calibri;font-size:11.0pt" lang="en-US"><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{8EAF1BA2-D0D2-0DEF-0CDD-B07549372B65}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{8EAF1BA2-D0D2-0DEF-0CDD-B07549372B65}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/empty/cold/read/payloads.json created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | [ | ||
| 2 | |||
| 3 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/empty/cold/run.json created+18| ... | @@ -0,0 +1,18 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/empty", | ||
| 3 | "expected_pages": 1, | ||
| 4 | "author": null, | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": false, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 16 | "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" | ||
| 17 | } | ||
| 18 | } | ||
corpus/formatted-insertion/empty/cold/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 5624, | ||
| 5 | "sha256": "bd592be42dc93e95444174ceceb19d1fc718fbe53c08403f87b6dec3207dc38d", | ||
| 6 | "mtime_ns": 1788842844347041269 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/formatted-insertion/empty/cold/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
corpus/formatted-insertion/empty/typed-after-cold/candidate/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/empty/typed-after-cold/candidate/synthetic.one differ | |||
corpus/formatted-insertion/empty/typed-after-cold/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-2A09ABA3", | ||
| 5 | "cold": true, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/empty/typed-after-cold/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{57C8FDE8-BE28-4C01-8B6F-A901BAEA2926}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:57:05.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{AE4499B4-D894-042B-2496-FDB9EA794340}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:57:05.000Z" color="#8AA8E4"><one:Page ID="{772240DF-668A-072E-150E-F1DECACB3AF2}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:57:05.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/empty/typed-after-cold/read/page-000.xml created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{772240DF-668A-072E-150E-F1DECACB3AF2}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:57:05.000Z" pageLevel="1" style="font-family:Calibri;font-size:11.0pt" lang="en-US"><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{AE4499B4-D894-042B-2496-FDB9EA794340}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{AE4499B4-D894-042B-2496-FDB9EA794340}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline style="font-family:Calibri;font-size:18.0pt" author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:53:58.000Z" objectID="{6EC06BD8-3CC0-0838-13B5-8BFED2119B71}{1}{B0}"><one:Position x="72.0" y="144.0" z="1"/><one:Size width="268.0195007324219" height="21.9726734161377"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:53:58.000Z" objectID="{6EC06BD8-3CC0-0838-13B5-8BFED2119B71}{3}{B0}" alignment="left"><one:T><![CDATA[<span | ||
| 3 | style='font-style:italic'>Typed after native reopen &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/empty/typed-after-cold/read/payloads.json created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | [ | ||
| 2 | |||
| 3 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/manifest.json created+963| ... | @@ -0,0 +1,963 @@ | ||
| 1 | { | ||
| 2 | "generator": "crates/onestore/tests/insertion.rs:export_native_formatted_insertions", | ||
| 3 | "cases": [ | ||
| 4 | { | ||
| 5 | "intent": { | ||
| 6 | "author": "Rich author", | ||
| 7 | "created": 1473310044, | ||
| 8 | "formats": [ | ||
| 9 | { | ||
| 10 | "attributes": [ | ||
| 11 | { | ||
| 12 | "Bold": true | ||
| 13 | }, | ||
| 14 | { | ||
| 15 | "Underline": true | ||
| 16 | } | ||
| 17 | ], | ||
| 18 | "guid": [ | ||
| 19 | 207, | ||
| 20 | 169, | ||
| 21 | 223, | ||
| 22 | 216, | ||
| 23 | 230, | ||
| 24 | 235, | ||
| 25 | 235, | ||
| 26 | 75, | ||
| 27 | 185, | ||
| 28 | 94, | ||
| 29 | 69, | ||
| 30 | 228, | ||
| 31 | 117, | ||
| 32 | 205, | ||
| 33 | 151, | ||
| 34 | 134 | ||
| 35 | ], | ||
| 36 | "range": { | ||
| 37 | "end": 4, | ||
| 38 | "start": 0 | ||
| 39 | } | ||
| 40 | }, | ||
| 41 | { | ||
| 42 | "attributes": [ | ||
| 43 | { | ||
| 44 | "Font": "Arial" | ||
| 45 | }, | ||
| 46 | { | ||
| 47 | "FontSize": 13.5 | ||
| 48 | } | ||
| 49 | ], | ||
| 50 | "guid": [ | ||
| 51 | 233, | ||
| 52 | 34, | ||
| 53 | 183, | ||
| 54 | 44, | ||
| 55 | 7, | ||
| 56 | 99, | ||
| 57 | 201, | ||
| 58 | 75, | ||
| 59 | 140, | ||
| 60 | 220, | ||
| 61 | 83, | ||
| 62 | 226, | ||
| 63 | 209, | ||
| 64 | 176, | ||
| 65 | 83, | ||
| 66 | 88 | ||
| 67 | ], | ||
| 68 | "range": { | ||
| 69 | "end": 7, | ||
| 70 | "start": 5 | ||
| 71 | } | ||
| 72 | }, | ||
| 73 | { | ||
| 74 | "attributes": [ | ||
| 75 | { | ||
| 76 | "Italic": true | ||
| 77 | }, | ||
| 78 | { | ||
| 79 | "Strike": true | ||
| 80 | } | ||
| 81 | ], | ||
| 82 | "guid": [ | ||
| 83 | 30, | ||
| 84 | 196, | ||
| 85 | 121, | ||
| 86 | 136, | ||
| 87 | 27, | ||
| 88 | 75, | ||
| 89 | 93, | ||
| 90 | 79, | ||
| 91 | 181, | ||
| 92 | 130, | ||
| 93 | 25, | ||
| 94 | 17, | ||
| 95 | 13, | ||
| 96 | 139, | ||
| 97 | 35, | ||
| 98 | 217 | ||
| 99 | ], | ||
| 100 | "range": { | ||
| 101 | "end": 14, | ||
| 102 | "start": 8 | ||
| 103 | } | ||
| 104 | }, | ||
| 105 | { | ||
| 106 | "attributes": [ | ||
| 107 | { | ||
| 108 | "Superscript": true | ||
| 109 | } | ||
| 110 | ], | ||
| 111 | "guid": [ | ||
| 112 | 101, | ||
| 113 | 236, | ||
| 114 | 26, | ||
| 115 | 203, | ||
| 116 | 134, | ||
| 117 | 120, | ||
| 118 | 215, | ||
| 119 | 67, | ||
| 120 | 170, | ||
| 121 | 155, | ||
| 122 | 81, | ||
| 123 | 250, | ||
| 124 | 86, | ||
| 125 | 214, | ||
| 126 | 214, | ||
| 127 | 111 | ||
| 128 | ], | ||
| 129 | "range": { | ||
| 130 | "end": 17, | ||
| 131 | "start": 15 | ||
| 132 | } | ||
| 133 | }, | ||
| 134 | { | ||
| 135 | "attributes": [ | ||
| 136 | { | ||
| 137 | "Color": [ | ||
| 138 | 12, | ||
| 139 | 34, | ||
| 140 | 56 | ||
| 141 | ] | ||
| 142 | }, | ||
| 143 | { | ||
| 144 | "Highlight": [ | ||
| 145 | 255, | ||
| 146 | 255, | ||
| 147 | 0 | ||
| 148 | ] | ||
| 149 | } | ||
| 150 | ], | ||
| 151 | "guid": [ | ||
| 152 | 57, | ||
| 153 | 2, | ||
| 154 | 72, | ||
| 155 | 237, | ||
| 156 | 92, | ||
| 157 | 155, | ||
| 158 | 100, | ||
| 159 | 72, | ||
| 160 | 130, | ||
| 161 | 100, | ||
| 162 | 120, | ||
| 163 | 181, | ||
| 164 | 179, | ||
| 165 | 69, | ||
| 166 | 97, | ||
| 167 | 11 | ||
| 168 | ], | ||
| 169 | "range": { | ||
| 170 | "end": 23, | ||
| 171 | "start": 18 | ||
| 172 | } | ||
| 173 | }, | ||
| 174 | { | ||
| 175 | "attributes": [ | ||
| 176 | { | ||
| 177 | "Subscript": true | ||
| 178 | } | ||
| 179 | ], | ||
| 180 | "guid": [ | ||
| 181 | 189, | ||
| 182 | 73, | ||
| 183 | 14, | ||
| 184 | 147, | ||
| 185 | 222, | ||
| 186 | 140, | ||
| 187 | 144, | ||
| 188 | 65, | ||
| 189 | 176, | ||
| 190 | 86, | ||
| 191 | 229, | ||
| 192 | 249, | ||
| 193 | 220, | ||
| 194 | 119, | ||
| 195 | 252, | ||
| 196 | 192 | ||
| 197 | ], | ||
| 198 | "range": { | ||
| 199 | "end": 26, | ||
| 200 | "start": 24 | ||
| 201 | } | ||
| 202 | }, | ||
| 203 | { | ||
| 204 | "attributes": [ | ||
| 205 | { | ||
| 206 | "Bold": false | ||
| 207 | }, | ||
| 208 | { | ||
| 209 | "Italic": false | ||
| 210 | }, | ||
| 211 | { | ||
| 212 | "Color": null | ||
| 213 | }, | ||
| 214 | { | ||
| 215 | "Highlight": null | ||
| 216 | } | ||
| 217 | ], | ||
| 218 | "guid": [ | ||
| 219 | 165, | ||
| 220 | 80, | ||
| 221 | 86, | ||
| 222 | 53, | ||
| 223 | 207, | ||
| 224 | 121, | ||
| 225 | 164, | ||
| 226 | 68, | ||
| 227 | 169, | ||
| 228 | 152, | ||
| 229 | 106, | ||
| 230 | 34, | ||
| 231 | 115, | ||
| 232 | 110, | ||
| 233 | 230, | ||
| 234 | 151 | ||
| 235 | ], | ||
| 236 | "range": { | ||
| 237 | "end": 30, | ||
| 238 | "start": 27 | ||
| 239 | } | ||
| 240 | } | ||
| 241 | ], | ||
| 242 | "guid": [ | ||
| 243 | 205, | ||
| 244 | 161, | ||
| 245 | 237, | ||
| 246 | 192, | ||
| 247 | 33, | ||
| 248 | 131, | ||
| 249 | 161, | ||
| 250 | 64, | ||
| 251 | 168, | ||
| 252 | 94, | ||
| 253 | 233, | ||
| 254 | 150, | ||
| 255 | 178, | ||
| 256 | 37, | ||
| 257 | 36, | ||
| 258 | 190 | ||
| 259 | ], | ||
| 260 | "parent": "{71AF36A5-6150-452F-B7F3-66BFFF4C3582},22", | ||
| 261 | "placement": { | ||
| 262 | "Outline": { | ||
| 263 | "x": 72.0, | ||
| 264 | "y": 144.0 | ||
| 265 | } | ||
| 266 | }, | ||
| 267 | "text": "Bold \ud83e\udd80 italic e\u0301 color \u6771\u4eac\rEnd" | ||
| 268 | }, | ||
| 269 | "name": "outline", | ||
| 270 | "space": "{A8C9EFCE-DF4E-462A-866B-6AD8DFFE4C30},1", | ||
| 271 | "candidate_sha256": "76f6b743caa9dc2b5ab342d6e6a742125ecbcd0ca2372062b42acbd08b5ebb4c", | ||
| 272 | "cold_sha256": "151a49d8cf2e607a10a9c948286ce7eb3eb754fa90e9557a74a2cb1f1f0204cb", | ||
| 273 | "reverse_sha256": "8127b63d52ecbc2ad88a0d4f0eccb7fc8b086983f25db40b5f3396616f39cc53", | ||
| 274 | "omitted_table_outline_size": false | ||
| 275 | }, | ||
| 276 | { | ||
| 277 | "intent": { | ||
| 278 | "author": "Rich author", | ||
| 279 | "created": 1473310044, | ||
| 280 | "formats": [ | ||
| 281 | { | ||
| 282 | "attributes": [ | ||
| 283 | { | ||
| 284 | "Bold": true | ||
| 285 | }, | ||
| 286 | { | ||
| 287 | "Underline": true | ||
| 288 | } | ||
| 289 | ], | ||
| 290 | "guid": [ | ||
| 291 | 141, | ||
| 292 | 194, | ||
| 293 | 83, | ||
| 294 | 170, | ||
| 295 | 169, | ||
| 296 | 68, | ||
| 297 | 33, | ||
| 298 | 76, | ||
| 299 | 139, | ||
| 300 | 83, | ||
| 301 | 12, | ||
| 302 | 156, | ||
| 303 | 72, | ||
| 304 | 95, | ||
| 305 | 145, | ||
| 306 | 140 | ||
| 307 | ], | ||
| 308 | "range": { | ||
| 309 | "end": 4, | ||
| 310 | "start": 0 | ||
| 311 | } | ||
| 312 | }, | ||
| 313 | { | ||
| 314 | "attributes": [ | ||
| 315 | { | ||
| 316 | "Font": "Arial" | ||
| 317 | }, | ||
| 318 | { | ||
| 319 | "FontSize": 13.5 | ||
| 320 | } | ||
| 321 | ], | ||
| 322 | "guid": [ | ||
| 323 | 168, | ||
| 324 | 249, | ||
| 325 | 0, | ||
| 326 | 182, | ||
| 327 | 1, | ||
| 328 | 200, | ||
| 329 | 117, | ||
| 330 | 66, | ||
| 331 | 179, | ||
| 332 | 210, | ||
| 333 | 69, | ||
| 334 | 6, | ||
| 335 | 83, | ||
| 336 | 62, | ||
| 337 | 157, | ||
| 338 | 171 | ||
| 339 | ], | ||
| 340 | "range": { | ||
| 341 | "end": 7, | ||
| 342 | "start": 5 | ||
| 343 | } | ||
| 344 | }, | ||
| 345 | { | ||
| 346 | "attributes": [ | ||
| 347 | { | ||
| 348 | "Italic": true | ||
| 349 | }, | ||
| 350 | { | ||
| 351 | "Strike": true | ||
| 352 | } | ||
| 353 | ], | ||
| 354 | "guid": [ | ||
| 355 | 152, | ||
| 356 | 84, | ||
| 357 | 172, | ||
| 358 | 67, | ||
| 359 | 218, | ||
| 360 | 72, | ||
| 361 | 77, | ||
| 362 | 67, | ||
| 363 | 143, | ||
| 364 | 158, | ||
| 365 | 58, | ||
| 366 | 16, | ||
| 367 | 177, | ||
| 368 | 251, | ||
| 369 | 222, | ||
| 370 | 20 | ||
| 371 | ], | ||
| 372 | "range": { | ||
| 373 | "end": 14, | ||
| 374 | "start": 8 | ||
| 375 | } | ||
| 376 | }, | ||
| 377 | { | ||
| 378 | "attributes": [ | ||
| 379 | { | ||
| 380 | "Superscript": true | ||
| 381 | } | ||
| 382 | ], | ||
| 383 | "guid": [ | ||
| 384 | 29, | ||
| 385 | 165, | ||
| 386 | 47, | ||
| 387 | 217, | ||
| 388 | 107, | ||
| 389 | 120, | ||
| 390 | 31, | ||
| 391 | 79, | ||
| 392 | 148, | ||
| 393 | 67, | ||
| 394 | 148, | ||
| 395 | 232, | ||
| 396 | 78, | ||
| 397 | 245, | ||
| 398 | 157, | ||
| 399 | 68 | ||
| 400 | ], | ||
| 401 | "range": { | ||
| 402 | "end": 17, | ||
| 403 | "start": 15 | ||
| 404 | } | ||
| 405 | }, | ||
| 406 | { | ||
| 407 | "attributes": [ | ||
| 408 | { | ||
| 409 | "Color": [ | ||
| 410 | 12, | ||
| 411 | 34, | ||
| 412 | 56 | ||
| 413 | ] | ||
| 414 | }, | ||
| 415 | { | ||
| 416 | "Highlight": [ | ||
| 417 | 255, | ||
| 418 | 255, | ||
| 419 | 0 | ||
| 420 | ] | ||
| 421 | } | ||
| 422 | ], | ||
| 423 | "guid": [ | ||
| 424 | 165, | ||
| 425 | 189, | ||
| 426 | 67, | ||
| 427 | 237, | ||
| 428 | 2, | ||
| 429 | 56, | ||
| 430 | 67, | ||
| 431 | 70, | ||
| 432 | 169, | ||
| 433 | 71, | ||
| 434 | 239, | ||
| 435 | 10, | ||
| 436 | 236, | ||
| 437 | 192, | ||
| 438 | 119, | ||
| 439 | 48 | ||
| 440 | ], | ||
| 441 | "range": { | ||
| 442 | "end": 23, | ||
| 443 | "start": 18 | ||
| 444 | } | ||
| 445 | }, | ||
| 446 | { | ||
| 447 | "attributes": [ | ||
| 448 | { | ||
| 449 | "Subscript": true | ||
| 450 | } | ||
| 451 | ], | ||
| 452 | "guid": [ | ||
| 453 | 116, | ||
| 454 | 118, | ||
| 455 | 37, | ||
| 456 | 115, | ||
| 457 | 74, | ||
| 458 | 111, | ||
| 459 | 247, | ||
| 460 | 70, | ||
| 461 | 172, | ||
| 462 | 126, | ||
| 463 | 100, | ||
| 464 | 131, | ||
| 465 | 159, | ||
| 466 | 151, | ||
| 467 | 38, | ||
| 468 | 234 | ||
| 469 | ], | ||
| 470 | "range": { | ||
| 471 | "end": 26, | ||
| 472 | "start": 24 | ||
| 473 | } | ||
| 474 | }, | ||
| 475 | { | ||
| 476 | "attributes": [ | ||
| 477 | { | ||
| 478 | "Bold": false | ||
| 479 | }, | ||
| 480 | { | ||
| 481 | "Italic": false | ||
| 482 | }, | ||
| 483 | { | ||
| 484 | "Color": null | ||
| 485 | }, | ||
| 486 | { | ||
| 487 | "Highlight": null | ||
| 488 | } | ||
| 489 | ], | ||
| 490 | "guid": [ | ||
| 491 | 32, | ||
| 492 | 151, | ||
| 493 | 42, | ||
| 494 | 7, | ||
| 495 | 76, | ||
| 496 | 55, | ||
| 497 | 143, | ||
| 498 | 75, | ||
| 499 | 178, | ||
| 500 | 217, | ||
| 501 | 234, | ||
| 502 | 71, | ||
| 503 | 135, | ||
| 504 | 25, | ||
| 505 | 75, | ||
| 506 | 145 | ||
| 507 | ], | ||
| 508 | "range": { | ||
| 509 | "end": 30, | ||
| 510 | "start": 27 | ||
| 511 | } | ||
| 512 | } | ||
| 513 | ], | ||
| 514 | "guid": [ | ||
| 515 | 191, | ||
| 516 | 62, | ||
| 517 | 177, | ||
| 518 | 4, | ||
| 519 | 17, | ||
| 520 | 246, | ||
| 521 | 2, | ||
| 522 | 68, | ||
| 523 | 130, | ||
| 524 | 157, | ||
| 525 | 199, | ||
| 526 | 46, | ||
| 527 | 35, | ||
| 528 | 34, | ||
| 529 | 28, | ||
| 530 | 139 | ||
| 531 | ], | ||
| 532 | "parent": "{03D49648-056C-0F08-32C9-0424E8496E7D},10", | ||
| 533 | "placement": { | ||
| 534 | "Paragraph": { | ||
| 535 | "before": "{03D49648-056C-0F08-32C9-0424E8496E7D},11" | ||
| 536 | } | ||
| 537 | }, | ||
| 538 | "text": "Bold \ud83e\udd80 italic e\u0301 color \u6771\u4eac\rEnd" | ||
| 539 | }, | ||
| 540 | "name": "native-paragraph", | ||
| 541 | "space": "{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1", | ||
| 542 | "candidate_sha256": "202823512283be980b6a139adcf5f4f369d15f17d60ed7b23f9f2289513aa4e9", | ||
| 543 | "cold_sha256": "efb61aaedbe12cb00434f7e581259d112480158cacb66961d4168081b77a1112", | ||
| 544 | "reverse_sha256": "753b320528748faa1ae11ee5eb710530d15636361674aab37f4c442ee5b9dd7b", | ||
| 545 | "omitted_table_outline_size": false | ||
| 546 | }, | ||
| 547 | { | ||
| 548 | "intent": { | ||
| 549 | "author": "Rich author", | ||
| 550 | "created": 1473310044, | ||
| 551 | "formats": [ | ||
| 552 | { | ||
| 553 | "attributes": [ | ||
| 554 | { | ||
| 555 | "Bold": true | ||
| 556 | }, | ||
| 557 | { | ||
| 558 | "Underline": true | ||
| 559 | } | ||
| 560 | ], | ||
| 561 | "guid": [ | ||
| 562 | 148, | ||
| 563 | 53, | ||
| 564 | 156, | ||
| 565 | 113, | ||
| 566 | 44, | ||
| 567 | 188, | ||
| 568 | 95, | ||
| 569 | 71, | ||
| 570 | 170, | ||
| 571 | 198, | ||
| 572 | 38, | ||
| 573 | 41, | ||
| 574 | 148, | ||
| 575 | 201, | ||
| 576 | 99, | ||
| 577 | 234 | ||
| 578 | ], | ||
| 579 | "range": { | ||
| 580 | "end": 4, | ||
| 581 | "start": 0 | ||
| 582 | } | ||
| 583 | }, | ||
| 584 | { | ||
| 585 | "attributes": [ | ||
| 586 | { | ||
| 587 | "Font": "Arial" | ||
| 588 | }, | ||
| 589 | { | ||
| 590 | "FontSize": 13.5 | ||
| 591 | } | ||
| 592 | ], | ||
| 593 | "guid": [ | ||
| 594 | 17, | ||
| 595 | 187, | ||
| 596 | 223, | ||
| 597 | 32, | ||
| 598 | 237, | ||
| 599 | 203, | ||
| 600 | 222, | ||
| 601 | 66, | ||
| 602 | 134, | ||
| 603 | 24, | ||
| 604 | 65, | ||
| 605 | 131, | ||
| 606 | 32, | ||
| 607 | 188, | ||
| 608 | 202, | ||
| 609 | 177 | ||
| 610 | ], | ||
| 611 | "range": { | ||
| 612 | "end": 7, | ||
| 613 | "start": 5 | ||
| 614 | } | ||
| 615 | }, | ||
| 616 | { | ||
| 617 | "attributes": [ | ||
| 618 | { | ||
| 619 | "Italic": true | ||
| 620 | }, | ||
| 621 | { | ||
| 622 | "Strike": true | ||
| 623 | } | ||
| 624 | ], | ||
| 625 | "guid": [ | ||
| 626 | 201, | ||
| 627 | 233, | ||
| 628 | 230, | ||
| 629 | 86, | ||
| 630 | 91, | ||
| 631 | 117, | ||
| 632 | 20, | ||
| 633 | 68, | ||
| 634 | 142, | ||
| 635 | 220, | ||
| 636 | 224, | ||
| 637 | 178, | ||
| 638 | 139, | ||
| 639 | 52, | ||
| 640 | 180, | ||
| 641 | 203 | ||
| 642 | ], | ||
| 643 | "range": { | ||
| 644 | "end": 14, | ||
| 645 | "start": 8 | ||
| 646 | } | ||
| 647 | }, | ||
| 648 | { | ||
| 649 | "attributes": [ | ||
| 650 | { | ||
| 651 | "Superscript": true | ||
| 652 | } | ||
| 653 | ], | ||
| 654 | "guid": [ | ||
| 655 | 145, | ||
| 656 | 203, | ||
| 657 | 90, | ||
| 658 | 115, | ||
| 659 | 34, | ||
| 660 | 107, | ||
| 661 | 73, | ||
| 662 | 66, | ||
| 663 | 160, | ||
| 664 | 157, | ||
| 665 | 25, | ||
| 666 | 141, | ||
| 667 | 249, | ||
| 668 | 128, | ||
| 669 | 72, | ||
| 670 | 159 | ||
| 671 | ], | ||
| 672 | "range": { | ||
| 673 | "end": 17, | ||
| 674 | "start": 15 | ||
| 675 | } | ||
| 676 | }, | ||
| 677 | { | ||
| 678 | "attributes": [ | ||
| 679 | { | ||
| 680 | "Color": [ | ||
| 681 | 12, | ||
| 682 | 34, | ||
| 683 | 56 | ||
| 684 | ] | ||
| 685 | }, | ||
| 686 | { | ||
| 687 | "Highlight": [ | ||
| 688 | 255, | ||
| 689 | 255, | ||
| 690 | 0 | ||
| 691 | ] | ||
| 692 | } | ||
| 693 | ], | ||
| 694 | "guid": [ | ||
| 695 | 53, | ||
| 696 | 51, | ||
| 697 | 180, | ||
| 698 | 64, | ||
| 699 | 45, | ||
| 700 | 92, | ||
| 701 | 153, | ||
| 702 | 70, | ||
| 703 | 163, | ||
| 704 | 88, | ||
| 705 | 171, | ||
| 706 | 172, | ||
| 707 | 200, | ||
| 708 | 222, | ||
| 709 | 35, | ||
| 710 | 19 | ||
| 711 | ], | ||
| 712 | "range": { | ||
| 713 | "end": 23, | ||
| 714 | "start": 18 | ||
| 715 | } | ||
| 716 | }, | ||
| 717 | { | ||
| 718 | "attributes": [ | ||
| 719 | { | ||
| 720 | "Subscript": true | ||
| 721 | } | ||
| 722 | ], | ||
| 723 | "guid": [ | ||
| 724 | 249, | ||
| 725 | 231, | ||
| 726 | 26, | ||
| 727 | 88, | ||
| 728 | 247, | ||
| 729 | 6, | ||
| 730 | 107, | ||
| 731 | 65, | ||
| 732 | 131, | ||
| 733 | 6, | ||
| 734 | 89, | ||
| 735 | 211, | ||
| 736 | 188, | ||
| 737 | 246, | ||
| 738 | 100, | ||
| 739 | 155 | ||
| 740 | ], | ||
| 741 | "range": { | ||
| 742 | "end": 26, | ||
| 743 | "start": 24 | ||
| 744 | } | ||
| 745 | }, | ||
| 746 | { | ||
| 747 | "attributes": [ | ||
| 748 | { | ||
| 749 | "Bold": false | ||
| 750 | }, | ||
| 751 | { | ||
| 752 | "Italic": false | ||
| 753 | }, | ||
| 754 | { | ||
| 755 | "Color": null | ||
| 756 | }, | ||
| 757 | { | ||
| 758 | "Highlight": null | ||
| 759 | } | ||
| 760 | ], | ||
| 761 | "guid": [ | ||
| 762 | 136, | ||
| 763 | 160, | ||
| 764 | 124, | ||
| 765 | 20, | ||
| 766 | 185, | ||
| 767 | 141, | ||
| 768 | 156, | ||
| 769 | 75, | ||
| 770 | 163, | ||
| 771 | 89, | ||
| 772 | 177, | ||
| 773 | 152, | ||
| 774 | 149, | ||
| 775 | 251, | ||
| 776 | 1, | ||
| 777 | 204 | ||
| 778 | ], | ||
| 779 | "range": { | ||
| 780 | "end": 30, | ||
| 781 | "start": 27 | ||
| 782 | } | ||
| 783 | } | ||
| 784 | ], | ||
| 785 | "guid": [ | ||
| 786 | 245, | ||
| 787 | 178, | ||
| 788 | 40, | ||
| 789 | 105, | ||
| 790 | 54, | ||
| 791 | 125, | ||
| 792 | 175, | ||
| 793 | 68, | ||
| 794 | 190, | ||
| 795 | 59, | ||
| 796 | 54, | ||
| 797 | 206, | ||
| 798 | 186, | ||
| 799 | 206, | ||
| 800 | 134, | ||
| 801 | 87 | ||
| 802 | ], | ||
| 803 | "parent": "{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14", | ||
| 804 | "placement": { | ||
| 805 | "Paragraph": { | ||
| 806 | "before": null | ||
| 807 | } | ||
| 808 | }, | ||
| 809 | "text": "Bold \ud83e\udd80 italic e\u0301 color \u6771\u4eac\rEnd" | ||
| 810 | }, | ||
| 811 | "name": "native-cell", | ||
| 812 | "space": "{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1", | ||
| 813 | "candidate_sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351", | ||
| 814 | "cold_sha256": "b7324075349e45f31d9e9fb8638691f58efff1989be65f12f7711dc359898a64", | ||
| 815 | "reverse_sha256": "04134b8db9b52aaf43dc5dfc90464d54802890e5d4966e7163a977e2ebd77e1e", | ||
| 816 | "omitted_table_outline_size": true, | ||
| 817 | "ui_sha256": "d67b70016af71db07a8012b85a5016897c08b715c6db8953e1fc45cfe008bc27" | ||
| 818 | }, | ||
| 819 | { | ||
| 820 | "intent": { | ||
| 821 | "author": "Rich author", | ||
| 822 | "created": 1473310044, | ||
| 823 | "formats": [ | ||
| 824 | { | ||
| 825 | "attributes": [ | ||
| 826 | { | ||
| 827 | "Italic": true | ||
| 828 | }, | ||
| 829 | { | ||
| 830 | "FontSize": 18.0 | ||
| 831 | } | ||
| 832 | ], | ||
| 833 | "guid": [ | ||
| 834 | 135, | ||
| 835 | 82, | ||
| 836 | 13, | ||
| 837 | 244, | ||
| 838 | 205, | ||
| 839 | 187, | ||
| 840 | 105, | ||
| 841 | 65, | ||
| 842 | 153, | ||
| 843 | 17, | ||
| 844 | 70, | ||
| 845 | 241, | ||
| 846 | 83, | ||
| 847 | 89, | ||
| 848 | 99, | ||
| 849 | 163 | ||
| 850 | ], | ||
| 851 | "range": { | ||
| 852 | "end": 0, | ||
| 853 | "start": 0 | ||
| 854 | } | ||
| 855 | } | ||
| 856 | ], | ||
| 857 | "guid": [ | ||
| 858 | 201, | ||
| 859 | 196, | ||
| 860 | 43, | ||
| 861 | 177, | ||
| 862 | 4, | ||
| 863 | 133, | ||
| 864 | 60, | ||
| 865 | 73, | ||
| 866 | 128, | ||
| 867 | 208, | ||
| 868 | 16, | ||
| 869 | 248, | ||
| 870 | 199, | ||
| 871 | 36, | ||
| 872 | 237, | ||
| 873 | 179 | ||
| 874 | ], | ||
| 875 | "parent": "{71AF36A5-6150-452F-B7F3-66BFFF4C3582},22", | ||
| 876 | "placement": { | ||
| 877 | "Outline": { | ||
| 878 | "x": 72.0, | ||
| 879 | "y": 144.0 | ||
| 880 | } | ||
| 881 | }, | ||
| 882 | "text": "" | ||
| 883 | }, | ||
| 884 | "name": "empty", | ||
| 885 | "space": "{A8C9EFCE-DF4E-462A-866B-6AD8DFFE4C30},1", | ||
| 886 | "candidate_sha256": "bd592be42dc93e95444174ceceb19d1fc718fbe53c08403f87b6dec3207dc38d", | ||
| 887 | "cold_sha256": "a0a59d1c5676e2b6742e13791f888c91a3e0494c980b66fb6ef0a3bf324fac7a" | ||
| 888 | }, | ||
| 889 | { | ||
| 890 | "intent": { | ||
| 891 | "author": "Rich author", | ||
| 892 | "created": 1473310044, | ||
| 893 | "formats": [ | ||
| 894 | { | ||
| 895 | "attributes": [ | ||
| 896 | { | ||
| 897 | "Italic": true | ||
| 898 | }, | ||
| 899 | { | ||
| 900 | "FontSize": 18.0 | ||
| 901 | } | ||
| 902 | ], | ||
| 903 | "guid": [ | ||
| 904 | 183, | ||
| 905 | 9, | ||
| 906 | 145, | ||
| 907 | 10, | ||
| 908 | 11, | ||
| 909 | 69, | ||
| 910 | 244, | ||
| 911 | 73, | ||
| 912 | 144, | ||
| 913 | 49, | ||
| 914 | 203, | ||
| 915 | 207, | ||
| 916 | 41, | ||
| 917 | 174, | ||
| 918 | 161, | ||
| 919 | 107 | ||
| 920 | ], | ||
| 921 | "range": { | ||
| 922 | "end": 0, | ||
| 923 | "start": 0 | ||
| 924 | } | ||
| 925 | } | ||
| 926 | ], | ||
| 927 | "guid": [ | ||
| 928 | 38, | ||
| 929 | 199, | ||
| 930 | 125, | ||
| 931 | 238, | ||
| 932 | 88, | ||
| 933 | 20, | ||
| 934 | 244, | ||
| 935 | 67, | ||
| 936 | 146, | ||
| 937 | 95, | ||
| 938 | 200, | ||
| 939 | 15, | ||
| 940 | 97, | ||
| 941 | 115, | ||
| 942 | 247, | ||
| 943 | 221 | ||
| 944 | ], | ||
| 945 | "parent": "{71AF36A5-6150-452F-B7F3-66BFFF4C3582},22", | ||
| 946 | "placement": { | ||
| 947 | "Outline": { | ||
| 948 | "x": 72.0, | ||
| 949 | "y": 144.0 | ||
| 950 | } | ||
| 951 | }, | ||
| 952 | "text": "" | ||
| 953 | }, | ||
| 954 | "name": "empty-typed", | ||
| 955 | "space": "{A8C9EFCE-DF4E-462A-866B-6AD8DFFE4C30},1", | ||
| 956 | "candidate_sha256": "855460055414c52034d0cf62b2e855b460deaedc17d1f276d6b3738458608f2e", | ||
| 957 | "cold_sha256": "12dcec5c696b989e0f78d76db6af8542104dec82e90b705269d53a8c52332871", | ||
| 958 | "reverse_sha256": "bc64aba71aba93596edff6ed270ea8ff17285c31cb79e357a5640edf6e934112", | ||
| 959 | "omitted_table_outline_size": false | ||
| 960 | } | ||
| 961 | ], | ||
| 962 | "native_author": "tools/native/formatted-insertion.ps1" | ||
| 963 | } | ||
corpus/formatted-insertion/native-cell/candidate/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/native-cell/candidate/synthetic.one differ | |||
corpus/formatted-insertion/native-cell/cold/notebook/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/native-cell/cold/notebook/synthetic.one differ | |||
corpus/formatted-insertion/native-cell/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../../append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/cold/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-382BC211", | ||
| 5 | "cold": true, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/native-cell/cold/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{C908BAFF-4738-41AD-8781-DF368EC1A41C}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:49:18.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{00A6EA90-3D33-0BF5-1CBF-DA0341FB877E}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:49:18.000Z" color="#8AA8E4"><one:Page ID="{2CEF1916-B4F8-48E4-9BD8-7292BDC39B61}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T04:49:18.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/native-cell/cold/read/page-000.xml created+21| ... | @@ -0,0 +1,21 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{2CEF1916-B4F8-48E4-9BD8-7292BDC39B61}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T04:49:18.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{4B23B1AA-FF8D-4B52-942A-FE49425F7E00}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{4B23B1AA-FF8D-4B52-942A-FE49425F7E00}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 4 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 5 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 6 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 7 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{1D936DBF-4CD8-410F-8E9C-7CC1E6539A49}{10}{B0}"><one:Position x="144.0" y="96.0" z="1"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{1D936DBF-4CD8-410F-8E9C-7CC1E6539A49}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{20BA0530-AA42-48A1-B8EC-D7350A3ED2C7}{10}{B0}"><one:Position x="144.0" y="192.0" z="2"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{20BA0530-AA42-48A1-B8EC-D7350A3ED2C7}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA | ||
| 8 | AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{A5A01D50-6C3A-4B67-9D41-B0CB3EEF1DF4}{10}{B0}"><one:Position x="264.0" y="192.0" z="3"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{A5A01D50-6C3A-4B67-9D41-B0CB3EEF1DF4}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{10}{B0}"><one:Position x="144.0" y="312.0" z="4"/><one:Size width="182.6545715332031" height="50.55070495605469"/><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{11}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{12}{B0}"><one:Columns><one:Column index="0" width="129.3788909912109"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{13}{B0}" lastModifiedTime="2026-09-08T04:47:24.000Z"><one:Cell lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{14}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" lastModifiedBy="Rich author" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{21DF9517-87D7-00F5-18D8-CCA310D8962A}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 9 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 10 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 11 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 12 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 13 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 14 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 15 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 16 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 17 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 18 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 19 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 20 | 11.0pt'><br> | ||
| 21 | End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{22}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/native-cell/cold/read/payloads.json created+10| ... | @@ -0,0 +1,10 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", | ||
| 4 | "name": "fictitious-attachment.txt", | ||
| 5 | "object": "{A5A01D50-6C3A-4B67-9D41-B0CB3EEF1DF4}{11}{B0}", | ||
| 6 | "kind": "InsertedFile", | ||
| 7 | "page": "{2CEF1916-B4F8-48E4-9BD8-7292BDC39B61}{1}{B0}", | ||
| 8 | "bytes": 43 | ||
| 9 | } | ||
| 10 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/cold/run.json created+18| ... | @@ -0,0 +1,18 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-cell", | ||
| 3 | "expected_pages": 1, | ||
| 4 | "author": null, | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": false, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 16 | "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" | ||
| 17 | } | ||
| 18 | } | ||
corpus/formatted-insertion/native-cell/cold/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 27800, | ||
| 5 | "sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351", | ||
| 6 | "mtime_ns": 1788842844345306887 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/formatted-insertion/native-cell/cold/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
corpus/formatted-insertion/native-cell/reverse/control-before.xml created+21| ... | @@ -0,0 +1,21 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{BE914D0C-20F2-4E33-AE0F-7458034A05F5}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:09:10.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{D95DE5B0-6B87-4D85-A1FD-F883FCD6E094}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{D95DE5B0-6B87-4D85-A1FD-F883FCD6E094}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 4 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 5 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 6 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 7 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{8FED39A5-D8D2-47D8-BB4B-7A0B58DA04DD}{10}{B0}"><one:Position x="144.0" y="96.0" z="1"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{8FED39A5-D8D2-47D8-BB4B-7A0B58DA04DD}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{B2C4512A-3E48-4E76-8D3B-D1FFB4B74C53}{10}{B0}"><one:Position x="144.0" y="192.0" z="2"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{B2C4512A-3E48-4E76-8D3B-D1FFB4B74C53}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA | ||
| 8 | AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{37DE494A-F830-4DB0-A896-B60180668360}{10}{B0}"><one:Position x="264.0" y="192.0" z="3"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{37DE494A-F830-4DB0-A896-B60180668360}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{10}{B0}"><one:Position x="144.0" y="312.0" z="4"/><one:Size width="183.4246368408203" height="50.55070495605469"/><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{11}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{12}{B0}"><one:Columns><one:Column index="0" width="130.1489715576172"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{1901301A-99A0-4630-B79E-5454A8357826}{13}{B0}" lastModifiedTime="2026-09-08T04:47:24.000Z"><one:Cell lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{14}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" lastModifiedBy="Rich author" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{B3A1C10D-13DD-0622-2D0F-CA69AE5108BE}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 9 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 10 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 11 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 12 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 13 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 14 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 15 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 16 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 17 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 18 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 19 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 20 | 11.0pt'><br> | ||
| 21 | End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{22}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/native-cell/reverse/control-update.xml created+14| ... | @@ -0,0 +1,14 @@ | ||
| 1 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{BE914D0C-20F2-4E33-AE0F-7458034A05F5}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{10}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="144.0" y="312.0" z="4" /><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{11}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{12}{B0}"><one:Columns><one:Column index="0" width="130.1489715576172" /><one:Column index="1" width="45.14567184448242" /></one:Columns><one:Row objectID="{1901301A-99A0-4630-B79E-5454A8357826}{13}{B0}" lastModifiedTime="2026-09-08T04:47:24.000Z"><one:Cell lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{14}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" lastModifiedBy="Rich author" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{B3A1C10D-13DD-0622-2D0F-CA69AE5108BE}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 2 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 3 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 4 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 5 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 6 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 7 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 8 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 9 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 10 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 11 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 12 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 13 | 11.0pt'><br> | ||
| 14 | End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{22}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page> | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/reverse/edit-before.xml created+23| ... | @@ -0,0 +1,23 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{BE914D0C-20F2-4E33-AE0F-7458034A05F5}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:09:10.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{D95DE5B0-6B87-4D85-A1FD-F883FCD6E094}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="1"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{D95DE5B0-6B87-4D85-A1FD-F883FCD6E094}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 4 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 5 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 6 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 7 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{8FED39A5-D8D2-47D8-BB4B-7A0B58DA04DD}{10}{B0}"><one:Position x="144.0" y="96.0" z="2"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{8FED39A5-D8D2-47D8-BB4B-7A0B58DA04DD}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{B2C4512A-3E48-4E76-8D3B-D1FFB4B74C53}{10}{B0}"><one:Position x="144.0" y="192.0" z="3"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{B2C4512A-3E48-4E76-8D3B-D1FFB4B74C53}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA | ||
| 8 | AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{37DE494A-F830-4DB0-A896-B60180668360}{10}{B0}"><one:Position x="264.0" y="192.0" z="4"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{37DE494A-F830-4DB0-A896-B60180668360}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{10}{B0}"><one:Position x="144.0" y="312.0" z="0"/><one:Size width="186.5719451904297" height="51.85495376586914"/><one:OEChildren><one:OE creationTime="2026-09-08T05:09:16.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{16}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{17}{B0}"><one:Columns><one:Column index="0" width="133.2962799072266"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{18}{B0}" lastModifiedTime="2026-09-08T05:09:19.000Z"><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{19}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" authorInitials="S" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B3A1C10D-13DD-0622-2D0F-CA69AE5108BE}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 9 | text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Bold</span><span | ||
| 10 | style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span | ||
| 11 | style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span | ||
| 12 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 13 | style='font-style:italic;text-decoration:line-through;font-family:Calibri; | ||
| 14 | font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri; | ||
| 15 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super; | ||
| 16 | font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span | ||
| 17 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 18 | style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; | ||
| 19 | mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri; | ||
| 20 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub; | ||
| 21 | font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span | ||
| 22 | style='font-family:Calibri;font-size:11.0pt' lang=en-US><br> | ||
| 23 | End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{39}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/native-cell/reverse/edit-update.xml created+16| ... | @@ -0,0 +1,16 @@ | ||
| 1 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{BE914D0C-20F2-4E33-AE0F-7458034A05F5}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{10}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="144.0" y="312.0" z="0" /><one:OEChildren><one:OE creationTime="2026-09-08T05:09:16.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{16}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{17}{B0}"><one:Columns><one:Column index="0" width="133.2962799072266" /><one:Column index="1" width="45.14567184448242" /></one:Columns><one:Row objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{18}{B0}" lastModifiedTime="2026-09-08T05:09:19.000Z"><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{19}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" authorInitials="S" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B3A1C10D-13DD-0622-2D0F-CA69AE5108BE}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T>&lt;span style='font-weight:bold; | ||
| 2 | text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US&gt;Native Bold&lt;/span&gt;&lt;span | ||
| 3 | style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt; &lt;/span&gt;&lt;span | ||
| 4 | style='font-family:Calibri;font-size:13.5pt' lang=en-US&gt;&amp;#129408;&lt;/span&gt;&lt;span | ||
| 5 | style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span | ||
| 6 | style='font-style:italic;text-decoration:line-through;font-family:Calibri; | ||
| 7 | font-size:11.0pt' lang=x-none&gt;italic&lt;/span&gt;&lt;span style='font-family:Calibri; | ||
| 8 | font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:super; | ||
| 9 | font-family:Calibri;font-size:11.0pt' lang=x-none&gt;é&lt;/span&gt;&lt;span | ||
| 10 | style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span | ||
| 11 | style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; | ||
| 12 | mso-highlight:yellow' lang=x-none&gt;color&lt;/span&gt;&lt;span style='font-family:Calibri; | ||
| 13 | font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:sub; | ||
| 14 | font-family:SimSun;font-size:11.0pt' lang=x-none&gt;東京&lt;/span&gt;&lt;span | ||
| 15 | style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt;&lt;br&gt; | ||
| 16 | End&lt;/span&gt;</one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{39}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page> | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/reverse/notebook/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/native-cell/reverse/notebook/synthetic.one differ | |||
corpus/formatted-insertion/native-cell/reverse/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../../append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/reverse/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-0BC5CBA6", | ||
| 5 | "cold": false, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/native-cell/reverse/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{1D5CE013-2ABD-43D2-AEFD-1F7020778E2F}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:09:31.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{B21D4528-7E27-0476-2024-E7DD43378AE0}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:09:31.000Z" color="#8AA8E4"><one:Page ID="{9E54B6AE-F7EC-4767-A743-4F4CBF0F96FF}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:09:31.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/native-cell/reverse/read/page-000.xml created+23| ... | @@ -0,0 +1,23 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{9E54B6AE-F7EC-4767-A743-4F4CBF0F96FF}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:09:31.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{F9981E12-BC99-44D1-A8B1-C3974093739E}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="1"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{F9981E12-BC99-44D1-A8B1-C3974093739E}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 4 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 5 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 6 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 7 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{AF28C207-0FCC-4E8C-B207-411FE49F97D7}{10}{B0}"><one:Position x="144.0" y="96.0" z="2"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{AF28C207-0FCC-4E8C-B207-411FE49F97D7}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{9201AA88-E956-4722-8477-EAEB08F2DF59}{10}{B0}"><one:Position x="144.0" y="192.0" z="3"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{9201AA88-E956-4722-8477-EAEB08F2DF59}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA | ||
| 8 | AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{171BB2E8-2F2E-44E4-A1DA-8D153C23106A}{10}{B0}"><one:Position x="264.0" y="192.0" z="4"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{171BB2E8-2F2E-44E4-A1DA-8D153C23106A}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{39C4CBB8-4EBE-4F64-BED2-6F401470EB2C}{10}{B0}"><one:Position x="144.0" y="312.0" z="0"/><one:Size width="218.9918212890625" height="51.85495376586914"/><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{99627E2B-AA27-44A7-87AB-1FE143000111}{51}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{99627E2B-AA27-44A7-87AB-1FE143000111}{52}{B0}"><one:Columns><one:Column index="0" width="165.7161407470703"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{99627E2B-AA27-44A7-87AB-1FE143000111}{53}{B0}" lastModifiedTime="2026-09-08T05:09:19.000Z"><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{99627E2B-AA27-44A7-87AB-1FE143000111}{54}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{39C4CBB8-4EBE-4F64-BED2-6F401470EB2C}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" authorInitials="S" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{93643AAF-C4C3-0F76-2443-F17D12149BB4}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 9 | text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Native Bold</span><span | ||
| 10 | style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span | ||
| 11 | style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span | ||
| 12 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 13 | style='font-style:italic;text-decoration:line-through;font-family:Calibri; | ||
| 14 | font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri; | ||
| 15 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super; | ||
| 16 | font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span | ||
| 17 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 18 | style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; | ||
| 19 | mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri; | ||
| 20 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub; | ||
| 21 | font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span | ||
| 22 | style='font-family:Calibri;font-size:11.0pt' lang=en-US><br> | ||
| 23 | End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{99627E2B-AA27-44A7-87AB-1FE143000111}{68}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{39C4CBB8-4EBE-4F64-BED2-6F401470EB2C}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/native-cell/reverse/read/payloads.json created+10| ... | @@ -0,0 +1,10 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", | ||
| 4 | "name": "fictitious-attachment.txt", | ||
| 5 | "object": "{171BB2E8-2F2E-44E4-A1DA-8D153C23106A}{11}{B0}", | ||
| 6 | "kind": "InsertedFile", | ||
| 7 | "page": "{9E54B6AE-F7EC-4767-A743-4F4CBF0F96FF}{1}{B0}", | ||
| 8 | "bytes": 43 | ||
| 9 | } | ||
| 10 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/reverse/reverse-verification.json created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | { | ||
| 2 | "paragraphs": 5, | ||
| 3 | "characters": 112, | ||
| 4 | "exact_native_character_styles_after_control": true | ||
| 5 | } | ||
corpus/formatted-insertion/native-cell/reverse/run.json created+19| ... | @@ -0,0 +1,19 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-cell", | ||
| 3 | "expected_pages": 1, | ||
| 4 | "author": "evidence/m10/formatted-reverse-auto-size.ps1", | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": false, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "author.ps1": "c5ebc74731fd4813803623b014ce9d6dbd6d2564918189865731807e6c458f9a", | ||
| 16 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 17 | "read.ps1": "df4244a18ab3e9c21083b8df61b08b863e8cce0ec4bf0c9cd742a8ee6f79877d" | ||
| 18 | } | ||
| 19 | } | ||
corpus/formatted-insertion/native-cell/reverse/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 27800, | ||
| 5 | "sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351", | ||
| 6 | "mtime_ns": 1788842844345306887 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/formatted-insertion/native-cell/reverse/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
corpus/formatted-insertion/native-cell/ui/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../../append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/ui/before-read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-1DC21C3F", | ||
| 5 | "cold": true, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/native-cell/ui/before-read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{9335E9A4-2BB5-44D1-BA50-B989AA6E0C31}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:17:48.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{7E619436-410B-0C9C-22EE-6EC96252B880}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:17:48.000Z" color="#8AA8E4"><one:Page ID="{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:17:48.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/native-cell/ui/before-read/page-000.xml created+21| ... | @@ -0,0 +1,21 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:17:48.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{35E4CF0C-83B5-4C3B-AA7B-4A8361F641FE}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{35E4CF0C-83B5-4C3B-AA7B-4A8361F641FE}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 4 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 5 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 6 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 7 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{63541319-30E0-4666-B0CD-C80BC5FAA5B7}{10}{B0}"><one:Position x="144.0" y="96.0" z="1"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{63541319-30E0-4666-B0CD-C80BC5FAA5B7}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{5E7D7B96-D67A-4FC8-86BD-63FF2997ED39}{10}{B0}"><one:Position x="144.0" y="192.0" z="2"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{5E7D7B96-D67A-4FC8-86BD-63FF2997ED39}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA | ||
| 8 | AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{DB6763F6-1002-4C0E-A310-04011D46220A}{10}{B0}"><one:Position x="264.0" y="192.0" z="3"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{DB6763F6-1002-4C0E-A310-04011D46220A}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{10}{B0}"><one:Position x="144.0" y="312.0" z="4"/><one:Size width="182.6545715332031" height="50.55070495605469"/><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{11}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{12}{B0}"><one:Columns><one:Column index="0" width="129.3788909912109"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{13}{B0}" lastModifiedTime="2026-09-08T04:47:24.000Z"><one:Cell lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{14}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" lastModifiedBy="Rich author" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{5F18EBB1-FBEF-079C-2689-78693371A9D4}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 9 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 10 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 11 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 12 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 13 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 14 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 15 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 16 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 17 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 18 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 19 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 20 | 11.0pt'><br> | ||
| 21 | End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{22}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/native-cell/ui/before-read/payloads.json created+10| ... | @@ -0,0 +1,10 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", | ||
| 4 | "name": "fictitious-attachment.txt", | ||
| 5 | "object": "{DB6763F6-1002-4C0E-A310-04011D46220A}{11}{B0}", | ||
| 6 | "kind": "InsertedFile", | ||
| 7 | "page": "{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}", | ||
| 8 | "bytes": 43 | ||
| 9 | } | ||
| 10 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/ui/edit.ahk created+10| ... | @@ -0,0 +1,10 @@ | ||
| 1 | #Requires AutoHotkey v2.0 | ||
| 2 | OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1))) | ||
| 3 | hwnd := WinExist("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE") | ||
| 4 | if !hwnd | ||
| 5 | throw Error("OneNote window is missing") | ||
| 6 | WinActivate(hwnd) | ||
| 7 | if !WinWaitActive(hwnd,, 5) | ||
| 8 | throw Error("OneNote window is not active") | ||
| 9 | Send "{Left}" | ||
| 10 | SendText "UI " | ||
corpus/formatted-insertion/native-cell/ui/edit.json created+13| ... | @@ -0,0 +1,13 @@ | ||
| 1 | { | ||
| 2 | "exit": 0, | ||
| 3 | "stdout": "", | ||
| 4 | "stderr": "", | ||
| 5 | "w": 1280, | ||
| 6 | "h": 720, | ||
| 7 | "error": null, | ||
| 8 | "win": { | ||
| 9 | "title": "Fictitious: caf\u00e9, \u6771\u4eac, \u0645\u0631\u062d\u0628\u0627 - Microsoft OneNote", | ||
| 10 | "class": "Framework::CFrame", | ||
| 11 | "dialog": false | ||
| 12 | } | ||
| 13 | } | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/ui/edit.png created| Binary files /dev/null and b/corpus/formatted-insertion/native-cell/ui/edit.png differ | |||
corpus/formatted-insertion/native-cell/ui/navigate.ahk created+20| ... | @@ -0,0 +1,20 @@ | ||
| 1 | #Requires AutoHotkey v2.0 | ||
| 2 | OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1))) | ||
| 3 | dm := Buffer(220, 0) | ||
| 4 | NumPut("UShort", 220, dm, 68) | ||
| 5 | if !DllCall("EnumDisplaySettingsW", "Ptr", 0, "UInt", 0xFFFFFFFF, "Ptr", dm) | ||
| 6 | throw Error("Cannot inspect display mode") | ||
| 7 | NumPut("UInt", NumGet(dm, 72, "UInt") | 0x180000, dm, 72) | ||
| 8 | NumPut("UInt", 1280, dm, 172) | ||
| 9 | NumPut("UInt", 720, dm, 176) | ||
| 10 | if DllCall("ChangeDisplaySettingsW", "Ptr", dm, "UInt", 0, "Int") != 0 | ||
| 11 | throw Error("Display mode rejected") | ||
| 12 | app := ComObject("OneNote.Application") | ||
| 13 | app.NavigateTo("{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}", "{5F18EBB1-FBEF-079C-2689-78693371A9D4}{1}{B0}", false) | ||
| 14 | hwnd := WinWait("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE",, 10) | ||
| 15 | if !hwnd | ||
| 16 | throw Error("OneNote window did not appear") | ||
| 17 | WinMaximize(hwnd) | ||
| 18 | WinActivate(hwnd) | ||
| 19 | if !WinWaitActive(hwnd,, 10) | ||
| 20 | throw Error("OneNote window did not become active") | ||
corpus/formatted-insertion/native-cell/ui/navigate.json created+13| ... | @@ -0,0 +1,13 @@ | ||
| 1 | { | ||
| 2 | "exit": 0, | ||
| 3 | "stdout": "", | ||
| 4 | "stderr": "", | ||
| 5 | "w": 1280, | ||
| 6 | "h": 720, | ||
| 7 | "error": null, | ||
| 8 | "win": { | ||
| 9 | "title": "Fictitious: caf\u00e9, \u6771\u4eac, \u0645\u0631\u062d\u0628\u0627 - Microsoft OneNote", | ||
| 10 | "class": "Framework::CFrame", | ||
| 11 | "dialog": false | ||
| 12 | } | ||
| 13 | } | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/ui/notebook/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/native-cell/ui/notebook/synthetic.one differ | |||
corpus/formatted-insertion/native-cell/ui/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../../append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/ui/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-1DC21C3F", | ||
| 5 | "cold": false, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/native-cell/ui/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{9335E9A4-2BB5-44D1-BA50-B989AA6E0C31}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:21:04.000Z" color="#B49EDE" isCurrentlyViewed="true"><one:Section name="synthetic" ID="{7E619436-410B-0C9C-22EE-6EC96252B880}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:21:04.000Z" color="#8AA8E4" isCurrentlyViewed="true"><one:Page ID="{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:20:59.000Z" pageLevel="1" isCurrentlyViewed="true"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/native-cell/ui/read/page-000.xml created+21| ... | @@ -0,0 +1,21 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:21:45.000Z" pageLevel="1" isCurrentlyViewed="true" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{35E4CF0C-83B5-4C3B-AA7B-4A8361F641FE}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{35E4CF0C-83B5-4C3B-AA7B-4A8361F641FE}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 4 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 5 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 6 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 7 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T05:20:08.000Z" objectID="{63541319-30E0-4666-B0CD-C80BC5FAA5B7}{10}{B0}"><one:Position x="144.0" y="96.0" z="1"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-08T05:20:08.000Z" objectID="{63541319-30E0-4666-B0CD-C80BC5FAA5B7}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{5E7D7B96-D67A-4FC8-86BD-63FF2997ED39}{10}{B0}"><one:Position x="144.0" y="192.0" z="2"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{5E7D7B96-D67A-4FC8-86BD-63FF2997ED39}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA | ||
| 8 | AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{DB6763F6-1002-4C0E-A310-04011D46220A}{10}{B0}"><one:Position x="264.0" y="192.0" z="3"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{DB6763F6-1002-4C0E-A310-04011D46220A}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T05:20:59.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{10}{B0}"><one:Position x="144.0" y="312.0" z="4"/><one:Size width="195.2552032470703" height="50.55070495605469"/><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T05:20:59.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{11}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T05:20:59.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{12}{B0}"><one:Columns><one:Column index="0" width="141.9795227050781"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{13}{B0}" lastModifiedTime="2026-09-08T05:20:59.000Z"><one:Cell lastModifiedTime="2026-09-08T05:20:59.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{14}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T05:20:08.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:20:59.000Z" objectID="{5F18EBB1-FBEF-079C-2689-78693371A9D4}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 9 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>UI Bold</span><span | ||
| 10 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 11 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 12 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 13 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 14 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 15 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 16 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 17 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 18 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 19 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 20 | 11.0pt'><br> | ||
| 21 | End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T05:20:08.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{22}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T05:20:08.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/native-cell/ui/read/payloads.json created+10| ... | @@ -0,0 +1,10 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", | ||
| 4 | "name": "fictitious-attachment.txt", | ||
| 5 | "object": "{DB6763F6-1002-4C0E-A310-04011D46220A}{11}{B0}", | ||
| 6 | "kind": "InsertedFile", | ||
| 7 | "page": "{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}", | ||
| 8 | "bytes": 43 | ||
| 9 | } | ||
| 10 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-cell/ui/run.json created+18| ... | @@ -0,0 +1,18 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/corpus/formatted-insertion/native-cell/candidate", | ||
| 3 | "expected_pages": 1, | ||
| 4 | "author": null, | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": true, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 16 | "read.ps1": "df4244a18ab3e9c21083b8df61b08b863e8cce0ec4bf0c9cd742a8ee6f79877d" | ||
| 17 | } | ||
| 18 | } | ||
corpus/formatted-insertion/native-cell/ui/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 27800, | ||
| 5 | "sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351", | ||
| 6 | "mtime_ns": 1788844254905915500 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/formatted-insertion/native-cell/ui/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
corpus/formatted-insertion/native-paragraph/candidate/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/native-paragraph/candidate/synthetic.one differ | |||
corpus/formatted-insertion/native-paragraph/cold/notebook/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/native-paragraph/cold/notebook/synthetic.one differ | |||
corpus/formatted-insertion/native-paragraph/cold/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-3A29493B", | ||
| 5 | "cold": true, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/native-paragraph/cold/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{94392AC7-D3ED-4D43-A6F0-56DDDBDC19F9}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:52:44.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{D26EFE31-822A-0358-00F3-8768C1B3CD8C}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:52:44.000Z" color="#8AA8E4"><one:Page ID="{FE270DB7-0BE1-4049-8794-2FF93D8BD193}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T04:52:44.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/native-paragraph/cold/read/page-000.xml created+20| ... | @@ -0,0 +1,20 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{FE270DB7-0BE1-4049-8794-2FF93D8BD193}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T04:52:44.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{99EBA50B-4094-43FF-8866-A322C21734F2}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="42.90299224853515"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{9E8E0DFC-B3E9-08F5-3832-6028097C4604}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 4 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 5 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 6 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 7 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 8 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 9 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 10 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 11 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 12 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 13 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 14 | 11.0pt'><br> | ||
| 15 | End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{99EBA50B-4094-43FF-8866-A322C21734F2}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 16 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 17 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 18 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 19 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 20 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/native-paragraph/cold/read/payloads.json created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | [ | ||
| 2 | |||
| 3 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-paragraph/cold/run.json created+18| ... | @@ -0,0 +1,18 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-paragraph", | ||
| 3 | "expected_pages": 1, | ||
| 4 | "author": null, | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": false, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 16 | "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" | ||
| 17 | } | ||
| 18 | } | ||
corpus/formatted-insertion/native-paragraph/cold/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 18672, | ||
| 5 | "sha256": "202823512283be980b6a139adcf5f4f369d15f17d60ed7b23f9f2289513aa4e9", | ||
| 6 | "mtime_ns": 1788842844336692559 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/formatted-insertion/native-paragraph/cold/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
corpus/formatted-insertion/native-paragraph/reverse/control-before.xml created+20| ... | @@ -0,0 +1,20 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1B7A8098-ED5A-422F-B4CC-AF462C16CB92}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:00:42.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="42.90299224853515"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{7BD380D3-5552-0A93-0B6A-E09718E15C05}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 4 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 5 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 6 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 7 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 8 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 9 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 10 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 11 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 12 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 13 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 14 | 11.0pt'><br> | ||
| 15 | End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 16 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 17 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 18 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 19 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 20 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/native-paragraph/reverse/control-update.xml created+19| ... | @@ -0,0 +1,19 @@ | ||
| 1 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1B7A8098-ED5A-422F-B4CC-AF462C16CB92}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{10}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="36.0" y="14.40000057220459" z="0" /><one:Size width="127.5136947631836" height="42.90299224853515" /><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{7BD380D3-5552-0A93-0B6A-E09718E15C05}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 2 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 3 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 4 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 5 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 6 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 7 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 8 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 9 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 10 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 11 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 12 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 13 | 11.0pt'><br> | ||
| 14 | End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 15 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 16 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 17 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 18 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 19 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-paragraph/reverse/edit-before.xml created+22| ... | @@ -0,0 +1,22 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1B7A8098-ED5A-422F-B4CC-AF462C16CB92}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="43.3349609375"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7BD380D3-5552-0A93-0B6A-E09718E15C05}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Bold</span><span | ||
| 4 | style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span | ||
| 5 | style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span | ||
| 6 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 7 | style='font-style:italic;text-decoration:line-through;font-family:Calibri; | ||
| 8 | font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri; | ||
| 9 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super; | ||
| 10 | font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span | ||
| 11 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 12 | style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; | ||
| 13 | mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri; | ||
| 14 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub; | ||
| 15 | font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span | ||
| 16 | style='font-family:Calibri;font-size:11.0pt' lang=en-US><br> | ||
| 17 | End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 18 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 19 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 20 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 21 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 22 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/native-paragraph/reverse/edit-update.xml created+21| ... | @@ -0,0 +1,21 @@ | ||
| 1 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1B7A8098-ED5A-422F-B4CC-AF462C16CB92}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{10}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="36.0" y="14.40000057220459" z="0" /><one:Size width="127.5136947631836" height="43.3349609375" /><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7BD380D3-5552-0A93-0B6A-E09718E15C05}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T>&lt;span style='font-weight:bold; | ||
| 2 | text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US&gt;Native Bold&lt;/span&gt;&lt;span | ||
| 3 | style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt; &lt;/span&gt;&lt;span | ||
| 4 | style='font-family:Calibri;font-size:13.5pt' lang=en-US&gt;&amp;#129408;&lt;/span&gt;&lt;span | ||
| 5 | style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span | ||
| 6 | style='font-style:italic;text-decoration:line-through;font-family:Calibri; | ||
| 7 | font-size:11.0pt' lang=x-none&gt;italic&lt;/span&gt;&lt;span style='font-family:Calibri; | ||
| 8 | font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:super; | ||
| 9 | font-family:Calibri;font-size:11.0pt' lang=x-none&gt;é&lt;/span&gt;&lt;span | ||
| 10 | style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span | ||
| 11 | style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; | ||
| 12 | mso-highlight:yellow' lang=x-none&gt;color&lt;/span&gt;&lt;span style='font-family:Calibri; | ||
| 13 | font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:sub; | ||
| 14 | font-family:SimSun;font-size:11.0pt' lang=x-none&gt;東京&lt;/span&gt;&lt;span | ||
| 15 | style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt;&lt;br&gt; | ||
| 16 | End&lt;/span&gt;</one:T></one:OE><one:OE author="snow" authorInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 17 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 18 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 19 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 20 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 21 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-paragraph/reverse/notebook/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/native-paragraph/reverse/notebook/synthetic.one differ | |||
corpus/formatted-insertion/native-paragraph/reverse/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-E17E9EEE", | ||
| 5 | "cold": false, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/native-paragraph/reverse/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{643EE131-1C57-48AE-A2E3-79A6724309F6}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:02:00.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{F55CE73E-E1CC-04D6-18B6-DF16A6EFDE4A}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:02:00.000Z" color="#8AA8E4"><one:Page ID="{D91514B8-6807-47C7-9FD1-77875AD7C255}{1}{B0}" name="Native Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:02:00.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/native-paragraph/reverse/read/page-000.xml created+22| ... | @@ -0,0 +1,22 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{D91514B8-6807-47C7-9FD1-77875AD7C255}{1}{B0}" name="Native Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:02:00.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{BED9BC04-2372-4471-9023-FB5CA54B2734}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="57.63496017456055"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{B9BC14F3-D00F-0F7B-2077-38566E2055C2}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Native Bold</span><span | ||
| 4 | style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span | ||
| 5 | style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span | ||
| 6 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 7 | style='font-style:italic;text-decoration:line-through;font-family:Calibri; | ||
| 8 | font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri; | ||
| 9 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super; | ||
| 10 | font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span | ||
| 11 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 12 | style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; | ||
| 13 | mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri; | ||
| 14 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub; | ||
| 15 | font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span | ||
| 16 | style='font-family:Calibri;font-size:11.0pt' lang=en-US><br> | ||
| 17 | End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{BED9BC04-2372-4471-9023-FB5CA54B2734}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span | ||
| 18 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | ||
| 19 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | ||
| 20 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | ||
| 21 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | ||
| 22 | lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/native-paragraph/reverse/read/payloads.json created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | [ | ||
| 2 | |||
| 3 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/native-paragraph/reverse/reverse-verification.json created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | { | ||
| 2 | "paragraphs": 2, | ||
| 3 | "characters": 63, | ||
| 4 | "exact_native_character_styles_after_control": true | ||
| 5 | } | ||
corpus/formatted-insertion/native-paragraph/reverse/run.json created+19| ... | @@ -0,0 +1,19 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-paragraph", | ||
| 3 | "expected_pages": 1, | ||
| 4 | "author": "evidence/m10/formatted-reverse-controlled.ps1", | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": false, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "author.ps1": "4362d0ba551eb00b2eca1c5563d76352469f85d3981155bf2682c159a03ddedb", | ||
| 16 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 17 | "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" | ||
| 18 | } | ||
| 19 | } | ||
corpus/formatted-insertion/native-paragraph/reverse/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 18672, | ||
| 5 | "sha256": "202823512283be980b6a139adcf5f4f369d15f17d60ed7b23f9f2289513aa4e9", | ||
| 6 | "mtime_ns": 1788842844336692559 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/formatted-insertion/native-paragraph/reverse/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
corpus/formatted-insertion/outline/candidate/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/outline/candidate/synthetic.one differ | |||
corpus/formatted-insertion/outline/cold/notebook/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/outline/cold/notebook/synthetic.one differ | |||
corpus/formatted-insertion/outline/cold/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-21E15CBC", | ||
| 5 | "cold": true, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/outline/cold/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{FD9B23E7-27DD-42DA-B9EB-7D7C38E67AC6}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:53:07.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{BF888060-5534-0692-36B6-7F1D9A763BAE}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:53:07.000Z" color="#8AA8E4"><one:Page ID="{66EE590B-EB2A-0597-072E-737ABAC4421C}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:52:56.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/outline/cold/read/page-000.xml created+15| ... | @@ -0,0 +1,15 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{66EE590B-EB2A-0597-072E-737ABAC4421C}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:52:56.000Z" pageLevel="1" lang="en-US"><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{BF888060-5534-0692-36B6-7F1D9A763BAE}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{BF888060-5534-0692-36B6-7F1D9A763BAE}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{0ECA1708-B745-031C-291B-F034D71F2A92}{1}{B0}"><one:Position x="72.0" y="144.0" z="1"/><one:Size width="468.0" height="28.60299110412598"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{0ECA1708-B745-031C-291B-F034D71F2A92}{3}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 4 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 5 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 6 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 7 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 8 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 9 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 10 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 11 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 12 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 13 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 14 | 11.0pt'><br> | ||
| 15 | End</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/outline/cold/read/payloads.json created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | [ | ||
| 2 | |||
| 3 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/outline/cold/run.json created+18| ... | @@ -0,0 +1,18 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/outline", | ||
| 3 | "expected_pages": 1, | ||
| 4 | "author": null, | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": false, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 16 | "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" | ||
| 17 | } | ||
| 18 | } | ||
corpus/formatted-insertion/outline/cold/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 7776, | ||
| 5 | "sha256": "76f6b743caa9dc2b5ab342d6e6a742125ecbcd0ca2372062b42acbd08b5ebb4c", | ||
| 6 | "mtime_ns": 1788842844332249915 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/formatted-insertion/outline/cold/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
corpus/formatted-insertion/outline/reverse/control-before.xml created+15| ... | @@ -0,0 +1,15 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1ADF0406-C7FD-03BA-0A13-462805F7226D}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:19.000Z" pageLevel="1" lang="en-US"><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{C3B9DD6D-79E3-00BF-3B8B-4A4F25455BDF}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{C3B9DD6D-79E3-00BF-3B8B-4A4F25455BDF}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{1}{B0}"><one:Position x="72.0" y="144.0" z="1"/><one:Size width="468.0" height="28.60299110412598"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{3}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 4 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 5 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 6 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 7 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 8 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 9 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 10 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 11 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 12 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 13 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 14 | 11.0pt'><br> | ||
| 15 | End</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/outline/reverse/control-update.xml created+14| ... | @@ -0,0 +1,14 @@ | ||
| 1 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1ADF0406-C7FD-03BA-0A13-462805F7226D}{1}{B0}"><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{1}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="72.0" y="144.0" z="1" /><one:Size width="468.0" height="28.60299110412598" /><one:Indents><one:Indent level="0" indent="0.0" /></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{3}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 2 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | ||
| 3 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | ||
| 4 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | ||
| 5 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | ||
| 6 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | ||
| 7 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | ||
| 8 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | ||
| 9 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | ||
| 10 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | ||
| 11 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | ||
| 12 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | ||
| 13 | 11.0pt'><br> | ||
| 14 | End</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/outline/reverse/edit-before.xml created+17| ... | @@ -0,0 +1,17 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1ADF0406-C7FD-03BA-0A13-462805F7226D}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:19.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{C3B9DD6D-79E3-00BF-3B8B-4A4F25455BDF}{23}{B0}"><one:Position x="36.0" y="36.0" z="1"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{C3B9DD6D-79E3-00BF-3B8B-4A4F25455BDF}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{1}{B0}"><one:Position x="72.0" y="144.0" z="0"/><one:Size width="468.0" height="29.90723991394043"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{3}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Bold</span><span | ||
| 4 | style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span | ||
| 5 | style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span | ||
| 6 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 7 | style='font-style:italic;text-decoration:line-through;font-family:Calibri; | ||
| 8 | font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri; | ||
| 9 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super; | ||
| 10 | font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span | ||
| 11 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 12 | style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; | ||
| 13 | mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri; | ||
| 14 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub; | ||
| 15 | font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span | ||
| 16 | style='font-family:Calibri;font-size:11.0pt' lang=en-US><br> | ||
| 17 | End</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/outline/reverse/edit-update.xml created+16| ... | @@ -0,0 +1,16 @@ | ||
| 1 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1ADF0406-C7FD-03BA-0A13-462805F7226D}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{1}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="72.0" y="144.0" z="0" /><one:Size width="468.0" height="29.90723991394043" /><one:Indents><one:Indent level="0" indent="0.0" /></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{3}{B0}" alignment="left" quickStyleIndex="0"><one:T>&lt;span style='font-weight:bold; | ||
| 2 | text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US&gt;Native Bold&lt;/span&gt;&lt;span | ||
| 3 | style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt; &lt;/span&gt;&lt;span | ||
| 4 | style='font-family:Calibri;font-size:13.5pt' lang=en-US&gt;&amp;#129408;&lt;/span&gt;&lt;span | ||
| 5 | style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span | ||
| 6 | style='font-style:italic;text-decoration:line-through;font-family:Calibri; | ||
| 7 | font-size:11.0pt' lang=x-none&gt;italic&lt;/span&gt;&lt;span style='font-family:Calibri; | ||
| 8 | font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:super; | ||
| 9 | font-family:Calibri;font-size:11.0pt' lang=x-none&gt;é&lt;/span&gt;&lt;span | ||
| 10 | style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span | ||
| 11 | style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; | ||
| 12 | mso-highlight:yellow' lang=x-none&gt;color&lt;/span&gt;&lt;span style='font-family:Calibri; | ||
| 13 | font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:sub; | ||
| 14 | font-family:SimSun;font-size:11.0pt' lang=x-none&gt;東京&lt;/span&gt;&lt;span | ||
| 15 | style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt;&lt;br&gt; | ||
| 16 | End&lt;/span&gt;</one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/outline/reverse/notebook/synthetic.one created| Binary files /dev/null and b/corpus/formatted-insertion/outline/reverse/notebook/synthetic.one differ | |||
corpus/formatted-insertion/outline/reverse/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-129C20F7", | ||
| 5 | "cold": false, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/formatted-insertion/outline/reverse/read/hierarchy.xml created+2| ... | @@ -0,0 +1,2 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{ACF9AA90-C944-4381-97F0-8AAE2DE5FAEF}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:04:40.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{D32B2090-2B9E-07F2-3796-17BEC4F45F8E}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:04:40.000Z" color="#8AA8E4"><one:Page ID="{0A4DF9FB-9580-04F7-060E-1BD9E446263C}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:40.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/formatted-insertion/outline/reverse/read/page-000.xml created+17| ... | @@ -0,0 +1,17 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{0A4DF9FB-9580-04F7-060E-1BD9E446263C}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:40.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{D32B2090-2B9E-07F2-3796-17BEC4F45F8E}{23}{B0}"><one:Position x="36.0" y="36.0" z="1"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{D32B2090-2B9E-07F2-3796-17BEC4F45F8E}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{6269B7F8-C9EF-027C-283B-9897899D4EB2}{1}{B0}"><one:Position x="72.0" y="144.0" z="0"/><one:Size width="468.0" height="29.90723991394043"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{6269B7F8-C9EF-027C-283B-9897899D4EB2}{3}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold; | ||
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Native Bold</span><span | ||
| 4 | style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span | ||
| 5 | style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span | ||
| 6 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 7 | style='font-style:italic;text-decoration:line-through;font-family:Calibri; | ||
| 8 | font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri; | ||
| 9 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super; | ||
| 10 | font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span | ||
| 11 | style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span | ||
| 12 | style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow; | ||
| 13 | mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri; | ||
| 14 | font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub; | ||
| 15 | font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span | ||
| 16 | style='font-family:Calibri;font-size:11.0pt' lang=en-US><br> | ||
| 17 | End</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/formatted-insertion/outline/reverse/read/payloads.json created+3| ... | @@ -0,0 +1,3 @@ | ||
| 1 | [ | ||
| 2 | |||
| 3 | ] | ||
| \ No newline at end of file | |||
corpus/formatted-insertion/outline/reverse/reverse-verification.json created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | { | ||
| 2 | "paragraphs": 2, | ||
| 3 | "characters": 44, | ||
| 4 | "exact_native_character_styles_after_control": true | ||
| 5 | } | ||
corpus/formatted-insertion/outline/reverse/run.json created+19| ... | @@ -0,0 +1,19 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/outline", | ||
| 3 | "expected_pages": 1, | ||
| 4 | "author": "evidence/m10/formatted-reverse-controlled.ps1", | ||
| 5 | "author_timeout_seconds": 600, | ||
| 6 | "inspect": false, | ||
| 7 | "collect_notebook": true, | ||
| 8 | "base": { | ||
| 9 | "file": "win7-office-base.qcow2", | ||
| 10 | "format": "qcow2", | ||
| 11 | "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", | ||
| 12 | "virtual_size": 68719476736 | ||
| 13 | }, | ||
| 14 | "scripts": { | ||
| 15 | "author.ps1": "4362d0ba551eb00b2eca1c5563d76352469f85d3981155bf2682c159a03ddedb", | ||
| 16 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 17 | "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" | ||
| 18 | } | ||
| 19 | } | ||
corpus/formatted-insertion/outline/reverse/source.json created+8| ... | @@ -0,0 +1,8 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "path": "synthetic.one", | ||
| 4 | "bytes": 7776, | ||
| 5 | "sha256": "76f6b743caa9dc2b5ab342d6e6a742125ecbcd0ca2372062b42acbd08b5ebb4c", | ||
| 6 | "mtime_ns": 1788842844332249915 | ||
| 7 | } | ||
| 8 | ] | ||
corpus/formatted-insertion/outline/reverse/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | {"absent": true} | ||
crates/onestore-offline/README.md+4-6| ... | @@ -26,7 +26,8 @@ assert_eq!(pending.last().map(|edit| edit.id), local_id); | ... | @@ -26,7 +26,8 @@ assert_eq!(pending.last().map(|edit| edit.id), local_id); |
| 26 | ``` | 26 | ``` |
| 27 | 27 | ||
| 28 | `insert` accepts the core library's `Insertion` value and durably retains its | 28 | `insert` accepts the core library's `Insertion` value and durably retains its |
| 29 | object identities. Keep that value across retries; its `text_object()` identifies | 29 | intent identities. `Insertion::with_formatting` queues text and |
| 30 | its styles as one intent and one publication. Keep that value across retries; its `text_object()` identifies | ||
| 30 | the new text for subsequent offline edits. Pending entries expose | 31 | the new text for subsequent offline edits. Pending entries expose |
| 31 | `Operation::Text(TextEdit)`, `Operation::Insert(Insertion)` or | 32 | `Operation::Text(TextEdit)`, `Operation::Insert(Insertion)` or |
| 32 | `Operation::Format(FormatEdit)` through their | 33 | `Operation::Format(FormatEdit)` through their |
| ... | @@ -47,12 +48,9 @@ use onestore::{ExGuid, Insertion, TextAttribute}; | ... | @@ -47,12 +48,9 @@ use onestore::{ExGuid, Insertion, TextAttribute}; |
| 47 | use onestore_offline::{EditStatus, Replica}; | 48 | use onestore_offline::{EditStatus, Replica}; |
| 48 | # fn add_outline(cache: &Replica, space: ExGuid, page: ExGuid) | 49 | # fn add_outline(cache: &Replica, space: ExGuid, page: ExGuid) |
| 49 | # -> Result<(), Box<dyn std::error::Error>> { | 50 | # -> Result<(), Box<dyn std::error::Error>> { |
| 50 | let outline = Insertion::outline(page, 144.0, 216.0, "Offline outline", "Author")?; | 51 | let outline = Insertion::outline(page, 144.0, 216.0, "Offline outline", "Author")? |
| 52 | .with_formatting(0..7, &[TextAttribute::Bold(true)])?; | ||
| 51 | let id = cache.insert(&cache.snapshot()?, space, &outline)?; | 53 | let id = cache.insert(&cache.snapshot()?, space, &outline)?; |
| 52 | cache.format( | ||
| 53 | &cache.snapshot()?, space, outline.text_object(), 0..7, | ||
| 54 | &[TextAttribute::Bold(true)], | ||
| 55 | )?; | ||
| 56 | if let Some(id) = id { | 54 | if let Some(id) = id { |
| 57 | // A running worker may already have advanced this state. | 55 | // A running worker may already have advanced this state. |
| 58 | match cache.status(id)? { | 56 | match cache.status(id)? { |
crates/onestore-offline/examples/smb_offline_client.rs+8-1| ... | @@ -301,7 +301,14 @@ fn queue_document( | ... | @@ -301,7 +301,14 @@ fn queue_document( |
| 301 | &text, | 301 | &text, |
| 302 | "Offline document writer", | 302 | "Offline document writer", |
| 303 | )? | 303 | )? |
| 304 | }; | 304 | } |
| 305 | .with_formatting( | ||
| 306 | 0..u32::try_from(text.encode_utf16().count())?, | ||
| 307 | &[ | ||
| 308 | TextAttribute::FontSize(13.5), | ||
| 309 | TextAttribute::Color(Some([0x44, 0x55, 0x66])), | ||
| 310 | ], | ||
| 311 | )?; | ||
| 305 | let parent = if operation.is_multiple_of(2) { | 312 | let parent = if operation.is_multiple_of(2) { |
| 306 | insertion.object() | 313 | insertion.object() |
| 307 | } else { | 314 | } else { |
crates/onestore-offline/tests/cache.rs+14-1| ... | @@ -609,7 +609,9 @@ fn twelve_local_clients_preserve_inserted_identities_and_dependent_edits() { | ... | @@ -609,7 +609,9 @@ fn twelve_local_clients_preserve_inserted_identities_and_dependent_edits() { |
| 609 | "Author", | 609 | "Author", |
| 610 | ) | 610 | ) |
| 611 | .unwrap() | 611 | .unwrap() |
| 612 | }; | 612 | } |
| 613 | .with_formatting(0..6, &[onestore::TextAttribute::Italic(true)]) | ||
| 614 | .unwrap(); | ||
| 613 | loop { | 615 | loop { |
| 614 | assert!( | 616 | assert!( |
| 615 | Instant::now() < deadline, | 617 | Instant::now() < deadline, |
| ... | @@ -691,6 +693,17 @@ fn twelve_local_clients_preserve_inserted_identities_and_dependent_edits() { | ... | @@ -691,6 +693,17 @@ fn twelve_local_clients_preserve_inserted_identities_and_dependent_edits() { |
| 691 | format!("Edited Paragraph {client}:{sequence}") | 693 | format!("Edited Paragraph {client}:{sequence}") |
| 692 | }; | 694 | }; |
| 693 | assert!(matches!(&v.nodes[id].kind,Kind::RichText{text,..} if *text==wanted)); | 695 | assert!(matches!(&v.nodes[id].kind,Kind::RichText{text,..} if *text==wanted)); |
| 696 | let runs = v.text_runs(*id).unwrap(); | ||
| 697 | assert_eq!(runs[0].format.italic, Some(true)); | ||
| 698 | assert_eq!( | ||
| 699 | runs[0].text, | ||
| 700 | if sequence == 0 { | ||
| 701 | "Client" | ||
| 702 | } else { | ||
| 703 | "Edited Paragr" | ||
| 704 | } | ||
| 705 | ); | ||
| 706 | assert!(runs[1..].iter().all(|run| run.format.italic != Some(true))); | ||
| 694 | } | 707 | } |
| 695 | } | 708 | } |
| 696 | } | 709 | } |
crates/onestore-offline/tests/sync.rs+35-5| ... | @@ -1736,8 +1736,10 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() { | ... | @@ -1736,8 +1736,10 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() { |
| 1736 | let doc = Document::parse(&index).unwrap(); | 1736 | let doc = Document::parse(&index).unwrap(); |
| 1737 | let (_, page) = doc.pages().unwrap()[0]; | 1737 | let (_, page) = doc.pages().unwrap()[0]; |
| 1738 | let cache = Replica::create(&path, &source).unwrap(); | 1738 | let cache = Replica::create(&path, &source).unwrap(); |
| 1739 | let outline = | 1739 | let outline = Insertion::outline(page, 72.0, 144.0, "Offline outline", "Offline author") |
| 1740 | Insertion::outline(page, 72.0, 144.0, "Offline outline", "Offline author").unwrap(); | 1740 | .unwrap() |
| 1741 | .with_formatting(0..7, &[onestore::TextAttribute::Italic(true)]) | ||
| 1742 | .unwrap(); | ||
| 1741 | let first = cache.insert(&source, sid, &outline).unwrap().unwrap(); | 1743 | let first = cache.insert(&source, sid, &outline).unwrap().unwrap(); |
| 1742 | let snapshot = cache.snapshot().unwrap(); | 1744 | let snapshot = cache.snapshot().unwrap(); |
| 1743 | let paragraph = Insertion::paragraph( | 1745 | let paragraph = Insertion::paragraph( |
| ... | @@ -1746,6 +1748,8 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() { | ... | @@ -1746,6 +1748,8 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() { |
| 1746 | "Offline paragraph 🦀", | 1748 | "Offline paragraph 🦀", |
| 1747 | "Offline author", | 1749 | "Offline author", |
| 1748 | ) | 1750 | ) |
| 1751 | .unwrap() | ||
| 1752 | .with_formatting(8..17, &[onestore::TextAttribute::Bold(true)]) | ||
| 1749 | .unwrap(); | 1753 | .unwrap(); |
| 1750 | let second = cache.insert(&snapshot, sid, &paragraph).unwrap().unwrap(); | 1754 | let second = cache.insert(&snapshot, sid, &paragraph).unwrap().unwrap(); |
| 1751 | let third = cache | 1755 | let third = cache |
| ... | @@ -1786,6 +1790,12 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() { | ... | @@ -1786,6 +1790,12 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() { |
| 1786 | ] { | 1790 | ] { |
| 1787 | assert!(matches!(&v.nodes[&id].kind,Kind::RichText{text,..} if text==wanted)); | 1791 | assert!(matches!(&v.nodes[&id].kind,Kind::RichText{text,..} if text==wanted)); |
| 1788 | } | 1792 | } |
| 1793 | let outline_runs = v.text_runs(outline.text_object()).unwrap(); | ||
| 1794 | assert_eq!(outline_runs[0].text, "Offline"); | ||
| 1795 | assert_eq!(outline_runs[0].format.italic, Some(true)); | ||
| 1796 | let runs = v.text_runs(paragraph.text_object()).unwrap(); | ||
| 1797 | assert_eq!(runs[1].text, "paragraph"); | ||
| 1798 | assert_eq!(runs[1].format.bold, Some(true)); | ||
| 1789 | assert_eq!( | 1799 | assert_eq!( |
| 1790 | v.nodes[&outline.object()].children.last(), | 1800 | v.nodes[&outline.object()].children.last(), |
| 1791 | Some(&paragraph.object()) | 1801 | Some(&paragraph.object()) |
| ... | @@ -1811,8 +1821,12 @@ fn uncertain_insertions_reconcile_the_original_revision_without_duplicate_object | ... | @@ -1811,8 +1821,12 @@ fn uncertain_insertions_reconcile_the_original_revision_without_duplicate_object |
| 1811 | let doc = Document::parse(&index).unwrap(); | 1821 | let doc = Document::parse(&index).unwrap(); |
| 1812 | let (sid, page) = doc.pages().unwrap()[0]; | 1822 | let (sid, page) = doc.pages().unwrap()[0]; |
| 1813 | let cache = Replica::create(&path, &source).unwrap(); | 1823 | let cache = Replica::create(&path, &source).unwrap(); |
| 1814 | let insertion = | 1824 | let insertion = Insertion::outline(page, 144.0, 144.0, "Uncertain insertion", "Author") |
| 1815 | Insertion::outline(page, 144.0, 144.0, "Uncertain insertion", "Author").unwrap(); | 1825 | .unwrap() |
| 1826 | .with_formatting(0..9, &[onestore::TextAttribute::Bold(true)]) | ||
| 1827 | .unwrap() | ||
| 1828 | .with_formatting(10..19, &[onestore::TextAttribute::Italic(true)]) | ||
| 1829 | .unwrap(); | ||
| 1816 | let id = cache.insert(&source, sid, &insertion).unwrap().unwrap(); | 1830 | let id = cache.insert(&source, sid, &insertion).unwrap().unwrap(); |
| 1817 | let local = cache.snapshot().unwrap(); | 1831 | let local = cache.snapshot().unwrap(); |
| 1818 | let mut server = Server::new(&source); | 1832 | let mut server = Server::new(&source); |
| ... | @@ -1860,6 +1874,15 @@ fn uncertain_insertions_reconcile_the_original_revision_without_duplicate_object | ... | @@ -1860,6 +1874,15 @@ fn uncertain_insertions_reconcile_the_original_revision_without_duplicate_object |
| 1860 | let v = &s.revisions[&s.contexts[&ExGuid::default()]]; | 1874 | let v = &s.revisions[&s.contexts[&ExGuid::default()]]; |
| 1861 | assert_eq!(v.nodes.values().filter(|node|matches!(&node.kind,Kind::RichText{text,..} if text=="Uncertain insertion")).count(),1); | 1875 | assert_eq!(v.nodes.values().filter(|node|matches!(&node.kind,Kind::RichText{text,..} if text=="Uncertain insertion")).count(),1); |
| 1862 | assert!(v.nodes.contains_key(&insertion.object())); | 1876 | assert!(v.nodes.contains_key(&insertion.object())); |
| 1877 | let runs = v.text_runs(insertion.text_object()).unwrap(); | ||
| 1878 | assert_eq!(runs.len(), 3); | ||
| 1879 | assert_eq!(runs[0].text, "Uncertain"); | ||
| 1880 | assert_eq!(runs[0].format.bold, Some(true)); | ||
| 1881 | assert_eq!(runs[1].text, " "); | ||
| 1882 | assert_ne!(runs[1].format.bold, Some(true)); | ||
| 1883 | assert_ne!(runs[1].format.italic, Some(true)); | ||
| 1884 | assert_eq!(runs[2].text, "insertion"); | ||
| 1885 | assert_eq!(runs[2].format.italic, Some(true)); | ||
| 1863 | assert!(cache.pending().unwrap().is_empty()); | 1886 | assert!(cache.pending().unwrap().is_empty()); |
| 1864 | } | 1887 | } |
| 1865 | } | 1888 | } |
| ... | @@ -2668,7 +2691,9 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() { | ... | @@ -2668,7 +2691,9 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() { |
| 2668 | Insertion::outline(page, 144.0, 144.0, "Offline", "Author").unwrap() | 2691 | Insertion::outline(page, 144.0, 144.0, "Offline", "Author").unwrap() |
| 2669 | } else { | 2692 | } else { |
| 2670 | Insertion::paragraph(parent, Some(anchor.object()), "Offline", "Author").unwrap() | 2693 | Insertion::paragraph(parent, Some(anchor.object()), "Offline", "Author").unwrap() |
| 2671 | }; | 2694 | } |
| 2695 | .with_formatting(0..7, &[A::Italic(true)]) | ||
| 2696 | .unwrap(); | ||
| 2672 | let cache = Replica::create(&path, &source).unwrap(); | 2697 | let cache = Replica::create(&path, &source).unwrap(); |
| 2673 | let first = cache.insert(&source, sid, &insertion).unwrap().unwrap(); | 2698 | let first = cache.insert(&source, sid, &insertion).unwrap().unwrap(); |
| 2674 | let second = cache | 2699 | let second = cache |
| ... | @@ -2754,6 +2779,10 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() { | ... | @@ -2754,6 +2779,10 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() { |
| 2754 | }; | 2779 | }; |
| 2755 | assert_eq!(rebased.object(), insertion.object()); | 2780 | assert_eq!(rebased.object(), insertion.object()); |
| 2756 | assert_eq!(rebased.text_object(), insertion.text_object()); | 2781 | assert_eq!(rebased.text_object(), insertion.text_object()); |
| 2782 | assert_eq!( | ||
| 2783 | serde_json::to_value(&rebased).unwrap()["formats"], | ||
| 2784 | serde_json::to_value(&insertion).unwrap()["formats"] | ||
| 2785 | ); | ||
| 2757 | assert_eq!(cache.status(first).unwrap(), Some(EditStatus::Pending)); | 2786 | assert_eq!(cache.status(first).unwrap(), Some(EditStatus::Pending)); |
| 2758 | drop(cache); | 2787 | drop(cache); |
| 2759 | let cache = Replica::open(&path).unwrap(); | 2788 | let cache = Replica::open(&path).unwrap(); |
| ... | @@ -2775,6 +2804,7 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() { | ... | @@ -2775,6 +2804,7 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() { |
| 2775 | "Offline 🦀" | 2804 | "Offline 🦀" |
| 2776 | ); | 2805 | ); |
| 2777 | assert!(runs.iter().all(|r| r.format.bold == Some(true))); | 2806 | assert!(runs.iter().all(|r| r.format.bold == Some(true))); |
| 2807 | assert!(runs.iter().all(|r| r.format.italic == Some(true))); | ||
| 2778 | if outline_case { | 2808 | if outline_case { |
| 2779 | assert_eq!( | 2809 | assert_eq!( |
| 2780 | ( | 2810 | ( |
crates/onestore/README.md+3-1| ... | @@ -71,7 +71,9 @@ passwords, unsupported protection profiles and work-limit failures remain distin | ... | @@ -71,7 +71,9 @@ passwords, unsupported protection profiles and work-limit failures remain distin |
| 71 | The source stays encrypted; protected writes are rejected. | 71 | The source stays encrypted; protected writes are rejected. |
| 72 | Insertions update child references, reference counts, modification times and automatic | 72 | Insertions update child references, reference counts, modification times and automatic |
| 73 | titles atomically. Paragraphs can be nested or inserted into table cells; outline | 73 | titles atomically. Paragraphs can be nested or inserted into table cells; outline |
| 74 | coordinates use points. Retain the `Insertion` value for rebasing: creating another | 74 | coordinates use points. `Insertion::with_formatting` includes nonoverlapping UTF-16 |
| 75 | spans in that same publication; gaps keep the default insertion style. Empty text | ||
| 76 | accepts one `0..0` span for subsequent typing. Retain the `Insertion` value for rebasing: creating another | ||
| 75 | value creates different object identities. Duplicate insertion identities require | 77 | value creates different object identities. Duplicate insertion identities require |
| 76 | reconciliation. Formatting accepts explicit attributes, preserves inherited values, | 78 | reconciliation. Formatting accepts explicit attributes, preserves inherited values, |
| 77 | and gives retired immutable styles zero current references while retaining history. | 79 | and gives retired immutable styles zero current references while retaining history. |
crates/onestore/src/formatting.rs+28-20| ... | @@ -91,26 +91,7 @@ pub(crate) fn format_text( | ... | @@ -91,26 +91,7 @@ pub(crate) fn format_text( |
| 91 | "Select a text range and at least one formatting attribute", | 91 | "Select a text range and at least one formatting attribute", |
| 92 | )); | 92 | )); |
| 93 | } | 93 | } |
| 94 | let mut values = Vec::new(); | 94 | let values = attribute_values(attributes)?; |
| 95 | let mut seen = BTreeSet::new(); | ||
| 96 | for attribute in attributes { | ||
| 97 | let (id, value) = attribute.property()?; | ||
| 98 | if !seen.insert(id & 0x7fffffff) { | ||
| 99 | return Err(invalid("Specify each formatting attribute once")); | ||
| 100 | } | ||
| 101 | values.push((id, value)); | ||
| 102 | } | ||
| 103 | if attributes.contains(&TextAttribute::Superscript(true)) | ||
| 104 | && attributes.contains(&TextAttribute::Subscript(true)) | ||
| 105 | { | ||
| 106 | return Err(invalid("Text cannot be both superscript and subscript")); | ||
| 107 | } | ||
| 108 | // Setting either script position clears its mutually exclusive counterpart. | ||
| 109 | for (set, opposite) in [(0x88001c08, 0x08001c09), (0x88001c09, 0x08001c08)] { | ||
| 110 | if values.iter().any(|(id, _)| *id == set) && !seen.contains(&opposite) { | ||
| 111 | values.push((opposite, Vec::new())); | ||
| 112 | } | ||
| 113 | } | ||
| 114 | let store = Store::parse(source)?; | 95 | let store = Store::parse(source)?; |
| 115 | let index = RevisionIndex::parse(&store)?; | 96 | let index = RevisionIndex::parse(&store)?; |
| 116 | index.validate_current()?; | 97 | index.validate_current()?; |
| ... | @@ -286,3 +267,30 @@ pub(crate) fn format_text( | ... | @@ -286,3 +267,30 @@ pub(crate) fn format_text( |
| 286 | Ok(changed) | 267 | Ok(changed) |
| 287 | }) | 268 | }) |
| 288 | } | 269 | } |
| 270 | |||
| 271 | pub(crate) fn attribute_values(attributes: &[TextAttribute]) -> Result<Vec<(u32, Vec<u8>)>, Error> { | ||
| 272 | if attributes.is_empty() { | ||
| 273 | return Err(invalid("Choose at least one formatting attribute")); | ||
| 274 | } | ||
| 275 | let mut values = Vec::new(); | ||
| 276 | let mut seen = BTreeSet::new(); | ||
| 277 | for attribute in attributes { | ||
| 278 | let (id, value) = attribute.property()?; | ||
| 279 | if !seen.insert(id & 0x7fffffff) { | ||
| 280 | return Err(invalid("Specify each formatting attribute once")); | ||
| 281 | } | ||
| 282 | values.push((id, value)); | ||
| 283 | } | ||
| 284 | if attributes.contains(&TextAttribute::Superscript(true)) | ||
| 285 | && attributes.contains(&TextAttribute::Subscript(true)) | ||
| 286 | { | ||
| 287 | return Err(invalid("Text cannot be both superscript and subscript")); | ||
| 288 | } | ||
| 289 | // Setting either script position clears its mutually exclusive counterpart. | ||
| 290 | for (set, opposite) in [(0x88001c08, 0x08001c09), (0x88001c09, 0x08001c08)] { | ||
| 291 | if values.iter().any(|(id, _)| *id == set) && !seen.contains(&opposite) { | ||
| 292 | values.push((opposite, Vec::new())); | ||
| 293 | } | ||
| 294 | } | ||
| 295 | Ok(values) | ||
| 296 | } |
crates/onestore/src/insertion.rs+110| ... | @@ -8,6 +8,7 @@ use crate::{ | ... | @@ -8,6 +8,7 @@ use crate::{ |
| 8 | use serde::{Deserialize, Serialize}; | 8 | use serde::{Deserialize, Serialize}; |
| 9 | use std::{ | 9 | use std::{ |
| 10 | collections::{BTreeMap, BTreeSet}, | 10 | collections::{BTreeMap, BTreeSet}, |
| 11 | ops::Range, | ||
| 11 | sync::Arc, | 12 | sync::Arc, |
| 12 | }; | 13 | }; |
| 13 | 14 | ||
| ... | @@ -22,6 +23,14 @@ enum Placement { | ... | @@ -22,6 +23,14 @@ enum Placement { |
| 22 | Outline { x: f32, y: f32 }, | 23 | Outline { x: f32, y: f32 }, |
| 23 | } | 24 | } |
| 24 | 25 | ||
| 26 | #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] | ||
| 27 | #[serde(deny_unknown_fields)] | ||
| 28 | struct FormatSpan { | ||
| 29 | guid: [u8; 16], | ||
| 30 | range: Range<u32>, | ||
| 31 | attributes: Vec<crate::TextAttribute>, | ||
| 32 | } | ||
| 33 | |||
| 25 | /// A paragraph or outline insertion with stable object identities and creation time. | 34 | /// A paragraph or outline insertion with stable object identities and creation time. |
| 26 | /// Retain this intent across rebases; constructing another intent allocates different identities. | 35 | /// Retain this intent across rebases; constructing another intent allocates different identities. |
| 27 | #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] | 36 | #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] |
| ... | @@ -33,9 +42,29 @@ pub struct Insertion { | ... | @@ -33,9 +42,29 @@ pub struct Insertion { |
| 33 | text: String, | 42 | text: String, |
| 34 | author: String, | 43 | author: String, |
| 35 | created: u32, | 44 | created: u32, |
| 45 | #[serde(default, skip_serializing_if = "Vec::is_empty")] | ||
| 46 | formats: Vec<FormatSpan>, | ||
| 36 | } | 47 | } |
| 37 | 48 | ||
| 38 | impl Insertion { | 49 | impl Insertion { |
| 50 | /// Adds a nonoverlapping UTF-16 formatting span, retaining all existing identities. | ||
| 51 | /// Gaps use the ordinary insertion style; only empty text accepts a zero-length span. | ||
| 52 | pub fn with_formatting( | ||
| 53 | &self, | ||
| 54 | range: Range<u32>, | ||
| 55 | attributes: &[crate::TextAttribute], | ||
| 56 | ) -> Result<Self, Error> { | ||
| 57 | let mut intent = self.clone(); | ||
| 58 | intent.formats.push(FormatSpan { | ||
| 59 | guid: fresh_guid()?, | ||
| 60 | range, | ||
| 61 | attributes: attributes.to_vec(), | ||
| 62 | }); | ||
| 63 | intent.formats.sort_by_key(|span| span.range.start); | ||
| 64 | intent.validate()?; | ||
| 65 | Ok(intent) | ||
| 66 | } | ||
| 67 | |||
| 39 | /// Inserts before a direct child, or appends when `before` is None. | 68 | /// Inserts before a direct child, or appends when `before` is None. |
| 40 | /// The parent must be an editable outline, paragraph, outline group or table cell. | 69 | /// The parent must be an editable outline, paragraph, outline group or table cell. |
| 41 | /// Carriage returns represent soft line breaks; line feeds and embedded-field markers are rejected. | 70 | /// Carriage returns represent soft line breaks; line feeds and embedded-field markers are rejected. |
| ... | @@ -89,6 +118,7 @@ impl Insertion { | ... | @@ -89,6 +118,7 @@ impl Insertion { |
| 89 | text: text.to_owned(), | 118 | text: text.to_owned(), |
| 90 | author: author.to_owned(), | 119 | author: author.to_owned(), |
| 91 | created: current_timestamps()?.0, | 120 | created: current_timestamps()?.0, |
| 121 | formats: Vec::new(), | ||
| 92 | }; | 122 | }; |
| 93 | intent.validate()?; | 123 | intent.validate()?; |
| 94 | Ok(intent) | 124 | Ok(intent) |
| ... | @@ -125,6 +155,37 @@ impl Insertion { | ... | @@ -125,6 +155,37 @@ impl Insertion { |
| 125 | { | 155 | { |
| 126 | return Err(invalid("Outline coordinates must be finite")); | 156 | return Err(invalid("Outline coordinates must be finite")); |
| 127 | } | 157 | } |
| 158 | if !self.formats.is_empty() { | ||
| 159 | let units: Vec<_> = self.text.encode_utf16().collect(); | ||
| 160 | let length = u32::try_from(units.len()) | ||
| 161 | .map_err(|_| invalid("Text exceeds UTF-16 offset range"))?; | ||
| 162 | let mut identities = BTreeSet::from([self.guid]); | ||
| 163 | let mut end = 0; | ||
| 164 | for span in &self.formats { | ||
| 165 | if span.guid == [0; 16] || !identities.insert(span.guid) { | ||
| 166 | return Err(invalid("Formatting identities must be distinct")); | ||
| 167 | } | ||
| 168 | if span.range.start > span.range.end | ||
| 169 | || span.range.end > length | ||
| 170 | || span.range.start < end | ||
| 171 | || (span.range.is_empty() && (!units.is_empty() || self.formats.len() != 1)) | ||
| 172 | { | ||
| 173 | return Err(invalid( | ||
| 174 | "Formatting spans must be nonoverlapping ranges within the new text", | ||
| 175 | )); | ||
| 176 | } | ||
| 177 | for boundary in [span.range.start, span.range.end] { | ||
| 178 | if boundary > 0 | ||
| 179 | && boundary < length | ||
| 180 | && (0xd800..=0xdbff).contains(&units[boundary as usize - 1]) | ||
| 181 | { | ||
| 182 | return Err(invalid("Formatting boundary splits a surrogate pair")); | ||
| 183 | } | ||
| 184 | } | ||
| 185 | crate::formatting::attribute_values(&span.attributes)?; | ||
| 186 | end = span.range.end; | ||
| 187 | } | ||
| 188 | } | ||
| 128 | Ok(()) | 189 | Ok(()) |
| 129 | } | 190 | } |
| 130 | 191 | ||
| ... | @@ -243,6 +304,55 @@ impl Insertion { | ... | @@ -243,6 +304,55 @@ impl Insertion { |
| 243 | }, | 304 | }, |
| 244 | ); | 305 | ); |
| 245 | } | 306 | } |
| 307 | if !self.formats.is_empty() { | ||
| 308 | let default = ExGuid { | ||
| 309 | guid: self.guid, | ||
| 310 | n: 5, | ||
| 311 | }; | ||
| 312 | let mut segments = Vec::new(); | ||
| 313 | let mut end = 0; | ||
| 314 | for span in &self.formats { | ||
| 315 | if end < span.range.start { | ||
| 316 | segments.push((span.range.start, default)); | ||
| 317 | } | ||
| 318 | let id = ExGuid { | ||
| 319 | guid: span.guid, | ||
| 320 | n: 1, | ||
| 321 | }; | ||
| 322 | let mut style = PropertyObject { | ||
| 323 | jcid: 0x12004d, | ||
| 324 | bytes: properties(&default_text_style())?, | ||
| 325 | global_ids: Arc::new(BTreeMap::from([(0, span.guid)])), | ||
| 326 | }; | ||
| 327 | let values = crate::formatting::attribute_values(&span.attributes)?; | ||
| 328 | style.set( | ||
| 329 | &values | ||
| 330 | .iter() | ||
| 331 | .map(|(id, value)| (*id, value.as_slice())) | ||
| 332 | .collect::<Vec<_>>(), | ||
| 333 | )?; | ||
| 334 | new.insert(id, style); | ||
| 335 | segments.push((span.range.end, id)); | ||
| 336 | end = span.range.end; | ||
| 337 | } | ||
| 338 | let length = u32::try_from(self.text.encode_utf16().count()) | ||
| 339 | .map_err(|_| invalid("Text exceeds UTF-16 offset range"))?; | ||
| 340 | if end < length { | ||
| 341 | segments.push((length, default)); | ||
| 342 | } | ||
| 343 | if !segments.iter().any(|(_, id)| *id == default) { | ||
| 344 | new.remove(&default); | ||
| 345 | } | ||
| 346 | let target = new.get_mut(&self.text_object()).unwrap(); | ||
| 347 | let mut references = Vec::new(); | ||
| 348 | let mut ends = Vec::new(); | ||
| 349 | for (end, id) in segments { | ||
| 350 | references.extend_from_slice(&target.reference(id)?); | ||
| 351 | ends.extend_from_slice(&end.to_le_bytes()); | ||
| 352 | } | ||
| 353 | ends.truncate(ends.len() - 4); | ||
| 354 | target.set(&[(0x24001e13, &references), (0x1c001e12, &ends)])?; | ||
| 355 | } | ||
| 246 | if let Placement::Outline { x, y } = self.placement { | 356 | if let Placement::Outline { x, y } = self.placement { |
| 247 | new.insert( | 357 | new.insert( |
| 248 | self.object(), | 358 | self.object(), |
crates/onestore/tests/insertion.rs+354-4| ... | @@ -6,7 +6,7 @@ mod current; | ... | @@ -6,7 +6,7 @@ mod current; |
| 6 | mod disk; | 6 | mod disk; |
| 7 | 7 | ||
| 8 | use onestore::{ | 8 | use onestore::{ |
| 9 | ExGuid, Insertion, PreparedEdit, RevisionIndex, Store, | 9 | ExGuid, Insertion, PreparedEdit, RevisionIndex, Store, TextAttribute as A, |
| 10 | document::{Document, Kind}, | 10 | document::{Document, Kind}, |
| 11 | }; | 11 | }; |
| 12 | 12 | ||
| ... | @@ -28,6 +28,335 @@ fn targets(source: &[u8]) -> (ExGuid, ExGuid, ExGuid, ExGuid, ExGuid) { | ... | @@ -28,6 +28,335 @@ fn targets(source: &[u8]) -> (ExGuid, ExGuid, ExGuid, ExGuid, ExGuid) { |
| 28 | (sid, page, outline, paragraph, text) | 28 | (sid, page, outline, paragraph, text) |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | #[test] | ||
| 32 | fn atomic_formatted_insertions_match_a_character_model_and_preserve_history() { | ||
| 33 | use serde_json::json; | ||
| 34 | let source = onestore::create_section("rich.one", "Original", "Author").unwrap(); | ||
| 35 | let (sid, page, outline, _, _) = targets(&source); | ||
| 36 | let text = "ab🦀 e\u{301} 東京\rEnd\t!"; | ||
| 37 | let plain = Insertion::paragraph(outline, None, text, "Author").unwrap(); | ||
| 38 | assert!( | ||
| 39 | serde_json::to_value(&plain) | ||
| 40 | .unwrap() | ||
| 41 | .get("formats") | ||
| 42 | .is_none() | ||
| 43 | ); | ||
| 44 | let restored: Insertion = serde_json::from_slice(&serde_json::to_vec(&plain).unwrap()).unwrap(); | ||
| 45 | assert_eq!(plain, restored); | ||
| 46 | let base = PreparedEdit::insert(&source, sid, &plain).unwrap(); | ||
| 47 | let base_store = Store::parse(base.as_bytes()).unwrap(); | ||
| 48 | let base_index = RevisionIndex::parse(&base_store).unwrap(); | ||
| 49 | let base_doc = Document::parse(&base_index).unwrap(); | ||
| 50 | let base_space = &base_doc.spaces[&sid]; | ||
| 51 | let base_view = &base_space.revisions[&base_space.contexts[&ExGuid::default()]]; | ||
| 52 | let default = | ||
| 53 | serde_json::to_value(&base_view.text_runs(plain.text_object()).unwrap()[0].format).unwrap(); | ||
| 54 | let offsets: Vec<u32> = std::iter::once(0) | ||
| 55 | .chain(text.chars().scan(0, |n, c| { | ||
| 56 | *n += c.len_utf16() as u32; | ||
| 57 | Some(*n) | ||
| 58 | })) | ||
| 59 | .collect(); | ||
| 60 | let old_store = Store::parse(&source).unwrap(); | ||
| 61 | let old_index = RevisionIndex::parse(&old_store).unwrap(); | ||
| 62 | for seed in 1..=48_u64 { | ||
| 63 | let mut random = seed; | ||
| 64 | let mut expected: Vec<_> = text.chars().map(|c| (c, default.clone())).collect(); | ||
| 65 | let mut intent = if seed % 2 == 0 { | ||
| 66 | Insertion::outline(page, 72.0, 144.0, text, "Author").unwrap() | ||
| 67 | } else { | ||
| 68 | plain.clone() | ||
| 69 | }; | ||
| 70 | // Descending construction also exercises persisted ordering independently of call order. | ||
| 71 | for i in (0..expected.len()).rev() { | ||
| 72 | random ^= random << 13; | ||
| 73 | random ^= random >> 7; | ||
| 74 | random ^= random << 17; | ||
| 75 | let (attributes, values) = match random % 8 { | ||
| 76 | 0 => continue, | ||
| 77 | 1 => ( | ||
| 78 | vec![A::Bold(true), A::Underline(true)], | ||
| 79 | json!({"bold":true,"underline":true}), | ||
| 80 | ), | ||
| 81 | 2 => ( | ||
| 82 | vec![A::Italic(true), A::Strike(true)], | ||
| 83 | json!({"italic":true,"strike":true}), | ||
| 84 | ), | ||
| 85 | 3 => ( | ||
| 86 | vec![A::Font("Arial".into()), A::FontSize(13.5)], | ||
| 87 | json!({"font":"Arial","font_size":13.5}), | ||
| 88 | ), | ||
| 89 | 4 => ( | ||
| 90 | vec![ | ||
| 91 | A::Color(Some([12, 34, 56])), | ||
| 92 | A::Highlight(Some([255, 255, 0])), | ||
| 93 | ], | ||
| 94 | json!({"color":0x38220c,"highlight":0x00ffff}), | ||
| 95 | ), | ||
| 96 | 5 => ( | ||
| 97 | vec![A::Superscript(true)], | ||
| 98 | json!({"superscript":true,"subscript":false}), | ||
| 99 | ), | ||
| 100 | 6 => ( | ||
| 101 | vec![A::Subscript(true)], | ||
| 102 | json!({"subscript":true,"superscript":false}), | ||
| 103 | ), | ||
| 104 | _ => ( | ||
| 105 | vec![A::Bold(false), A::Color(None), A::Highlight(None)], | ||
| 106 | json!({"bold":false,"color":0xff000000_u32,"highlight":0xff000000_u32}), | ||
| 107 | ), | ||
| 108 | }; | ||
| 109 | intent = intent | ||
| 110 | .with_formatting(offsets[i]..offsets[i + 1], &attributes) | ||
| 111 | .unwrap(); | ||
| 112 | for (key, value) in values.as_object().unwrap() { | ||
| 113 | expected[i].1[key] = value.clone(); | ||
| 114 | } | ||
| 115 | } | ||
| 116 | let restored: Insertion = | ||
| 117 | serde_json::from_slice(&serde_json::to_vec(&intent).unwrap()).unwrap(); | ||
| 118 | assert_eq!(restored, intent); | ||
| 119 | let edited = PreparedEdit::insert(&source, sid, &restored).unwrap(); | ||
| 120 | let store = Store::parse(edited.as_bytes()).unwrap(); | ||
| 121 | assert_eq!( | ||
| 122 | store.header.transaction_count, | ||
| 123 | old_store.header.transaction_count + 1 | ||
| 124 | ); | ||
| 125 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 126 | index.validate_current().unwrap(); | ||
| 127 | assert_eq!( | ||
| 128 | index.spaces[&sid].revisions.len(), | ||
| 129 | old_index.spaces[&sid].revisions.len() + 1 | ||
| 130 | ); | ||
| 131 | for (space, old) in &old_index.spaces { | ||
| 132 | for revision in old.revisions.keys() { | ||
| 133 | assert_eq!( | ||
| 134 | format!("{:?}", old_index.resolve(*space, *revision).unwrap()), | ||
| 135 | format!("{:?}", index.resolve(*space, *revision).unwrap()) | ||
| 136 | ); | ||
| 137 | } | ||
| 138 | } | ||
| 139 | let document = Document::parse(&index).unwrap(); | ||
| 140 | let space = &document.spaces[&sid]; | ||
| 141 | let view = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 142 | let actual: Vec<_> = view | ||
| 143 | .text_runs(intent.text_object()) | ||
| 144 | .unwrap() | ||
| 145 | .into_iter() | ||
| 146 | .flat_map(|run| { | ||
| 147 | let format = serde_json::to_value(run.format).unwrap(); | ||
| 148 | run.text.chars().map(move |c| (c, format.clone())) | ||
| 149 | }) | ||
| 150 | .collect(); | ||
| 151 | assert_eq!(actual, expected, "seed {seed}"); | ||
| 152 | } | ||
| 153 | } | ||
| 154 | |||
| 155 | #[test] | ||
| 156 | fn invalid_or_forged_insertion_formats_fail_before_source_parsing() { | ||
| 157 | use serde_json::json; | ||
| 158 | let source = onestore::create_section("invalid-rich.one", "Original", "Author").unwrap(); | ||
| 159 | let (sid, _, outline, _, _) = targets(&source); | ||
| 160 | let plain = Insertion::paragraph(outline, None, "a🦀e\u{301}b", "Author").unwrap(); | ||
| 161 | for (start, end) in [(0, 0), (2, 3), (1, 2), (4, 3), (0, 7)] { | ||
| 162 | let range = start..end; | ||
| 163 | assert!(plain.with_formatting(range, &[A::Bold(true)]).is_err()); | ||
| 164 | } | ||
| 165 | for attributes in [ | ||
| 166 | vec![], | ||
| 167 | vec![A::Bold(true), A::Bold(false)], | ||
| 168 | vec![A::FontSize(f32::NAN)], | ||
| 169 | vec![A::FontSize(5.5)], | ||
| 170 | vec![A::Font("a\0b".into())], | ||
| 171 | vec![A::Superscript(true), A::Subscript(true)], | ||
| 172 | ] { | ||
| 173 | assert!(plain.with_formatting(1..3, &attributes).is_err()); | ||
| 174 | } | ||
| 175 | let formatted = plain.with_formatting(1..3, &[A::Bold(true)]).unwrap(); | ||
| 176 | for range in [0..3, 1..3, 1..4] { | ||
| 177 | assert!( | ||
| 178 | formatted | ||
| 179 | .with_formatting(range, &[A::Italic(true)]) | ||
| 180 | .is_err() | ||
| 181 | ); | ||
| 182 | } | ||
| 183 | let encoded = serde_json::to_value(&formatted).unwrap(); | ||
| 184 | for mutate in 0..6 { | ||
| 185 | let mut value = encoded.clone(); | ||
| 186 | match mutate { | ||
| 187 | 0 => value["formats"][0]["guid"] = serde_json::to_value([0; 16]).unwrap(), | ||
| 188 | 1 => value["formats"][0]["guid"] = value["guid"].clone(), | ||
| 189 | 2 => { | ||
| 190 | let duplicate = value["formats"][0].clone(); | ||
| 191 | value["formats"].as_array_mut().unwrap().push(duplicate); | ||
| 192 | } | ||
| 193 | 3 => value["formats"][0]["range"] = json!({"start":2,"end":3}), | ||
| 194 | 4 => value["formats"][0]["attributes"] = json!([]), | ||
| 195 | _ => value["formats"][0]["range"] = json!({"start":0,"end":u32::MAX}), | ||
| 196 | } | ||
| 197 | let forged: Insertion = serde_json::from_value(value).unwrap(); | ||
| 198 | let error = PreparedEdit::insert(&[], sid, &forged).err().unwrap(); | ||
| 199 | assert_eq!( | ||
| 200 | error, | ||
| 201 | PreparedEdit::insert(&source, sid, &forged).err().unwrap() | ||
| 202 | ); | ||
| 203 | } | ||
| 204 | } | ||
| 205 | |||
| 206 | #[test] | ||
| 207 | fn formatted_empty_insertions_preserve_the_insertion_style_for_later_typing() { | ||
| 208 | let source = onestore::create_section("empty-rich.one", "Original", "Author").unwrap(); | ||
| 209 | let (sid, page, outline, _, _) = targets(&source); | ||
| 210 | for plain in [ | ||
| 211 | Insertion::outline(page, 72.0, 144.0, "", "Author").unwrap(), | ||
| 212 | Insertion::paragraph(outline, None, "", "Author").unwrap(), | ||
| 213 | ] { | ||
| 214 | let intent = plain | ||
| 215 | .with_formatting(0..0, &[A::Italic(true), A::FontSize(18.0)]) | ||
| 216 | .unwrap(); | ||
| 217 | assert!(intent.with_formatting(0..0, &[A::Bold(true)]).is_err()); | ||
| 218 | let inserted = PreparedEdit::insert(&source, sid, &intent).unwrap(); | ||
| 219 | let typed = PreparedEdit::text( | ||
| 220 | inserted.as_bytes(), | ||
| 221 | sid, | ||
| 222 | intent.text_object(), | ||
| 223 | 0..0, | ||
| 224 | "Typed 🦀", | ||
| 225 | ) | ||
| 226 | .unwrap(); | ||
| 227 | for (bytes, text) in [(inserted.as_bytes(), ""), (typed.as_bytes(), "Typed 🦀")] { | ||
| 228 | let store = Store::parse(bytes).unwrap(); | ||
| 229 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 230 | index.validate_current().unwrap(); | ||
| 231 | let document = Document::parse(&index).unwrap(); | ||
| 232 | let space = &document.spaces[&sid]; | ||
| 233 | let view = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 234 | let runs = view.text_runs(intent.text_object()).unwrap(); | ||
| 235 | assert_eq!(runs.len(), 1); | ||
| 236 | assert_eq!(runs[0].text, text); | ||
| 237 | assert_eq!(runs[0].format.italic, Some(true)); | ||
| 238 | assert_eq!(runs[0].format.font_size, Some(18.0)); | ||
| 239 | } | ||
| 240 | } | ||
| 241 | } | ||
| 242 | |||
| 243 | #[test] | ||
| 244 | #[ignore = "exports formatted insertion candidates for cold native validation"] | ||
| 245 | fn export_native_formatted_insertions() { | ||
| 246 | use std::{fs, path::PathBuf}; | ||
| 247 | let output = PathBuf::from(std::env::var_os("ONESTORE_INSERT_OUTPUT").unwrap()); | ||
| 248 | assert!(output.is_absolute()); | ||
| 249 | fs::create_dir(&output).unwrap(); | ||
| 250 | let generated = onestore::create_section("rich.one", "Original", "Author").unwrap(); | ||
| 251 | let unicode = include_bytes!( | ||
| 252 | "../../../corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one" | ||
| 253 | ); | ||
| 254 | let table = include_bytes!( | ||
| 255 | "../../../corpus/native/20260905-05/snapshots/07-table/notebook/synthetic.one" | ||
| 256 | ); | ||
| 257 | let text = "Bold 🦀 italic e\u{301} color 東京\rEnd"; | ||
| 258 | let mut manifest = Vec::new(); | ||
| 259 | for (name, source, empty) in [ | ||
| 260 | ("outline", generated.as_slice(), false), | ||
| 261 | ("native-paragraph", unicode.as_slice(), false), | ||
| 262 | ("native-cell", table.as_slice(), false), | ||
| 263 | ("empty", generated.as_slice(), true), | ||
| 264 | ("empty-typed", generated.as_slice(), true), | ||
| 265 | ] { | ||
| 266 | let (sid, page, outline, paragraph, _) = targets(source); | ||
| 267 | let insertion = match name { | ||
| 268 | "native-paragraph" => { | ||
| 269 | Insertion::paragraph(outline, Some(paragraph), text, "Rich author") | ||
| 270 | } | ||
| 271 | "native-cell" => { | ||
| 272 | let store = Store::parse(source).unwrap(); | ||
| 273 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 274 | let document = Document::parse(&index).unwrap(); | ||
| 275 | let space = &document.spaces[&sid]; | ||
| 276 | let view = &space.revisions[&space.contexts[&ExGuid::default()]]; | ||
| 277 | let cell = *view | ||
| 278 | .nodes | ||
| 279 | .iter() | ||
| 280 | .find(|(_, node)| matches!(node.kind, Kind::Cell { .. })) | ||
| 281 | .unwrap() | ||
| 282 | .0; | ||
| 283 | Insertion::paragraph(cell, None, text, "Rich author") | ||
| 284 | } | ||
| 285 | _ => Insertion::outline( | ||
| 286 | page, | ||
| 287 | 72.0, | ||
| 288 | 144.0, | ||
| 289 | if empty { "" } else { text }, | ||
| 290 | "Rich author", | ||
| 291 | ), | ||
| 292 | } | ||
| 293 | .unwrap(); | ||
| 294 | let mut intent = insertion; | ||
| 295 | if empty { | ||
| 296 | intent = intent | ||
| 297 | .with_formatting(0..0, &[A::Italic(true), A::FontSize(18.0)]) | ||
| 298 | .unwrap(); | ||
| 299 | } else { | ||
| 300 | for (label, attributes) in [ | ||
| 301 | ("Bold", vec![A::Bold(true), A::Underline(true)]), | ||
| 302 | ("🦀", vec![A::Font("Arial".into()), A::FontSize(13.5)]), | ||
| 303 | ("italic", vec![A::Italic(true), A::Strike(true)]), | ||
| 304 | ("e\u{301}", vec![A::Superscript(true)]), | ||
| 305 | ( | ||
| 306 | "color", | ||
| 307 | vec![ | ||
| 308 | A::Color(Some([12, 34, 56])), | ||
| 309 | A::Highlight(Some([255, 255, 0])), | ||
| 310 | ], | ||
| 311 | ), | ||
| 312 | ("東京", vec![A::Subscript(true)]), | ||
| 313 | ( | ||
| 314 | "End", | ||
| 315 | vec![ | ||
| 316 | A::Bold(false), | ||
| 317 | A::Italic(false), | ||
| 318 | A::Color(None), | ||
| 319 | A::Highlight(None), | ||
| 320 | ], | ||
| 321 | ), | ||
| 322 | ] { | ||
| 323 | let start = text[..text.find(label).unwrap()].encode_utf16().count() as u32; | ||
| 324 | intent = intent | ||
| 325 | .with_formatting( | ||
| 326 | start..start + label.encode_utf16().count() as u32, | ||
| 327 | &attributes, | ||
| 328 | ) | ||
| 329 | .unwrap(); | ||
| 330 | } | ||
| 331 | } | ||
| 332 | let inserted = PreparedEdit::insert(source, sid, &intent).unwrap(); | ||
| 333 | let bytes = if name == "empty-typed" { | ||
| 334 | PreparedEdit::text( | ||
| 335 | inserted.as_bytes(), | ||
| 336 | sid, | ||
| 337 | intent.text_object(), | ||
| 338 | 0..0, | ||
| 339 | "Typed café 🦀", | ||
| 340 | ) | ||
| 341 | .unwrap() | ||
| 342 | .as_bytes() | ||
| 343 | .to_vec() | ||
| 344 | } else { | ||
| 345 | inserted.as_bytes().to_vec() | ||
| 346 | }; | ||
| 347 | current::current(&bytes); | ||
| 348 | let notebook = output.join(name); | ||
| 349 | fs::create_dir(&notebook).unwrap(); | ||
| 350 | fs::write(notebook.join("synthetic.one"), &bytes).unwrap(); | ||
| 351 | manifest.push(serde_json::json!({"name":name,"space":sid,"intent":intent})); | ||
| 352 | } | ||
| 353 | fs::write( | ||
| 354 | output.join("manifest.json"), | ||
| 355 | serde_json::to_vec_pretty(&manifest).unwrap(), | ||
| 356 | ) | ||
| 357 | .unwrap(); | ||
| 358 | } | ||
| 359 | |||
| 31 | #[test] | 360 | #[test] |
| 32 | fn paragraph_and_outline_insertions_publish_metadata_and_references_together() { | 361 | fn paragraph_and_outline_insertions_publish_metadata_and_references_together() { |
| 33 | let source = onestore::create_section("insertion.one", "Original", "Original author").unwrap(); | 362 | let source = onestore::create_section("insertion.one", "Original", "Original author").unwrap(); |
| ... | @@ -165,11 +494,15 @@ fn repeated_insertions_and_formatting_share_immutable_objects() { | ... | @@ -165,11 +494,15 @@ fn repeated_insertions_and_formatting_share_immutable_objects() { |
| 165 | fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits() { | 494 | fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits() { |
| 166 | let source = onestore::create_section("rebase.one", "Original", "Author").unwrap(); | 495 | let source = onestore::create_section("rebase.one", "Original", "Author").unwrap(); |
| 167 | let (sid, _, outline, paragraph, text) = targets(&source); | 496 | let (sid, _, outline, paragraph, text) = targets(&source); |
| 168 | let intent = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author").unwrap(); | 497 | let intent = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author") |
| 498 | .unwrap() | ||
| 499 | .with_formatting(0..3, &[A::Bold(true), A::Color(Some([12, 34, 56]))]) | ||
| 500 | .unwrap(); | ||
| 169 | let encoded = serde_json::to_vec(&intent).unwrap(); | 501 | let encoded = serde_json::to_vec(&intent).unwrap(); |
| 170 | let restored: Insertion = serde_json::from_slice(&encoded).unwrap(); | 502 | let restored: Insertion = serde_json::from_slice(&encoded).unwrap(); |
| 171 | assert_eq!(intent.object(), restored.object()); | 503 | assert_eq!(intent.object(), restored.object()); |
| 172 | assert_eq!(intent.text_object(), restored.text_object()); | 504 | assert_eq!(intent.text_object(), restored.text_object()); |
| 505 | assert_eq!(intent, restored); | ||
| 173 | let original_preparation = PreparedEdit::insert(&source, sid, &intent).unwrap(); | 506 | let original_preparation = PreparedEdit::insert(&source, sid, &intent).unwrap(); |
| 174 | let remote = PreparedEdit::text(&source, sid, text, 0..0, "Remote ").unwrap(); | 507 | let remote = PreparedEdit::text(&source, sid, text, 0..0, "Remote ").unwrap(); |
| 175 | let updated = PreparedEdit::insert(remote.as_bytes(), sid, &restored).unwrap(); | 508 | 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( | ... | @@ -188,6 +521,12 @@ fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits( |
| 188 | assert!( | 521 | assert!( |
| 189 | matches!(&view.nodes[&restored.text_object()].kind, Kind::RichText { text, .. } if text == "Inserted") | 522 | matches!(&view.nodes[&restored.text_object()].kind, Kind::RichText { text, .. } if text == "Inserted") |
| 190 | ); | 523 | ); |
| 524 | let runs = view.text_runs(restored.text_object()).unwrap(); | ||
| 525 | assert_eq!(runs[0].text, "Ins"); | ||
| 526 | assert_eq!(runs[0].format.bold, Some(true)); | ||
| 527 | assert_eq!(runs[0].format.color, Some(0x38220c)); | ||
| 528 | assert_eq!(runs[1].text, "erted"); | ||
| 529 | assert_ne!(runs[1].format.bold, Some(true)); | ||
| 191 | assert!(PreparedEdit::insert(original_preparation.as_bytes(), sid, &restored).is_err()); | 530 | assert!(PreparedEdit::insert(original_preparation.as_bytes(), sid, &restored).is_err()); |
| 192 | assert!(PreparedEdit::insert(updated.as_bytes(), sid, &restored).is_err()); | 531 | assert!(PreparedEdit::insert(updated.as_bytes(), sid, &restored).is_err()); |
| 193 | } | 532 | } |
| ... | @@ -196,8 +535,14 @@ fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits( | ... | @@ -196,8 +535,14 @@ fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits( |
| 196 | fn repositioning_preserves_intent_identity_and_kind() { | 535 | fn repositioning_preserves_intent_identity_and_kind() { |
| 197 | let source = onestore::create_section("placement.one", "Original", "Author").unwrap(); | 536 | let source = onestore::create_section("placement.one", "Original", "Author").unwrap(); |
| 198 | let (sid, page, outline, paragraph, _) = targets(&source); | 537 | let (sid, page, outline, paragraph, _) = targets(&source); |
| 199 | let p = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author").unwrap(); | 538 | let p = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author") |
| 200 | let o = Insertion::outline(page, 144.0, 144.0, "Inserted", "Author").unwrap(); | 539 | .unwrap() |
| 540 | .with_formatting(1..4, &[A::Italic(true)]) | ||
| 541 | .unwrap(); | ||
| 542 | let o = Insertion::outline(page, 144.0, 144.0, "Inserted", "Author") | ||
| 543 | .unwrap() | ||
| 544 | .with_formatting(0..8, &[A::FontSize(18.0)]) | ||
| 545 | .unwrap(); | ||
| 201 | assert!(p.reposition_outline(page, 72.0, 72.0).is_err()); | 546 | assert!(p.reposition_outline(page, 72.0, 72.0).is_err()); |
| 202 | assert!(o.reposition_paragraph(outline, None).is_err()); | 547 | assert!(o.reposition_paragraph(outline, None).is_err()); |
| 203 | assert!(p.reposition_paragraph(ExGuid::default(), None).is_err()); | 548 | assert!(p.reposition_paragraph(ExGuid::default(), None).is_err()); |
| ... | @@ -344,6 +689,11 @@ fn insertion_publication_faults_expose_only_complete_graphs_and_title_caches() { | ... | @@ -344,6 +689,11 @@ fn insertion_publication_faults_expose_only_complete_graphs_and_title_caches() { |
| 344 | Insertion::paragraph(outline, Some(paragraph), "First 🦀", "New author").unwrap(), | 689 | Insertion::paragraph(outline, Some(paragraph), "First 🦀", "New author").unwrap(), |
| 345 | Insertion::outline(page, 0.0, 0.0, "First 🦀", "New author").unwrap(), | 690 | Insertion::outline(page, 0.0, 0.0, "First 🦀", "New author").unwrap(), |
| 346 | ] { | 691 | ] { |
| 692 | let intent = intent | ||
| 693 | .with_formatting(0..3, &[A::Bold(true), A::FontSize(18.0)]) | ||
| 694 | .unwrap() | ||
| 695 | .with_formatting(6..8, &[A::Italic(true), A::Highlight(Some([255, 255, 0]))]) | ||
| 696 | .unwrap(); | ||
| 347 | let edit = PreparedEdit::insert(source, sid, &intent).unwrap(); | 697 | let edit = PreparedEdit::insert(source, sid, &intent).unwrap(); |
| 348 | let before = current::current(source); | 698 | let before = current::current(source); |
| 349 | let after = current::current(edit.as_bytes()); | 699 | let after = current::current(edit.as_bytes()); |
fuzz/Cargo.toml+7| ... | @@ -77,3 +77,10 @@ path = "fuzz_targets/edit_text.rs" | ... | @@ -77,3 +77,10 @@ path = "fuzz_targets/edit_text.rs" |
| 77 | test = false | 77 | test = false |
| 78 | doc = false | 78 | doc = false |
| 79 | bench = false | 79 | bench = false |
| 80 | |||
| 81 | [[bin]] | ||
| 82 | name = "insert" | ||
| 83 | path = "fuzz_targets/insert.rs" | ||
| 84 | test = false | ||
| 85 | doc = false | ||
| 86 | bench = false |
fuzz/fuzz_targets/insert.rs created+135| ... | @@ -0,0 +1,135 @@ | ||
| 1 | #![no_main] | ||
| 2 | use libfuzzer_sys::fuzz_target; | ||
| 3 | use onestore::{ | ||
| 4 | CommitState, ExGuid, Insertion, PreparedEdit, RevisionIndex, Store, TextAttribute as A, | ||
| 5 | document::{Document, Kind}, | ||
| 6 | }; | ||
| 7 | use std::sync::LazyLock; | ||
| 8 | |||
| 9 | #[path = "../../crates/onestore/tests/support/current.rs"] | ||
| 10 | mod current; | ||
| 11 | #[path = "../../crates/onestore/tests/support/disk.rs"] | ||
| 12 | mod disk; | ||
| 13 | |||
| 14 | static SOURCE: LazyLock<(Vec<u8>, ExGuid, ExGuid, ExGuid)> = LazyLock::new(|| { | ||
| 15 | let bytes = include_bytes!( | ||
| 16 | "../../corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one" | ||
| 17 | ) | ||
| 18 | .to_vec(); | ||
| 19 | let store = Store::parse(&bytes).unwrap(); | ||
| 20 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 21 | let document = Document::parse(&index).unwrap(); | ||
| 22 | let (space, page) = document.pages().unwrap()[0]; | ||
| 23 | let s = &document.spaces[&space]; | ||
| 24 | let view = &s.revisions[&s.contexts[&ExGuid::default()]]; | ||
| 25 | let outline = *view.nodes[&page] | ||
| 26 | .children | ||
| 27 | .iter() | ||
| 28 | .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. })) | ||
| 29 | .unwrap(); | ||
| 30 | (bytes, space, page, outline) | ||
| 31 | }); | ||
| 32 | |||
| 33 | fuzz_target!(|input: &[u8]| { | ||
| 34 | let (source, space, page, outline) = &*SOURCE; | ||
| 35 | if let Ok(intent) = serde_json::from_slice::<Insertion>(input) | ||
| 36 | && let Ok(prepared) = PreparedEdit::insert(source, *space, &intent) | ||
| 37 | { | ||
| 38 | current::current(prepared.as_bytes()); | ||
| 39 | } | ||
| 40 | let mut persisted = source.clone(); | ||
| 41 | let mut caches = std::array::from_fn::<_, 12, _>(|_| source.clone()); | ||
| 42 | for step in input.chunks_exact(8).take(12) { | ||
| 43 | let actor = usize::from(step[0]) % caches.len(); | ||
| 44 | if step[1] % 4 == 0 { | ||
| 45 | caches[actor].clone_from(&persisted); | ||
| 46 | } | ||
| 47 | let source = &caches[actor]; | ||
| 48 | let text = | ||
| 49 | ["", "ab", "🦀e\u{301}東京\rEnd", "same style same style"][usize::from(step[2]) % 4]; | ||
| 50 | let offsets: Vec<u32> = std::iter::once(0) | ||
| 51 | .chain(text.chars().scan(0, |n, c| { | ||
| 52 | *n += c.len_utf16() as u32; | ||
| 53 | Some(*n) | ||
| 54 | })) | ||
| 55 | .collect(); | ||
| 56 | let first = usize::from(step[3]) % offsets.len(); | ||
| 57 | let second = usize::from(step[4]) % offsets.len(); | ||
| 58 | let (start, end) = (first.min(second), first.max(second)); | ||
| 59 | let plain = if step[1] & 1 == 0 { | ||
| 60 | Insertion::paragraph(*outline, None, text, "Insertion fuzz").unwrap() | ||
| 61 | } else { | ||
| 62 | Insertion::outline(*page, 72.0, 144.0, text, "Insertion fuzz").unwrap() | ||
| 63 | }; | ||
| 64 | let enabled = step[5] & 1 != 0; | ||
| 65 | let intent = if start != end || text.is_empty() { | ||
| 66 | plain | ||
| 67 | .with_formatting( | ||
| 68 | offsets[start]..offsets[end], | ||
| 69 | &[A::Bold(enabled), A::FontSize(18.0)], | ||
| 70 | ) | ||
| 71 | .unwrap() | ||
| 72 | } else { | ||
| 73 | plain | ||
| 74 | }; | ||
| 75 | let encoded = serde_json::to_vec(&intent).unwrap(); | ||
| 76 | let intent: Insertion = serde_json::from_slice(&encoded).unwrap(); | ||
| 77 | let edit = PreparedEdit::insert(source, *space, &intent).unwrap(); | ||
| 78 | let store = Store::parse(edit.as_bytes()).unwrap(); | ||
| 79 | let index = RevisionIndex::parse(&store).unwrap(); | ||
| 80 | let document = Document::parse(&index).unwrap(); | ||
| 81 | let s = &document.spaces[space]; | ||
| 82 | let view = &s.revisions[&s.contexts[&ExGuid::default()]]; | ||
| 83 | let actual: Vec<_> = view | ||
| 84 | .text_runs(intent.text_object()) | ||
| 85 | .unwrap() | ||
| 86 | .into_iter() | ||
| 87 | .flat_map(|run| { | ||
| 88 | run.text.chars().map(move |c| { | ||
| 89 | ( | ||
| 90 | c, | ||
| 91 | run.format.bold.unwrap_or(false), | ||
| 92 | run.format.font_size.unwrap(), | ||
| 93 | ) | ||
| 94 | }) | ||
| 95 | }) | ||
| 96 | .collect(); | ||
| 97 | let expected: Vec<_> = text | ||
| 98 | .chars() | ||
| 99 | .enumerate() | ||
| 100 | .map(|(i, c)| { | ||
| 101 | if (start..end).contains(&i) { | ||
| 102 | (c, enabled, 18.0) | ||
| 103 | } else { | ||
| 104 | (c, false, 11.0) | ||
| 105 | } | ||
| 106 | }) | ||
| 107 | .collect(); | ||
| 108 | assert_eq!(actual, expected); | ||
| 109 | let before = current::current(&persisted); | ||
| 110 | let after = current::current(edit.as_bytes()); | ||
| 111 | let mut disk = disk::Disk { | ||
| 112 | visible: persisted.clone(), | ||
| 113 | durable: persisted.clone(), | ||
| 114 | operation: 0, | ||
| 115 | fail_at: (step[6] != 0).then_some(usize::from(step[6])), | ||
| 116 | write_limit: if step[7] & 1 == 0 { 17 } else { 4096 }, | ||
| 117 | random: u64::from(step[7]) + 1, | ||
| 118 | }; | ||
| 119 | let result = edit.commit(&mut disk); | ||
| 120 | let observed = current::current(&disk.durable); | ||
| 121 | match result { | ||
| 122 | Ok(()) => assert_eq!(observed, after), | ||
| 123 | Err(error) => { | ||
| 124 | assert!(observed == before || observed == after); | ||
| 125 | if error.state == CommitState::NotCommitted { | ||
| 126 | assert_eq!(observed, before); | ||
| 127 | } | ||
| 128 | if error.state == CommitState::Committed { | ||
| 129 | assert_eq!(observed, after); | ||
| 130 | } | ||
| 131 | } | ||
| 132 | } | ||
| 133 | persisted = disk.durable; | ||
| 134 | } | ||
| 135 | }); | ||
tools/native/formatted-insertion.ps1 created+53| ... | @@ -0,0 +1,53 @@ | ||
| 1 | param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') | ||
| 2 | Set-StrictMode -Version Latest | ||
| 3 | $ErrorActionPreference = 'Stop' | ||
| 4 | & "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost | ||
| 5 | $app = New-Object -ComObject OneNote.Application | ||
| 6 | $notebook = '' | ||
| 7 | try { | ||
| 8 | $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebook, 0) | ||
| 9 | $section = '' | ||
| 10 | $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) | ||
| 11 | $deadline = [DateTime]::UtcNow.AddSeconds(60) | ||
| 12 | do { | ||
| 13 | $hierarchy = '' | ||
| 14 | $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) | ||
| 15 | [xml]$tree = $hierarchy | ||
| 16 | $pages = @($tree.SelectNodes('//*[local-name()="Page"]')) | ||
| 17 | if ($pages.Count -eq 1) { break } | ||
| 18 | Start-Sleep -Milliseconds 250 | ||
| 19 | } while ([DateTime]::UtcNow -lt $deadline) | ||
| 20 | if ($pages.Count -ne 1) { throw 'Expected one fixture page.' } | ||
| 21 | $pageId = $pages[0].GetAttribute('ID') | ||
| 22 | foreach ($phase in @('control', 'edit')) { | ||
| 23 | $content = '' | ||
| 24 | $app.GetPageContent($pageId, [ref]$content, 1, 1) | ||
| 25 | [IO.File]::WriteAllText((Join-Path $Root ($phase + '-before.xml')), $content, [Text.Encoding]::UTF8) | ||
| 26 | [xml]$page = $content | ||
| 27 | $matches = @($page.SelectNodes('//*[local-name()="T"]') | Where-Object { | ||
| 28 | $plain = [regex]::Replace($_.InnerText, '<[^>]*>', '') | ||
| 29 | $plain.StartsWith('Bold ') -or $plain.StartsWith('Typed ') | ||
| 30 | }) | ||
| 31 | if ($matches.Count -ne 1) { throw 'Expected one inserted rich paragraph.' } | ||
| 32 | $target = $matches[0] | ||
| 33 | if ($phase -eq 'edit') { $target.InnerText = $target.InnerText.Replace('Bold', 'Native Bold').Replace('Typed', 'Native Typed') } | ||
| 34 | $outline = $target | ||
| 35 | while ($outline.LocalName -ne 'Outline') { $outline = $outline.ParentNode } | ||
| 36 | $update = '<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="' + $pageId + '">' | ||
| 37 | foreach ($style in $page.SelectNodes('/*/*[local-name()="QuickStyleDef"]')) { $update += $style.OuterXml } | ||
| 38 | if ($outline.SelectSingleNode('.//*[local-name()="Table"]')) { | ||
| 39 | # Resubmitting measured outline size constrains native table auto-fit. | ||
| 40 | foreach ($size in @($outline.SelectNodes('*[local-name()="Size"]'))) { [void]$outline.RemoveChild($size) } | ||
| 41 | } | ||
| 42 | $update += $outline.OuterXml + '</one:Page>' | ||
| 43 | [IO.File]::WriteAllText((Join-Path $Root ($phase + '-update.xml')), $update, [Text.Encoding]::UTF8) | ||
| 44 | $app.UpdatePageContent($update, [DateTime]::MinValue, 1, $false) | ||
| 45 | } | ||
| 46 | $app.SyncHierarchy($notebook) | ||
| 47 | } finally { | ||
| 48 | if ($notebook) { $app.CloseNotebook($notebook, $false) } | ||
| 49 | [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) | ||
| 50 | $app = $null | ||
| 51 | [GC]::Collect() | ||
| 52 | [GC]::WaitForPendingFinalizers() | ||
| 53 | } | ||
tools/native/read.ps1+4-1| ... | @@ -40,6 +40,7 @@ try { | ... | @@ -40,6 +40,7 @@ try { |
| 40 | } | 40 | } |
| 41 | $deadline = [DateTime]::UtcNow.AddSeconds(300) | 41 | $deadline = [DateTime]::UtcNow.AddSeconds(300) |
| 42 | $previous = '' | 42 | $previous = '' |
| 43 | $lastChange = '' | ||
| 43 | $stableSince = [DateTime]::UtcNow | 44 | $stableSince = [DateTime]::UtcNow |
| 44 | $settled = $false | 45 | $settled = $false |
| 45 | do { | 46 | do { |
| ... | @@ -62,6 +63,7 @@ try { | ... | @@ -62,6 +63,7 @@ try { |
| 62 | } | 63 | } |
| 63 | $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) | 64 | $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) |
| 64 | if ($signature -ne $previous) { | 65 | if ($signature -ne $previous) { |
| 66 | $lastChange = $previous | ||
| 65 | $previous = $signature | 67 | $previous = $signature |
| 66 | $stableSince = [DateTime]::UtcNow | 68 | $stableSince = [DateTime]::UtcNow |
| 67 | } | 69 | } |
| ... | @@ -71,6 +73,7 @@ try { | ... | @@ -71,6 +73,7 @@ try { |
| 71 | Start-Sleep -Milliseconds 250 | 73 | Start-Sleep -Milliseconds 250 |
| 72 | } while ([DateTime]::UtcNow -lt $deadline) | 74 | } while ([DateTime]::UtcNow -lt $deadline) |
| 73 | if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { | 75 | if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { |
| 76 | [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) | ||
| 74 | $index = 0 | 77 | $index = 0 |
| 75 | foreach ($id in @($pages.Keys | Sort-Object)) { | 78 | foreach ($id in @($pages.Keys | Sort-Object)) { |
| 76 | [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) | 79 | [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) |
| ... | @@ -79,7 +82,7 @@ try { | ... | @@ -79,7 +82,7 @@ try { |
| 79 | $hierarchy = '' | 82 | $hierarchy = '' |
| 80 | $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) | 83 | $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) |
| 81 | [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) | 84 | [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) |
| 82 | throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." | 85 | throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." |
| 83 | } | 86 | } |
| 84 | $index = 0 | 87 | $index = 0 |
| 85 | $payloads = @() | 88 | $payloads = @() |
tools/offline_document_history.py+6-1| ... | @@ -80,6 +80,11 @@ def document_history(logs, operations): | ... | @@ -80,6 +80,11 @@ def document_history(logs, operations): |
| 80 | assert formatted['range'] == [1, len(text.encode('utf-16-le')) // 2 - 2] | 80 | assert formatted['range'] == [1, len(text.encode('utf-16-le')) // 2 - 2] |
| 81 | assert formatted['attributes'] == [{'Bold': True}, {'FontSize': 18 + number % 9}, {'Color': [18, 52, 86]}] | 81 | assert formatted['attributes'] == [{'Bold': True}, {'FontSize': 18 + number % 9}, {'Color': [18, 52, 86]}] |
| 82 | old = [(char, False, 11, 0xff000000) for char in text] | 82 | old = [(char, False, 11, 0xff000000) for char in text] |
| 83 | if insertion.get('formats'): | ||
| 84 | span, = insertion['formats'] | ||
| 85 | assert span['range'] == {'start': 0, 'end': len(text.encode('utf-16-le')) // 2}, 'Initial formatting range differs from workload' | ||
| 86 | assert span['attributes'] == [{'FontSize': 13.5}, {'Color': [68, 85, 102]}], 'Initial formatting attributes differ from workload' | ||
| 87 | old = [(char, False, 13.5, 0x665544) for char in text] | ||
| 83 | new = [(char, True, 18 + number % 9, 0x563412) if 0 < i < len(text)-1 else old[i] for i, char in enumerate(text)] | 88 | new = [(char, True, 18 + number % 9, 0x563412) if 0 < i < len(text)-1 else old[i] for i, char in enumerate(text)] |
| 84 | assert target not in documents, 'Two insertion intents share an object identity' | 89 | assert target not in documents, 'Two insertion intents share an object identity' |
| 85 | created, changed = linked[inserted['id']], linked[formatted['id']] | 90 | created, changed = linked[inserted['id']], linked[formatted['id']] |
| ... | @@ -158,6 +163,6 @@ def verify_native(paragraphs, documents): | ... | @@ -158,6 +163,6 @@ def verify_native(paragraphs, documents): |
| 158 | if color == 0xff000000: | 163 | if color == 0xff000000: |
| 159 | assert native_color in ('automatic', None), 'Native automatic color changed' | 164 | assert native_color in ('automatic', None), 'Native automatic color changed' |
| 160 | else: | 165 | else: |
| 161 | assert ImageColor.getrgb(native_color) == (18, 52, 86), 'Native color differs from intent' | 166 | assert ImageColor.getrgb(native_color) == (color & 255, (color >> 8) & 255, (color >> 16) & 255), 'Native color differs from intent' |
| 162 | checks += 3 | 167 | checks += 3 |
| 163 | return checks | 168 | return checks |
tools/test_formatted_insertion.py created+57| ... | @@ -0,0 +1,57 @@ | ||
| 1 | import json | ||
| 2 | from pathlib import Path | ||
| 3 | import runpy | ||
| 4 | import shutil | ||
| 5 | from tempfile import TemporaryDirectory | ||
| 6 | import unittest | ||
| 7 | import xml.etree.ElementTree as ET | ||
| 8 | |||
| 9 | from native_format import native_characters | ||
| 10 | from native_xml import ns | ||
| 11 | |||
| 12 | ROOT = Path(__file__).resolve().parent.parent | ||
| 13 | FIXTURE = ROOT / 'corpus/formatted-insertion' | ||
| 14 | compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare'] | ||
| 15 | |||
| 16 | |||
| 17 | class FormattedInsertionTest(unittest.TestCase): | ||
| 18 | def test_cold_native_content_and_formatting(self): | ||
| 19 | manifest = json.loads((FIXTURE / 'manifest.json').read_text()) | ||
| 20 | for case in manifest['cases']: | ||
| 21 | with self.subTest(case=case['name']), TemporaryDirectory() as temporary: | ||
| 22 | fixture = FIXTURE / case['name'] | ||
| 23 | native = Path(temporary) / 'read' | ||
| 24 | shutil.copytree(fixture / 'cold/read', native) | ||
| 25 | compare(fixture / 'candidate', native) | ||
| 26 | with TemporaryDirectory() as temporary: | ||
| 27 | fixture = FIXTURE / 'empty/typed-after-cold' | ||
| 28 | native = Path(temporary) / 'read' | ||
| 29 | shutil.copytree(fixture / 'read', native) | ||
| 30 | compare(fixture / 'candidate', native) | ||
| 31 | |||
| 32 | def test_native_edits_preserve_the_observed_character_styles(self): | ||
| 33 | manifest = json.loads((FIXTURE / 'manifest.json').read_text()) | ||
| 34 | for case in manifest['cases']: | ||
| 35 | for variant, before_file, prefix in [('reverse', 'edit-before.xml', 'Native '), | ||
| 36 | ('ui', 'before-read/page-000.xml', 'UI ')]: | ||
| 37 | if variant + '_sha256' not in case: | ||
| 38 | continue | ||
| 39 | with self.subTest(case=case['name'], variant=variant), TemporaryDirectory() as temporary: | ||
| 40 | fixture = FIXTURE / case['name'] / variant | ||
| 41 | native = Path(temporary) / 'read' | ||
| 42 | shutil.copytree(fixture / 'read', native) | ||
| 43 | compare(fixture / 'notebook', native) | ||
| 44 | before = ET.parse(fixture / before_file).getroot() | ||
| 45 | after = ET.parse(native / 'page-000.xml').getroot() | ||
| 46 | expected = native_characters(before, before.findall('one:Outline', ns)) | ||
| 47 | changed = 0 | ||
| 48 | for index, paragraph in enumerate(expected): | ||
| 49 | if ''.join(char for char, _ in paragraph).startswith(('Bold ', 'Typed ')): | ||
| 50 | expected[index] = [(char, paragraph[0][1]) for char in prefix] + paragraph | ||
| 51 | changed += 1 | ||
| 52 | self.assertEqual(changed, 1) | ||
| 53 | self.assertEqual(native_characters(after, after.findall('one:Outline', ns)), expected) | ||
| 54 | |||
| 55 | |||
| 56 | if __name__ == '__main__': | ||
| 57 | unittest.main() | ||
tools/test_offline_document_history.py+28| ... | @@ -60,6 +60,34 @@ class DocumentHistoryTests(unittest.TestCase): | ... | @@ -60,6 +60,34 @@ class DocumentHistoryTests(unittest.TestCase): |
| 60 | events.remove(next(row for row in events if row['event'] == name)) | 60 | events.remove(next(row for row in events if row['event'] == name)) |
| 61 | with self.subTest(event=name), self.assertRaises(AssertionError): document_history(logs, 2) | 61 | with self.subTest(event=name), self.assertRaises(AssertionError): document_history(logs, 2) |
| 62 | 62 | ||
| 63 | def test_formatted_insertions_are_atomic_in_every_observed_snapshot(self): | ||
| 64 | for events in self.logs.values(): | ||
| 65 | for row in events: | ||
| 66 | insertion = row.get('insertion') | ||
| 67 | if insertion: | ||
| 68 | insertion['formats'] = [{'guid': list(uuid.uuid4().bytes_le), | ||
| 69 | 'range': {'start': 0, 'end': len(insertion['text'].encode('utf-16-le')) // 2}, | ||
| 70 | 'attributes': [{'FontSize': 13.5}, {'Color': [68, 85, 102]}]}] | ||
| 71 | for key in ('documents', 'document_changes'): | ||
| 72 | for document in (row.get(key) or {}).values(): | ||
| 73 | for run in document['runs']: | ||
| 74 | if run['size'] == 11: | ||
| 75 | run['size'] = 13.5 | ||
| 76 | run['color'] = 0x665544 | ||
| 77 | documents = document_history(self.logs, 2) | ||
| 78 | paragraphs = [[(char, {'bold': bold, 'font_size': size, | ||
| 79 | 'color': '#123456' if color == 0x563412 else '#445566'}) | ||
| 80 | for char, bold, size, color in row['new']] for row in documents.values()] | ||
| 81 | self.assertEqual(verify_native(paragraphs, documents), sum(len(row['new'])*3 for row in documents.values())) | ||
| 82 | baseline = copy.deepcopy(self.logs) | ||
| 83 | for event, key in [('remote_attempt', 'document_changes'), ('read', 'documents')]: | ||
| 84 | for field, value in [('size', 11), ('color', 0xff000000)]: | ||
| 85 | logs = copy.deepcopy(baseline) | ||
| 86 | row = next(row for row in logs['w0'] if row['event'] == event) | ||
| 87 | next(iter(row[key].values()))['runs'][0][field] = value | ||
| 88 | with self.subTest(event=event, field=field), self.assertRaises(AssertionError): | ||
| 89 | document_history(logs, 2) | ||
| 90 | |||
| 63 | def test_retired_format_receipt_requires_current_revision_and_exact_observed_effect(self): | 91 | def test_retired_format_receipt_requires_current_revision_and_exact_observed_effect(self): |
| 64 | events = self.logs['w0'] | 92 | events = self.logs['w0'] |
| 65 | attempt = next(row for row in events if row['event'] == 'remote_attempt' and row['revision'] == 'revision-3') | 93 | attempt = next(row for row in events if row['event'] == 'remote_attempt' and row['revision'] == 'revision-3') |