Arabic scripture in the packet uses plain alef: U+0671 alef wasla becomes U+0627 in the stored ar strings (the blessing and Mark 5, 13 letters), display only, words and vowels unchanged

A device whose fonts lack U+0671 printed it as a box. Only those 13 code points change (0671: 13 -> 0, 0627:
+13); the bold verse is still a substring of the passage. check:packet-strings-parity fails on any U+0671 in
an ar value (it fails on the previous file). The Arabic scripture blocks also name Arabic faces before serif.
This commit is contained in:
Doxa Maps 2026-10-02 20:04:41 +00:00
parent 2d01e80002
commit 4386b4e5bf
3 changed files with 26 additions and 4 deletions

View file

@ -125,6 +125,22 @@ for (const loc of locales) {
}
}
// ── ARABIC: NO ALEF WASLA (U+0671) ─────────────────────────────────────────────
// The Van Dyck texts write the article with alef wasla (ٱ). A device whose fonts lack U+0671 printed it as a
// BOX, three times in the blessing and eight in Mark 5. The stored ar text uses plain alef (U+0627), the
// ordinary print form: display only, no word or vowel changes (_meta.note_on_blessing). Asserted on EVERY ar
// value, nested ones included, so the next passage pasted from the same source cannot bring it back.
{
const hits = []
const walk = (v, path) => {
if (typeof v === 'string') { const n = [...v].filter((ch) => ch === '\u0671').length; if (n) hits.push(`${path} (${n})`) }
else if (v && typeof v === 'object') for (const [k, x] of Object.entries(v)) walk(x, `${path}.${k}`)
}
walk(cat.ar || {}, 'ar')
if (hits.length) fails.push(`ar carries U+0671 alef wasla, which prints as a box where a font lacks it — store plain alef (U+0627): ${hits.slice(0, 4).join(', ')}`)
else notes.push('ar: no U+0671 alef wasla in any value (plain alef, the print form every Arabic font draws)')
}
console.log('PACKET-STRINGS-PARITY')
console.log(` catalog : ${CATALOG.replace(REPO + '/', '')}`)
console.log(` locales : ${locales.length} (${locales.join(' ')})`)

View file

@ -270,6 +270,12 @@ export function createPacketRenderer({ strings, lang = 'en', fontData = null, de
/* Upright, not italic, in scripts with no true italic: a slanted Arabic, Chinese or Devanagari line is a
synthesized oblique, which reads as a rendering fault rather than as emphasis. */
.ws-bless:lang(ar),.ws-wheel:lang(ar),.ws-bless:lang(zh),.ws-wheel:lang(zh),.ws-bless:lang(hi),.ws-wheel:lang(hi){font-style:normal}
/* Arabic SCRIPTURE (the blessing, Mark 5) names real Arabic faces before the generic serif: Georgia has no
Arabic, so each Arabic letter falls to the first named face the device has, instead of to whatever
system font the browser picks, which on one test machine had no glyph for a letter the Van Dyck text
used. The text itself now uses only common letters (_meta.note_on_blessing); this is the second guard.
Scoped to the scripture blocks, so no other page's measured fit moves. */
.ws-bless:lang(ar),.p4-passage:lang(ar),.p4-passage:lang(ar) *{font-family:Georgia,'Palatino Linotype','Noto Naskh Arabic',Amiri,'Traditional Arabic',Tahoma,serif !important}
/* ── THE BOUNDED + CENTERED SETS (back matter) ──────────────────────────
Two figures side by side. The SVGs carry no width/height — they scale to their

View file

@ -6,7 +6,7 @@
"note_on_references": "Scripture REFERENCES (Matthew 27:27, Mark 5:18-20) are deliberately left in English in every language block, so a reader can look them up in their own Bible regardless of the packet's language. ⚠ MEASURED TRADEOFF, not an oversight: on a rendered French page the English book names are visibly foreign next to fully-translated prayer text. If a language wants localised book names, add a `books` map to that block and teach the renderer to use it — do NOT translate the refs inline, because the same strings identify the passage for any future lookup.",
"note_on_scripts": "ALL 11 app locales now ship. Script coverage MEASURED by rendering at 48px and READING THE PIXELS: Latin, Cyrillic (ru), Arabic (ar) and CJK (zh) shape correctly with the system Georgia/Palatino/serif stack. DEVANAGARI (hi) does NOT — it renders as tofu boxes — so Noto Serif Devanagari is vendored (OFL) and base64-INLINED into hi packets by the renderer's SCRIPT_FONT map. Inlined, not linked, because a packet is a standalone file that must print offline; ~165KB on a 3.5MB packet, and only for that language. mr and ne map to the same face.\n⚠ TWO MEASUREMENTS LIED ABOUT THIS, so do not automate it cheaply: (1) comparing shaped width against a missing font reported ar and zh BROKEN and hi FINE — exactly backwards, because Devanagari tofu boxes match real glyph advance; (2) an ink-column-profile heuristic scored CORRECTLY-RENDERED Devanagari the same as tofu (3 vs 2 distinct heights), because its baseline bar gives a uniform profile. check:packet-render therefore asserts only that a DECLARED @font-face LOADED — the mechanical half — and leaves glyph correctness to a human reading a screenshot. A detector that blocks working packets is worse than none.",
"note_on_rtl": "ar is right-to-left. The renderer emits dir on <html> from an RTL set (packet-render.js), and scripture REFERENCES are wrapped in dir=ltr + unicode-bidi:isolate. Without that isolation the bidi algorithm reorders a reference that STARTS WITH A DIGIT: '1 Peter 5:6-11' rendered as 'Peter 5:6-11 1'. Note the reference LIST then reads right-to-left on an RTL page (first item rightmost) — that is correct for an RTL reader, not a defect.",
"note_on_blessing": "blessing_text is Numbers 6:24-26, printed in full on the lightweight list's first page. Each block carries a PUBLIC-DOMAIN text for its language, verbatim from bible.helloao.org (eBible), with its credit in blessing_credit; only the source's own outer speech marks are replaced by the language's quotation marks. ro and hi have no strict public-domain text on this pipeline, so they omit both keys and print the English per key. bless_refs (en, and ru with Synodal numbering) is the ONE line of further blessing references; book names come from `books`."
"note_on_blessing": "blessing_text is Numbers 6:24-26, printed in full on the lightweight list's first page. Each block carries a PUBLIC-DOMAIN text for its language, verbatim from bible.helloao.org (eBible), with its credit in blessing_credit; only the source's own outer speech marks are replaced by the language's quotation marks. ro and hi have no strict public-domain text on this pipeline, so they omit both keys and print the English per key. bless_refs (en, and ru with Synodal numbering) is the ONE line of further blessing references; book names come from `books`. ar: U+0671 alef wasla → U+0627 alef, display only; words and vowels unchanged (the wasla marks an alef that is silent in connected speech; plain alef is the ordinary print form and renders wherever Arabic renders, where U+0671 printed as a box on devices whose fonts lack it). Applies to every ar value, the Mark 5 passage included; check:packet-strings-parity asserts none remains."
},
"en": {
"map_page_kicker": "UNENGAGED PEOPLE GROUPS",
@ -2652,9 +2652,9 @@
"pray_blessed": "هل باركتهم؟",
"pray_know": "ماذا تريد أن أعرف؟",
"pray_do": "ماذا تريد أن أفعل؟",
"point4_passage": "وَلَمَّا دَخَلَ ٱلسَّفِينَةَ طَلَبَ إِلَيْهِ ٱلَّذِي كَانَ مَجْنُونًا أَنْ يَكُونَ مَعَهُ، فَلَمْ يَدَعْهُ يَسُوعُ، بَلْ قَالَ لَهُ: «ٱذْهَبْ إِلَى بَيْتِكَ وَإِلَى أَهْلِكَ، وَأَخْبِرْهُمْ كَمْ صَنَعَ ٱلرَّبُّ بِكَ وَرَحِمَكَ». فَمَضَى وَٱبْتَدَأَ يُنَادِي فِي ٱلْعَشْرِ ٱلْمُدُنِ كَمْ صَنَعَ بِهِ يَسُوعُ. فَتَعَجَّبَ ٱلْجَمِيعُ.",
"point4_passage": "وَلَمَّا دَخَلَ السَّفِينَةَ طَلَبَ إِلَيْهِ الَّذِي كَانَ مَجْنُونًا أَنْ يَكُونَ مَعَهُ، فَلَمْ يَدَعْهُ يَسُوعُ، بَلْ قَالَ لَهُ: «اذْهَبْ إِلَى بَيْتِكَ وَإِلَى أَهْلِكَ، وَأَخْبِرْهُمْ كَمْ صَنَعَ الرَّبُّ بِكَ وَرَحِمَكَ». فَمَضَى وَابْتَدَأَ يُنَادِي فِي الْعَشْرِ الْمُدُنِ كَمْ صَنَعَ بِهِ يَسُوعُ. فَتَعَجَّبَ الْجَمِيعُ.",
"point4_passage_credit": "مرقس ٥:‏١٨–٢٠ · Arabic Van Dyck Bible (ملك عام) · ebible.org",
"point4_passage_bold": "فَلَمْ يَدَعْهُ يَسُوعُ، بَلْ قَالَ لَهُ: «ٱذْهَبْ إِلَى بَيْتِكَ وَإِلَى أَهْلِكَ، وَأَخْبِرْهُمْ كَمْ صَنَعَ ٱلرَّبُّ بِكَ وَرَحِمَكَ».",
"point4_passage_bold": "فَلَمْ يَدَعْهُ يَسُوعُ، بَلْ قَالَ لَهُ: «اذْهَبْ إِلَى بَيْتِكَ وَإِلَى أَهْلِكَ، وَأَخْبِرْهُمْ كَمْ صَنَعَ الرَّبُّ بِكَ وَرَحِمَكَ».",
"point4_heart_title": "قلب الآب السماوي",
"point4_heart_lede": "يحتاجون أن يعرفوا أن أباهم السماوي يحبهم، ويريد أن يخلّصهم، ومن خلالهم يريد أن يخلُص جيرانهم من الشعوب غير المُصل إليها.",
"point4_heart_leadin": "المزيد من الآيات عن قلب الآب السماوي",
@ -2753,7 +2753,7 @@
"pace_week": "نحو {n} في الأسبوع",
"pace_month": "نحو {n} في الشهر",
"pace_note": "الصلاة اليومية لأجل كل الشعوب للمتشفّعين الذين نالوا هذه الموهبة ويخصّصون للصلاة نحو ثلاث ساعات يوميًا. ولمعظمنا، الصلاة الأسبوعية إيقاع صحّي وثابت.",
"blessing_text": "«يُبَارِكُكَ ٱلرَّبُّ وَيَحْرُسُكَ. يُضِيءُ ٱلرَّبُّ بِوَجْهِهِ عَلَيْكَ وَيَرْحَمُكَ. يَرْفَعُ ٱلرَّبُّ وَجْهَهُ عَلَيْكَ وَيَمْنَحُكَ سَلَامًا.»",
"blessing_text": "«يُبَارِكُكَ الرَّبُّ وَيَحْرُسُكَ. يُضِيءُ الرَّبُّ بِوَجْهِهِ عَلَيْكَ وَيَرْحَمُكَ. يَرْفَعُ الرَّبُّ وَجْهَهُ عَلَيْكَ وَيَمْنَحُكَ سَلَامًا.»",
"blessing_credit": "العدد ٦:‏٢٤–٢٦ · Arabic Van Dyck Bible (ملك عام) · ebible.org"
},
"hi": {