The language tree could write an SVG to disk; now it only prints

regions' fleet audit found the one poster path in the tree that downloaded a
file. The Driver's rule is that a poster action opens the print dialog and never
downloads, and there is no case for an exception here: printPoster builds the
same poster from the same makePoster(), so the download was a second route to one
artefact rather than a capability only it could offer. A reader who needs a file
prints to PDF — the system's own dialog, not a silent write.

The button, the function and the now-unreferenced tree.posterSvg key in all
eleven locales are gone. The comment left in its place names check:poster-action-
print, which regions is extending with this file as its poison case, so a
download added here again fails a gate rather than shipping quietly.

The two CSV export paths in GiGrid and GiResources are deliberately untouched: a
table has no print equivalent, the export is a documented feature that writes a
header line of sources with the data, and the rule — and that gate's own
description — is about POSTER buttons. Flagged to the shepherd rather than left
for the extended gate to trip over.
This commit is contained in:
Doxa Maps 2026-09-29 03:52:35 +00:00
parent 98fd04c86d
commit 7c1cfc8596
12 changed files with 7 additions and 21 deletions

View file

@ -285,7 +285,6 @@
"posterOmitted": "حُذف {n} اسمًا حيث كانت ستتداخل مع غيرها؛ كل دائرة مرسومة.",
"posterPrint": "طباعة",
"posterSizeAria": "حجم الملصق",
"posterSvg": "تنزيل SVG",
"posterTitle": "الوصول إلى الإنجيل، عائلة لغوية تلو الأخرى",
"sources": "الشجرة: Glottolog (CC BY 4.0). الموارد: eBible وFaith Comes By Hearing وScripture Earth وPNG.Bible وفيلم يسوع وGlobal Recordings وغيرها، حسب ISO 639-3.",
"st": {

View file

@ -285,7 +285,6 @@
"posterOmitted": "{n} Namen weggelassen, wo sie einen anderen überdecken würden; jeder Kreis ist gezeichnet.",
"posterPrint": "Drucken",
"posterSizeAria": "Postergröße",
"posterSvg": "SVG herunterladen",
"posterTitle": "Zugang zum Evangelium, Sprachfamilie für Sprachfamilie",
"sources": "Baum: Glottolog (CC BY 4.0). Ressourcen: eBible, Faith Comes By Hearing, Scripture Earth, PNG.Bible, JESUS-Film, Global Recordings und weitere, nach ISO 639-3.",
"st": {

View file

@ -285,7 +285,6 @@
"posterOmitted": "{n} names left off where they would overlap another; every circle is drawn.",
"posterPrint": "Print",
"posterSizeAria": "Poster size",
"posterSvg": "Download SVG",
"posterTitle": "Gospel access, language family by language family",
"sources": "Tree: Glottolog (CC BY 4.0). Resources: eBible, Faith Comes By Hearing, Scripture Earth, PNG.Bible, JESUS Film, Global Recordings and others, keyed by ISO 639-3.",
"st": {

View file

@ -285,7 +285,6 @@
"posterOmitted": "{n} nombres omitidos donde se superpondrían a otro; cada círculo está dibujado.",
"posterPrint": "Imprimir",
"posterSizeAria": "Tamaño del póster",
"posterSvg": "Descargar SVG",
"posterTitle": "Acceso al evangelio, familia lingüística por familia lingüística",
"sources": "Árbol: Glottolog (CC BY 4.0). Recursos: eBible, Faith Comes By Hearing, Scripture Earth, PNG.Bible, película JESÚS, Global Recordings y otros, por ISO 639-3.",
"st": {

View file

@ -285,7 +285,6 @@
"posterOmitted": "{n} noms omis là où ils en chevaucheraient un autre ; chaque cercle est dessiné.",
"posterPrint": "Imprimer",
"posterSizeAria": "Taille de l’affiche",
"posterSvg": "Télécharger le SVG",
"posterTitle": "L’accès à l’Évangile, famille de langues par famille de langues",
"sources": "Arbre : Glottolog (CC BY 4.0). Ressources : eBible, Faith Comes By Hearing, Scripture Earth, PNG.Bible, film JÉSUS, Global Recordings et d’autres, par code ISO 639-3.",
"st": {

View file

@ -285,7 +285,6 @@
"posterOmitted": "{n} नाम छोड़े गए जहाँ वे किसी दूसरे पर चढ़ जाते; हर वृत्त बनाया गया है।",
"posterPrint": "प्रिंट करें",
"posterSizeAria": "पोस्टर का आकार",
"posterSvg": "SVG डाउनलोड करें",
"posterTitle": "सुसमाचार तक पहुँच, एक-एक भाषा परिवार के अनुसार",
"sources": "वृक्ष: Glottolog (CC BY 4.0)। संसाधन: eBible, Faith Comes By Hearing, Scripture Earth, PNG.Bible, यीशु फ़िल्म, Global Recordings और अन्य, ISO 639-3 के अनुसार।",
"st": {

View file

@ -285,7 +285,6 @@
"posterOmitted": "{n} nomi omessi dove si sovrapporrebbero a un altro; ogni cerchio è disegnato.",
"posterPrint": "Stampa",
"posterSizeAria": "Dimensione del poster",
"posterSvg": "Scarica SVG",
"posterTitle": "L’accesso al vangelo, famiglia linguistica per famiglia linguistica",
"sources": "Albero: Glottolog (CC BY 4.0). Risorse: eBible, Faith Comes By Hearing, Scripture Earth, PNG.Bible, film JESUS, Global Recordings e altre, per ISO 639-3.",
"st": {

View file

@ -285,7 +285,6 @@
"posterOmitted": "{n} nomes omitidos onde sobreporiam outro; todo círculo está desenhado.",
"posterPrint": "Imprimir",
"posterSizeAria": "Tamanho do pôster",
"posterSvg": "Baixar SVG",
"posterTitle": "Acesso ao evangelho, família linguística por família linguística",
"sources": "Árvore: Glottolog (CC BY 4.0). Recursos: eBible, Faith Comes By Hearing, Scripture Earth, PNG.Bible, filme JESUS, Global Recordings e outros, por ISO 639-3.",
"st": {

View file

@ -285,7 +285,6 @@
"posterOmitted": "{n} nume omise acolo unde s-ar suprapune peste altul; fiecare cerc este desenat.",
"posterPrint": "Tipărește",
"posterSizeAria": "Dimensiunea posterului",
"posterSvg": "Descarcă SVG",
"posterTitle": "Accesul la Evanghelie, familie de limbi cu familie de limbi",
"sources": "Arbore: Glottolog (CC BY 4.0). Resurse: eBible, Faith Comes By Hearing, Scripture Earth, PNG.Bible, filmul JESUS, Global Recordings și altele, după ISO 639-3.",
"st": {

View file

@ -285,7 +285,6 @@
"posterOmitted": "Пропущено названий: {n} — там, где они перекрыли бы другие; каждый круг нарисован.",
"posterPrint": "Печать",
"posterSizeAria": "Размер постера",
"posterSvg": "Скачать SVG",
"posterTitle": "Доступ к Евангелию: языковая семья за языковой семьёй",
"sources": "Дерево: Glottolog (CC BY 4.0). Ресурсы: eBible, Faith Comes By Hearing, Scripture Earth, PNG.Bible, фильм «Иисус», Global Recordings и другие, по ISO 639-3.",
"st": {

View file

@ -285,7 +285,6 @@
"posterOmitted": "有 {n} 个名称因会与其他名称重叠而省略;每个圆圈都已绘出。",
"posterPrint": "打印",
"posterSizeAria": "海报尺寸",
"posterSvg": "下载 SVG",
"posterTitle": "福音资源,按语系逐一呈现",
"sources": "语言树:Glottolog(CC BY 4.0)。资源:eBible、Faith Comes By Hearing、Scripture Earth、PNG.Bible、耶稣传影片、Global Recordings 等,按 ISO 639-3 编目。",
"st": {

View file

@ -312,15 +312,13 @@ function printPoster() {
const p = makePoster()
if (p) openPrintFrame(posterPrintHtml(p.svg, p.size, T('gospelInternet.tree.posterTitle', 'Gospel access, language family by language family')), { autoprint: true })
}
function downloadPoster() {
const p = makePoster()
if (!p) return
try {
const url = URL.createObjectURL(new Blob([p.svg], { type: 'image/svg+xml;charset=utf-8' }))
const a = document.createElement('a'); a.href = url; a.download = `gospel-language-tree-${p.size}in.svg`; a.style.display = 'none'
document.body.appendChild(a); a.click(); setTimeout(() => { try { URL.revokeObjectURL(url); a.remove() } catch (_) {} }, 200)
} catch (_) { /* a sandbox without downloads: the print path still works */ }
}
// ★ NO DOWNLOAD BUTTON HERE. This used to write gospel-language-tree-<size>in.svg to disk beside the
// Print button. The Driver's rule is that a poster action opens the PRINT DIALOG and never downloads a
// file, and there was no case for an exception: printPoster above builds the same poster from the same
// makePoster(), so the download was a second route to one artefact rather than a capability only it
// could offer. A reader who needs a file prints to PDF — the system's own dialog, not a silent write.
// check:poster-action-print (regions) uses this file as its poison case, so a download added here
// again fails the gate rather than shipping quietly.
const ST_EN = { g: 'New Testament or full Bible found', y: 'Something found, but no New Testament', r: 'Nothing found' }
const citation = computed(() => (ix.value && ix.value.meta && ix.value.meta.citation) || '')
@ -402,7 +400,6 @@ useShadowStyles(
<option :value="48">{{ T('gospelInternet.tree.poster4ft', '4 × 4 ft') }}</option>
</select>
<button type="button" @click="printPoster">{{ T('gospelInternet.tree.posterPrint', 'Print') }}</button>
<button type="button" @click="downloadPoster">{{ T('gospelInternet.tree.posterSvg', 'Download SVG') }}</button>
</div>
<div v-if="posterNote" class="gtr-note">{{ posterNote }}</div>
<div class="gtr-note">{{ T('gospelInternet.tree.sources', 'Tree: Glottolog (CC BY 4.0). Resources: eBible, Faith Comes By Hearing, Scripture Earth, PNG.Bible, JESUS Film, Global Recordings and others, keyed by ISO 639-3.') }} {{ citation }}</div>