feat: support custom SVG bullet markers (PR #2616 + gate fixes) #2652

Merged
brenno merged 6 commits from feat/custom-svg-bullets-fmt into main 2026-10-29 01:09:44 +00:00
Owner

Vervangende PR voor #2616 (bijdrage van @jhermans). De originele branch staat op diens fork met allow_maintainer_edit: false, dus poortfixes konden niet op de PR zelf — ze staan hier als eigen commits bovenop de ongemoeide bijdrage 663fdb774.

Originele bijdrage

custom_svg als derde bullet-marker naast dot en paw: gesanitiseerde SVG inline in het stijlprofiel, kiezer in thema-instellingen en per-dia override, Flutter-preview en self-contained data-URI in HTML-export, allow-list sanitisering (geen scripts/events/animatie/externe of data-URLs), 256 KiB-cap, docs in FILE_FORMAT (en + nl).

Maintainer-commits erbovenop

  • 56ca141 style: dart format (drie bestanden waren niet geformatteerd)
  • 699e882 refactor: marker-rij + SVG-kiezer als top-level _bulletMarkerField in eigen part settings_dialog_bullet_marker.dart — de bijdrage duwde vier ratchets over plafond (settings_dialog 1048→1050, colors 994→1080, marp_html_service 1000→1001, klasse 6287→6362); marp-CSS achter _bulletMarkerCss
  • 5289d63 chore: ThemeProfile.copyWith gebaselined op 158 — pure parameter-plumbing, zelfde patroon als Slide.copyWith
  • 7e67340 fix: SVG-segmentlabel door l10n.d + unchangedInEnglish-whitelist (hardcoded-text-poort)
  • 56fb4e1 test: stijlprofiel-round-trip gebruikt sanitise-stabiele SVG — fromJson vult xmlns aan bij import, dus kale invoer kan niet byte-identiek terugkomen

Poort

make check-full op 56fb4e19c: alles groen — format, analyze, toolchain, conventies, projectiegrens, methodlengte, dead code, hardcoded text, l10n, volledige suite (14804 + 1238 tests), coverage, goldens, make check-secrets, make sast.

Eén uitzondering: deps-check faalt, maar identiek op main — MITRE CWE 5.0 en ISO 9001:2026 zijn upstream verschenen (externe drift, geen PR-regressie). De CWE-bundel regenereer je volgens de poort bewust met termdiff-weging; dat is eigen onderhoudswerk, geen onderdeel van deze merge.

Review-focus

SVG allow-list en pariteit Flutter-preview ↔ HTML-export (zie originele PR-tekst #2616).

Vervangende PR voor #2616 (bijdrage van @jhermans). De originele branch staat op diens fork met `allow_maintainer_edit: false`, dus poortfixes konden niet op de PR zelf — ze staan hier als eigen commits bovenop de ongemoeide bijdrage `663fdb774`. ## Originele bijdrage `custom_svg` als derde bullet-marker naast `dot` en `paw`: gesanitiseerde SVG inline in het stijlprofiel, kiezer in thema-instellingen en per-dia override, Flutter-preview en self-contained data-URI in HTML-export, allow-list sanitisering (geen scripts/events/animatie/externe of data-URLs), 256 KiB-cap, docs in FILE_FORMAT (en + nl). ## Maintainer-commits erbovenop - `56ca141` style: dart format (drie bestanden waren niet geformatteerd) - `699e882` refactor: marker-rij + SVG-kiezer als top-level `_bulletMarkerField` in eigen part `settings_dialog_bullet_marker.dart` — de bijdrage duwde vier ratchets over plafond (settings_dialog 1048→1050, colors 994→1080, marp_html_service 1000→1001, klasse 6287→6362); marp-CSS achter `_bulletMarkerCss` - `5289d63` chore: `ThemeProfile.copyWith` gebaselined op 158 — pure parameter-plumbing, zelfde patroon als `Slide.copyWith` - `7e67340` fix: `SVG`-segmentlabel door `l10n.d` + `unchangedInEnglish`-whitelist (hardcoded-text-poort) - `56fb4e1` test: stijlprofiel-round-trip gebruikt sanitise-stabiele SVG — `fromJson` vult `xmlns` aan bij import, dus kale invoer kan niet byte-identiek terugkomen ## Poort `make check-full` op `56fb4e19c`: alles groen — format, analyze, toolchain, conventies, projectiegrens, methodlengte, dead code, hardcoded text, l10n, volledige suite (14804 + 1238 tests), coverage, goldens, `make check-secrets`, `make sast`. **Eén uitzondering:** `deps-check` faalt, maar identiek op `main` — MITRE CWE 5.0 en ISO 9001:2026 zijn upstream verschenen (externe drift, geen PR-regressie). De CWE-bundel regenereer je volgens de poort bewust met termdiff-weging; dat is eigen onderhoudswerk, geen onderdeel van deze merge. ## Review-focus SVG allow-list en pariteit Flutter-preview ↔ HTML-export (zie originele PR-tekst #2616).
Signed-off-by: Jeroen Hermans <j.hermans@cloudaware.eu>
De externe bijdrage was niet door dart format gehaald; de format-check
faalde op drie bestanden. Alleen whitespace, geen semantische wijziging.

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

Signed-off-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
De bijdrage uit PR #2616 duwde vier conventie-ratchets over hun plafond:
settings_dialog.dart (+2: sanitize-import en part-directive),
settings_dialog_colors.dart (994 -> 1080), marp_html_service.dart
(1000 -> 1001) en de klasse _SettingsDialogState (6287 -> 6362).

De hele marker-rij (segmentknop plus SVG-bestandskiezer) staat nu als
top-level _bulletMarkerField in de eigen part
settings_dialog_bullet_marker.dart — hetzelfde patroon als
settings_dialog_table_style.dart, en als top-level hulp telt hij niet
mee voor de klasse. In marp_html_service staat de poot-CSS plus de
custom-SVG-CSS nu achter _bulletMarkerCss in de markup-part, wat het
servicebestand weer onder de 1000 brengt.

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

Signed-off-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
De customBulletSvg-parameter plus clear-vlag uit PR #2616 duwde copyWith
van 150 naar 153 regels. Het is pure parameter-plumbing zonder uit te
tillen gedrag — dezelfde situatie als Slide.copyWith (174), dus een
gedocumenteerde baseline-entry in plaats van een geforceerde splitsing.

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

Signed-off-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
De hardcoded-text-poort accepteert geen letterlijke schermtekst, ook
geen technisch acroniem: 'SVG' loopt nu door d() en staat via
make add-l10n als leenwoord in unchangedInEnglish.

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

Signed-off-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
fromJson sanitiseert customBulletSvg bij import en vult een ontbrekende
xmlns aan; een test die met een kale, ongesanitiseerde string begint kan
daardoor nooit byte-identiek terugkomen. De invoer draagt nu de xmlns
die elke echte opgeslagen marker al heeft.

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

Signed-off-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno force-pushed feat/custom-svg-bullets-fmt from 56fb4e19c5 to 673c75f197 2026-10-29 00:22:54 +00:00 Compare
brenno force-pushed feat/custom-svg-bullets-fmt from 673c75f197 to 63b41433d6 2026-10-29 01:09:38 +00:00 Compare
brenno merged commit d79d042ebd into main 2026-10-29 01:09:44 +00:00
Author
Owner

Gate-status op uiteindelijke head 63b41433d:

  • make check-full op 673c75f19 (identieke PR-inhoud, een main eerder): volledig groen behalve deps-check, dat toen faalde op externe CWE/ISO-drift — identiek rood op main.
  • Na rebase op 4d7aeb062 (die #2653 met CWE 5.0 bevat): format, analyze, conventies, methodlengte, dead code, hardcoded text, deps-check (nu groen), check-secrets en sast opnieuw gedraaid — alles OK. Volledige testsuite (14812 + 1238 + goldens) groen op 673c75f19; de PR-delta was na de laatste rebase byte-identiek, alleen de basis schoof op.

Originele bijdrage van @jhermans: fc1f9c151.

**Gate-status op uiteindelijke head `63b41433d`:** - `make check-full` op `673c75f19` (identieke PR-inhoud, een main eerder): volledig groen behalve `deps-check`, dat toen faalde op externe CWE/ISO-drift — identiek rood op `main`. - Na rebase op `4d7aeb062` (die #2653 met CWE 5.0 bevat): format, analyze, conventies, methodlengte, dead code, hardcoded text, `deps-check` (nu groen), `check-secrets` en `sast` opnieuw gedraaid — alles OK. Volledige testsuite (14812 + 1238 + goldens) groen op `673c75f19`; de PR-delta was na de laatste rebase byte-identiek, alleen de basis schoof op. Originele bijdrage van @jhermans: `fc1f9c151`.
Sign in to join this conversation.
No description provided.