AB-PDF: Zeichen ohne Glyph werden ersetzt statt als Kästchen gedruckt

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-07 14:11:54 +00:00
1 parent ae6d84b2a4
commit b097fedf5a
2 files changed
+76

No files matched your search

+36
View File
@@ -39,3 +39,39 @@ test('hatGlyph: deutsche Buchstaben, €, Minuszeichen, geschütztes Leerzeichen
for (const zeichen of noetig) assert.ok(hatGlyph(zeichen.codePointAt(0)), `Glyph fehlt: U+${zeichen.codePointAt(0).toString(16)}`)
for (const code of [0x202f, 0x2009, 0x200b, 0x416, 0x1f600, 0x3042]) assert.equal(hatGlyph(code), false, `U+${code.toString(16)} sollte fehlen`)
})
test('bereinigeText: vorhandene Zeichen bleiben unverändert, getrennte Akzente werden zusammengesetzt', () => {
const text = `Müller & Söhne – „Größe“ 1.234,56${NBSP}€ ${cp(0x2212)} 20,00${NBSP}€ ÄÖÜ äöü ß … Łukasz Yıldız Çelik`
assert.equal(bereinigeText(text), text)
assert.equal(bereinigeText('a' + cp(0x301)), 'á'.normalize('NFC'))
assert.equal(bereinigeText(null), '')
assert.equal(bereinigeText(undefined), '')
assert.equal(bereinigeText(42), '42')
})
test('bereinigeText: Steuerzeichen, Zero-Width, weiche Trennung und BOM entfallen; Zeilenenden werden Zeilenumbrüche, Tab wird Leerzeichen', () => {
const roh = `a${cp(0x200b)}b${cp(0xad)}c${cp(0xfeff)}d${cp(0)}e\tf\r\ng\rh${cp(0x2028)}i${cp(0x200d, 0xfe0f)}j`
assert.equal(bereinigeText(roh), 'abcde f\ng\nh\nij')
})
test('bereinigeText mit Figtree: schmale Leerzeichen werden Leerzeichen, kyrillische und japanische Zeichen sowie Emoji je ein Fragezeichen', () => {
assert.equal(bereinigeText(`a${cp(0x202f)}b${cp(0x2009)}c`), 'a b c')
assert.equal(bereinigeText(`${cp(0x416)}${cp(0x3042)}${cp(0x1f600)}`), '???')
})
test('bereinigeText: Ersatzregeln bei fehlendem Glyph (Schrift ohne Zeichen über ASCII)', () => {
const nurAscii = (code) => code < 0x80
const fall = (eingabe) => bereinigeText(eingabe, nurAscii)
assert.equal(fall('9,00' + NBSP + '€'), '9,00 EUR')
assert.equal(fall(`${cp(0x201e)}x${cp(0x201c)} ${cp(0x201a)}y${cp(0x2019)}`), `"x" 'y'`)
assert.equal(fall(`1 ${cp(0x2013)} 2 ${cp(0x2212)} 3 ${cp(0x2014)} 4`), '1 - 2 - 3 - 4')
assert.equal(fall(`wait${cp(0x2026)} 3${cp(0xd7)}4 a${cp(0x2192)}b`), 'wait... 3x4 a->b')
assert.equal(fall('Müller Çelik Ångström'), 'Muller Celik Angstrom')
assert.equal(fall('Łukasz Ğ'), '?ukasz G')
assert.equal(fall('e' + cp(0x301) + cp(0x301)), 'e')
assert.equal(fall(cp(0x301)), '')
})
test('bereinigeTexte: bearbeitet jede Zeichenkette in verschachtelten Objekten und Listen, andere Werte bleiben', () => {
const roh = { a: ['x' + cp(0x200b) + 'y', { b: 'ż' + cp(0x1f600) }], n: 5, f: null, t: true }
assert.deepEqual(bereinigeTexte(roh), { a: ['xy', { b: 'ż?' }], n: 5, f: null, t: true })
})