One source for the bridge candidate, and the map shows it too

The table offered 107 groups a next step the map did not show. The candidate is
now computed once, in the pin build beside the curated bridge, and both surfaces
read it — the same rule that put the tier in one place. 1,167 candidates across
the research index; 107 of them reach Doxa groups the curated bridge misses.

The map's sheet renders it as its own weaker panel, and the words carry the
limit: "Possibly a way in — worth checking locally", with the language, how
many groups there speak it and what share of the country they are, and "not
ranked and not recommended". No strength, because none can honestly be
computed. Never for a sign language.

A REGRESSION I INTRODUCED AND ALMOST SHIPPED. The edit that wired this used
pinCandidates without declaring it — a string replace that matched nothing and
said nothing. The ReferenceError died inside the custom-element boundary, so the
map never mounted AND the page reported zero errors. My probe then failed with a
30-second timeout that I had caused separately, by passing playwright's timeout
as the waitForFunction ARG rather than its options, which had been silently
using the default in eleven scripts. Two faults stacked: a broken page that
looked error-free, and a probe too impatient to say so.

Zero page errors is not the same as working, and that is the only reason this
was caught: __grState never appeared, which no assertion about pins could have
explained away. Verified after the fix: 2,107 pins, gap cuts to 370, the
candidate panel renders for Abai Sungai naming Malay, and 25 Deaf sheets still
show no bridge at all.
This commit is contained in:
doxa-maps-88655c70 2026-09-25 09:29:48 +00:00
parent 0adf6c3021
commit df3e383c42
16 changed files with 250 additions and 204 deletions

View file

@ -1431,12 +1431,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/alk",
"training_url": "",
"bridge_language": "Akha",
"bridge_iso639_3": "ahk",
"bridge_strength": "strong",
"bridge_groups_speaking": 12,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -1728,12 +1728,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/nos",
"training_url": "",
"bridge_language": "Chinese, Mandarin",
"bridge_iso639_3": "cmn",
"bridge_strength": "strong",
"bridge_groups_speaking": 25,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -3708,12 +3708,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/jle",
"training_url": "",
"bridge_language": "Arabic, Sudanese",
"bridge_iso639_3": "apd",
"bridge_strength": "strong",
"bridge_groups_speaking": 65,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -12288,12 +12288,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/nos",
"training_url": "",
"bridge_language": "Chinese, Mandarin",
"bridge_iso639_3": "cmn",
"bridge_strength": "strong",
"bridge_groups_speaking": 25,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -19581,12 +19581,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/jle",
"training_url": "",
"bridge_language": "Arabic, Sudanese",
"bridge_iso639_3": "apd",
"bridge_strength": "strong",
"bridge_groups_speaking": 65,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -33771,12 +33771,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/ngt",
"training_url": "",
"bridge_language": "Akha",
"bridge_iso639_3": "ahk",
"bridge_strength": "strong",
"bridge_groups_speaking": 12,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -38292,12 +38292,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/nos",
"training_url": "",
"bridge_language": "Chinese, Mandarin",
"bridge_iso639_3": "cmn",
"bridge_strength": "strong",
"bridge_groups_speaking": 25,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -38556,12 +38556,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/lbo",
"training_url": "",
"bridge_language": "Akha",
"bridge_iso639_3": "ahk",
"bridge_strength": "strong",
"bridge_groups_speaking": 12,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -47697,12 +47697,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/jle",
"training_url": "",
"bridge_language": "Arabic, Sudanese",
"bridge_iso639_3": "apd",
"bridge_strength": "strong",
"bridge_groups_speaking": 65,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -48555,12 +48555,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/nev",
"training_url": "",
"bridge_language": "Akha",
"bridge_iso639_3": "ahk",
"bridge_strength": "strong",
"bridge_groups_speaking": 12,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,

File diff suppressed because one or more lines are too long

View file

@ -203,6 +203,11 @@ const doxaUnplaced = ref(0) // on the roster, no coordinates in this build
const doxaByCountry = shallowRef({})
const pinCodes = ref({})
const pinBridges = ref({}) // '<iso639-3>|<ISO3 country>' -> the in-country bridge, if any
/* Declared beside pinBridges. The previous edit USED this ref without declaring it —
a silent string replace that matched nothing — and the ReferenceError died inside the
custom-element boundary, so the map simply never mounted and the page reported no error
at all. Zero errors is not the same as working. */
const pinCandidates = shallowRef({})
const pinCount = ref(0)
// The legend quotes these, so they can never drift from what the layer is drawing.
@ -713,6 +718,7 @@ function groupAt(i) {
scripture_earth: c.se || null,
gospel_audio: c.ga || null,
bridge: pinBridges.value[`${r[4]}|${r[3]}`] || null,
bridge_candidate: pinCandidates.value[`${r[4]}|${r[3]}`] || null,
related: c.rel || null,
zume_url: c.z || '',
zume_approx: c.za || null,
@ -842,6 +848,7 @@ async function load() {
rows.value = data.countries || []
pinCodes.value = pinData.codes || {}
pinBridges.value = pinData.bridges || {}
pinCandidates.value = pinData.bridgeCandidates || {}
/* Same seven-slot shape the rest of this file already speaks, so narrowing the roster
changes WHICH pins exist and nothing about how they are drawn, clicked or filtered. */
@ -1734,6 +1741,26 @@ useShadowStyles(
<br><em>Bridge strength: {{ selectedGroup.bridge.st }}.</em> A second language is a
way in, not a translation — the gap in their own language is unchanged.
</div>
<!-- THE WEAKER CASE, and it says so on its face. No curated bridge exists for this
group, but their country does have a language carrying Scripture and the film.
No strength is shown because none can honestly be computed: ranking needs "is
this a lingua franca", and by population share a 10% floor refuses Urdu in
Pakistan while by group count Oman picks Swahili for an Arabic-speaking people.
The evidence is shown instead and the reader judges. Never for a sign language:
a spoken bridge is no bridge for a Deaf community. -->
<div v-else-if="selectedGroup.bridge_candidate && !selectedGroup.is_sign
&& !selectedGroup.scripture_url && !selectedGroup.film_url
&& !selectedGroup.audio && !selectedGroup.gospel_audio && !selectedGroup.scripture_earth"
class="gm-sign" style="border-left-color:#d1d4cd" dir="ltr">
<b>Possibly a way in — worth checking locally.</b>
<br>Nothing was found in {{ selectedGroup.language || 'their language' }}. The largest
language in this country that does have Scripture and the JESUS Film is
<b>{{ selectedGroup.bridge_candidate.l }}</b>, spoken by
{{ selectedGroup.bridge_candidate.n }} people group<template v-if="selectedGroup.bridge_candidate.n !== 1">s</template>
here ({{ selectedGroup.bridge_candidate.pct }}% of this country's mapped population).
<br><em>Not ranked and not recommended</em> — whether it actually reaches this group
is a local question, and the gap in their own language is unchanged.
</div>
<p v-if="selectedGroup.scripture_title || selectedGroup.scripture_scope" class="gm-scope">
<b>{{ selectedGroup.scripture_title || 'Scripture' }}</b>

View file

@ -40,52 +40,12 @@ const REPO = resolve(HERE, '../../..')
const T = (f) => JSON.parse(readFileSync(resolve(REPO, 'data/tables', f), 'utf8'))
const doxa = T('doxa-people-groups.json')
const { codes, bridges, pins } = T('people-group-pins.json')
const { codes, bridges, bridgeCandidates } = T('people-group-pins.json')
/**
* ═══ A SECOND-BEST BRIDGE, OFFERED AS EVIDENCE AND NOT AS A RECOMMENDATION ══════════════
*
* The curated bridge above covers 168 of Doxa's 369 groups with nothing, because it comes
* from a curated subset table rather than from the data. For the other 201 a candidate IS
* computable from the pin index — the languages spoken in their country that have both
* Scripture and the film — and 196 of them have one.
*
* WHAT I COULD NOT COMPUTE, and therefore do not claim. Ranking those candidates needs a
* notion of "is this a lingua franca", and neither proxy available here survives contact:
* - by GROUP COUNT, Oman picks Swahili (2 groups) for an Arabic-speaking people.
* - by SHARE OF PINNED POPULATION, a 10% floor REFUSES Urdu in Pakistan at 7.3% — the
* national language — because few Pakistani groups are pinned as Urdu speakers. That is
* the same bad-denominator mistake this map already fixed on the choropleth: dividing by
* something that does not mean what the question needs it to mean.
* Both produce confident wrong answers, so neither ships as a strength. What ships is the
* CANDIDATE and the EVIDENCE — which language, how many groups there speak it, and what
* share of that country's pinned population they are — under column names that say
* "candidate". A reader who knows Pakistan will see Urdu at 7.3% and know what to do with
* it; a score would have thrown it away on their behalf.
*/
const countryPool = {}
const countryPop = {}
for (const p of pins) {
const iso3 = p[3], code = p[4], pop = p[5] || 0
if (!iso3 || !code) continue
const c = codes[code]
if (!c) continue
countryPop[iso3] = (countryPop[iso3] || 0) + pop
const e = (countryPool[iso3] ||= {})
const slot = (e[code] ||= { n: 0, pop: 0, l: c.l || '', rows: resourceRows(c) })
slot.n += 1
slot.pop += pop
}
const candidateFor = (iso3, ownCode) => {
const pool = countryPool[iso3] || {}
const best = Object.entries(pool)
.filter(([code, s]) => code !== ownCode &&
s.rows.some((x) => x.type === 'Scripture') && s.rows.some((x) => x.type === 'Film'))
.sort((a, b) => b[1].pop - a[1].pop)[0]
if (!best) return null
const tot = countryPop[iso3] || 0
return { code: best[0], l: best[1].l, n: best[1].n, share: tot ? Math.round((1000 * best[1].pop) / tot) / 10 : 0 }
}
/* The candidate is computed ONCE, in build-people-group-pins.mjs beside the curated bridge,
and read here. It used to be computed in this file, which meant the table could offer a
group a next step the map did not show — the same disagreement the tier rule exists to
prevent. One source, two surfaces. */
const TYPE_ORDER = ['Scripture', 'Film', 'Audio Scripture', 'Bible video', 'Bible Stories', 'Gospel presentation', 'Gospel audio', 'Discipleship training']
const first = (rows, type) => rows.find((r) => r.type === type) || null
@ -144,7 +104,8 @@ const rows = doxa.rows.map((g) => {
const isSign = c?.sg === 1 || /sign language/i.test(g.language || '') || /^Deaf /i.test(g.name || '')
const br = !isSign && g.iso639_3 ? bridges[`${g.iso639_3}|${g.iso3}`] : null
/* Only where the curated bridge has nothing to say, and only for a group with nothing. */
const cand = !isSign && !br && access === 'nothing found' ? candidateFor(g.iso3, g.iso639_3) : null
const cand = !isSign && !br && access === 'nothing found'
? (bridgeCandidates[`${g.iso639_3}|${g.iso3}`] || null) : null
return {
people_group: g.name,
@ -172,9 +133,9 @@ const rows = doxa.rows.map((g) => {
bridge_has_scripture: br ? !!br.s : false,
bridge_has_film: br ? !!br.f : false,
bridge_candidate: cand ? cand.l : '',
bridge_candidate_iso: cand ? cand.code : '',
bridge_candidate_iso: cand ? cand.c : '',
bridge_candidate_groups: cand ? cand.n : 0,
bridge_candidate_pct_of_country: cand ? cand.share : 0,
bridge_candidate_pct_of_country: cand ? cand.pct : 0,
pray_url: g.pray_url,
people_praying: g.people_praying,
placed: g.mapped,

View file

@ -739,8 +739,65 @@ for (const p of slim) {
])
}
/**
* ═══ THE WEAKER COUSIN OF A BRIDGE, COMPUTED HERE SO BOTH SURFACES READ ONE SOURCE ══════
*
* `bridges` above comes from the curated gaps-and-opportunities table and covers 168 of
* Doxa's 369 groups with nothing. For the rest a CANDIDATE is computable straight from this
* index: the largest language in their country that carries both Scripture and the film.
*
* It lives here rather than in the access-table builder because the map sheet and the table
* must not disagree about what a group's next step is — the same rule that put the tier in
* one place. The access table used to compute this for itself, which meant the table offered
* 107 groups a candidate while the map showed them nothing at all.
*
* NO STRENGTH IS ATTACHED, on purpose. Ranking needs "is this a lingua franca" and neither
* proxy survives: by group count Oman picks Swahili for an Arabic-speaking people, and by
* population share a 10% floor refuses Urdu in Pakistan. So the candidate ships with its
* group count and its share of the country's pinned population, and the reader judges.
*
* NEVER FOR A SIGN LANGUAGE. A spoken bridge is not a bridge for a Deaf community — the same
* reason GRN is skipped for them above.
*/
const bridgeCandidates = {}
{
const pool = {}
const cpop = {}
for (const p of pins) {
const iso3 = p[3], code = p[4], pop = p[5] || 0
if (!iso3 || !code) continue
const c = codes[code]
if (!c) continue
cpop[iso3] = (cpop[iso3] || 0) + pop
const e = (pool[iso3] ||= {})
const slot = (e[code] ||= { n: 0, pop: 0, l: c.l || '', s: false, f: false })
slot.n += 1
slot.pop += pop
slot.s = slot.s || !!c.s || !!c.se || (c.d || []).some((d) => !/^Open Bible Stories/.test(d.s || ''))
slot.f = slot.f || !!c.f
}
for (const p of pins) {
const iso3 = p[3], code = p[4]
if (!iso3 || !code || p[6] !== 0) continue
if (codes[code] && codes[code].sg === 1) continue
const key = `${code}|${iso3}`
if (bridges[key] || bridgeCandidates[key]) continue
const best = Object.entries(pool[iso3] || {})
.filter(([cc, s]) => cc !== code && s.s && s.f)
.sort((a, b) => b[1].pop - a[1].pop)[0]
if (!best) continue
const tot = cpop[iso3] || 0
bridgeCandidates[key] = {
l: best[1].l, c: best[0], n: best[1].n,
pct: tot ? Math.round((1000 * best[1].pop) / tot) / 10 : 0,
}
}
}
const out = {
bridges,
bridgeCandidates,
_note: 'Generated by scripts/build-people-group-pins.mjs. pins=[name,lat,lng,iso3,code,pop,tier]; URLs live in codes[] by ISO 639-3. No URL is invented here.',
generated: new Date().toISOString().slice(0, 10),
counts: { pins: pins.length, joined, withUrl, liftedByD43, codes: Object.keys(codes).length, droppedNoCoord: noCoord },
@ -769,6 +826,7 @@ console.log(`arclight codes ${Object.keys(arc).length} (${arcOnly} new, ${upgr
console.log(`share urls ${Object.keys(share).length}`)
console.log(`fcbh codes ${audioCodes} (${audioNew} new codes)`)
console.log(`gospel tracts ${gospelCodes} (Cru/GodTools presentations; depth only, tier UNCHANGED)`)
console.log(`bridge candidates ${Object.keys(bridgeCandidates).length} (computed here so the map sheet and the access table cannot disagree)`)
console.log(`in-country bridge ${bridgeRows} (groups with NOTHING of their own; a widely-spoken language around them has something — never counted as theirs)`)
console.log(`gospel audio ${grnCodes} (${grnNew} new codes; GRN via 5fish — heard, not read; ${grnSignSkipped} sign language(s) skipped)`)
console.log(`scripture earth ${seCodes} (${seNew} new codes; SIL partners — Scripture in their own language)`)

File diff suppressed because one or more lines are too long

View file

@ -1431,12 +1431,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/alk",
"training_url": "",
"bridge_language": "Akha",
"bridge_iso639_3": "ahk",
"bridge_strength": "strong",
"bridge_groups_speaking": 12,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -1728,12 +1728,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/nos",
"training_url": "",
"bridge_language": "Chinese, Mandarin",
"bridge_iso639_3": "cmn",
"bridge_strength": "strong",
"bridge_groups_speaking": 25,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -3708,12 +3708,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/jle",
"training_url": "",
"bridge_language": "Arabic, Sudanese",
"bridge_iso639_3": "apd",
"bridge_strength": "strong",
"bridge_groups_speaking": 65,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -12288,12 +12288,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/nos",
"training_url": "",
"bridge_language": "Chinese, Mandarin",
"bridge_iso639_3": "cmn",
"bridge_strength": "strong",
"bridge_groups_speaking": 25,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -19581,12 +19581,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/jle",
"training_url": "",
"bridge_language": "Arabic, Sudanese",
"bridge_iso639_3": "apd",
"bridge_strength": "strong",
"bridge_groups_speaking": 65,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -33771,12 +33771,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/ngt",
"training_url": "",
"bridge_language": "Akha",
"bridge_iso639_3": "ahk",
"bridge_strength": "strong",
"bridge_groups_speaking": 12,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -38292,12 +38292,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/nos",
"training_url": "",
"bridge_language": "Chinese, Mandarin",
"bridge_iso639_3": "cmn",
"bridge_strength": "strong",
"bridge_groups_speaking": 25,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -38556,12 +38556,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/lbo",
"training_url": "",
"bridge_language": "Akha",
"bridge_iso639_3": "ahk",
"bridge_strength": "strong",
"bridge_groups_speaking": 12,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -47697,12 +47697,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/jle",
"training_url": "",
"bridge_language": "Arabic, Sudanese",
"bridge_iso639_3": "apd",
"bridge_strength": "strong",
"bridge_groups_speaking": 65,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,
@ -48555,12 +48555,12 @@
"stories_url": "",
"gospel_audio_url": "https://fivefish.org/nev",
"training_url": "",
"bridge_language": "Akha",
"bridge_iso639_3": "ahk",
"bridge_strength": "strong",
"bridge_groups_speaking": 12,
"bridge_has_scripture": true,
"bridge_has_film": true,
"bridge_language": "",
"bridge_iso639_3": "",
"bridge_strength": "",
"bridge_groups_speaking": 0,
"bridge_has_scripture": false,
"bridge_has_film": false,
"bridge_candidate": "",
"bridge_candidate_iso": "",
"bridge_candidate_groups": 0,

File diff suppressed because one or more lines are too long

View file

@ -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-VtjIcrHXFJktN3QNCQ15WHEaLgw3v/HYNYYTrIKsfM0u4VXxcUGWsCGRDKlmCCCP" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-WsPPwgoFC9vy1BPi/sT71i/Tl6OoGupGHFMd8j/iMXhyE1VfbtHrHtL+4CTv5Iul" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -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-VtjIcrHXFJktN3QNCQ15WHEaLgw3v/HYNYYTrIKsfM0u4VXxcUGWsCGRDKlmCCCP" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-WsPPwgoFC9vy1BPi/sT71i/Tl6OoGupGHFMd8j/iMXhyE1VfbtHrHtL+4CTv5Iul" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -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-VtjIcrHXFJktN3QNCQ15WHEaLgw3v/HYNYYTrIKsfM0u4VXxcUGWsCGRDKlmCCCP" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-WsPPwgoFC9vy1BPi/sT71i/Tl6OoGupGHFMd8j/iMXhyE1VfbtHrHtL+4CTv5Iul" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -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-VtjIcrHXFJktN3QNCQ15WHEaLgw3v/HYNYYTrIKsfM0u4VXxcUGWsCGRDKlmCCCP" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-WsPPwgoFC9vy1BPi/sT71i/Tl6OoGupGHFMd8j/iMXhyE1VfbtHrHtL+4CTv5Iul" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -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-VtjIcrHXFJktN3QNCQ15WHEaLgw3v/HYNYYTrIKsfM0u4VXxcUGWsCGRDKlmCCCP" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-WsPPwgoFC9vy1BPi/sT71i/Tl6OoGupGHFMd8j/iMXhyE1VfbtHrHtL+4CTv5Iul" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -579,7 +579,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "doxa-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-VtjIcrHXFJktN3QNCQ15WHEaLgw3v/HYNYYTrIKsfM0u4VXxcUGWsCGRDKlmCCCP",
"integrity": "sha384-WsPPwgoFC9vy1BPi/sT71i/Tl6OoGupGHFMd8j/iMXhyE1VfbtHrHtL+4CTv5Iul",
"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-VtjIcrHXFJktN3QNCQ15WHEaLgw3v/HYNYYTrIKsfM0u4VXxcUGWsCGRDKlmCCCP\" 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-WsPPwgoFC9vy1BPi/sT71i/Tl6OoGupGHFMd8j/iMXhyE1VfbtHrHtL+4CTv5Iul\" 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-VtjIcrHXFJktN3QNCQ15WHEaLgw3v/HYNYYTrIKsfM0u4VXxcUGWsCGRDKlmCCCP\" 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-WsPPwgoFC9vy1BPi/sT71i/Tl6OoGupGHFMd8j/iMXhyE1VfbtHrHtL+4CTv5Iul\" 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": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-VtjIcrHXFJktN3QNCQ15WHEaLgw3v/HYNYYTrIKsfM0u4VXxcUGWsCGRDKlmCCCP\" 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": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-WsPPwgoFC9vy1BPi/sT71i/Tl6OoGupGHFMd8j/iMXhyE1VfbtHrHtL+4CTv5Iul\" 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-VtjIcrHXFJktN3QNCQ15WHEaLgw3v/HYNYYTrIKsfM0u4VXxcUGWsCGRDKlmCCCP\" 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-WsPPwgoFC9vy1BPi/sT71i/Tl6OoGupGHFMd8j/iMXhyE1VfbtHrHtL+4CTv5Iul\" 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": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-VtjIcrHXFJktN3QNCQ15WHEaLgw3v/HYNYYTrIKsfM0u4VXxcUGWsCGRDKlmCCCP\" 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": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-WsPPwgoFC9vy1BPi/sT71i/Tl6OoGupGHFMd8j/iMXhyE1VfbtHrHtL+4CTv5Iul\" 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>"
}
}
]