| author | |
| committer | |
| log | e3fba00fa7baf2a33af4943802256e937ba0573d |
| tree | 4bef4307add284b5f3293f525722433ff2b43a64 |
| parent | 5f00c02e9903b23fca73277fcdd3b6aa4fe2ea5a |
| signature | Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU |
Record five keyboard-driven OneNote joins covering differing paragraph styles, tagged empty text, right-side tags and children on both sides. Preserve native identity, hierarchy, tag-transfer and metadata observations in public fixtures.
The native document oracle passes six pages before and after joining, and all characters plus 2,180 style comparisons survive. The complete Python lane passes 129 tests; all owned VMs were removed.
Assisted-by: gpt-6-astra45 files changed, 465 insertions(+), 0 deletions(-)
corpus/paragraph-edit/README.md+11| ... | @@ -37,3 +37,14 @@ typing checks extend the preexisting empty run in an independent expected model. | ... | @@ -37,3 +37,14 @@ typing checks extend the preexisting empty run in an independent expected model. |
| 37 | `tools/test_paragraph_edit.py` verifies these controls without a VM. The native | 37 | `tools/test_paragraph_edit.py` verifies these controls without a VM. The native |
| 38 | join captures establish behavior for subsequent join implementation. | 38 | join captures establish behavior for subsequent join implementation. |
| 39 | Identical captured files link to one canonical copy within this corpus. | 39 | Identical captured files link to one canonical copy within this corpus. |
| 40 | |||
| 41 | `join-edges`, authored with `tools/native/paragraph-joins.ps1`, adds five native | ||
| 42 | Backspace cases for differing inherited styles, tags on either side and children | ||
| 43 | on both sides. A nonempty left paragraph keeps its own tags; right-only tags | ||
| 44 | disappear from the active result. An empty tagged left paragraph transfers its | ||
| 45 | tags onto the adopted right text. A left paragraph with children joins through | ||
| 46 | its last descendant, and the right children become that descendant's peers. | ||
| 47 | The untouched parent's text gains a timestamp and `0x880034dd`, as in the earlier | ||
| 48 | native controls; its content and other properties stay unchanged. The test fixes | ||
| 49 | these observed graph, identity and metadata effects alongside independent native | ||
| 50 | character-style comparisons. |
corpus/paragraph-edit/join-edges/before/notebook/Open Notebook.onetoc2 created| Binary files /dev/null and b/corpus/paragraph-edit/join-edges/before/notebook/Open Notebook.onetoc2 differ | |||
corpus/paragraph-edit/join-edges/before/notebook/synthetic.one created| Binary files /dev/null and b/corpus/paragraph-edit/join-edges/before/notebook/synthetic.one differ | |||
corpus/paragraph-edit/join-edges/before/read/environment.json created+7| ... | @@ -0,0 +1,7 @@ | ||
| 1 | { | ||
| 2 | "powershell": "5.1.14409.1005", | ||
| 3 | "schema": "xs2010", | ||
| 4 | "hostname": "ONE-M6-680BB09B", | ||
| 5 | "cold": false, | ||
| 6 | "onenote": "14.0.4763.1000" | ||
| 7 | } | ||
corpus/paragraph-edit/join-edges/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="{22D0E791-FDA6-42CE-AF2A-16373B9BE3F9}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T09:08:50.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{A9716841-ED4F-0F89-335D-AA1487991C1C}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T09:08:50.000Z" color="#8AA8E4"><one:Page ID="{85389BC7-6484-4C98-B43A-02857BA10003}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}" name="Join inherited styles" dateTime="2026-09-08T09:07:14.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}" name="Join empty left tag" dateTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}" name="Join right tag" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}" name="Join both tags" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}" name="Join both children" dateTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/></one:Section></one:Notebook> | ||
corpus/paragraph-edit/join-edges/before/read/page-000.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}" name="Join empty left tag" dateTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><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:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join empty left tag]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:07:18.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="116.9218902587891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{47}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Bold</span><span lang=en-US> </span><span | ||
| 4 | style='font-style:italic' lang=en-US>italic</span><span lang=en-US> &#129408; é </span><span | ||
| 5 | style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/paragraph-edit/join-edges/before/read/page-001.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}" name="Join both children" dateTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:08: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:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join both children]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:07:18.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="116.921875" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{45}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left child]]></one:T></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{50}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Bold</span><span lang=en-US> </span><span | ||
| 4 | style='font-style:italic' lang=en-US>italic</span><span lang=en-US> &#129408; é </span><span | ||
| 5 | style='color:#123456' lang=x-none>tail</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{58}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right child]]></one:T></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{63}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/paragraph-edit/join-edges/before/read/page-002.xml created+4| ... | @@ -0,0 +1,4 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}" name="Join inherited styles" dateTime="2026-09-08T09:07:14.000Z" lastModifiedTime="2026-09-08T09:08: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:QuickStyleDef index="1" name="h1" fontColor="#123456" highlightColor="automatic" font="Georgia" fontSize="18.0" bold="true" spaceBefore="8.0" spaceAfter="4.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:07:15.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join inherited styles]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:07:18.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="143.3818817138672" height="479.3075256347656"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:07:15.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:07:15.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{46}{B0}" alignment="left" spaceBefore="288.0" spaceAfter="144.0" quickStyleIndex="1"><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold'>Right </span><span style='font-weight:bold;font-style: | ||
| 4 | italic'>italic</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:07:15.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/paragraph-edit/join-edges/before/read/page-003.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}" name="Join both tags" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><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:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join both tags]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:07:18.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="116.9218902587891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[Left]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{46}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Bold</span><span lang=en-US> </span><span | ||
| 4 | style='font-style:italic' lang=en-US>italic</span><span lang=en-US> &#129408; é </span><span | ||
| 5 | style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/paragraph-edit/join-edges/before/read/page-004.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="{85389BC7-6484-4C98-B43A-02857BA10003}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T09:08: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="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{E2F4337B-2FF1-4F2E-BBC8-8E5E843DE562}{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="{E5919B8C-DC8C-0424-0B9C-4D544F569794}{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="{E2F4337B-2FF1-4F2E-BBC8-8E5E843DE562}{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/paragraph-edit/join-edges/before/read/page-005.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}" name="Join right tag" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><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:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join right tag]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:07:18.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="116.9218902587891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Bold</span><span lang=en-US> </span><span | ||
| 4 | style='font-style:italic' lang=en-US>italic</span><span lang=en-US> &#129408; é </span><span | ||
| 5 | style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/paragraph-edit/join-edges/before/read/payloads.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../before/read/payloads.json | ||
| \ No newline at end of file | |||
corpus/paragraph-edit/join-edges/cases.json created+27| ... | @@ -0,0 +1,27 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "body": "\u003cone:OE quickStyleIndex=\"0\"\u003e\u003cone:T\u003eLeft \u003c/one:T\u003e\u003c/one:OE\u003e\u003cone:OE quickStyleIndex=\"1\"\u003e\u003cone:T\u003e\u003c![CDATA[Right \u003ci\u003eitalic\u003c/i\u003e]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e", | ||
| 4 | "name": "Join inherited styles", | ||
| 5 | "page": "{E046973C-CAEF-4B56-BEA4-93E05E43212A}{1}{B0}" | ||
| 6 | }, | ||
| 7 | { | ||
| 8 | "body": "\u003cone:OE\u003e\u003cone:Tag index=\"0\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003e\u003c![CDATA[]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e\u003cone:OE\u003e\u003cone:T\u003e\u003c![CDATA[\u003cb\u003eBold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e 🦀 é \u003cspan style=\"color:#123456\"\u003etail\u003c/span\u003e]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e", | ||
| 9 | "name": "Join empty left tag", | ||
| 10 | "page": "{C06F80E1-9B07-4035-B55C-3144C1873BD1}{1}{B0}" | ||
| 11 | }, | ||
| 12 | { | ||
| 13 | "body": "\u003cone:OE\u003e\u003cone:T\u003eLeft \u003c/one:T\u003e\u003c/one:OE\u003e\u003cone:OE\u003e\u003cone:Tag index=\"0\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003e\u003c![CDATA[\u003cb\u003eBold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e 🦀 é \u003cspan style=\"color:#123456\"\u003etail\u003c/span\u003e]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e", | ||
| 14 | "name": "Join right tag", | ||
| 15 | "page": "{3266A6F4-4313-4C8D-8103-7D8EC811E889}{1}{B0}" | ||
| 16 | }, | ||
| 17 | { | ||
| 18 | "body": "\u003cone:OE\u003e\u003cone:Tag index=\"0\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003eLeft \u003c/one:T\u003e\u003c/one:OE\u003e\u003cone:OE\u003e\u003cone:Tag index=\"0\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003e\u003c![CDATA[\u003cb\u003eBold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e 🦀 é \u003cspan style=\"color:#123456\"\u003etail\u003c/span\u003e]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e", | ||
| 19 | "name": "Join both tags", | ||
| 20 | "page": "{55922D45-C0E9-41E5-BCE7-ECBE10331C71}{1}{B0}" | ||
| 21 | }, | ||
| 22 | { | ||
| 23 | "body": "\u003cone:OE\u003e\u003cone:T\u003eLeft \u003c/one:T\u003e\u003cone:OEChildren\u003e\u003cone:OE\u003e\u003cone:T\u003eLeft child\u003c/one:T\u003e\u003c/one:OE\u003e\u003c/one:OEChildren\u003e\u003c/one:OE\u003e\u003cone:OE\u003e\u003cone:T\u003e\u003c![CDATA[\u003cb\u003eBold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e 🦀 é \u003cspan style=\"color:#123456\"\u003etail\u003c/span\u003e]]\u003e\u003c/one:T\u003e\u003cone:OEChildren\u003e\u003cone:OE\u003e\u003cone:T\u003eRight child\u003c/one:T\u003e\u003c/one:OE\u003e\u003c/one:OEChildren\u003e\u003c/one:OE\u003e", | ||
| 24 | "name": "Join both children", | ||
| 25 | "page": "{E151A4C0-B88B-4EFD-8F87-D3269DE420CD}{1}{B0}" | ||
| 26 | } | ||
| 27 | ] | ||
corpus/paragraph-edit/join-edges/joined/notebook/Open Notebook.onetoc2	 created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../before/notebook/Open Notebook.onetoc2 | ||
| \ No newline at end of file | |||
corpus/paragraph-edit/join-edges/joined/notebook/synthetic.one created| Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/notebook/synthetic.one differ | |||
corpus/paragraph-edit/join-edges/joined/read/environment.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../before/read/environment.json | ||
| \ No newline at end of file | |||
corpus/paragraph-edit/join-edges/joined/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="{22D0E791-FDA6-42CE-AF2A-16373B9BE3F9}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T09:09:35.000Z" color="#B49EDE" isCurrentlyViewed="true"><one:Section name="synthetic" ID="{A9716841-ED4F-0F89-335D-AA1487991C1C}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T09:09:35.000Z" color="#8AA8E4" isCurrentlyViewed="true"><one:Page ID="{85389BC7-6484-4C98-B43A-02857BA10003}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}" name="Join inherited styles" dateTime="2026-09-08T09:07:14.000Z" lastModifiedTime="2026-09-08T09:09:28.000Z" pageLevel="1"/><one:Page ID="{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}" name="Join empty left tag" dateTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:09:30.000Z" pageLevel="1"/><one:Page ID="{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}" name="Join right tag" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:32.000Z" pageLevel="1"/><one:Page ID="{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}" name="Join both tags" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:33.000Z" pageLevel="1"/><one:Page ID="{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}" name="Join both children" dateTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" pageLevel="1" isCurrentlyViewed="true"/></one:Section></one:Notebook> | ||
corpus/paragraph-edit/join-edges/joined/read/page-000.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}" name="Join empty left tag" dateTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:09:30.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><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:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:29.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join empty left tag]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:09:30.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="116.9218902587891" height="26.85543441772461"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:30.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | style='font-weight:bold' lang=en-US>Bold</span><span lang=en-US> </span><span | ||
| 4 | style='font-style:italic' lang=en-US>italic</span><span lang=en-US> &#129408; é </span><span | ||
| 5 | style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:29.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/paragraph-edit/join-edges/joined/read/page-001.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}" name="Join both children" dateTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.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:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join both children]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="184.8066253662109" height="53.71086883544922"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T09:09:35.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{45}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span | ||
| 3 | lang=en-US>Left child</span><span style='font-weight:bold' lang=en-US>Bold</span><span | ||
| 4 | lang=en-US> </span><span style='font-style:italic' lang=en-US>italic</span><span | ||
| 5 | lang=en-US> &#129408; é </span><span style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{58}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right child]]></one:T></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{63}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/paragraph-edit/join-edges/joined/read/page-002.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}" name="Join inherited styles" dateTime="2026-09-08T09:07:14.000Z" lastModifiedTime="2026-09-08T09:09:28.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:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:09:28.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join inherited styles]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:09:28.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="160.521011352539" height="33.87984466552734"/><one:OEChildren><one:OE creationTime="2026-09-08T09:09:28.000Z" lastModifiedTime="2026-09-08T09:09:28.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-family:Calibri; | ||
| 3 | font-size:11.0pt'>Left</span><span style='font-weight:bold;font-family:Georgia; | ||
| 4 | font-size:18.0pt;color:#123456'>Right </span><span style='font-weight:bold; | ||
| 5 | font-style:italic;font-family:Georgia;font-size:18.0pt;color:#123456'>italic</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:09:28.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/paragraph-edit/join-edges/joined/read/page-003.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}" name="Join both tags" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:33.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><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:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:33.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join both tags]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:09:33.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="134.0610046386719" height="26.85543441772461"/><one:OEChildren><one:OE creationTime="2026-09-08T09:09:33.000Z" lastModifiedTime="2026-09-08T09:09:33.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span | ||
| 3 | lang=en-US>Left</span><span style='font-weight:bold' lang=en-US>Bold</span><span | ||
| 4 | lang=en-US> </span><span style='font-style:italic' lang=en-US>italic</span><span | ||
| 5 | lang=en-US> &#129408; é </span><span style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:33.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/paragraph-edit/join-edges/joined/read/page-004.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="{85389BC7-6484-4C98-B43A-02857BA10003}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T09:09:26.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="{E2F4337B-2FF1-4F2E-BBC8-8E5E843DE562}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="523.125" height="42.90299224853515"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{E5919B8C-DC8C-0424-0B9C-4D544F569794}{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="{E2F4337B-2FF1-4F2E-BBC8-8E5E843DE562}{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/paragraph-edit/join-edges/joined/read/page-005.xml created+5| ... | @@ -0,0 +1,5 @@ | ||
| 1 | <?xml version="1.0"?> | ||
| 2 | <one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}" name="Join right tag" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:32.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:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:31.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join right tag]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:09:32.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="134.0610046386719" height="26.85543441772461"/><one:OEChildren><one:OE creationTime="2026-09-08T09:09:32.000Z" lastModifiedTime="2026-09-08T09:09:32.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span | ||
| 3 | lang=en-US>Left</span><span style='font-weight:bold' lang=en-US>Bold</span><span | ||
| 4 | lang=en-US> </span><span style='font-style:italic' lang=en-US>italic</span><span | ||
| 5 | lang=en-US> &#129408; é </span><span style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:31.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page> | ||
corpus/paragraph-edit/join-edges/joined/read/payloads.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../../../before/read/payloads.json | ||
| \ No newline at end of file | |||
corpus/paragraph-edit/join-edges/joined/ui/join-both-children.ahk created+22| ... | @@ -0,0 +1,22 @@ | ||
| 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("{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}", "{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{50}{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") | ||
| 21 | Sleep 300 | ||
| 22 | Send "{Left}{Backspace}" | ||
corpus/paragraph-edit/join-edges/joined/ui/join-both-children.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": "Join both children - Microsoft OneNote", | ||
| 10 | "class": "Framework::CFrame", | ||
| 11 | "dialog": false | ||
| 12 | } | ||
| 13 | } | ||
| \ No newline at end of file | |||
corpus/paragraph-edit/join-edges/joined/ui/join-both-children.png created| Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/ui/join-both-children.png differ | |||
corpus/paragraph-edit/join-edges/joined/ui/join-both-tags.ahk created+22| ... | @@ -0,0 +1,22 @@ | ||
| 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("{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}", "{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{46}{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") | ||
| 21 | Sleep 300 | ||
| 22 | Send "{Left}{Backspace}" | ||
corpus/paragraph-edit/join-edges/joined/ui/join-both-tags.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": "Join both tags - Microsoft OneNote", | ||
| 10 | "class": "Framework::CFrame", | ||
| 11 | "dialog": false | ||
| 12 | } | ||
| 13 | } | ||
| \ No newline at end of file | |||
corpus/paragraph-edit/join-edges/joined/ui/join-both-tags.png created| Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/ui/join-both-tags.png differ | |||
corpus/paragraph-edit/join-edges/joined/ui/join-empty-left-tag.ahk created+22| ... | @@ -0,0 +1,22 @@ | ||
| 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("{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}", "{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{47}{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") | ||
| 21 | Sleep 300 | ||
| 22 | Send "{Left}{Backspace}" | ||
corpus/paragraph-edit/join-edges/joined/ui/join-empty-left-tag.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": "Join empty left tag - Microsoft OneNote", | ||
| 10 | "class": "Framework::CFrame", | ||
| 11 | "dialog": false | ||
| 12 | } | ||
| 13 | } | ||
| \ No newline at end of file | |||
corpus/paragraph-edit/join-edges/joined/ui/join-empty-left-tag.png created| Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/ui/join-empty-left-tag.png differ | |||
corpus/paragraph-edit/join-edges/joined/ui/join-inherited-styles.ahk created+22| ... | @@ -0,0 +1,22 @@ | ||
| 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("{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}", "{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{46}{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") | ||
| 21 | Sleep 300 | ||
| 22 | Send "{Left}{Backspace}" | ||
corpus/paragraph-edit/join-edges/joined/ui/join-inherited-styles.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": "Join inherited styles - Microsoft OneNote", | ||
| 10 | "class": "Framework::CFrame", | ||
| 11 | "dialog": false | ||
| 12 | } | ||
| 13 | } | ||
| \ No newline at end of file | |||
corpus/paragraph-edit/join-edges/joined/ui/join-inherited-styles.png created| Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/ui/join-inherited-styles.png differ | |||
corpus/paragraph-edit/join-edges/joined/ui/join-right-tag.ahk created+22| ... | @@ -0,0 +1,22 @@ | ||
| 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("{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}", "{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{45}{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") | ||
| 21 | Sleep 300 | ||
| 22 | Send "{Left}{Backspace}" | ||
corpus/paragraph-edit/join-edges/joined/ui/join-right-tag.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": "Join right tag - Microsoft OneNote", | ||
| 10 | "class": "Framework::CFrame", | ||
| 11 | "dialog": false | ||
| 12 | } | ||
| 13 | } | ||
| \ No newline at end of file | |||
corpus/paragraph-edit/join-edges/joined/ui/join-right-tag.png created| Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/ui/join-right-tag.png differ | |||
corpus/paragraph-edit/join-edges/joined/ui/selections.json created+32| ... | @@ -0,0 +1,32 @@ | ||
| 1 | [ | ||
| 2 | { | ||
| 3 | "case": "Join inherited styles", | ||
| 4 | "page": "{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}", | ||
| 5 | "object": "{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{46}{B0}", | ||
| 6 | "keys": "{Left}{Backspace}" | ||
| 7 | }, | ||
| 8 | { | ||
| 9 | "case": "Join empty left tag", | ||
| 10 | "page": "{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}", | ||
| 11 | "object": "{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{47}{B0}", | ||
| 12 | "keys": "{Left}{Backspace}" | ||
| 13 | }, | ||
| 14 | { | ||
| 15 | "case": "Join right tag", | ||
| 16 | "page": "{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}", | ||
| 17 | "object": "{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{45}{B0}", | ||
| 18 | "keys": "{Left}{Backspace}" | ||
| 19 | }, | ||
| 20 | { | ||
| 21 | "case": "Join both tags", | ||
| 22 | "page": "{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}", | ||
| 23 | "object": "{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{46}{B0}", | ||
| 24 | "keys": "{Left}{Backspace}" | ||
| 25 | }, | ||
| 26 | { | ||
| 27 | "case": "Join both children", | ||
| 28 | "page": "{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}", | ||
| 29 | "object": "{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{50}{B0}", | ||
| 30 | "keys": "{Left}{Backspace}" | ||
| 31 | } | ||
| 32 | ] | ||
| \ No newline at end of file | |||
corpus/paragraph-edit/join-edges/run.json created+19| ... | @@ -0,0 +1,19 @@ | ||
| 1 | { | ||
| 2 | "notebook": "/Users/clo/dev/one/corpus/formatted-insertion/native-paragraph/candidate", | ||
| 3 | "expected_pages": 6, | ||
| 4 | "author": "evidence/m10/native-paragraph-edges.ps1", | ||
| 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 | "author.ps1": "9c9f9f172794e7be6aeee910731ac50d0db8130799ced1bcc8f4f5c4a37a4932", | ||
| 16 | "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", | ||
| 17 | "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" | ||
| 18 | } | ||
| 19 | } | ||
corpus/paragraph-edit/join-edges/source.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../split/source.json | ||
| \ No newline at end of file | |||
corpus/paragraph-edit/join-edges/teardown.json created+1| ... | @@ -0,0 +1 @@ | ||
| 1 | ../joined/teardown.json | ||
| \ No newline at end of file | |||
tools/native/paragraph-joins.ps1 created+40| ... | @@ -0,0 +1,40 @@ | ||
| 1 | param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][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 | $mixed = '<b>Bold</b> <i>italic</i> ' + [char]::ConvertFromUtf32(0x1F980) + ' e' + [char]0x0301 + ' <span style="color:#123456">tail</span>' | ||
| 12 | $text = '<one:T><![CDATA[' + $mixed + ']]></one:T>' | ||
| 13 | $child = '<one:OEChildren><one:OE><one:T>Preserved child</one:T></one:OE></one:OEChildren>' | ||
| 14 | $tag = '<one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/>' | ||
| 15 | $cases = @( | ||
| 16 | @{ name = 'Join inherited styles'; body = '<one:OE quickStyleIndex="0"><one:T>Left </one:T></one:OE><one:OE quickStyleIndex="1"><one:T><![CDATA[Right <i>italic</i>]]></one:T></one:OE>' }, | ||
| 17 | @{ name = 'Join empty left tag'; body = '<one:OE>' + $tag + '<one:T><![CDATA[]]></one:T></one:OE><one:OE>' + $text + '</one:OE>' }, | ||
| 18 | @{ name = 'Join right tag'; body = '<one:OE><one:T>Left </one:T></one:OE><one:OE>' + $tag + $text + '</one:OE>' }, | ||
| 19 | @{ name = 'Join both tags'; body = '<one:OE>' + $tag + '<one:T>Left </one:T></one:OE><one:OE>' + $tag + $text + '</one:OE>' }, | ||
| 20 | @{ name = 'Join both children'; body = '<one:OE><one:T>Left </one:T><one:OEChildren><one:OE><one:T>Left child</one:T></one:OE></one:OEChildren></one:OE><one:OE>' + $text + '<one:OEChildren><one:OE><one:T>Right child</one:T></one:OE></one:OEChildren></one:OE>' } | ||
| 21 | ) | ||
| 22 | $inputs = Join-Path $Root 'inputs' | ||
| 23 | New-Item -ItemType Directory -Path $inputs | Out-Null | ||
| 24 | foreach ($case in $cases) { | ||
| 25 | $page = '' | ||
| 26 | $app.CreateNewPage($section, [ref]$page, 0) | ||
| 27 | $xml = '<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="' + $page + '"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><one:QuickStyleDef index="0" name="p" font="Calibri" fontSize="11" fontColor="automatic" highlightColor="automatic"/><one:QuickStyleDef index="1" name="h1" font="Georgia" fontSize="18" bold="true" fontColor="#123456" highlightColor="automatic" spaceBefore="8" spaceAfter="4"/><one:Title><one:OE><one:T>' + $case.name + '</one:T></one:OE></one:Title><one:Outline><one:Position x="72" y="108"/><one:OEChildren>' + $case.body + '<one:OE><one:T>Preserved sibling</one:T></one:OE></one:OEChildren></one:Outline></one:Page>' | ||
| 28 | [IO.File]::WriteAllText((Join-Path $inputs ($case.name + '.xml')), $xml, [Text.Encoding]::UTF8) | ||
| 29 | $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $true) | ||
| 30 | $case.page = $page | ||
| 31 | } | ||
| 32 | $cases | ConvertTo-Json -Depth 6 | Set-Content (Join-Path $Root 'cases.json') -Encoding UTF8 | ||
| 33 | $app.SyncHierarchy($notebook) | ||
| 34 | } finally { | ||
| 35 | if ($notebook) { $app.CloseNotebook($notebook, $false) } | ||
| 36 | [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) | ||
| 37 | $app = $null | ||
| 38 | [GC]::Collect() | ||
| 39 | [GC]::WaitForPendingFinalizers() | ||
| 40 | } | ||
tools/test_paragraph_edit.py+55| ... | @@ -17,6 +17,61 @@ compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare'] | ... | @@ -17,6 +17,61 @@ compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare'] |
| 17 | 17 | ||
| 18 | 18 | ||
| 19 | class ParagraphEditTest(unittest.TestCase): | 19 | class ParagraphEditTest(unittest.TestCase): |
| 20 | def test_native_joins_preserve_inherited_styles_and_follow_tag_and_child_rules(self): | ||
| 21 | fixture = FIXTURE / 'join-edges' | ||
| 22 | models, captures = {}, {} | ||
| 23 | with TemporaryDirectory() as temporary: | ||
| 24 | for phase in ('before', 'joined'): | ||
| 25 | folder = Path(temporary) / phase | ||
| 26 | shutil.copytree(fixture / phase / 'read', folder / 'read') | ||
| 27 | compare(fixture / phase / 'notebook', folder / 'read') | ||
| 28 | subprocess.run([EXPORTER, fixture / phase / 'notebook/synthetic.one', folder / 'model'], check=True) | ||
| 29 | model = json.loads((folder / 'model/document.json').read_text()) | ||
| 30 | models[phase] = {r['nodes'][r['roots']['2']]['kind']['title']: (r, page) | ||
| 31 | for _, _, r, page in ordered_pages(model)} | ||
| 32 | captures[phase] = {} | ||
| 33 | for path in (folder / 'read').glob('page-*.xml'): | ||
| 34 | page = ET.parse(path).getroot() | ||
| 35 | captures[phase][page.get('name')] = native_characters(page, page.findall('one:Outline', ns)) | ||
| 36 | self.assertEqual(len(models[phase]), 6) | ||
| 37 | cases = json.loads((fixture / 'cases.json').read_text(encoding='utf-8-sig')) | ||
| 38 | self.assertEqual(len(cases), 5) | ||
| 39 | for case in cases: | ||
| 40 | name = case['name'] | ||
| 41 | with self.subTest(case=name): | ||
| 42 | old, page = models['before'][name] | ||
| 43 | new, new_page = models['joined'][name] | ||
| 44 | self.assertEqual(page, new_page) | ||
| 45 | outline, = [oid for oid in old['nodes'][page]['children'] if old['nodes'][oid]['kind']['type'] == 'Outline'] | ||
| 46 | left, right, sibling = old['nodes'][outline]['children'] | ||
| 47 | self.assertEqual(new['nodes'][outline]['children'], [left, sibling]) | ||
| 48 | target = old['nodes'][left]['children'][-1] if name == 'Join both children' else left | ||
| 49 | a, = old['nodes'][target]['content'] | ||
| 50 | b, = old['nodes'][right]['content'] | ||
| 51 | empty = old['nodes'][a]['kind']['text'] == '' | ||
| 52 | survivor = b if empty else a | ||
| 53 | self.assertEqual(new['nodes'][target]['content'], [survivor]) | ||
| 54 | self.assertEqual(new['nodes'][survivor]['kind']['text'], old['nodes'][a]['kind']['text'] + old['nodes'][b]['kind']['text']) | ||
| 55 | self.assertEqual(new['nodes'][survivor]['tags'], old['nodes'][a]['tags']) | ||
| 56 | children = old['nodes'][left]['children'] + old['nodes'][right]['children'] | ||
| 57 | self.assertEqual(new['nodes'][left]['children'], children) | ||
| 58 | self.assertEqual(new['nodes'][sibling], old['nodes'][sibling]) | ||
| 59 | if name == 'Join both children': | ||
| 60 | parent_text, = old['nodes'][left]['content'] | ||
| 61 | original = old['nodes'][parent_text] | ||
| 62 | current = new['nodes'][parent_text] | ||
| 63 | self.assertGreater(current['modified'], original['modified']) | ||
| 64 | expected = {**original, 'modified': current['modified'], | ||
| 65 | 'extra': [original['extra'][0] + [{'id': 0x880034dd, 'value': 'NoData'}]]} | ||
| 66 | self.assertEqual(current, expected) | ||
| 67 | before = [v for paragraph in captures['before'][name] for v in paragraph] | ||
| 68 | after = [v for paragraph in captures['joined'][name] for v in paragraph] | ||
| 69 | for (a, old_style), (b, new_style) in zip(before, after, strict=True): | ||
| 70 | self.assertEqual(a, b) | ||
| 71 | for key in old_style.keys() | new_style.keys(): | ||
| 72 | default = 'automatic' if key in ('color', 'highlight') else False | ||
| 73 | self.assertEqual(old_style.get(key, default), new_style.get(key, default)) | ||
| 74 | |||
| 20 | def test_rust_splits_match_native_controls_and_preserve_empty_typing_styles(self): | 75 | def test_rust_splits_match_native_controls_and_preserve_empty_typing_styles(self): |
| 21 | fixture = FIXTURE / 'rust-split' | 76 | fixture = FIXTURE / 'rust-split' |
| 22 | manifest = json.loads((fixture / 'manifest.json').read_text()) | 77 | manifest = json.loads((fixture / 'manifest.json').read_text()) |