Gospel map: shape Arabic, Hebrew and Persian place names
The map is built raw, for the provider switch, so it never installed the RTL text plugin — the same opt-out that cost it the engine stylesheet. Without the plugin those labels draw as disconnected glyphs in the wrong order, which is unreadable rather than merely ugly. This was never an Arabic-locale bug, which is why it went unseen. The leaf does not localise basemap labels, so every place is drawn in its own script: over Arabia, 57 of 61 rendered symbols are Arabic for every viewer whatever their UI language. An English reader sees broken Arabic they cannot evaluate. It installs after the engine global resolves rather than at bundle entry. This bundle injects its engine lazily, so at entry time there is no engine to install into and the call would silently do nothing. The gate pans to Arabia before judging. Registration alone proves little, since the plugin is registered lazily and a freshly loaded map reports "deferred" whether or not the shaper can actually be fetched; only real RTL text on screen turns it "loaded". Asserting without panning would have failed a working map.
This commit is contained in:
parent
1870efa5c9
commit
d633f496d7
12 changed files with 245 additions and 39 deletions
181
internal/check-gospel-rtl-shaping.mjs
Normal file
181
internal/check-gospel-rtl-shaping.mjs
Normal file
|
|
@ -0,0 +1,181 @@
|
|||
#!/usr/bin/env node
|
||||
/**
|
||||
* check-gospel-rtl-shaping — Arabic, Hebrew and Persian place names must be SHAPED.
|
||||
*
|
||||
* THE DEFECT. Mapbox and MapLibre cannot shape right-to-left scripts on their own; the
|
||||
* mapbox-gl-rtl-text plugin does it, and it has to be registered on the engine before the
|
||||
* first RTL label is drawn. Maps built through useMapInstance get that at line 416.
|
||||
* gospel-resources/resources-map builds its map RAW — `new gl.Map`, for the provider switch —
|
||||
* and in taking that path it opted out, exactly as it had opted out of the engine stylesheet.
|
||||
* Unshaped Arabic is not a subtly wrong font: the glyphs come out disconnected and in the
|
||||
* wrong order, which is unreadable to the people the map is for.
|
||||
*
|
||||
* WHY NOBODY REPORTED IT. This leaf does not localise basemap labels, so the style draws each
|
||||
* place in its OWN script — measured over Arabia, 57 of 61 rendered symbols are Arabic
|
||||
* (مصر, قطاع غزة, الأردن, السعودية) for EVERY viewer, whatever the UI language. An English
|
||||
* reader sees broken Arabic they cannot evaluate; an Arabic reader would have said something.
|
||||
*
|
||||
* WHAT THIS ASSERTS, AND WHY IT PANS FIRST. Registration alone is weak evidence: the plugin is
|
||||
* registered LAZILY, so a freshly loaded map reports 'deferred' whether or not the plugin can
|
||||
* actually be fetched and run. Status only becomes 'loaded' when the engine has encountered
|
||||
* real RTL text and pulled the shaper in. So the gate drives the map to Arabia, proves RTL
|
||||
* labels are genuinely on screen, and only then requires 'loaded' — the difference between
|
||||
* "someone called the setter" and "these labels went through a shaper".
|
||||
* MEASURED: at the opening world-fit view Mapbox sits at 'deferred' with no RTL label
|
||||
* rendered at that zoom. That is correct lazy behaviour, not a failure, and a gate that
|
||||
* asserted 'loaded' without panning would have reported a false red on a working map.
|
||||
*
|
||||
* BOTH ENGINES, because the bug is per-engine and the leaf switches on ?provider=.
|
||||
*
|
||||
* Run with --poison to prove it can fail: the poison neuters setRTLTextPlugin in the page, which
|
||||
* reproduces the real pre-fix state — the plugin never registered — rather than a synthetic one.
|
||||
*/
|
||||
import { chromium } from 'playwright'
|
||||
import { serveReaped } from './_serve-reaped.mjs'
|
||||
import { resolve, dirname } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..')
|
||||
const PORT = Number(process.env.RTL_SHAPE_PORT || 5393)
|
||||
const POISON = process.argv.includes('--poison')
|
||||
const LEAF = 'doxa-maps/gospel-resources/resources-map/index.html'
|
||||
/* Arabia: the densest concentration of rendered Arabic on the basemap. */
|
||||
const RTL_VIEW = { center: [39.2, 24.5], zoom: 5 }
|
||||
|
||||
const srv = serveReaped(resolve(ROOT, 'public'), PORT)
|
||||
await new Promise((r) => setTimeout(r, 2500))
|
||||
|
||||
const browser = await chromium.launch({
|
||||
args: ['--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'],
|
||||
})
|
||||
|
||||
/**
|
||||
* ONE property definition per engine global, doing BOTH jobs.
|
||||
*
|
||||
* ⚠ THIS WAS THE GATE'S OWN FIRST BUG, and it is the reason the poison arm exists. The hook and
|
||||
* the poison were two separate addInitScript calls, each running Object.defineProperty on
|
||||
* window.mapboxgl — so the second SILENTLY REPLACED the first. The poison never applied, the
|
||||
* self-test reported the plugin loaded on a "poisoned" page, and had I read only the summary I
|
||||
* would have concluded the gate was too weak rather than that it had disabled itself.
|
||||
*/
|
||||
const INSTALL = (poison) => {
|
||||
const define = (name) => {
|
||||
let v
|
||||
Object.defineProperty(window, name, {
|
||||
configurable: true,
|
||||
get: () => v,
|
||||
set: (g) => {
|
||||
v = g
|
||||
if (!g) return
|
||||
/* Reproduce the pre-fix state: the install call silently does nothing. */
|
||||
if (poison && g.setRTLTextPlugin) g.setRTLTextPlugin = () => {}
|
||||
/* Capture the Map the leaf builds, without the leaf exposing anything for tests. */
|
||||
if (g.Map && !g.__hooked) {
|
||||
g.__hooked = true
|
||||
const Orig = g.Map
|
||||
g.Map = function (...a) { const m = new Orig(...a); window.__MAP = m; return m }
|
||||
g.Map.prototype = Orig.prototype
|
||||
Object.setPrototypeOf(g.Map, Orig)
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
define('mapboxgl'); define('maplibregl')
|
||||
}
|
||||
|
||||
const results = []
|
||||
for (const provider of ['mapbox', 'maplibre']) {
|
||||
const page = await browser.newPage({ viewport: { width: 1280, height: 800 } })
|
||||
await page.addInitScript(INSTALL, POISON)
|
||||
let r
|
||||
try {
|
||||
await page.goto(`http://127.0.0.1:${PORT}/${LEAF}?provider=${provider}&lang=ar`, {
|
||||
waitUntil: 'networkidle', timeout: 90000,
|
||||
})
|
||||
await page.waitForTimeout(8000)
|
||||
r = await page.evaluate(async (view) => {
|
||||
const m = window.__MAP
|
||||
if (!m) return { err: 'the leaf never constructed a map' }
|
||||
const sleep = (ms) => new Promise((res) => setTimeout(res, ms))
|
||||
/* ⚠ WAIT FOR THE STYLE BEFORE MOVING. Querying a map whose style has not finished loading
|
||||
returns ZERO features, which this gate would have read as "no RTL label rendered" — a
|
||||
NOT MEASURED on a perfectly good map. Measured: Mapbox reported 0 symbols on the first
|
||||
run for exactly this reason, while a slower probe of the same page saw 61. */
|
||||
for (let i = 0; i < 60 && !m.isStyleLoaded(); i++) await sleep(500)
|
||||
m.jumpTo(view)
|
||||
await new Promise((res) => { m.once('idle', res); setTimeout(res, 15000) })
|
||||
/* Tiles for the new view still arrive after 'idle'; poll until labels appear. */
|
||||
let names = []
|
||||
for (let i = 0; i < 30; i++) {
|
||||
names = m.queryRenderedFeatures()
|
||||
.filter((f) => f.layer && f.layer.type === 'symbol')
|
||||
.map((f) => String((f.properties && (f.properties.name || f.properties.name_en)) || ''))
|
||||
.filter(Boolean)
|
||||
if (names.some((n) => /[\u0600-\u06FF\u0750-\u077F\u0590-\u05FF]/.test(n))) break
|
||||
await sleep(1000)
|
||||
}
|
||||
const g = (window.maplibregl && window.maplibregl.getRTLTextPluginStatus)
|
||||
? window.maplibregl : window.mapboxgl
|
||||
return {
|
||||
rtl: names.filter((n) => /[\u0600-\u06FF\u0750-\u077F\u0590-\u05FF]/.test(n)),
|
||||
symbols: names.length,
|
||||
status: g && g.getRTLTextPluginStatus ? g.getRTLTextPluginStatus() : 'NO STATUS API',
|
||||
}
|
||||
}, RTL_VIEW)
|
||||
} catch (e) {
|
||||
r = { err: String(e.message).slice(0, 90) }
|
||||
}
|
||||
await page.close()
|
||||
results.push({ provider, ...r })
|
||||
}
|
||||
await browser.close()
|
||||
srv.stop()
|
||||
|
||||
let bad = 0
|
||||
let unmeasured = 0
|
||||
for (const r of results) {
|
||||
if (r.err) {
|
||||
console.error(` ${r.provider}: NOT MEASURED — ${r.err}`)
|
||||
unmeasured++
|
||||
continue
|
||||
}
|
||||
/* No RTL text on screen means the gate cannot tell a shaped map from an unshaped one. That is
|
||||
NOT MEASURED, never a pass — the whole point of panning is to make the question answerable. */
|
||||
if (!r.rtl.length) {
|
||||
console.error(` ${r.provider}: NOT MEASURED — no RTL label rendered at the test view ` +
|
||||
`(${r.symbols} symbols); the basemap changed and the gate can no longer see the defect.`)
|
||||
unmeasured++
|
||||
continue
|
||||
}
|
||||
const sample = r.rtl.slice(0, 3).join(', ')
|
||||
if (r.status !== 'loaded') {
|
||||
console.error(` ${r.provider}: FAIL — ${r.rtl.length} RTL labels on screen (${sample}) ` +
|
||||
`but the shaper is '${r.status}'. These labels are drawn unshaped.`)
|
||||
bad++
|
||||
continue
|
||||
}
|
||||
console.log(` ok ${r.provider} — ${r.rtl.length}/${r.symbols} rendered labels are RTL ` +
|
||||
`(${sample}), shaper loaded`)
|
||||
}
|
||||
|
||||
if (POISON) {
|
||||
if (bad === results.length) {
|
||||
console.log(`RTL-SHAPING --poison: ${bad}/${results.length} engines caught with the plugin neutered.`)
|
||||
console.log('RTL-SHAPING: SELF-TEST PASS — the check fails as designed.')
|
||||
process.exitCode = 0
|
||||
} else {
|
||||
console.error('RTL-SHAPING: SELF-TEST FAIL — the check cannot detect the bug it exists for.')
|
||||
process.exitCode = 1
|
||||
}
|
||||
} else if (unmeasured) {
|
||||
console.error(`RTL-SHAPING: NOT MEASURED — ${unmeasured} of ${results.length} engines could not be judged.`)
|
||||
process.exitCode = 2
|
||||
} else if (bad) {
|
||||
console.error(`RTL-SHAPING: FAIL — ${bad} of ${results.length} engines draw RTL place names unshaped.`)
|
||||
console.error(' Fix: installRtlTextPlugin(gl) from library/maps/rtl-text.js, right after the')
|
||||
console.error(' engine global resolves and BEFORE new gl.Map.')
|
||||
process.exitCode = 1
|
||||
} else {
|
||||
console.log(`RTL-SHAPING: PASS — both engines shape RTL place names.`)
|
||||
process.exitCode = 0
|
||||
}
|
||||
|
|
@ -129,6 +129,8 @@
|
|||
"check:public-hygiene": "node internal/public-hygiene-check.mjs",
|
||||
"check:published": "node internal/check-published-matches-build.mjs",
|
||||
"check:quoted-scripts": "node internal/check-quoted-scripts.mjs",
|
||||
"check:rtl-shaping": "node internal/check-gospel-rtl-shaping.mjs",
|
||||
"check:rtl-shaping:poison": "node internal/check-gospel-rtl-shaping.mjs --poison",
|
||||
"check:scrim-viewport": "node internal/check-scrim-covers-viewport.mjs",
|
||||
"check:scrim-viewport:self-test": "node internal/check-scrim-covers-viewport.mjs --self-test",
|
||||
"check:script-flags": "node internal/check-script-flags-reachable.mjs",
|
||||
|
|
|
|||
|
|
@ -88,6 +88,7 @@ import ShareButton from '@map/components/map-controls/ShareButton.vue'
|
|||
import { resolveAssetsBase } from '@map/utils/embedBase.js'
|
||||
import { resolveMapProvider } from '@map/composables/useMapProvider.js'
|
||||
import { ensureEngineScript, engineGlobal, engineStylesheetUrl, ensureEngineCSS } from '@map/composables/useMapInstance.js'
|
||||
import { installRtlTextPlugin } from '@map/maps/rtl-text.js'
|
||||
import { resolveNamedStyle } from '@map/styles/registry.js'
|
||||
|
||||
const profileConfig = inject('profileConfig', ref(null))
|
||||
|
|
@ -1068,6 +1069,28 @@ onMounted(async () => {
|
|||
if (!mapEl.value) return
|
||||
const gl = engineGlobal(grProvider) || window.mapboxgl
|
||||
if (!gl || !mapEl.value) { err.value = 'map engine not loaded'; return }
|
||||
/**
|
||||
* ═══ ARABIC, HEBREW AND PERSIAN PLACE NAMES NEED A SHAPER ═══════════════════════════════
|
||||
*
|
||||
* Same root cause as the stylesheet above: maps built through useMapInstance get this at
|
||||
* line 416, and building raw opted out of it. Without the plugin every RTL label draws as
|
||||
* disconnected, left-to-right glyphs — not a subtly wrong font, unreadable text.
|
||||
*
|
||||
* THIS IS NOT AN ARABIC-LOCALE BUG, which is why it went unseen. This leaf never localises
|
||||
* basemap labels, so the style renders each place in its OWN script: the Middle East and
|
||||
* North Africa come back in Arabic for EVERY viewer, whatever their UI language. An English
|
||||
* reader saw broken Arabic and had no reason to report it; an Arabic reader would have.
|
||||
* MEASURED before this line existed — getRTLTextPluginStatus() 'unavailable' on both the
|
||||
* default load and ?lang=ar.
|
||||
*
|
||||
* IT GOES HERE, NOT IN index.js. Sibling bundles call it at entry load time, but this
|
||||
* bundle injects its engine lazily, so at entry time there is no engine global to install
|
||||
* into and the call would silently do nothing (rtl-text.js says so in its own header). The
|
||||
* first moment it can work is the one after the engine resolves — this one. Idempotent, so
|
||||
* a second profile on the same page costs nothing, and lazy, so a map with no RTL labels
|
||||
* never fetches the plugin.
|
||||
*/
|
||||
installRtlTextPlugin(gl)
|
||||
try {
|
||||
const adm0 = await load()
|
||||
const map = new gl.Map({
|
||||
|
|
|
|||
12
public/doxa-maps/doxa-maps-spa/manifest.json
generated
12
public/doxa-maps/doxa-maps-spa/manifest.json
generated
|
|
@ -579,7 +579,7 @@
|
|||
"bundle": "gospel-resources",
|
||||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"output": "doxa-maps/gospel-resources/gospel-resources.js",
|
||||
"integrity": "sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt",
|
||||
"integrity": "sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb",
|
||||
"elements": [
|
||||
"gospel-resources-map"
|
||||
],
|
||||
|
|
@ -599,7 +599,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/charts/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -613,7 +613,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/data-tables/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -627,7 +627,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/gospel-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -641,7 +641,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/resources-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -655,7 +655,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
2
public/doxa-maps/index.html
generated
2
public/doxa-maps/index.html
generated
File diff suppressed because one or more lines are too long
12
public/doxa-maps/manifest.json
generated
12
public/doxa-maps/manifest.json
generated
|
|
@ -579,7 +579,7 @@
|
|||
"bundle": "gospel-resources",
|
||||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"output": "doxa-maps/gospel-resources/gospel-resources.js",
|
||||
"integrity": "sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt",
|
||||
"integrity": "sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb",
|
||||
"elements": [
|
||||
"gospel-resources-map"
|
||||
],
|
||||
|
|
@ -599,7 +599,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/charts/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -613,7 +613,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/data-tables/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -627,7 +627,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/gospel-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -641,7 +641,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/resources-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -655,7 +655,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-8CWyLCDtiAJHHSGZLkGPqtiq1HE5YZgxdWUx+XwYvOllbfi9wihCxV7w86IjCilt\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<!-- Mapbox engine, fetched early; remove this line if you set \"provider\":\"maplibre\" -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-sJezzFvUiZP/+gVJZnY40rOMePR5DY23/pIK1ypKSgDtzbv1PHJwsFpV3Iro9eeb\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||
Loading…
Reference in a new issue