Het gebundelde terugvalfont mist tekens die in diagrammen gewoon zijn (→) #1968

Closed
opened 2026-09-03 12:14:46 +00:00 by brenno · 1 comment
Owner

Wat er aan de hand is

Sinds #1942 wordt de tekst in een ingesloten tekening (grafiek, mermaid,
formule) op het gebundelde Roboto-Variable.ttf gezet zodra er een teken boven
U+00FF in staat. Dat lost het afbreken van de export op, maar niet elk teken
staat in dat font.

Afgelezen uit de cmap-tabel van het bestand zelf:

teken in Roboto-Variable
U+2014 ja
U+2019 ja
U+2026 ja
Cyrillisch, Grieks ja
U+2192 nee

Een pijl in een diagramlabel of een grafiekreeks (Kritiek → hoog) wordt dus
een leeg blokje. Sinds #1942 méldt de export dat wel — unsupportedCharacters
leest nu ook de tekst in de tekening — maar de gebruiker kan er niets anders mee
dan het teken vermijden.

De afweging

Meer dekking kost bestandsgrootte, in de app én in elke PDF die het font
insluit. Mogelijke richtingen, van klein naar groot:

  1. Niets doen: de melding is er, en een pijl is te vervangen door ->.
  2. Een klein aanvullend terugvalfont voor de meest voorkomende symbolen
    (pijlen, wiskundige tekens) naast Roboto zetten. DocumentPdfFonts.fallback
    is al een lijst, dus de bedrading ligt er.
  3. Een breder Unicode-font bundelen in plaats van Roboto.

Dit is een productafweging (grootte tegenover dekking), geen bug — vandaar een
apart issue in plaats van meeliften op #1942.

Waar het zit

  • lib/services/pdf/document_pdf_fonts.dartfallback, fallbackCoverage
  • assets/fonts/Roboto-Variable.ttf
  • lib/widgets/parts/document_export_pdf_support.dart — de melding
## Wat er aan de hand is Sinds #1942 wordt de tekst in een ingesloten tekening (grafiek, mermaid, formule) op het gebundelde `Roboto-Variable.ttf` gezet zodra er een teken boven U+00FF in staat. Dat lost het afbreken van de export op, maar niet elk teken staat in dat font. Afgelezen uit de `cmap`-tabel van het bestand zelf: | teken | in Roboto-Variable | |---|---| | `—` U+2014 | ja | | `’` U+2019 | ja | | `…` U+2026 | ja | | Cyrillisch, Grieks | ja | | **`→` U+2192** | **nee** | Een pijl in een diagramlabel of een grafiekreeks (`Kritiek → hoog`) wordt dus een leeg blokje. Sinds #1942 méldt de export dat wel — `unsupportedCharacters` leest nu ook de tekst in de tekening — maar de gebruiker kan er niets anders mee dan het teken vermijden. ## De afweging Meer dekking kost bestandsgrootte, in de app én in elke PDF die het font insluit. Mogelijke richtingen, van klein naar groot: 1. Niets doen: de melding is er, en een pijl is te vervangen door `->`. 2. Een klein aanvullend terugvalfont voor de meest voorkomende symbolen (pijlen, wiskundige tekens) naast Roboto zetten. `DocumentPdfFonts.fallback` is al een *lijst*, dus de bedrading ligt er. 3. Een breder Unicode-font bundelen in plaats van Roboto. Dit is een productafweging (grootte tegenover dekking), geen bug — vandaar een apart issue in plaats van meeliften op #1942. ## Waar het zit - `lib/services/pdf/document_pdf_fonts.dart` — `fallback`, `fallbackCoverage` - `assets/fonts/Roboto-Variable.ttf` - `lib/widgets/parts/document_export_pdf_support.dart` — de melding
Author
Owner

Nagemeten, en dat verandert het voorstel op twee punten. Beide corrigeren iets dat hierboven staat.

1. De afweging "grootte tegenover dekking" bestaat grotendeels niet. package:pdf bedt geen heel font in maar een subset: PdfTtfFont._buildType0 roept TtfWriter.withChars(unicodeCMap.cmap) aan, met alleen de tekens die het document werkelijk gebruikt. Een breder terugvalfont kost dus niets in de PDF — alleen in de app-download. Wat hierboven staat over "elke PDF die het font insluit" klopt niet.

2. Het is geen ontbrekende pijl maar een systematisch gat. Roboto-Variable dekt 927 codepunten:

blok dekking
Pijlen U+2190–21FF 0/112
Wiskunde U+2200–22FF 12/256
Blokken en vormen U+25A0–25FF 4/96
Symbolen U+2600–26FF 0/256
Cyrillisch 255/256
Grieks 75/144

Dus → ← ↑ ↓ ↔ ⇒ ✓ ✗ ★ ▪ ontbreken allemaal — precies het rijtje dat in een diagramlabel of een statuskolom thuishoort. En het raakt niet alleen tekeningen: een in de lopende tekst van een document is vandaag even onzetbaar.

Voorstel: geen nieuw font bundelen — de fonts die er al zijn aan elkaar knopen.

Inter-Variable.ttf zit al in de app (het is de interfaceletter) en dekt 2818 codepunten, inclusief het hele rijtje hierboven. Roboto heeft 39 codepunten die Inter niet heeft (Cyrillische uitbreidingen als U+047A–047F en het U+0500-blok), dus vervangen is een kleine achteruitgang en kettingen niet. De unie is 2857.

Kosten: geen nieuw bestand, geen licentieregel erbij (Inter-OFL.txt staat al in de assets), geen afhankelijkheid, geen SBOM-wijziging.

Het werk zit niet in het font maar in drie plekken:

  1. fallback is al een List<pw.Font> en de lopende tekst ketent vanzelf via fontFallback — daar is het één font erbij.
  2. fallbackCoverage is nu één map uit één font en moet de unie worden. Anders meldt de export tekens als ontbrekend die wél gezet worden — precies de valse melding waar #1942 tegen waarschuwt.
  3. Tekeningen ketenen niet. customFontLookup geeft één Font per (familie, stijl, gewicht) terug en de SVG-lezer heeft geen terugvallijst. svgTypesetting moet dus per tekening de snede kiezen die álle tekens erin dekt. Dekt geen enkele snede ze allemaal (een tekening met zowel een pijl als zo'n Cyrillische uitbreiding), dan kiest hij de snede die het meeste dekt en meldt de rest via het bestaande kanaal — de belofte blijft dat de export zegt wat hij kwijtraakt.

Aanbeveling: dit doen. Het is klein, het haalt een gat weg dat de gebruiker vandaag alleen kan omzeilen door het teken te vermijden, en het kost geen byte in de export.

Nagemeten, en dat verandert het voorstel op twee punten. Beide corrigeren iets dat hierboven staat. **1. De afweging "grootte tegenover dekking" bestaat grotendeels niet.** `package:pdf` bedt geen heel font in maar een subset: `PdfTtfFont._buildType0` roept `TtfWriter.withChars(unicodeCMap.cmap)` aan, met alleen de tekens die het document werkelijk gebruikt. Een breder terugvalfont kost dus **niets** in de PDF — alleen in de app-download. Wat hierboven staat over "elke PDF die het font insluit" klopt niet. **2. Het is geen ontbrekende pijl maar een systematisch gat.** Roboto-Variable dekt 927 codepunten: | blok | dekking | |---|---| | Pijlen U+2190–21FF | **0/112** | | Wiskunde U+2200–22FF | 12/256 | | Blokken en vormen U+25A0–25FF | 4/96 | | Symbolen U+2600–26FF | **0/256** | | Cyrillisch | 255/256 | | Grieks | 75/144 | Dus `→ ← ↑ ↓ ↔ ⇒ ✓ ✗ ★ ▪` ontbreken allemaal — precies het rijtje dat in een diagramlabel of een statuskolom thuishoort. En het raakt niet alleen tekeningen: een `→` in de lopende tekst van een document is vandaag even onzetbaar. **Voorstel: geen nieuw font bundelen — de fonts die er al zijn aan elkaar knopen.** `Inter-Variable.ttf` zit al in de app (het is de interfaceletter) en dekt 2818 codepunten, inclusief het hele rijtje hierboven. Roboto heeft 39 codepunten die Inter niet heeft (Cyrillische uitbreidingen als U+047A–047F en het U+0500-blok), dus vervangen is een kleine achteruitgang en **kettingen** niet. De unie is 2857. Kosten: geen nieuw bestand, geen licentieregel erbij (`Inter-OFL.txt` staat al in de assets), geen afhankelijkheid, geen SBOM-wijziging. Het werk zit niet in het font maar in drie plekken: 1. `fallback` is al een `List<pw.Font>` en de lopende tekst ketent vanzelf via `fontFallback` — daar is het één font erbij. 2. `fallbackCoverage` is nu één map uit één font en moet de **unie** worden. Anders meldt de export tekens als ontbrekend die wél gezet worden — precies de valse melding waar #1942 tegen waarschuwt. 3. **Tekeningen ketenen niet.** `customFontLookup` geeft één `Font` per (familie, stijl, gewicht) terug en de SVG-lezer heeft geen terugvallijst. `svgTypesetting` moet dus per tekening de snede kiezen die álle tekens erin dekt. Dekt geen enkele snede ze allemaal (een tekening met zowel een pijl als zo'n Cyrillische uitbreiding), dan kiest hij de snede die het meeste dekt en meldt de rest via het bestaande kanaal — de belofte blijft dat de export zegt wat hij kwijtraakt. Aanbeveling: dit doen. Het is klein, het haalt een gat weg dat de gebruiker vandaag alleen kan omzeilen door het teken te vermijden, en het kost geen byte in de export.
brenno 2026-09-04 05:31:16 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1968
No description provided.