Plakschoonmaak wist betekenisdragende witruimte: U+2009-inspringing en U+2028/29-regelscheiders verdwijnen #1560

Closed
opened 2026-08-18 20:09:58 +00:00 by brenno · 0 comments
Owner

Wat er misgaat

sanitizeMarkdownPaste in lib/utils/markdown_paste_cleanup.dart verwijdert een
vaste lijst "onzichtbare tekens" onvoorwaardelijk:

const _invisibleChars = {
  '­', // soft hyphen
  ' ', // thin space
  '
', // line separator
  '
', // paragraph separator
  '', // BOM
};

Twee daarvan dragen wél betekenis zodra ze aan het begin van een regel of tussen
regels staan:

  • U+2009 (dunne spatie) als inspringing wordt weggegooid. Een geneste
    opsomming die met dunne spaties is ingesprongen komt volledig plat binnen —
    alle items op het eerste niveau.
  • U+2028 / U+2029 (regel- en alineascheider) worden weggegooid in plaats van
    omgezet naar \n. Alle regels plakken dan aan elkaar tot één regel.

Gemeten

Inspringing van vier tekens, door sanitizeMarkdownPaste:

teken uitkomst
U+0020 spatie 4 tekens
U+00A0 NBSP 4 tekens
U+2002 en space 4 tekens
U+2003 em space 4 tekens
U+2007 figure space 4 tekens
U+202F narrow nbsp 4 tekens
U+3000 ideographic 4 tekens
U+2009 dunne spatie weg

En met U+2028 of U+2029 als scheider tussen drie opsommingsregels: regels=1,
uitkomst - een - twee - drie.

Alleen U+2009 valt uit de toon: elke andere spatiesoort overleeft. Dat maakt dit
geen ontwerpkeuze maar een gat in de lijst.

Waarom de motivering niet meer opgaat

Het commentaar noemt de lijst "invisible characters often copied from news sites
(nu.nl, etc.)". Voor een dunne spatie midden in een zin klopt dat. Voor een
dunne spatie aan het begin van een regel niet: daar is het de structuur van het
document.

Wat het zou moeten doen

  • U+2009 alleen binnen de regel wissen, niet in de leidende witruimte — of daar
    omzetten naar een gewone spatie, zoals NBSP al gebeurt.
  • U+2028 en U+2029 omzetten naar \n in plaats van wissen; dat is precies wat
    ze betekenen. De regeleinde-normalisatie een regel hoger doet dat al voor
    \r\n en \r.

Waar het vandaan komt

Gevonden bij het natrekken van #1556 (inspringing kwijt bij plakken in de
broneditor van documentmodus). Dit is de eerste kandidaat die de beschrijving
van de indiener letterlijk reproduceert: "all bullets will now live on the same
primary level". Nog niet bevestigd dat zijn bronprogramma dunne spaties gebruikt
— daarvoor loopt de vraag om de ruwe klembordinhoud.

Bestandsformaat

Raakt het formaat niet; het gaat om wat er bij het plakken de tekst in komt.

Regressietest

Per spatiesoort de inspringing meten na sanitizeMarkdownPaste, en U+2028/29
tellen als regelovergang. De tabel hierboven is de test.

**Wat er misgaat** `sanitizeMarkdownPaste` in `lib/utils/markdown_paste_cleanup.dart` verwijdert een vaste lijst "onzichtbare tekens" onvoorwaardelijk: ```dart const _invisibleChars = { '­', // soft hyphen ' ', // thin space '
', // line separator '
', // paragraph separator '', // BOM }; ``` Twee daarvan dragen wél betekenis zodra ze aan het begin van een regel of tussen regels staan: - **U+2009 (dunne spatie) als inspringing** wordt weggegooid. Een geneste opsomming die met dunne spaties is ingesprongen komt volledig plat binnen — alle items op het eerste niveau. - **U+2028 / U+2029 (regel- en alineascheider)** worden weggegooid in plaats van omgezet naar `\n`. Alle regels plakken dan aan elkaar tot één regel. **Gemeten** Inspringing van vier tekens, door `sanitizeMarkdownPaste`: | teken | uitkomst | | --- | --- | | U+0020 spatie | 4 tekens | | U+00A0 NBSP | 4 tekens | | U+2002 en space | 4 tekens | | U+2003 em space | 4 tekens | | U+2007 figure space | 4 tekens | | U+202F narrow nbsp | 4 tekens | | U+3000 ideographic | 4 tekens | | **U+2009 dunne spatie** | **weg** | En met U+2028 of U+2029 als scheider tussen drie opsommingsregels: `regels=1`, uitkomst `- een - twee - drie`. Alleen U+2009 valt uit de toon: elke andere spatiesoort overleeft. Dat maakt dit geen ontwerpkeuze maar een gat in de lijst. **Waarom de motivering niet meer opgaat** Het commentaar noemt de lijst "invisible characters often copied from news sites (nu.nl, etc.)". Voor een dunne spatie *midden in* een zin klopt dat. Voor een dunne spatie aan het *begin* van een regel niet: daar is het de structuur van het document. **Wat het zou moeten doen** - U+2009 alleen binnen de regel wissen, niet in de leidende witruimte — of daar omzetten naar een gewone spatie, zoals NBSP al gebeurt. - U+2028 en U+2029 omzetten naar `\n` in plaats van wissen; dat is precies wat ze betekenen. De regeleinde-normalisatie een regel hoger doet dat al voor `\r\n` en `\r`. **Waar het vandaan komt** Gevonden bij het natrekken van #1556 (inspringing kwijt bij plakken in de broneditor van documentmodus). Dit is de eerste kandidaat die de beschrijving van de indiener letterlijk reproduceert: "all bullets will now live on the same primary level". Nog niet bevestigd dat zijn bronprogramma dunne spaties gebruikt — daarvoor loopt de vraag om de ruwe klembordinhoud. **Bestandsformaat** Raakt het formaat niet; het gaat om wat er bij het plakken de tekst in komt. **Regressietest** Per spatiesoort de inspringing meten na `sanitizeMarkdownPaste`, en U+2028/29 tellen als regelovergang. De tabel hierboven is de test.
brenno 2026-08-18 20:34:22 +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#1560
No description provided.