Regressie: een pijl in een diagramlabel breekt de PDF-export opnieuw (#1968) #1987
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1987
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Wat er misgaat
laag → hoogin een diagram- of grafieklabel laat de PDF-export afbreken metNull check operator used on a null value. Dat is dezelfde klasse fout die#1942 dichtzette, opnieuw geopend door #1968.
Waarom
Twee dingen samen.
1.
svgTypesettingkiest het symbolen-font zodra Roboto één teken mist.Nagemeten:
laag → hoogКритик высокийКритик → высокий2.
NotoSansMath-subset.ttfheeft geen letters en geen spatie. Het laagstecodepunt in zijn
cmapis U+2190. Geen ASCII, geenU+0020.De SVG-lezer van
package:pdfzet alle tekst van de tekening met die enesnede.
TtfWriter.withCharsdoet voor de spatie een onvoorwaardelijkettf.charToGlyphIndexMap[32]!— en dat isnull. Weg export.Zelfs zonder die crash was de keuze verkeerd: elke letter van
laag → hoogzouin een wiskundefont gezet worden, dus als leeg blokje. Vóór #1968 stond er een
leesbaar label met één blokje op de plek van de pijl; nu is het hele document
weg.
Reproductie
Diagram- of grafieklabel met een pijl en een spatie, dan exporteren naar PDF.
Bijvoorbeeld een mermaid-label
laag → hoogof een grafiekreeksKritiek → hoog.Voorstel
primaire font iets". De lezer gebruikt één snede voor álles, dus telt hoeveel
van de tekens die er staan een kandidaat kan zetten — inclusief letters en
spaties.
laag → hoogkomt dan op Roboto uit (8 van de 9), met de pijl alsblokje en gemeld.
af. Dat is precies de crash hierboven, en het is deterministisch te
vermijden. Blijft er niets over, dan de bron tonen — niet werpen.
Inter-Variable.ttfals extra terugval. Die zit al in de app (het is deinterfaceletter) en dekt
→ ← ↑ ↓ ↔ ⇒ ✓ ✗ ★ ▪én alle letters. Dan wordtlaag → hooggewoon volledig gezet in plaats van met een blokje. Kost geenbyte extra en geen licentieregel.
unie van alle terugvalfonts. Nu zegt de unie dat een teken gedekt is terwijl
de gekozen snede het niet kan zetten — dan is het stil verlies.
Regressietest
Een export met een diagramlabel
laag → hoogmoet bytes opleveren. Die staat nurood — hij werpt.
Opgepakt. Tak: fix/pdf-svg-fontkeuze-1987. Verwachte reikwijdte: lib/services/pdf/document_pdf_fonts.dart, document_pdf_export.dart, lib/widgets/parts/document_export_pdf_support.dart, document_editor_screen.dart, pubspec.yaml (Inter als exportasset), plus tests.
Gerepareerd en op
main(merge3f85f0a7f, PR #1989).fallbackFonts) in plaats van twee benoemde rollen. De vorige vorm gaf geen plek aan de vraag wélke snede een tekening krijgt.Inter-Variable.ttfstaat erin, tussen Roboto en het wiskundefont. Zat al in de app als interfaceletter, dekt→ ← ↑ ↓ ↔ ⇒ ✓ ✗ ★ ▪én alle letters — geen byte extra, geen licentieregel, geen SBOM-wijziging.TtfWriter.withCharsniet betrouwbaar een blokje (laag ⨁ ∮ hoog→ blokjes,a ⨁ ∮→ worp), en op zo'n grens valt geen regel te bouwen.Acht regressietests. De belangrijkste les zit niet in de code maar in de toets: de exporttests bouwden hun fonts met Roboto alleen, terwijl de app met drie fonts exporteert. Daardoor was de hele klasse fouten die uit de fontkeuze komt onbereikbaar voor de test. Ze gebruiken nu dezelfde lijst en volgorde als de schil.
Eén bestaande test uit #1968 legde bovendien het foute gedrag vást: hij toetste wélk font gekozen werd (
fallback[1]) in plaats van of de gekozen snede het label kán zetten. Omgeschreven naar de eigenschap.Met eigen ogen bekeken: een export met
→ ✓ ≤, gedachtestreepje en krul-apostrofs in kop, alinea, grafiektitel, aslabels en legenda staat er volledig, enunsupportedCharactersis leeg.