fix: PDF-export en editor — #1757, #1758, #1759, #1760 #1765

Merged
brenno merged 4 commits from fix/editor-pdf-batch-1757-1760 into main 2026-08-24 09:02:28 +00:00
Owner

Samenvatting

Vier issues in één batch, elk met eigen commit en test:

  • #1757documentChapterPageBreak default true: een hoofdstuk opent op een nieuw vel, zoals een lezer verwacht. Kleinste diff — de code bestond al, alleen de default draaide.
  • #1758 — keep-with-next voor sub-hoofdstukken: de grens van 400→1200 tekens dekt nu bijna elke alinea; langere alinea's worden op woordgrens gesplitst zodat de kop altijd met ~3 regels meereist in een Inseparable. Nieuwe top-level splitParagraphAtWordBoundary in document_pdf_blocks.dart.
  • #1759stripLeadingFrontMatterLeakage (bestond al voor export, #1726) nu ook op drie plekken in de editor: initialisatie, ref.listen, ref.watch. De visuele modus toont geen theme:/tlp:-regels meer als bewerkbare tekst.
  • #1760onQueryFieldChanged in FindReplaceSession: telt treffers bij tijdens het typen in het zoekveld, maar springt niet naar de eerste treffer. setQuery (met sprong) blijft voor open() en programma-aanroepen. Toegepast in zowel document_editor_screen als markdown_deck_editor.

Testplan

  • make check groen lokaal (10500+ tests, 87.2% dekking)
  • test/pdf/document_pdf_keep_with_next_test.dart — telt Inseparables voor korte alinea's, lange alinea's (gesplitst), H1, en kop zonder volgend blok
  • test/find_replace_session_test.dart — typen in zoekveld telt mee zonder onReveal te triggeren; lege vraag geeft geen treffers
  • test/document_front_matter_test.dartstripLeadingFrontMatterLeakage al gedekt (bestaand)
  • test/settings_provider_test.dartdocumentChapterPageBreak default-wissel breekt geen bestaande test

Beveiliging

Geen geheimen, geen uitgaand verkeer, geen nieuwe afhankelijkheid. make check-secrets en make sast zitten in check-full (niet in check); de wijziging raakt geen trust-boundary.

Bewaker

Deze wijziging raakt geen van de vijf punten (bestandsformaat, opslag, afhankelijkheid, uitgaand verkeer, publieke belofte). De PDF-export en editor-UI veranderen, maar de Markdown-bron en het .md-formaat niet. Stap overgeslagen — expliciet, niet stilzwijgend.

Generated with Devin

## Samenvatting Vier issues in één batch, elk met eigen commit en test: - **#1757** — `documentChapterPageBreak` default `true`: een hoofdstuk opent op een nieuw vel, zoals een lezer verwacht. Kleinste diff — de code bestond al, alleen de default draaide. - **#1758** — keep-with-next voor sub-hoofdstukken: de grens van 400→1200 tekens dekt nu bijna elke alinea; langere alinea's worden op woordgrens gesplitst zodat de kop altijd met ~3 regels meereist in een `Inseparable`. Nieuwe top-level `splitParagraphAtWordBoundary` in `document_pdf_blocks.dart`. - **#1759** — `stripLeadingFrontMatterLeakage` (bestond al voor export, #1726) nu ook op drie plekken in de editor: initialisatie, `ref.listen`, `ref.watch`. De visuele modus toont geen `theme:`/`tlp:`-regels meer als bewerkbare tekst. - **#1760** — `onQueryFieldChanged` in `FindReplaceSession`: telt treffers bij tijdens het typen in het zoekveld, maar springt niet naar de eerste treffer. `setQuery` (met sprong) blijft voor `open()` en programma-aanroepen. Toegepast in zowel `document_editor_screen` als `markdown_deck_editor`. ## Testplan - [x] `make check` groen lokaal (10500+ tests, 87.2% dekking) - [x] `test/pdf/document_pdf_keep_with_next_test.dart` — telt `Inseparable`s voor korte alinea's, lange alinea's (gesplitst), H1, en kop zonder volgend blok - [x] `test/find_replace_session_test.dart` — typen in zoekveld telt mee zonder `onReveal` te triggeren; lege vraag geeft geen treffers - [x] `test/document_front_matter_test.dart` — `stripLeadingFrontMatterLeakage` al gedekt (bestaand) - [x] `test/settings_provider_test.dart` — `documentChapterPageBreak` default-wissel breekt geen bestaande test ## Beveiliging Geen geheimen, geen uitgaand verkeer, geen nieuwe afhankelijkheid. `make check-secrets` en `make sast` zitten in `check-full` (niet in `check`); de wijziging raakt geen trust-boundary. ## Bewaker Deze wijziging raakt geen van de vijf punten (bestandsformaat, opslag, afhankelijkheid, uitgaand verkeer, publieke belofte). De PDF-export en editor-UI veranderen, maar de Markdown-bron en het `.md`-formaat niet. Stap overgeslagen — expliciet, niet stilzwijgend. Generated with [Devin](https://devin.ai)
`documentChapterPageBreak` stond standaard uit — een lezer verwacht dat een
hoofdstuk opent op een nieuw vel. Default nu `true` (model + provider).

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
De keep-with-next logica bond een kop alleen aan een volgend blok van ≤400
tekens — langere alinea's vielen door en lieten de kop als wees onderaan
staan. Nu:

- grens verhoogd naar 1200 tekens (dekt bijna elke alinea);
- alinea's daarboven worden op woordgrens gesplitst: het eerste deel
  (~200 tekens, ~3 regels) reist met de kop mee in een Inseparable, de
  rest volgt los;
- splitParagraphAtWordBoundary als top-level functie in document_pdf_blocks
  (houdt document_pdf_widgets onder zijn size-ceiling).

Test: document_pdf_keep_with_next_test.dart — telt Inseparables voor korte
alinea's, lange alinea's, H1, en kop zonder volgend blok.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
stripLeadingFrontMatterLeakage bestond al (#1726) maar werd alleen in het
exportpad toegepast — de editor toonde `theme:`/`tlp:`-regels als bewerkbare
tekst. Nu op drie plekken in document_editor_screen: initialisatie, de
ref.listen (externe wijzigingen) en ref.watch (source voor layouts).

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
fix(editor): zoek/vervangen focus springt niet meer weg per karakter (#1760)
All checks were successful
scans / scans (pull_request) Successful in 6m8s
static-gate / static-gate (pull_request) Successful in 9m36s
094152e088
setQuery riep recount(selectFirst: true) aan die onReveal → _jumpToMatch
doet — elke toetsaanslag in het zoekveld trok de focus naar het document.

Nieuwe methode onQueryFieldChanged: telt treffers bij (refreshWhileTyping-
gedrag) maar springt niet. onQueryChanged in zowel document_editor_screen
als markdown_deck_editor nu hieraan gebonden. setQuery (met sprong) blijft
voor open() en programma-aanroepen.

Test: typen in zoekveld telt mee zonder onReveal te triggeren; lege vraag
geeft geen treffers.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno merged commit 226ef8ea20 into main 2026-08-24 09:02:28 +00:00
Sign in to join this conversation.
No description provided.