From bdb38ac1f1a4e8f65b558380079eeab79033b2f8 Mon Sep 17 00:00:00 2001 From: clover caruso Date: Sat, 12 Sep 2026 20:22:19 -0700 Subject: [PATCH] feat: render roots, limits, named fences, accents and function names as OneNote does A second equation-editor session (corpus/math-edit/native-editor-2, typed by tools/native_math.py with ONESTORE_MATH_EQUATIONS) adds square and n-th roots, a plain fraction, a limit with an upright function name, a product, square brackets, an overbar and a hat to the MathML oracle, and the mapping now reproduces all nine exports byte for byte: radicals render as msqrt or mroot with the degree second, brackets other than parentheses name their fences, an accent object is mover accent="true" with the combining mark exported as its spacing character, an overbar is mover accent="false" with a stretchy bar, and runs of upright letters are one function-name identifier that a limit base wraps in a row. Mouse ink drawn over an outline in OneNote 2010 becomes a page-level drawing (corpus/ink-edit/native-mouse-over-text, tools/native_handwriting.py), so handwriting inside text runs cannot be authored in the lab and stays read-only retained content. Assisted-by: claude-fable-5.1 --- corpus/ink-edit/README.md | 6 + .../before-read/environment.json | 7 + .../before-read/hierarchy.xml | 2 + .../before-read/page-000.xml | 3 + .../before-read/payloads.json | 3 + .../native-mouse-over-text/commands.jsonl | 6 + .../native-mouse-over-text/handwriting.ahk | 34 +++++ .../native-mouse-over-text/handwriting.json | 13 ++ .../native-mouse-over-text/handwriting.png | Bin 0 -> 38268 bytes .../native-mouse-over-text/machine.json | 1 + .../notebook/Open Notebook.onetoc2 | Bin 0 -> 3764 bytes .../native-mouse-over-text/notebook/links.one | Bin 0 -> 15792 bytes .../read/environment.json | 7 + .../native-mouse-over-text/read/hierarchy.xml | 2 + .../native-mouse-over-text/read/page-000.xml | 22 +++ .../native-mouse-over-text/read/payloads.json | 3 + .../ink-edit/native-mouse-over-text/run.json | 18 +++ .../native-mouse-over-text/scripts/cold.ps1 | 27 ++++ .../native-mouse-over-text/scripts/read.ps1 | 142 ++++++++++++++++++ .../native-mouse-over-text/source.json | 14 ++ .../native-mouse-over-text/teardown.json | 1 + corpus/math-edit/README.md | 10 ++ .../before-read/environment.json | 7 + .../native-editor-2/before-read/hierarchy.xml | 2 + .../native-editor-2/before-read/page-000.xml | 3 + .../native-editor-2/before-read/payloads.json | 3 + .../math-edit/native-editor-2/commands.jsonl | 6 + .../math-edit/native-editor-2/equations.ahk | 104 +++++++++++++ .../math-edit/native-editor-2/equations.json | 13 ++ .../math-edit/native-editor-2/equations.png | Bin 0 -> 39674 bytes corpus/math-edit/native-editor-2/machine.json | 1 + .../notebook/Open Notebook.onetoc2 | Bin 0 -> 3764 bytes .../native-editor-2/notebook/links.one | Bin 0 -> 18920 bytes .../native-editor-2/read/environment.json | 7 + .../native-editor-2/read/hierarchy.xml | 2 + .../native-editor-2/read/page-000.xml | 3 + .../native-editor-2/read/payloads.json | 3 + corpus/math-edit/native-editor-2/run.json | 18 +++ .../native-editor-2/scripts/cold.ps1 | 27 ++++ .../native-editor-2/scripts/read.ps1 | 142 ++++++++++++++++++ corpus/math-edit/native-editor-2/source.json | 14 ++ .../math-edit/native-editor-2/teardown.json | 1 + crates/onestore/src/page/math.rs | 80 +++++++++- crates/onestore/tests/page_math.rs | 10 ++ tools/native_handwriting.py | 67 +++++++++ tools/native_math.py | 3 + tools/test_math_edit.py | 1 + 47 files changed, 834 insertions(+), 4 deletions(-) create mode 100644 corpus/ink-edit/native-mouse-over-text/before-read/environment.json create mode 100644 corpus/ink-edit/native-mouse-over-text/before-read/hierarchy.xml create mode 100644 corpus/ink-edit/native-mouse-over-text/before-read/page-000.xml create mode 100644 corpus/ink-edit/native-mouse-over-text/before-read/payloads.json create mode 100644 corpus/ink-edit/native-mouse-over-text/commands.jsonl create mode 100644 corpus/ink-edit/native-mouse-over-text/handwriting.ahk create mode 100644 corpus/ink-edit/native-mouse-over-text/handwriting.json create mode 100644 corpus/ink-edit/native-mouse-over-text/handwriting.png create mode 100644 corpus/ink-edit/native-mouse-over-text/machine.json create mode 100644 corpus/ink-edit/native-mouse-over-text/notebook/Open Notebook.onetoc2 create mode 100644 corpus/ink-edit/native-mouse-over-text/notebook/links.one create mode 100644 corpus/ink-edit/native-mouse-over-text/read/environment.json create mode 100644 corpus/ink-edit/native-mouse-over-text/read/hierarchy.xml create mode 100644 corpus/ink-edit/native-mouse-over-text/read/page-000.xml create mode 100644 corpus/ink-edit/native-mouse-over-text/read/payloads.json create mode 100644 corpus/ink-edit/native-mouse-over-text/run.json create mode 100644 corpus/ink-edit/native-mouse-over-text/scripts/cold.ps1 create mode 100644 corpus/ink-edit/native-mouse-over-text/scripts/read.ps1 create mode 100644 corpus/ink-edit/native-mouse-over-text/source.json create mode 100644 corpus/ink-edit/native-mouse-over-text/teardown.json create mode 100644 corpus/math-edit/native-editor-2/before-read/environment.json create mode 100644 corpus/math-edit/native-editor-2/before-read/hierarchy.xml create mode 100644 corpus/math-edit/native-editor-2/before-read/page-000.xml create mode 100644 corpus/math-edit/native-editor-2/before-read/payloads.json create mode 100644 corpus/math-edit/native-editor-2/commands.jsonl create mode 100644 corpus/math-edit/native-editor-2/equations.ahk create mode 100644 corpus/math-edit/native-editor-2/equations.json create mode 100644 corpus/math-edit/native-editor-2/equations.png create mode 100644 corpus/math-edit/native-editor-2/machine.json create mode 100644 corpus/math-edit/native-editor-2/notebook/Open Notebook.onetoc2 create mode 100644 corpus/math-edit/native-editor-2/notebook/links.one create mode 100644 corpus/math-edit/native-editor-2/read/environment.json create mode 100644 corpus/math-edit/native-editor-2/read/hierarchy.xml create mode 100644 corpus/math-edit/native-editor-2/read/page-000.xml create mode 100644 corpus/math-edit/native-editor-2/read/payloads.json create mode 100644 corpus/math-edit/native-editor-2/run.json create mode 100644 corpus/math-edit/native-editor-2/scripts/cold.ps1 create mode 100644 corpus/math-edit/native-editor-2/scripts/read.ps1 create mode 100644 corpus/math-edit/native-editor-2/source.json create mode 100644 corpus/math-edit/native-editor-2/teardown.json create mode 100644 tools/native_handwriting.py diff --git a/corpus/ink-edit/README.md b/corpus/ink-edit/README.md index 6c197490dcf039a5f94109e14922dd906bd360c8..3019ee1db0ab1a6f071cff4d43513f04c05f9f20 100644 --- a/corpus/ink-edit/README.md +++ b/corpus/ink-edit/README.md @@ -24,3 +24,9 @@ outline grown to contain the strokes' absolute page coordinates. directories while running the tests, then cold-open each with `tools/native_runner.py OUTPUT COLD --expected-pages 1 --collect-notebook --screenshots`. + +`native-mouse-over-text/` is OneNote 2010 receiving mouse strokes over an +outline's text and in empty space (`tools/native_handwriting.py`): both +became page-level `InkDrawing` objects. Mouse ink never produces +handwriting paragraphs or embedded ink in text runs, so those forms stay +read-only retained content until a pen-authored fixture exists. diff --git a/corpus/ink-edit/native-mouse-over-text/before-read/environment.json b/corpus/ink-edit/native-mouse-over-text/before-read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..48170eb10e7c124bec03bbefa92489448abc1c7b --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/before-read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-9C262230", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/ink-edit/native-mouse-over-text/before-read/hierarchy.xml b/corpus/ink-edit/native-mouse-over-text/before-read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..aafe6fe16b418054fefe67554bd25b4c3a8c2696 --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/before-read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/ink-edit/native-mouse-over-text/before-read/page-000.xml b/corpus/ink-edit/native-mouse-over-text/before-read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..64309b8beab4fba6f61ff424a57c1ff003946095 --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/before-read/page-000.xml @@ -0,0 +1,3 @@ + +the Rust site]]> diff --git a/corpus/ink-edit/native-mouse-over-text/before-read/payloads.json b/corpus/ink-edit/native-mouse-over-text/before-read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/before-read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/ink-edit/native-mouse-over-text/commands.jsonl b/corpus/ink-edit/native-mouse-over-text/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..5396301c658933b761dcd5c744950040598a1a2b --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/commands.jsonl @@ -0,0 +1,6 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-9C262230 -ExpectedPages 1 -KeepOpen", "exit": 0, "stdout": "Read 1 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Rename-Item C:\\one-tests\\runs\\capture\\read before-read\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-9C262230 -UseCurrentCache -ExpectedPages -1", "exit": 0, "stdout": "Read 1 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/ink-edit/native-mouse-over-text/handwriting.ahk b/corpus/ink-edit/native-mouse-over-text/handwriting.ahk new file mode 100644 index 0000000000000000000000000000000000000000..d9eed5cc7ae66da901ae822d1d4a93a9ad4c1be2 --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/handwriting.ahk @@ -0,0 +1,34 @@ +ComObject("OneNote.Application").NavigateTo("{B2A882BE-DBA1-0E8F-3F13-C2840E6C5065}{1}{B0}", "", false) +WinWait("ahk_exe ONENOTE.EXE", , 30) +WinActivate("ahk_exe ONENOTE.EXE") +WinWaitActive("ahk_exe ONENOTE.EXE", , 30) +WinMaximize("ahk_exe ONENOTE.EXE") +Sleep(3000) +SendMode("Event") +CoordMode("Mouse", "Screen") +Click(258,36) +Sleep(600) +Click(205,69) +Sleep(600) +; handwriting inside the outline, below its text line +MouseMove(140,160) +Click("Down") +MouseMove(160,175,25) +MouseMove(180,160,25) +MouseMove(200,175,25) +MouseMove(220,160,25) +Click("Up") +Sleep(300) +MouseClickDrag("Left",240,158,300,178,25) +Sleep(300) +; a drawing in empty page space +MouseMove(450,320) +Click("Down") +MouseMove(500,360,25) +MouseMove(450,400,25) +MouseMove(400,360,25) +MouseMove(450,320,25) +Click("Up") +Sleep(1000) +Click(21,74) +Sleep(2000) diff --git a/corpus/ink-edit/native-mouse-over-text/handwriting.json b/corpus/ink-edit/native-mouse-over-text/handwriting.json new file mode 100644 index 0000000000000000000000000000000000000000..83fb4df3362bb2ac7e9fa657fe6db76614b54e31 --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/handwriting.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Read about Rust the Rust site - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/ink-edit/native-mouse-over-text/handwriting.png b/corpus/ink-edit/native-mouse-over-text/handwriting.png new file mode 100644 index 0000000000000000000000000000000000000000..70de49a8fabc7dc476321f80881a96835b90d3f1 GIT binary patch literal 38268 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 literal 0 HcmV?d00001 diff --git a/corpus/ink-edit/native-mouse-over-text/machine.json b/corpus/ink-edit/native-mouse-over-text/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..f24fec724c6f926a619cc2619251ac87e48c5c43 --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/machine.json @@ -0,0 +1 @@ +{"name": "m6-9c262230", "hostname": "ONE-M6-9C262230"} diff --git a/corpus/ink-edit/native-mouse-over-text/notebook/Open Notebook.onetoc2 b/corpus/ink-edit/native-mouse-over-text/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..e778e73c6e795c17476d16d2c979a1ef85eedad6 GIT binary patch literal 3764 zcmZ3e|KIuM`!b(-j|5(YE0x7-U%1(NBK?KiMr9et4GSM;FrWeZyR!tOCw}!@dO>{R z+Y{?_7K;rSCMqF)(Dp{IG1n9pF literal 0 HcmV?d00001 diff --git a/corpus/ink-edit/native-mouse-over-text/notebook/links.one b/corpus/ink-edit/native-mouse-over-text/notebook/links.one new file mode 100644 index 0000000000000000000000000000000000000000..a4e70cdeec681787cfac62b97f9d68edc05c8dbb GIT binary patch literal 15792 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 + diff --git a/corpus/ink-edit/native-mouse-over-text/read/page-000.xml b/corpus/ink-edit/native-mouse-over-text/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..0697afb220185b97a11ad2e68741d3cd0e73de1c --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/read/page-000.xml @@ -0,0 +1,22 @@ + +the Rust site]]>ANoCHQJ6KgFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwtIFETtuZAB +RSNGIwUIC2VPZmdoZGkZFDIIAMAMAgAAyEEzCACwCQIAAMhBZAMVRgBACr4BSIfwsXeFcUmUzTWa +EzmU1mk1gEBmkzgMAgKAQGATWZQCAzOaQGZzSAzOaTWZTOZTNNJrMpmmk1mUzTSazKZppNUymc0m +qZTOZTOH7f7t/5pAZnNIDM5pAZnNJrMpnMpmmk1mUzTSaplMyaTVMpmTSaplMyaTVMpmmk1AAAAF +FEYAQAAACQQFFEYAAAAAEgARILeLLBPpguVJo6ME9ct7COwKP0AjYQMhZDLQO6ADFUYAQAo/QCKS +wgP7+zf4wA==AOMFHQTKAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADC0gURO25 +kAFFI0YjBQgLZU9mZ2hkaRkUMggAwAwCAADIQTMIALAJAgAAyEFkAxVGAEAKxQSNAofyDLeQS2Zz +KAwCZzKazSZzCYwGAQGAQGAQGAQGAQFM5pAZnNIDM5pNZlM5pNZlM5pNUymcymaaTWZTNNJqmUzm +k1TKZzSaplM7SIBMJnNJrMpnNEBgEBgEBgEBgEBgEBmkzTKawCZTWaTOZTWaTOZTWaJnMprNEzmU +zmSazRM5lNZomcyms0FpIBAZlM5pNZlMZhAIDAIDAIDAIDAIDAEymsAmU1gEyms0mcyms0mcyms0 +TOZTOZJrNJnMk1miZzKazRM5lNZoLRM5kgMxmU1mkzmU1QCAwCAwCAwCAwCAwCazJM5pAZnNJrMp +nNJrMpnNJqmUzmk1TKZzKZppNUymc0mqZTOaTVMpmIfw++eH0maTWaTOAwCZTWAQGAQFAIDM5pAY +BNZlAJrMoBNZlM5lM5pNUymc0mqZTMmk1TKZppNSZTNNJqTKZplM00gM0mcymsAgM0msAgMAgMAg +MAmsygEBmc0gMzmUAmsymc0msymaaTWZTNNJqTKZppNUymZMpmmk1JlM00mqZYdTSazSAwCazKAQ +GAIDAIDNJnAYBMprAJlNYBMprNJnMpnMk1mkzmSazQmcyTWaJnMiazRM5kTWaJnMi0ppNZlAIDM5 +ogMAgMAgMAmU1gEBmkzTKawCZTWaTOZTWaJnMprNEzmRNZomcyTWaEzmSZzIms0TOZAFFEYAgAAA +CQQFFEYAAAAAEgARIHXkv4XbUV9Btx3j0SO9N8YKABEgsI0hZS1D3QEDFUYAQAoAESDcOupAw5Sd +QA== diff --git a/corpus/ink-edit/native-mouse-over-text/read/payloads.json b/corpus/ink-edit/native-mouse-over-text/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/ink-edit/native-mouse-over-text/run.json b/corpus/ink-edit/native-mouse-over-text/run.json new file mode 100644 index 0000000000000000000000000000000000000000..9e670c7143179c57e2107d7c15c06d0cb8b81a64 --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/link-edit/candidate", + "expected_pages": 1, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/ink-edit/native-mouse-over-text/scripts/cold.ps1 b/corpus/ink-edit/native-mouse-over-text/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/ink-edit/native-mouse-over-text/scripts/read.ps1 b/corpus/ink-edit/native-mouse-over-text/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..476094ab1e0c47077988a6461db2080cf208642b --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/scripts/read.ps1 @@ -0,0 +1,142 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/ink-edit/native-mouse-over-text/source.json b/corpus/ink-edit/native-mouse-over-text/source.json new file mode 100644 index 0000000000000000000000000000000000000000..14786084a474f1cc0a6f522bd49c8104ad3627f0 --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1604, + "sha256": "6731c4214437fe1cb6aa347b0004542b7f7e4260f47773bf9ec07c4e894de47c", + "mtime_ns": 1789206821144296891 + }, + { + "path": "links.one", + "bytes": 6128, + "sha256": "0cfb356ed374fe919f73fb73fdbe5d66e0baa484d4119f70074d9f869d6db78a", + "mtime_ns": 1789206821116200533 + } +] diff --git a/corpus/ink-edit/native-mouse-over-text/teardown.json b/corpus/ink-edit/native-mouse-over-text/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/ink-edit/native-mouse-over-text/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/math-edit/README.md b/corpus/math-edit/README.md index 41c825e97f632849b7de0c268b6da349d45c3a74..304e67a5ab432fa9f62be01d2a078b684b5f3b95 100644 --- a/corpus/math-edit/README.md +++ b/corpus/math-edit/README.md @@ -15,6 +15,16 @@ the stored section and compares it with the exported MathML byte for byte; together with `corpus/m6/native-math-01` (superscripts, a fraction, inline Greek) that covers the kinds `onestore::page::Math` claims. +`native-editor-2/` is a second session (`ONESTORE_MATH_EQUATIONS` on +`tools/native_math.py`): `\sqrt x+1`, `\cbrt(x)`, `\sqrt(n&x)`, `a/b`, +`\lim_(x\to 0) f(x)` (the `\lim` stayed literal), `\prod_(k=1)^n k`, +`[a+b]`, `\overline(x)` and `x\hat`; `\sqrt (x+1)` again left an empty +paragraph. Its MathML adds radicals (25: `msqrt`, or `mroot` with the +degree second), a lower limit (19: `munder`, with the upright `lim` as one +`mi` in a row), a product, named fences (`mfenced open="[" close="]"`), an +overbar (23: `mover accent="false"` with a stretchy bar) and an accent (10: +`mover accent="true"` with the combining circumflex exported as `^`). + `written/candidate` is the page writer's output for `equations_are_written_and_read_back`: on a fresh section, every native equation of both fixtures copied as a new paragraph, then two expressions diff --git a/corpus/math-edit/native-editor-2/before-read/environment.json b/corpus/math-edit/native-editor-2/before-read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..42f84b6fc2dbbf352f2d0577245ce2bb557c15f6 --- /dev/null +++ b/corpus/math-edit/native-editor-2/before-read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-C31DFB94", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/math-edit/native-editor-2/before-read/hierarchy.xml b/corpus/math-edit/native-editor-2/before-read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..a57e93db3ba3980e173f8bfcf23b4a0efb2b28a5 --- /dev/null +++ b/corpus/math-edit/native-editor-2/before-read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/math-edit/native-editor-2/before-read/page-000.xml b/corpus/math-edit/native-editor-2/before-read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..fa67ad142ef8b71a9ae0cdc02d3bf4cc04039036 --- /dev/null +++ b/corpus/math-edit/native-editor-2/before-read/page-000.xml @@ -0,0 +1,3 @@ + +the Rust site]]> diff --git a/corpus/math-edit/native-editor-2/before-read/payloads.json b/corpus/math-edit/native-editor-2/before-read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/math-edit/native-editor-2/before-read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/math-edit/native-editor-2/commands.jsonl b/corpus/math-edit/native-editor-2/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..decd2dea6386a77a6eb8a9d3b054398420a80d2a --- /dev/null +++ b/corpus/math-edit/native-editor-2/commands.jsonl @@ -0,0 +1,6 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-C31DFB94 -ExpectedPages 1 -KeepOpen", "exit": 0, "stdout": "Read 1 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Rename-Item C:\\one-tests\\runs\\capture\\read before-read\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-C31DFB94 -UseCurrentCache -ExpectedPages -1", "exit": 0, "stdout": "Read 1 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/math-edit/native-editor-2/equations.ahk b/corpus/math-edit/native-editor-2/equations.ahk new file mode 100644 index 0000000000000000000000000000000000000000..1f09c896c0d801ac0b64e3d9b516d0afdc1f07b7 --- /dev/null +++ b/corpus/math-edit/native-editor-2/equations.ahk @@ -0,0 +1,104 @@ +ComObject("OneNote.Application").NavigateTo("{2846FEB9-1B89-0608-2064-808478C45E8D}{1}{B0}", "", false) +WinWait("ahk_exe ONENOTE.EXE", , 30) +WinActivate("ahk_exe ONENOTE.EXE") +WinWaitActive("ahk_exe ONENOTE.EXE", , 30) +WinMaximize("ahk_exe ONENOTE.EXE") +Sleep(3000) +CoordMode("Mouse", "Screen") +Click(300, 140) +Sleep(500) +Send("{End}") +Sleep(300) +Send("{Enter}") +Sleep(500) +Send("!=") +Sleep(600) +SendText("\sqrt x+1") +Send(" ") +Sleep(600) +Send("{End}") +Sleep(300) +Send("{Enter}") +Sleep(600) +Send("!=") +Sleep(600) +SendText("\sqrt (x+1)") +Send(" ") +Sleep(600) +Send("{End}") +Sleep(300) +Send("{Enter}") +Sleep(600) +Send("!=") +Sleep(600) +SendText("\cbrt(x)") +Send(" ") +Sleep(600) +Send("{End}") +Sleep(300) +Send("{Enter}") +Sleep(600) +Send("!=") +Sleep(600) +SendText("\sqrt(n&x)") +Send(" ") +Sleep(600) +Send("{End}") +Sleep(300) +Send("{Enter}") +Sleep(600) +Send("!=") +Sleep(600) +SendText("a/b") +Send(" ") +Sleep(600) +Send("{End}") +Sleep(300) +Send("{Enter}") +Sleep(600) +Send("!=") +Sleep(600) +SendText("\lim_(x\to 0) f(x)") +Send(" ") +Sleep(600) +Send("{End}") +Sleep(300) +Send("{Enter}") +Sleep(600) +Send("!=") +Sleep(600) +SendText("\prod_(k=1)^n k") +Send(" ") +Sleep(600) +Send("{End}") +Sleep(300) +Send("{Enter}") +Sleep(600) +Send("!=") +Sleep(600) +SendText("[a+b]") +Send(" ") +Sleep(600) +Send("{End}") +Sleep(300) +Send("{Enter}") +Sleep(600) +Send("!=") +Sleep(600) +SendText("\overline(x)") +Send(" ") +Sleep(600) +Send("{End}") +Sleep(300) +Send("{Enter}") +Sleep(600) +Send("!=") +Sleep(600) +SendText("x\hat") +Send(" ") +Sleep(600) +Send("{End}") +Sleep(300) +Send("{Enter}") +Sleep(600) +Sleep(2000) diff --git a/corpus/math-edit/native-editor-2/equations.json b/corpus/math-edit/native-editor-2/equations.json new file mode 100644 index 0000000000000000000000000000000000000000..83fb4df3362bb2ac7e9fa657fe6db76614b54e31 --- /dev/null +++ b/corpus/math-edit/native-editor-2/equations.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Read about Rust the Rust site - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/math-edit/native-editor-2/equations.png b/corpus/math-edit/native-editor-2/equations.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4789453f675e82152192a262158c2cd7deea7e GIT binary patch literal 39674 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ℑ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 literal 0 HcmV?d00001 diff --git a/corpus/math-edit/native-editor-2/machine.json b/corpus/math-edit/native-editor-2/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..1d2b98c5232a3003763b9fd19208af32c90473be --- /dev/null +++ b/corpus/math-edit/native-editor-2/machine.json @@ -0,0 +1 @@ +{"name": "m6-c31dfb94", "hostname": "ONE-M6-C31DFB94"} diff --git a/corpus/math-edit/native-editor-2/notebook/Open Notebook.onetoc2 b/corpus/math-edit/native-editor-2/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c23568f599b56d2a22787596ff606c9525c44e9a GIT binary patch literal 3764 zcmZ3e|KIuM`!b(-j|5(YE0x7-U%1(NBK?KiMr9et4GSM;FrWeZyR!tOCw}!@dO>{R z+Y{?6f+9IbxdGb&*6TwTChQZ1Y+htPqYwMBCwKMZ46 zF)BJ50z*Co8dw;n$TG<6lwlCb2GaY0v;fdkvV7mxh3r}BzjNoR@HL_*r!oS?M1VMl zA(J7GA)BF?L60FH$Vvr@!Ez!415i~17m#3N_$I@k0@4EkN4|Xjy0I#3i6E3OQozt~ zBRS|uvAVz0h6(8_cwcS&4pS}tf}tUSM^9i%>_7K;rSCMqF)(Dp{IG1n9t{PPXpd=80JOW}vv@kGe2sAYG0QKC|VE(^( zUzXFRUnYJn3Ln3KnJrE0;3@?3_}0_(*ZYK literal 0 HcmV?d00001 diff --git a/corpus/math-edit/native-editor-2/notebook/links.one b/corpus/math-edit/native-editor-2/notebook/links.one new file mode 100644 index 0000000000000000000000000000000000000000..8366ac8d85d2220aa1c88ec5843b433e587c2b22 GIT binary patch literal 18920 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 literal 0 HcmV?d00001 diff --git a/corpus/math-edit/native-editor-2/read/environment.json b/corpus/math-edit/native-editor-2/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..d1628c99dec1df6f1adf3df990fd989b57af406b --- /dev/null +++ b/corpus/math-edit/native-editor-2/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-C31DFB94", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/math-edit/native-editor-2/read/hierarchy.xml b/corpus/math-edit/native-editor-2/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..b3b602a571daf7729689daf483a4cfce6ea3f32e --- /dev/null +++ b/corpus/math-edit/native-editor-2/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/math-edit/native-editor-2/read/page-000.xml b/corpus/math-edit/native-editor-2/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..e5c9ed12b5b6c41679950cd7d67d6af6c9929c6a --- /dev/null +++ b/corpus/math-edit/native-editor-2/read/page-000.xml @@ -0,0 +1,3 @@ + +the Rust site]]>x+1 ]]>x3]]>xn]]>ab]]>\limx→0fx]]>∏k=1nk ]]>a+b]]>x¯]]>x^]]> diff --git a/corpus/math-edit/native-editor-2/read/payloads.json b/corpus/math-edit/native-editor-2/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/math-edit/native-editor-2/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/math-edit/native-editor-2/run.json b/corpus/math-edit/native-editor-2/run.json new file mode 100644 index 0000000000000000000000000000000000000000..9e670c7143179c57e2107d7c15c06d0cb8b81a64 --- /dev/null +++ b/corpus/math-edit/native-editor-2/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/link-edit/candidate", + "expected_pages": 1, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/math-edit/native-editor-2/scripts/cold.ps1 b/corpus/math-edit/native-editor-2/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/math-edit/native-editor-2/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/math-edit/native-editor-2/scripts/read.ps1 b/corpus/math-edit/native-editor-2/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..476094ab1e0c47077988a6461db2080cf208642b --- /dev/null +++ b/corpus/math-edit/native-editor-2/scripts/read.ps1 @@ -0,0 +1,142 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/math-edit/native-editor-2/source.json b/corpus/math-edit/native-editor-2/source.json new file mode 100644 index 0000000000000000000000000000000000000000..14786084a474f1cc0a6f522bd49c8104ad3627f0 --- /dev/null +++ b/corpus/math-edit/native-editor-2/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1604, + "sha256": "6731c4214437fe1cb6aa347b0004542b7f7e4260f47773bf9ec07c4e894de47c", + "mtime_ns": 1789206821144296891 + }, + { + "path": "links.one", + "bytes": 6128, + "sha256": "0cfb356ed374fe919f73fb73fdbe5d66e0baa484d4119f70074d9f869d6db78a", + "mtime_ns": 1789206821116200533 + } +] diff --git a/corpus/math-edit/native-editor-2/teardown.json b/corpus/math-edit/native-editor-2/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/math-edit/native-editor-2/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/crates/onestore/src/page/math.rs b/crates/onestore/src/page/math.rs index 7ae2f63d495c769e352107e0daab7da9f9d5f289..a822a0b7d7fb75eb776766f9c99c83fa28b2103c 100644 --- a/crates/onestore/src/page/math.rs +++ b/crates/onestore/src/page/math.rs @@ -11,6 +11,8 @@ use crate::document::MathObject; #[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] pub enum Math { Identifier(char), + /// Upright letters, as the editor stores a function name such as `lim`. + Function(String), Number(String), Operator(char), Object { @@ -51,6 +53,7 @@ impl Math { let mut frames: Vec = Vec::new(); let mut sequences: Vec> = vec![Vec::new()]; let mut number = String::new(); + let mut word = String::new(); let mut offset = 0; for character in paragraph.text().chars() { let here = offset; @@ -63,6 +66,14 @@ impl Math { let number = std::mem::take(&mut number); sequences.last_mut().unwrap().push(Math::Number(number)); } + if character.is_ascii_alphabetic() { + word.push(character); + continue; + } + if !word.is_empty() { + let word = std::mem::take(&mut word); + sequences.last_mut().unwrap().push(Math::Function(word)); + } match character { OBJECT_START => { // The span lookup treats a boundary offset as the span ending there, so the @@ -108,6 +119,9 @@ impl Math { if !number.is_empty() { sequences.last_mut().unwrap().push(Math::Number(number)); } + if !word.is_empty() { + sequences.last_mut().unwrap().push(Math::Function(word)); + } if !frames.is_empty() { return Err(invalid("An equation object never ends")); } @@ -127,6 +141,7 @@ impl Math { fn write(&self, out: &mut String) { match self { Math::Identifier(c) => tag(out, "mi", &c.to_string()), + Math::Function(name) => tag(out, "mi", name), Math::Number(n) => tag(out, "mn", n), Math::Operator(c) => tag(out, "mo", &c.to_string()), Math::Object { @@ -134,12 +149,16 @@ impl Math { symbols, arguments, } => { - // A lone identifier, number or operator stands bare; anything else is a row. + // A lone letter, number or operator stands bare; anything else is a row. let argument = |out: &mut String, index: usize| match arguments .get(index) .map(Vec::as_slice) { - Some([single]) if !matches!(single, Math::Object { .. }) => single.write(out), + Some([single]) + if !matches!(single, Math::Object { .. } | Math::Function(_)) => + { + single.write(out) + } Some(many) => { out.push_str(""); for node in many { @@ -165,8 +184,41 @@ impl Math { (25, _) => wrapped(out, "msqrt", &[arguments.len() - 1]), (19, 2) => wrapped(out, "munder", &[0, 1]), (33, 2) => wrapped(out, "mover", &[0, 1]), - // OneNote exports parentheses as default fences, whatever the pair. - (13, _) => wrapped(out, "mfenced", &[0]), + // Parentheses are the default fences; other pairs name themselves. + (13, _) => { + let (open, close) = (symbols.first(), symbols.get(1)); + if open == Some(&'(') && close == Some(&')') { + wrapped(out, "mfenced", &[0]); + } else { + out.push_str("'); + argument(out, 0); + out.push_str(""); + } + } + (10, 1) | (23, 1) => { + let accent = *kind == 10; + out.push_str(&format!("")); + argument(out, 0); + if accent { + tag( + out, + "mo", + &spacing(symbols.first().copied().unwrap_or('^')).to_string(), + ); + } else { + out.push_str(""); + out.push(symbols.first().copied().unwrap_or('¯')); + out.push_str(""); + } + out.push_str(""); + } // Lower limit, upper limit, body; integrals take their limits as scripts, // other operators above and below. (21, 3) => { @@ -204,6 +256,25 @@ impl Math { } } +fn escaped(c: char) -> String { + match c { + '<' => "<".into(), + '&' => "&".into(), + '"' => """.into(), + c => c.to_string(), + } +} + +/// The spacing character OneNote exports for a combining accent. +fn spacing(c: char) -> char { + match c { + '\u{302}' => '^', + '\u{303}' => '~', + '\u{308}' => '¨', + c => c, + } +} + fn tag(out: &mut String, element: &str, content: &str) { out.push_str(&format!("")); for c in content.chars() { @@ -264,6 +335,7 @@ fn write_sequence(nodes: &[Math], runs: &mut Vec<(String, Option)>) for node in nodes { match node { Math::Identifier(c) => leaf.push(italic(*c)), + Math::Function(name) => leaf.push_str(name), Math::Number(n) => leaf.push_str(n), Math::Operator(c) => leaf.push(*c), Math::Object { diff --git a/crates/onestore/tests/page_math.rs b/crates/onestore/tests/page_math.rs index c62f12b9b596b23eb78a70f9848833a44647f738..45e4b4c35ce028c7eb5a84f1abb3229c04fb1ba6 100644 --- a/crates/onestore/tests/page_math.rs +++ b/crates/onestore/tests/page_math.rs @@ -12,6 +12,12 @@ const NATIVE_READ: &str = include_str!("../../../corpus/m6/native-math-01/read/p /// subscripts, a sub-superscript, parentheses, an integral and a sum with limits. const EDITOR: &[u8] = include_bytes!("../../../corpus/math-edit/native-editor/notebook/links.one"); const EDITOR_READ: &str = include_str!("../../../corpus/math-edit/native-editor/read/page-000.xml"); +/// A second editor session: square and n-th roots, a plain fraction, a limit, a product, +/// square brackets, an overbar and a hat. +const EDITOR_2: &[u8] = + include_bytes!("../../../corpus/math-edit/native-editor-2/notebook/links.one"); +const EDITOR_2_READ: &str = + include_str!("../../../corpus/math-edit/native-editor-2/read/page-000.xml"); fn native_mathml(read: &str) -> Vec { read.split(">) -> Math { diff --git a/tools/native_handwriting.py b/tools/native_handwriting.py new file mode 100644 index 0000000000000000000000000000000000000000..ce00fa7a585787d65b6ea6f2dfd232968cc4d624 --- /dev/null +++ b/tools/native_handwriting.py @@ -0,0 +1,67 @@ +"""Draw ink over an outline's text and in empty space with the mouse in OneNote 2010 on a +Rust-written page, then capture the COM read: the oracle for handwriting held by paragraphs. + +Usage: native_handwriting.py NOTEBOOK_DIR OUTPUT_DIR +""" +import base64 +import json +import sys +from pathlib import Path +import xml.etree.ElementTree as ET + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import native_runner as runner + +windows = runner.windows + + +def interaction(name, output): + page = ET.parse(sorted((output / 'read').glob('page-*.xml'))[0]).getroot().attrib['ID'] + script = '''ComObject("OneNote.Application").NavigateTo("PAGE_ID", "", false) +WinWait("ahk_exe ONENOTE.EXE", , 30) +WinActivate("ahk_exe ONENOTE.EXE") +WinWaitActive("ahk_exe ONENOTE.EXE", , 30) +WinMaximize("ahk_exe ONENOTE.EXE") +Sleep(3000) +SendMode("Event") +CoordMode("Mouse", "Screen") +Click(258,36) +Sleep(600) +Click(205,69) +Sleep(600) +; handwriting inside the outline, below its text line +MouseMove(140,160) +Click("Down") +MouseMove(160,175,25) +MouseMove(180,160,25) +MouseMove(200,175,25) +MouseMove(220,160,25) +Click("Up") +Sleep(300) +MouseClickDrag("Left",240,158,300,178,25) +Sleep(300) +; a drawing in empty page space +MouseMove(450,320) +Click("Down") +MouseMove(500,360,25) +MouseMove(450,400,25) +MouseMove(400,360,25) +MouseMove(450,320,25) +Click("Up") +Sleep(1000) +Click(21,74) +Sleep(2000) +'''.replace('PAGE_ID', page) + (output / 'handwriting.ahk').write_text(script) + result = windows.do_exec(script, target=name, timeout_ms=120000, shot_delay_ms=1500) + screenshot = result.pop('png_b64', None) + if screenshot: + (output / 'handwriting.png').write_bytes(base64.b64decode(screenshot)) + (output / 'handwriting.json').write_text(json.dumps(result, indent=2)) + if result.get('error') or result.get('exit') != 0: + raise RuntimeError(str(result)) + + +if __name__ == '__main__': + notebook, output = Path(sys.argv[1]), Path(sys.argv[2]) + runner.capture(notebook, output, expected_pages=1, collect_notebook=True, interaction=interaction) diff --git a/tools/native_math.py b/tools/native_math.py index 749c70f1c3b4076e6a41fe9d14fd4769c72424cb..94f381f5ff329df3a0ae1d0d510c93880ac5fb9a 100644 --- a/tools/native_math.py +++ b/tools/native_math.py @@ -5,6 +5,7 @@ Usage: native_math.py NOTEBOOK_DIR OUTPUT_DIR """ import base64 import json +import os import sys from pathlib import Path import xml.etree.ElementTree as ET @@ -23,6 +24,8 @@ EQUATIONS = [ '\\int_0^1 x dx', '\\sum_(i=1)^n i', ] +if os.environ.get('ONESTORE_MATH_EQUATIONS'): + EQUATIONS = os.environ['ONESTORE_MATH_EQUATIONS'].split('|') def interaction(name, output): diff --git a/tools/test_math_edit.py b/tools/test_math_edit.py index 2d6866d8e785b558777dfb321b72a8d4b4a2ffa4..83227267fa7834792960f48dc92b32a35d597c97 100644 --- a/tools/test_math_edit.py +++ b/tools/test_math_edit.py @@ -22,6 +22,7 @@ def exported_mathml(path): class MathEditTest(unittest.TestCase): def test_equation_editor_expressions_export_as_mathml(self): self.assertEqual(len(exported_mathml(FIXTURE / 'native-editor/read/page-000.xml')), 5) + self.assertEqual(len(exported_mathml(FIXTURE / 'native-editor-2/read/page-000.xml')), 9) def test_rust_written_equations_export_the_expected_mathml(self): with TemporaryDirectory() as temporary: -- 2.54.0