From f3bfb4de18ec03dca625dd95d5d5f2ae34383837 Mon Sep 17 00:00:00 2001 From: clover caruso Date: Fri, 2 Oct 2026 01:29:08 -0700 Subject: [PATCH] feat: make bullets into a to-do list and back Make To-Do List, in the page context menu and the palette when the selection holds bulleted or numbered paragraphs, removes their lists and gives each the first check box tag in the tag list; Make Bulleted List trades that tag back for the default bullet. Each is one undo step and one revision. OneNote 2010 has no such command, and its Ctrl+1 keeps a list beside the new To Do box (corpus/to-do-list/native). Fixes #53. Assisted-by: claude-opus-5.5 --- arc/canvas.md | 6 + corpus/to-do-list/README.md | 22 +++ .../candidate/Open Notebook.onetoc2 | Bin 0 -> 1604 bytes corpus/to-do-list/candidate/lists.one | Bin 0 -> 15712 bytes corpus/to-do-list/cold/commands.jsonl | 3 + corpus/to-do-list/cold/machine.json | 1 + .../cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 3764 bytes corpus/to-do-list/cold/notebook/lists.one | Bin 0 -> 17200 bytes corpus/to-do-list/cold/read/environment.json | 7 + corpus/to-do-list/cold/read/hierarchy.xml | 2 + .../cold/read/page-000.navigation.json | 13 ++ corpus/to-do-list/cold/read/page-000.png | Bin 0 -> 38359 bytes corpus/to-do-list/cold/read/page-000.xml | 2 + corpus/to-do-list/cold/read/payloads.json | 3 + corpus/to-do-list/cold/run.json | 18 +++ corpus/to-do-list/cold/scripts/cold.ps1 | 27 ++++ corpus/to-do-list/cold/scripts/read.ps1 | 144 ++++++++++++++++++ corpus/to-do-list/cold/source.json | 14 ++ corpus/to-do-list/cold/teardown.json | 1 + corpus/to-do-list/native/1-select.ahk | 14 ++ corpus/to-do-list/native/2-menu.png | Bin 0 -> 45150 bytes corpus/to-do-list/native/3-tag.ahk | 4 + corpus/to-do-list/native/3-tag.png | Bin 0 -> 39879 bytes corpus/to-do-list/native/commands.jsonl | 6 + corpus/to-do-list/native/machine.json | 1 + .../native/notebook/Open Notebook.onetoc2 | Bin 0 -> 3764 bytes corpus/to-do-list/native/notebook/lists.one | Bin 0 -> 22272 bytes .../to-do-list/native/read/environment.json | 7 + corpus/to-do-list/native/read/hierarchy.xml | 2 + corpus/to-do-list/native/read/page-000.xml | 2 + corpus/to-do-list/native/read/payloads.json | 3 + corpus/to-do-list/native/run.json | 18 +++ corpus/to-do-list/native/scripts/cold.ps1 | 27 ++++ corpus/to-do-list/native/scripts/read.ps1 | 144 ++++++++++++++++++ corpus/to-do-list/native/source.json | 14 ++ corpus/to-do-list/native/teardown.json | 1 + crates/canvas/src/editor/format.rs | 101 ++++++++++++ crates/canvas/src/outline.rs | 2 +- crates/canvas/tests/to_do_list.rs | 119 +++++++++++++++ crates/snowbound/src/commands.rs | 34 +++++ crates/snowbound/src/link.rs | 22 ++- tools/test_to_do_list.py | 57 +++++++ 42 files changed, 839 insertions(+), 2 deletions(-) create mode 100644 corpus/to-do-list/README.md create mode 100644 corpus/to-do-list/candidate/Open Notebook.onetoc2 create mode 100644 corpus/to-do-list/candidate/lists.one create mode 100644 corpus/to-do-list/cold/commands.jsonl create mode 100644 corpus/to-do-list/cold/machine.json create mode 100644 corpus/to-do-list/cold/notebook/Open Notebook.onetoc2 create mode 100644 corpus/to-do-list/cold/notebook/lists.one create mode 100644 corpus/to-do-list/cold/read/environment.json create mode 100644 corpus/to-do-list/cold/read/hierarchy.xml create mode 100644 corpus/to-do-list/cold/read/page-000.navigation.json create mode 100644 corpus/to-do-list/cold/read/page-000.png create mode 100644 corpus/to-do-list/cold/read/page-000.xml create mode 100644 corpus/to-do-list/cold/read/payloads.json create mode 100644 corpus/to-do-list/cold/run.json create mode 100644 corpus/to-do-list/cold/scripts/cold.ps1 create mode 100644 corpus/to-do-list/cold/scripts/read.ps1 create mode 100644 corpus/to-do-list/cold/source.json create mode 100644 corpus/to-do-list/cold/teardown.json create mode 100644 corpus/to-do-list/native/1-select.ahk create mode 100644 corpus/to-do-list/native/2-menu.png create mode 100644 corpus/to-do-list/native/3-tag.ahk create mode 100644 corpus/to-do-list/native/3-tag.png create mode 100644 corpus/to-do-list/native/commands.jsonl create mode 100644 corpus/to-do-list/native/machine.json create mode 100644 corpus/to-do-list/native/notebook/Open Notebook.onetoc2 create mode 100644 corpus/to-do-list/native/notebook/lists.one create mode 100644 corpus/to-do-list/native/read/environment.json create mode 100644 corpus/to-do-list/native/read/hierarchy.xml create mode 100644 corpus/to-do-list/native/read/page-000.xml create mode 100644 corpus/to-do-list/native/read/payloads.json create mode 100644 corpus/to-do-list/native/run.json create mode 100644 corpus/to-do-list/native/scripts/cold.ps1 create mode 100644 corpus/to-do-list/native/scripts/read.ps1 create mode 100644 corpus/to-do-list/native/source.json create mode 100644 corpus/to-do-list/native/teardown.json create mode 100644 crates/canvas/tests/to_do_list.rs create mode 100644 tools/test_to_do_list.py diff --git a/arc/canvas.md b/arc/canvas.md index 7143de8e0c4f4d1beffd9a683f567f3c6a63a5d9..5862a04d174252785767351437265c51fba55de4 100644 --- a/arc/canvas.md +++ b/arc/canvas.md @@ -129,6 +129,12 @@ it; a click checks its box (`corpus/object-tags`). A picture's link follows on Ctrl+click, Command+click on macOS, while a click selects it, as OneNote's tooltip says (`corpus/picture-link`). +OneNote 2010's Ctrl+1 leaves a bulleted or numbered paragraph's list beside its +new To Do box, and it has no command that converts a list. Make To-Do List, in +the page's context menu and the palette, trades the selected paragraphs' bullets +and numbers for the first check box tag in the user's list as one undo step; +Make Bulleted List trades the tag back for a bullet (`corpus/to-do-list`). + An outline holding only pictures or files takes a paragraph after them where a click beside them lands, as OneNote 2010 adds one when typing there. It is stored with the first edit that reaches it, and undoing back to it empty takes it diff --git a/corpus/to-do-list/README.md b/corpus/to-do-list/README.md new file mode 100644 index 0000000000000000000000000000000000000000..dfde95c532df18b9dd7a48ed06dc70a975c97db2 --- /dev/null +++ b/corpus/to-do-list/README.md @@ -0,0 +1,22 @@ +# Bullets into a to-do list + +`native/` is OneNote 2010 on a copy of `corpus/list-edit/cold/notebook`: the +outline's paragraphs selected with Ctrl+A twice (`1-select.ahk`), then Ctrl+1 +(`3-tag.ahk`). OneNote keeps every bullet and number and puts the To Do box +beside them (`3-tag.png`); the selected top-level paragraphs take the tag and +their nested children do not. Its context menu on the selection offers no +command that converts a list (`2-menu.png`). + +`candidate/` is the output of `lists_become_to_do_lists_and_back_one_revision_each` +in `crates/canvas/tests/to_do_list.rs`, on the same section: Make To-Do List over +"Bullet item" through "Nested numbered" removes their bullets and numbers and +tags each To Do, then Make Bulleted List over "Second numbered" and "Nested +numbered" removes the tag and gives each OneNote's default bullet, each published +as its own revision. + +`cold/` is a fresh OneNote 2010 read: the first two paragraphs are open To Do +items with no list, the next two are bulleted and untagged, and "Restarted at +three" keeps its number. `tools/test_to_do_list.py` checks both reads without a +VM. Regenerate with `SNOWBOUND_TO_DO_LIST_EXPORT` set to a new absolute directory +while running the test, then cold-open it with +`tools/native_runner.py OUTPUT COLD --expected-pages 1 --collect-notebook --screenshots`. diff --git a/corpus/to-do-list/candidate/Open Notebook.onetoc2 b/corpus/to-do-list/candidate/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..228852a0246bdc5cb0c3c241d0351ed7a27282be GIT binary patch literal 1604 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 literal 0 HcmV?d00001 diff --git a/corpus/to-do-list/cold/notebook/lists.one b/corpus/to-do-list/cold/notebook/lists.one new file mode 100644 index 0000000000000000000000000000000000000000..3ecc96975526a5f3f48cb52e8a7e27b0ff8a378d GIT binary patch literal 17200 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 + diff --git a/corpus/to-do-list/cold/read/page-000.navigation.json b/corpus/to-do-list/cold/read/page-000.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..b8578e6a2f723044d70c505e33406a480433361c --- /dev/null +++ b/corpus/to-do-list/cold/read/page-000.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Bullet item - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/to-do-list/cold/read/page-000.png b/corpus/to-do-list/cold/read/page-000.png new file mode 100644 index 0000000000000000000000000000000000000000..383688262e44c7a12754b290a01bac5a7dac1d5e GIT binary patch literal 38359 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 + diff --git a/corpus/to-do-list/cold/read/payloads.json b/corpus/to-do-list/cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/to-do-list/cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/to-do-list/cold/run.json b/corpus/to-do-list/cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..8835702bf0fe63b97b650245dfbb686799936fca --- /dev/null +++ b/corpus/to-do-list/cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/todo-lab/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": "22bc760f955ef59bb5f0ccfd55271f8d868674084127fbe219e1048bd3777f35" + } +} diff --git a/corpus/to-do-list/cold/scripts/cold.ps1 b/corpus/to-do-list/cold/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/to-do-list/cold/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/to-do-list/cold/scripts/read.ps1 b/corpus/to-do-list/cold/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a42366b32e8baaf13dae92e9472cae7a071220cc --- /dev/null +++ b/corpus/to-do-list/cold/scripts/read.ps1 @@ -0,0 +1,144 @@ +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) + # A paragraph's file is named by its paragraph, one on the page by itself. + $owner = if ($file.ParentNode.LocalName -eq 'Page') { $file } else { $file.ParentNode } + $payloads += @{ page = $id; object = $owner.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/to-do-list/cold/source.json b/corpus/to-do-list/cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..1cd559fd77b9f15854dfee92e20955f00eaa8a74 --- /dev/null +++ b/corpus/to-do-list/cold/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1604, + "sha256": "c61c516ccbd4afb37584948f03296eb8308d54caa05f243e2f740fe462afad7c", + "mtime_ns": 1790929500289569401 + }, + { + "path": "lists.one", + "bytes": 15712, + "sha256": "83da9e79e5801f6add606031cb833390bf5694d1cdbf3afdca194fe9285a4c20", + "mtime_ns": 1790929500289401194 + } +] diff --git a/corpus/to-do-list/cold/teardown.json b/corpus/to-do-list/cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/to-do-list/cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/to-do-list/native/1-select.ahk b/corpus/to-do-list/native/1-select.ahk new file mode 100644 index 0000000000000000000000000000000000000000..77ee982350771b0243337b04cb5ee5f255b65597 --- /dev/null +++ b/corpus/to-do-list/native/1-select.ahk @@ -0,0 +1,14 @@ +app := ComObject("OneNote.Application") +app.NavigateTo("{3A318476-D3AE-0D72-0308-0A93E64A687F}{1}{B0}", "{55287AA0-9FCF-0E9B-2D6D-3E6C43F50BC3}{24}{B0}", false) +hwnd := WinWait("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE",, 20) +WinMaximize(hwnd) +WinActivate(hwnd) +WinWaitActive(hwnd,, 10) +app.NavigateTo("{3A318476-D3AE-0D72-0308-0A93E64A687F}{1}{B0}", "{55287AA0-9FCF-0E9B-2D6D-3E6C43F50BC3}{24}{B0}", false) +Sleep(1500) +Send("{Home}") +Sleep(300) +Send("^a") +Sleep(400) +Send("^a") +Sleep(800) diff --git a/corpus/to-do-list/native/2-menu.png b/corpus/to-do-list/native/2-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..93ad142bd5becf31aa60528c23296e6bdaf20cec GIT binary patch literal 45150 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 literal 0 HcmV?d00001 diff --git a/corpus/to-do-list/native/commands.jsonl b/corpus/to-do-list/native/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..53ea2a4f1a71135fbb7b06b5eec67973382cc778 --- /dev/null +++ b/corpus/to-do-list/native/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-6ED8D009 -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-6ED8D009 -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/to-do-list/native/machine.json b/corpus/to-do-list/native/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..00a020dd7903552ad0e4a06599be1b48e8dc6fcf --- /dev/null +++ b/corpus/to-do-list/native/machine.json @@ -0,0 +1 @@ +{"name": "m6-6ed8d009", "hostname": "ONE-M6-6ED8D009"} diff --git a/corpus/to-do-list/native/notebook/Open Notebook.onetoc2 b/corpus/to-do-list/native/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..ab1de4e83f613d517c06f3f412aa67871090671c GIT binary patch literal 3764 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 literal 0 HcmV?d00001 diff --git a/corpus/to-do-list/native/read/environment.json b/corpus/to-do-list/native/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..6f5a651a9c02725503a4a1fffb02d698fd7bfc19 --- /dev/null +++ b/corpus/to-do-list/native/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-6ED8D009", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/to-do-list/native/read/hierarchy.xml b/corpus/to-do-list/native/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..36412a2c260d05467cda6b4d67c50eccb8b2dcc0 --- /dev/null +++ b/corpus/to-do-list/native/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/to-do-list/native/read/page-000.xml b/corpus/to-do-list/native/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..ef7f2f4cc1c1c4416d07d5f3a6647cd090567c0a --- /dev/null +++ b/corpus/to-do-list/native/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/to-do-list/native/read/payloads.json b/corpus/to-do-list/native/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/to-do-list/native/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/to-do-list/native/run.json b/corpus/to-do-list/native/run.json new file mode 100644 index 0000000000000000000000000000000000000000..4e223f3c098e1a862c5487c116733a672a906ac8 --- /dev/null +++ b/corpus/to-do-list/native/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/todo-lab/source", + "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": "22bc760f955ef59bb5f0ccfd55271f8d868674084127fbe219e1048bd3777f35" + } +} diff --git a/corpus/to-do-list/native/scripts/cold.ps1 b/corpus/to-do-list/native/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/to-do-list/native/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/to-do-list/native/scripts/read.ps1 b/corpus/to-do-list/native/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a42366b32e8baaf13dae92e9472cae7a071220cc --- /dev/null +++ b/corpus/to-do-list/native/scripts/read.ps1 @@ -0,0 +1,144 @@ +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) + # A paragraph's file is named by its paragraph, one on the page by itself. + $owner = if ($file.ParentNode.LocalName -eq 'Page') { $file } else { $file.ParentNode } + $payloads += @{ page = $id; object = $owner.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/to-do-list/native/source.json b/corpus/to-do-list/native/source.json new file mode 100644 index 0000000000000000000000000000000000000000..bc892050aaabef04b0a794320853de30f6d93f4f --- /dev/null +++ b/corpus/to-do-list/native/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 3764, + "sha256": "45d6059529eb5c2d05c107a93ba81842132102c03135e02687709f72662bde09", + "mtime_ns": 1790929228488500810 + }, + { + "path": "lists.one", + "bytes": 11328, + "sha256": "c2c9bdb4a58e747a6dfacb98492fad9c0c19f222f9a59e94abc7273213a93c9f", + "mtime_ns": 1790929228488058521 + } +] diff --git a/corpus/to-do-list/native/teardown.json b/corpus/to-do-list/native/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/to-do-list/native/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/crates/canvas/src/editor/format.rs b/crates/canvas/src/editor/format.rs index 17ec0895649772d4d23fb70f0feb6bf9bcd55e4c..eb92e8b91882da9907e59dcbb965bf4766eef097 100644 --- a/crates/canvas/src/editor/format.rs +++ b/crates/canvas/src/editor/format.rs @@ -40,6 +40,10 @@ pub enum Formatting { RemoveTags, /// Checks the selected paragraphs' check boxes, or clears them when all are checked. Check, + /// Gives the selected bulleted and numbered paragraphs this tag in place of their list. + ToDoList(NoteTag, u16), + /// Gives the selected paragraphs with this tag OneNote's default bullet in its place. + BulletedList(NoteTag, u16), /// Format Painter: gives the selection the character formatting and alignment of text /// picked up with [`CanvasEditor::painted_format`], as OneNote's does. Paint(Format), @@ -344,6 +348,8 @@ pub struct FormatState { /// Whether every selected paragraph is bulleted or numbered. pub bullets: bool, pub numbering: bool, + /// Whether any selected paragraph is bulleted or numbered. + pub listed: bool, /// The library style every selected paragraph's list shares. pub list: Option, /// Tags every selected paragraph has, with their action types. @@ -701,6 +707,7 @@ impl CanvasEditor { })), bullets: list(Formatting::Bullets), numbering: list(Formatting::Numbering), + listed: paragraphs.iter().any(|node| self.list(node).is_some()), list: common(paragraphs.iter().map(|node| self.list_style(node))), tags: paragraphs.first().map_or_else(Vec::new, |first| { let mut shared: Vec<_> = tags(first) @@ -753,6 +760,8 @@ impl CanvasEditor { | Formatting::Tag(..) | Formatting::RemoveTags | Formatting::Check + | Formatting::ToDoList(..) + | Formatting::BulletedList(..) | Formatting::Style(_) if title => { @@ -860,6 +869,46 @@ impl CanvasEditor { } } Formatting::Check => self.check(&mut replacement, &ranges), + Formatting::ToDoList(tag, action_type) => { + let definition = tag.definition(*action_type); + let id = self.define_tag(&definition)?; + let created = time32(); + for node in leaves_mut(&mut replacement) { + if ranges.remove(&node.id).is_none() || self.list(node).is_none() { + continue; + } + node.lists.clear(); + if tags(node).any(|tag| self.tag_kind(tag) == Some(&definition.kind)) { + continue; + } + let ParagraphContent::Text(text) = &mut node.content else { + unreachable!() + }; + let added = Some((id, tag.shape, created)); + self.retag([&mut node.tags, &mut text.tags], &definition.kind, added); + } + } + Formatting::BulletedList(tag, action_type) => { + let kind = tag.definition(*action_type).kind; + for node in leaves_mut(&mut replacement) { + if ranges.remove(&node.id).is_none() + || !tags(node).any(|tag| self.tag_kind(tag) == Some(&kind)) + { + continue; + } + if self.list(node) != Some(Formatting::Bullets) { + let format = &node.text().unwrap().text.spans()[0].format; + let list = list_definition(ListStyle::BULLET, format); + let id = new_id()?; + self.definitions.insert(id, list); + node.lists = vec![id]; + } + let ParagraphContent::Text(text) = &mut node.content else { + unreachable!() + }; + self.retag([&mut node.tags, &mut text.tags], &kind, None); + } + } Formatting::Style(definition) => { let olds = bases(&replacement)?; let style = self.define_style(definition)?; @@ -2300,6 +2349,57 @@ mod tests { assert_eq!(editor.active_outline().document, original); } + #[test] + fn lists_become_to_do_lists_and_back_as_one_undo_step_each() { + let mut engine = TextEngine::default(); + let mut editor = plain(&mut engine, &["one", "two", "three"]); + editor.select([at(0, 0), at(1, 3)].into()).unwrap(); + editor.format(&mut engine, Formatting::Bullets).unwrap(); + editor.select([at(1, 0); 2].into()).unwrap(); + editor.format(&mut engine, Formatting::Numbering).unwrap(); + let listed = editor.active_outline().document.clone(); + let all = Selection::from([at(0, 0), at(2, 5)]); + editor.select(all).unwrap(); + assert!(editor.format_state().unwrap().listed); + let to_do = NoteTag::defaults()[0].clone(); + editor + .format(&mut engine, Formatting::ToDoList(to_do.clone(), 0)) + .unwrap(); + let lists = |editor: &CanvasEditor| { + let document = &editor.active_outline().document; + document + .nodes() + .iter() + .map(|node| editor.list(node)) + .collect::>() + }; + assert_eq!(lists(&editor), [None, None, None]); + let task = || vec![("To Do".to_owned(), 0, true)]; + assert_eq!( + (0..3).map(|at| text_tags(&editor, at)).collect::>(), + [task(), task(), vec![]] + ); + let state = editor.format_state().unwrap(); + assert!(!state.listed && state.tags.is_empty()); + editor.select([at(0, 0), at(1, 3)].into()).unwrap(); + assert_eq!(editor.format_state().unwrap().tags, [(to_do.clone(), 0)]); + editor + .format(&mut engine, Formatting::BulletedList(to_do, 0)) + .unwrap(); + assert_eq!( + lists(&editor), + [Some(Formatting::Bullets), Some(Formatting::Bullets), None] + ); + assert_eq!(text_tags(&editor, 0), []); + assert_eq!(text_tags(&editor, 1), []); + let state = editor.format_state().unwrap(); + assert_eq!((state.list, state.tags), (Some(ListStyle::BULLET), vec![])); + editor.undo(&mut engine).unwrap(); + assert_eq!(text_tags(&editor, 1), task()); + editor.undo(&mut engine).unwrap(); + assert_eq!(editor.active_outline().document, listed); + } + #[test] fn the_default_tags_are_onenotes_stored_definitions_and_all_draw() { use onestore::{RevisionIndex, Store, document::Document}; @@ -2522,6 +2622,7 @@ mod tests { alignment: Some(Alignment::Center), bullets: false, numbering: true, + listed: true, list: Some(ListStyle::NUMBER), tags: vec![ (NoteTag::defaults()[0].clone(), 0), diff --git a/crates/canvas/src/outline.rs b/crates/canvas/src/outline.rs index 264c522ba12e23d9ba36937af6bb4bb528ce995a..fb1e8d3f5a5bc1521ef82a52e6c8bf4aeed5c92d 100644 --- a/crates/canvas/src/outline.rs +++ b/crates/canvas/src/outline.rs @@ -324,7 +324,7 @@ impl TagIcon { } /// Whether tag symbol `shape` is a check box, as MS-ONE's NoteTagShape marks them. -pub(crate) fn checkable(shape: u16) -> bool { +pub fn checkable(shape: u16) -> bool { matches!( shape, 1..=12 | 28 | 30 | 32 | 48 | 50 | 52 | 69 | 71 | 73 | 89..=99 diff --git a/crates/canvas/tests/to_do_list.rs b/crates/canvas/tests/to_do_list.rs new file mode 100644 index 0000000000000000000000000000000000000000..f64e5eb08eb02e2e78d2213eba745dcb6bda36ee --- /dev/null +++ b/crates/canvas/tests/to_do_list.rs @@ -0,0 +1,119 @@ +//! Make To-Do List trades bulleted and numbered paragraphs' lists for the To Do tag, and Make +//! Bulleted List trades it back, each published as one revision (`corpus/to-do-list`). + +use canvas::{ + document::TextPosition, + editor::{CanvasEditor, Formatting, NoteTag}, + layout::TextEngine, +}; +use onestore::{ + Arena, ExGuid, Section, Store, + op::{Edit, Op}, + page::{Page, PageObject}, +}; + +const LISTS: &[u8] = include_bytes!("../../../corpus/list-edit/cold/notebook/lists.one"); + +fn body(page: &Page) -> ExGuid { + page.objects + .iter() + .find_map(|object| match object { + PageObject::Outline(outline) => Some(outline.id), + _ => None, + }) + .unwrap() +} + +fn at(paragraph: usize) -> TextPosition { + TextPosition { + paragraph, + offset: 0, + } +} + +/// Each paragraph's list, as `bullet`, `number` or none, and its tags' labels. +fn items(page: &Page, engine: &mut TextEngine) -> Vec<(Option<&'static str>, Vec)> { + let mut editor = CanvasEditor::from_page(page.clone(), engine).unwrap(); + editor.focus_outline(body(page)).unwrap(); + (0..7) + .map(|paragraph| { + editor.select([at(paragraph); 2].into()).unwrap(); + let state = editor.format_state().unwrap(); + let list = match (state.bullets, state.numbering) { + (true, _) => Some("bullet"), + (_, true) => Some("number"), + _ => None, + }; + ( + list, + state.tags.into_iter().map(|(tag, _)| tag.label).collect(), + ) + }) + .collect() +} + +/// `SNOWBOUND_TO_DO_LIST_EXPORT` names a new directory receiving the candidate for a cold +/// reopen. +#[test] +fn lists_become_to_do_lists_and_back_one_revision_each() { + let arena = Arena::default(); + let mut section = Section::open(&arena, LISTS.to_vec()).unwrap(); + let space = section.pages().unwrap()[0].0; + let page = section.page(space).unwrap(); + let mut engine = TextEngine::default(); + let mut editor = CanvasEditor::from_page(page.clone(), &mut engine).unwrap(); + editor.focus_outline(body(&page)).unwrap(); + let to_do = NoteTag::defaults()[0].clone(); + let mut publish = |editor: &mut CanvasEditor, at| { + let ops = editor + .take_ops() + .unwrap() + .into_iter() + .map(|op| Op::Page { space, op }) + .collect(); + section.apply("Author", &Edit { at, ops }).unwrap(); + }; + // Through "Nested numbered", the last paragraph each edit takes. + let nested = TextPosition { + paragraph: 3, + offset: 15, + }; + editor.select([at(0), nested].into()).unwrap(); + editor + .format(&mut engine, Formatting::ToDoList(to_do.clone(), 0)) + .unwrap(); + publish(&mut editor, 134_000_000_000_000_000); + editor.select([at(2), nested].into()).unwrap(); + editor + .format(&mut engine, Formatting::BulletedList(to_do, 0)) + .unwrap(); + publish(&mut editor, 134_000_000_010_000_000); + + let task = || vec!["To Do".to_owned()]; + let expected = [ + (None, task()), + (None, task()), + (Some("bullet"), vec![]), + (Some("bullet"), vec![]), + (Some("number"), vec![]), + (None, vec![]), + (None, vec![]), + ]; + assert_eq!(items(§ion.page(space).unwrap(), &mut engine), expected); + section.seal().unwrap(); + let written = section.image(); + let reread = Section::open(&arena, written.clone()).unwrap(); + assert_eq!(items(&reread.page(space).unwrap(), &mut engine), expected); + if let Some(directory) = std::env::var_os("SNOWBOUND_TO_DO_LIST_EXPORT") { + let directory = std::path::PathBuf::from(directory); + std::fs::create_dir(&directory).unwrap(); + std::fs::write(directory.join("lists.one"), &written).unwrap(); + let file_id = Store::parse(&written).unwrap().header.file_id; + std::fs::write( + directory.join("Open Notebook.onetoc2"), + onestore::create_table_of_contents("Open Notebook.onetoc2", &[("lists.one", file_id)]) + .unwrap(), + ) + .unwrap(); + } +} diff --git a/crates/snowbound/src/commands.rs b/crates/snowbound/src/commands.rs index 11594c38f40b653e98581acf5da8ee0902dd21f1..5ab5f9bfa049f2dbf8fbdc50343336ad5caf3333 100644 --- a/crates/snowbound/src/commands.rs +++ b/crates/snowbound/src/commands.rs @@ -113,6 +113,11 @@ pub enum Id { CustomizeTags, RemoveTags, FindTags, + /// Gives the selected bulleted and numbered paragraphs the To Do tag in place of + /// their list. + ToDoList, + /// Gives the selected To Do paragraphs a bullet in place of their tag. + BulletedList, Help, CheckForUpdates, } @@ -598,6 +603,8 @@ pub const COMMANDS: &[Command] = &[ &[cmd('0')] ), row!(Id::FindTags, "Find Tags", NONE, NONE), + row!(Id::ToDoList, "Make To-Do List", NONE, NONE), + row!(Id::BulletedList, "Make Bulleted List", NONE, NONE), row!(Id::Help, "Snowbound Help", NONE, NONE), row!(Id::CheckForUpdates, "Check for Updates…", NONE, NONE), ]; @@ -1290,6 +1297,14 @@ impl State { Id::Theme(scope) => enabled(!modal && self.theme_target(scope).is_some()), // A selected picture or file takes tags too, as in OneNote. Id::RemoveTags => enabled(text || tagged), + Id::ToDoList => enabled(text && format.listed && self.to_do().is_some()), + Id::BulletedList => enabled( + text && self.to_do().is_some_and(|place| { + format + .tags + .contains(&(self.tags[place].stored(), place as u16)) + }), + ), Id::Toggle(toggle) => checked(format.toggles.contains(&toggle)), Id::Bullets => checked(format.bullets), Id::Numbering => checked(format.numbering), @@ -1329,6 +1344,11 @@ impl State { Ok(()) } + /// The place of the first check box tag in the user's list, To Do in OneNote's. + fn to_do(&self) -> Option { + (self.tags.iter()).position(|tag| canvas::outline::checkable(tag.shape)) + } + /// The notebook the open section, or the notebook showing none, belongs to. fn notebook(&self) -> Option<&Arc> { self.session @@ -1683,6 +1703,20 @@ impl State { return Ok(()); } Id::RemoveTags => return format(self, Formatting::RemoveTags), + Id::ToDoList | Id::BulletedList => { + let place = self.to_do().expect("Enabled with a To Do tag"); + let tag = self.tags[place].clone(); + format( + self, + if id == Id::ToDoList { + Formatting::ToDoList(tag, place as u16) + } else { + Formatting::BulletedList(tag, place as u16) + }, + )?; + self.keep_tag_art(place); + return Ok(()); + } }; self.commands.push(response); Ok(()) diff --git a/crates/snowbound/src/link.rs b/crates/snowbound/src/link.rs index fa9547b60abfb4afdb3767712869c8e65e0a58ef..82f86b5059a3e8d201a44a9aacf44e271c512545 100644 --- a/crates/snowbound/src/link.rs +++ b/crates/snowbound/src/link.rs @@ -2,7 +2,7 @@ //! the page's context menu, and following a clicked link, to a page //! of the notebook or with the system's handler. -use crate::{Command, State, page, platform}; +use crate::{Command, State, commands, page, platform}; use onestore::ExGuid; use onestore::page::link::{LinkTarget, internal_link}; use std::error::Error; @@ -330,6 +330,14 @@ impl State { None => Vec::new(), }; let corrections = items.len(); + let format = self.format_state(); + let lists = [commands::Id::ToDoList, commands::Id::BulletedList] + .into_iter() + .filter(|id| { + let choice = commands::Choice::Command(*id); + self.status(&choice, &format).enabled + }) + .collect::>(); items.extend(if context.attachment.is_some() { // OneNote 2010's commands for the file itself; its clipboard holds text alone. vec![item("Open"), item("Save As…")] @@ -368,6 +376,12 @@ impl State { item("Copy Link to Paragraph"), ]), } + for (at, id) in lists.iter().enumerate() { + items.push(Item { + separated: at == 0, + ..item(commands::command(*id).title) + }); + } if context.equation { items.extend([ Item { @@ -414,6 +428,12 @@ impl State { self.respond(response); return Ok(()); } + if let Some(id) = lists + .into_iter() + .find(|id| commands::command(*id).title == chosen_text) + { + return self.run(commands::Choice::Command(id)); + } let response = match chosen_text.as_str() { "Open" => return self.open_attachment(&context.attachment.unwrap()), "Save As…" => return self.save_attachment(&context.attachment.unwrap()), diff --git a/tools/test_to_do_list.py b/tools/test_to_do_list.py new file mode 100644 index 0000000000000000000000000000000000000000..35a18471d7b44f90b33c9aafb54c9941b28b922a --- /dev/null +++ b/tools/test_to_do_list.py @@ -0,0 +1,57 @@ +from pathlib import Path +import runpy +import shutil +from tempfile import TemporaryDirectory +import unittest +import xml.etree.ElementTree as ET + +from native_xml import ns + +ROOT = Path(__file__).resolve().parent.parent +FIXTURE = ROOT / 'corpus/to-do-list' +compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare'] + + +def items(read): + """Each paragraph's text, list kind and tags' names, in page order.""" + page, = (ET.parse(path).getroot() for path in sorted(read.glob('page-*.xml'))) + names = {d.get('index'): d.get('name') for d in page.findall('one:TagDef', ns)} + result = [] + for oe in page.iter('{%s}OE' % ns['one']): + marker = oe.find('one:List', ns) + kind = None if marker is None else list(marker)[0].tag.split('}')[1] + tags = [names[tag.get('index')] for tag in oe.findall('one:Tag', ns)] + result.append((oe.find('one:T', ns).text, kind, tags)) + return result + + +class ToDoListTest(unittest.TestCase): + def test_onenote_tags_lists_without_removing_them(self): + self.assertEqual(items(FIXTURE / 'native/read'), [ + ('Bullet item', 'Bullet', ['To Do']), + ('First numbered', 'Number', ['To Do']), + ('Second numbered', 'Number', ['To Do']), + ('Nested numbered', 'Number', []), + ('Restarted at three', 'Number', ['To Do']), + ('Nested plain', None, []), + ('Plain again', None, ['To Do']), + ]) + + def test_snowbound_to_do_and_bulleted_lists_reopen_natively(self): + with TemporaryDirectory() as temporary: + read = Path(temporary) / 'read' + shutil.copytree(FIXTURE / 'cold/read', read) + compare(FIXTURE / 'candidate', read) + self.assertEqual(items(FIXTURE / 'cold/read'), [ + ('Bullet item', None, ['To Do']), + ('First numbered', None, ['To Do']), + ('Second numbered', 'Bullet', []), + ('Nested numbered', 'Bullet', []), + ('Restarted at three', 'Number', []), + ('Nested plain', None, []), + ('Plain again', None, []), + ]) + + +if __name__ == '__main__': + unittest.main() -- 2.54.0