Een gedachtestreepje in een grafiektitel kostte de hele PDF-export (#1942) #1966
No reviewers
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!1966
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/pdf-svg-unicode-1942"
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 misging
De SVG-lezer van
package:pdfkiest voor elke<text>in een ingesloten tekening hardgecodeerd een van de veertien standaardsneden (src/svg/painter.dart:117— Helvetica, Times of Courier naarfont-family), zonder terugvallijst. Die sneden reiken tot Latin-1, enPdfFont.stringMetricswerpt op alles daarboven.Gevolg: niet dat ene diagram viel weg, maar het hele document. En het gaat niet om exotische schriften — nagemeten met een kale
pw.SvgImage:Start—(em-streepje)ArgumentError’…→ArgumentErrorłArgumentErrorDat zijn precies de tekens die een tekstverwerker vanzelf maakt. Grafieken zetten de titel, reeksnamen en aslabels van de auteur letterlijk in
<text>, dus de weg ernaartoe was kort.De bestaande
tryin_graphicving het niet: die dekt de constructor, terwijl de worp uitSvgImage.paintkomt — tijdensdocument.save().Wat er verandert
DocumentPdfFonts.svgTypesettingzegt per tekening wat er moet gebeuren: standaardsneden volstaan, dít Unicode-font moet het doen, of de tekening is niet te zetten. Het gebundelde Roboto dat de export toch al alsfontFallbackmeedraagt, gaat viacustomFontLookupmee.document_pdf_fonts.dartze koos.tryhem hier niet maken.→) staat níét in het gebundelde Roboto en wordt dan een leeg blokje.svgTextContentleest nu ook de<text>- en<tspan>-knopen, zodatunsupportedCharactershem meldt.sanitizeMermaidSvgliet een<defs>leeg achter (mermaid vult hem met<marker>en<style>, allebei gaan ze eruit). De serializer schrijft dat als<defs/>, en juist die zelfsluitende vorm handeltvector_graphics_compilerniet af — vandaarunhandled element <defs/>in elke debug-run. Er ging niets verloren, maar een melding die niets betekent leert je de meldingen negeren die wél iets betekenen.Twee kanten op benaderd, met opzet
svgTypesettingleest de héle SVG: een scan die één plek mist waar tekst kan staan, zet de afbreker terug. Te ruim kiezen kost daar hooguit een ander font.svgTextContentleest juist krap, alleen de tekstknopen: een melding die een teken noemt dat wél gewoon in het bestand staat, leert de gebruiker de melding negeren. Een teken minder gemeld is beter dan een teken ten onrechte.Regressietests
Acht nieuwe tests, waarvan er vier rood stonden tegen de onherstelde code, elk op de eigenschap zelf:
/BaseFontin het bestand)→) wordt gemeld in plaats van stil weggelatensvgTextContentleest tekstknopen en géén attribuutwaardenMet eigen ogen bekeken
Een echte export met een gedachtestreepje in de kop, de alinea, de grafiektitel en krul-apostrofs in de aslabels, gerasterd met QuickLook: alles staat er. (De eerste rasteraar liet de lopende tekst weg — die had de standaardsneden niet, die niet ingebed worden. Dat was de rasteraar, niet het bestand.)
Bewaker
Deze wijziging raakt geen bestandsformaat, geen opslag, geen afhankelijkheid, geen uitgaand verkeer en geen publieke belofte — het gaat om de uitvoer van één exportroute. Bewaker-stap expliciet overgeslagen.
Test plan
make checkgroen (opmaak, analyse, conventies, volledige suite, dekkingsvloeren, golden)make check-secretsgroen (gitleaks + trufflehog)make sastgroen (semgrep)Closes #1942
🤖 Generated with Claude Code
109e93b78ae89263beeb