Update from source a37ea4ff
683
data/tables/bridge-language-reach.json
Normal file
|
|
@ -0,0 +1,683 @@
|
|||
{
|
||||
"meta": {
|
||||
"title": "One language, how many peoples — the way in, ranked by reach",
|
||||
"why": "Every other surface answers \"what is the way in for THIS group\". A mobiliser with a budget asks the inverse: if I resource ONE language, how many peoples does it reach? 35 languages are the way in to all 369 groups with nothing of their own.",
|
||||
"generated": "2026-09-27",
|
||||
"grain": "one row per (way-in kind, language); a language offered both as a checked bridge and as a computed candidate appears once per kind, because those are different claims",
|
||||
"groups_with_nothing": 369,
|
||||
"groups_with_no_way_in": 0,
|
||||
"a_bridge_is_not_their_own_language": "Every group counted here still has NOTHING in its own language. This table ranks the second-best answer, and the word bridge travels with every row.",
|
||||
"three_kinds": "CURATED — checked for those groups. CANDIDATE — computed from published CLDR data about what the country speaks, which is a fact about the country and not about these people. SIGNED — SUN, a constructed signed language that has to be learned. Never summed.",
|
||||
"the_map_link_names_the_peoples": "The link uses ?groups=<slug list>, which filters the map by PEOPLE GROUP, so it shows exactly the groups this row counts. Written first with ?codes=, which filters by language, it drew 55 pins for Mandarin's 36-group row and 57 for Akha's 33 — those extra groups also have nothing but belong to a different row. The map gained the per-group filter rather than the column gaining an excuse.",
|
||||
"links": "No new link enters the map here. A bridge language's resources are the ones the pin index already carries for that ISO code, already proved by the verification record."
|
||||
},
|
||||
"columns": [
|
||||
{
|
||||
"title": "Language",
|
||||
"field": "language",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Code",
|
||||
"field": "iso639_3",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Kind of way in",
|
||||
"field": "way_in",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Groups with nothing",
|
||||
"field": "groups_with_nothing",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "People with nothing",
|
||||
"field": "people_with_nothing",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "Countries",
|
||||
"field": "countries",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "Nobody praying",
|
||||
"field": "nobody_praying",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "Largest groups",
|
||||
"field": "largest",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Scripture in this language",
|
||||
"field": "scripture_url",
|
||||
"type": "link"
|
||||
},
|
||||
{
|
||||
"title": "Film in this language",
|
||||
"field": "film_url",
|
||||
"type": "link"
|
||||
},
|
||||
{
|
||||
"title": "Training",
|
||||
"field": "training_url",
|
||||
"type": "link"
|
||||
},
|
||||
{
|
||||
"title": "Languages they speak",
|
||||
"field": "their_languages",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "Groups the map link shows",
|
||||
"field": "map_shows_groups",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "These peoples on the map",
|
||||
"field": "map_url",
|
||||
"type": "link"
|
||||
}
|
||||
],
|
||||
"rows": [
|
||||
{
|
||||
"language": "SUN (universal signed language)",
|
||||
"iso639_3": "",
|
||||
"way_in": "bridge — a constructed signed language, learned",
|
||||
"groups_with_nothing": 93,
|
||||
"people_with_nothing": 17533305,
|
||||
"countries": 93,
|
||||
"nobody_praying": 14,
|
||||
"largest": "Deaf Pakistanis; Deaf Congolese; Deaf Burmese",
|
||||
"scripture_url": "https://sun.bible/sun/NewTestament",
|
||||
"film_url": "",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=deaf-afghans,deaf-algerians,deaf-angolans,deaf-armenians,deaf-arubans,deaf-azerbaijanis,deaf-bahrainis,deaf-beninese,deaf-bhutanese,deaf-bissau-guineans,deaf-bosnians,deaf-british-virgin-islanders,deaf-bruneians,deaf-bulgarians,deaf-burmese,deaf-cambodians,deaf-cameroonians,deaf-central-africans,deaf-christmas-islanders,deaf-cocos-islanders,deaf-comorans,deaf-congolese-congo,deaf-congolese-democratic-republic-of-the-congo,deaf-cubans,deaf-curacaoan,deaf-cypriots,deaf-djiboutians,deaf-emiratis,deaf-eritreans,deaf-faroese,deaf-fijians,deaf-french-polynesians,deaf-gabonese,deaf-gambians,deaf-georgians,deaf-gibraltarians,deaf-greeks,deaf-guadeloupeans,deaf-guernsey-islanders,deaf-guineans,deaf-guyanese,deaf-hong-kong,deaf-i-kiribati,deaf-icelanders,deaf-iraqis,deaf-israelis,deaf-ivoirians,deaf-jamaicans,deaf-jersey-islanders,deaf-koreans,deaf-kosovar,deaf-kuwaitis,deaf-laotians,deaf-libyans,deaf-liechtensteiners,deaf-luxembourgers,deaf-macao,deaf-mahorais,deaf-maldivans,deaf-maltese,deaf-marshallese,deaf-mauritians,deaf-micronesians,deaf-monacans,deaf-montserratians,deaf-moroccans,deaf-mozambicans,deaf-new-caledonians,deaf-ni-vanuatu,deaf-norfolk-islanders,deaf-omanis,deaf-pakistanis,deaf-palestinian-arabs,deaf-papua-new-guineans,deaf-qataris,deaf-sahrawis,deaf-saint-barth,deaf-saint-helenians,deaf-sammarinese,deaf-samoan,deaf-santomeans,deaf-saudi-arabians,deaf-solomon-islanders,deaf-somalis,deaf-sri-lankans,deaf-sudanese,deaf-surinamers,deaf-svalbardians,deaf-swazis,deaf-swedes,deaf-tongans,deaf-wallisians,deaf-yemenis",
|
||||
"their_languages": 69,
|
||||
"map_shows_groups": 93
|
||||
},
|
||||
{
|
||||
"language": "Arabic, Standard",
|
||||
"iso639_3": "arb",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 15,
|
||||
"people_with_nothing": 2366775,
|
||||
"countries": 7,
|
||||
"nobody_praying": 2,
|
||||
"largest": "Hadrami Arabs; Gulf Arabs; Socotran",
|
||||
"scripture_url": "https://ebible.org/arbnav/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/arabic-modern-standard",
|
||||
"training_url": "https://zume.training/ar",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=arab-bahraini-sunni,arabic-shihhi,batahira,hadrami-arabs,harasi,hobyot-oman,hobyot-yemen,jerba,jibbali,kumzari,mahra,moroccan-jews,shihuh,siwa-imazighen,socotran",
|
||||
"their_languages": 13,
|
||||
"map_shows_groups": 15
|
||||
},
|
||||
{
|
||||
"language": "Chinese, Mandarin",
|
||||
"iso639_3": "cmn",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 36,
|
||||
"people_with_nothing": 1562400,
|
||||
"countries": 1,
|
||||
"nobody_praying": 26,
|
||||
"largest": "Huishui Miao; Hongjin Tai; Buryat",
|
||||
"scripture_url": "https://ebible.org/cmn2006/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/mandarin-taiwan",
|
||||
"training_url": "https://zume.training/zhcn",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=ai-cham,ainu-china,bit-china,bugan,buryat,cai,eastern-xiangxi-miao,ersu,gao,guaigun,hagei,hongjin-tai,hu,huishui-miao,kucong,lati-china,liang-e,luzu,manyak,minyak,mosuo,naju,namuyi,northern-muji,rao,sanda,sarikoli-tajiks,shixing,tongren-bonan,wenma-zhuang,wunai,wutun,ya,yanghuang,yerong,yunnan-mongol",
|
||||
"their_languages": 30,
|
||||
"map_shows_groups": 36
|
||||
},
|
||||
{
|
||||
"language": "Arabic, Sudanese",
|
||||
"iso639_3": "apd",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 22,
|
||||
"people_with_nothing": 880000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 15,
|
||||
"largest": "Kimr; Tagale; Dar Fur Daju",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/arabic-sudanese-spoken",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=afitti,binga,dajo,dar-fur-daju,erenga,fungor,kajakaja,kanga,karko,keiga,kimr,kufa-lima,midob,tagale,tagoy,talasa,tingal,tukum,tumale,tumtum,wali,warnang",
|
||||
"their_languages": 14,
|
||||
"map_shows_groups": 22
|
||||
},
|
||||
{
|
||||
"language": "Somali",
|
||||
"iso639_3": "som",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 5,
|
||||
"people_with_nothing": 508500,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Garre; Tunni; Jiiddu",
|
||||
"scripture_url": "https://ebible.org/som/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/somali",
|
||||
"training_url": "https://zume.training/so",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=dabarre,garre,jiiddu,mushungulu,tunni",
|
||||
"their_languages": 5,
|
||||
"map_shows_groups": 5
|
||||
},
|
||||
{
|
||||
"language": "Arabic, Chadian",
|
||||
"iso639_3": "shu",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 22,
|
||||
"people_with_nothing": 475825,
|
||||
"countries": 1,
|
||||
"nobody_praying": 14,
|
||||
"largest": "Mubi; Mesmedje; Sungor",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/arabic-chadian-spoken",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=berguid,bernde,bolgo-dugag,bon-gula,boor,fanya,gula,jegu,kajakse,karanga,kendeje,koke,kujarge,majera-chad,marfa,maslam,mesmedje,mogum,mubi,sungor,surbakhal,torom",
|
||||
"their_languages": 22,
|
||||
"map_shows_groups": 22
|
||||
},
|
||||
{
|
||||
"language": "French",
|
||||
"iso639_3": "fra",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 7,
|
||||
"people_with_nothing": 436050,
|
||||
"countries": 3,
|
||||
"nobody_praying": 2,
|
||||
"largest": "Syenara Senufo; Konkabay; Ndemli",
|
||||
"scripture_url": "https://ebible.org/fra_fob/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/french",
|
||||
"training_url": "https://zume.training/fr",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=bangi-me,dek,jina,konkabay,majera-cameroon,ndemli,syenara-senufo",
|
||||
"their_languages": 7,
|
||||
"map_shows_groups": 7
|
||||
},
|
||||
{
|
||||
"language": "Indonesian",
|
||||
"iso639_3": "ind",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 28,
|
||||
"people_with_nothing": 358825,
|
||||
"countries": 4,
|
||||
"nobody_praying": 11,
|
||||
"largest": "Kedayan; Geser Gorom; Hitu",
|
||||
"scripture_url": "https://ebible.org/ind/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/indonesian-yesus",
|
||||
"training_url": "https://zume.training/id",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=abai-sungai,ambelau,asilulu,balaesan,bati,bisayan-tutong,bonerate,cocos-malays,dondo,gane,geser-gorom,gorap,hitu,kedayan,kensiu,kiput,komfana,komodo,lahanan,larike-wakasihu,latu,lola,luhu,mairiri,mendriq,seit-kaitetu,tutung,ujir",
|
||||
"their_languages": 28,
|
||||
"map_shows_groups": 28
|
||||
},
|
||||
{
|
||||
"language": "Swahili",
|
||||
"iso639_3": "swh",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 6,
|
||||
"people_with_nothing": 356900,
|
||||
"countries": 3,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Sagara; Nubi; Tagbo",
|
||||
"scripture_url": "https://ebible.org/swh1850/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/swahili-kenya",
|
||||
"training_url": "https://zume.training/swa",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=kami,ndunga,nubi,sagara,tagbo,yulu-binga",
|
||||
"their_languages": 6,
|
||||
"map_shows_groups": 6
|
||||
},
|
||||
{
|
||||
"language": "Akha",
|
||||
"iso639_3": "ahk",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 33,
|
||||
"people_with_nothing": 296085,
|
||||
"countries": 1,
|
||||
"nobody_praying": 25,
|
||||
"largest": "Tai Khang; Phunoi; Pong",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/akha",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=bit-laos,bo,chut-laos,halang-doan,hung,katu-adek,katu-dark-kang,katu-hanna,katu-triew,khua,khuen,kuan,laoseng,mlabri,o-du,phongku,phongset,phunoi-laos,pong,pong-phen,pong-poong,pong-puang,pong-seng,sida,sila-laos,tai-he,tai-khang,tai-laan,tai-men,tayten,thai-ae,thai-toum,tong",
|
||||
"their_languages": 20,
|
||||
"map_shows_groups": 33
|
||||
},
|
||||
{
|
||||
"language": "Arabic, Libyan",
|
||||
"iso639_3": "ayl",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 2,
|
||||
"people_with_nothing": 235500,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Nefusa Imazighen; Zuara",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/arabic-libyan",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=nefusa-imazighen,zuara",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 2
|
||||
},
|
||||
{
|
||||
"language": "Russian",
|
||||
"iso639_3": "rus",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 9,
|
||||
"people_with_nothing": 116800,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Andi; Kaitag; Chamalal",
|
||||
"scripture_url": "https://ebible.org/russyn/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/russian",
|
||||
"training_url": "https://zume.training/ru",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=akhwakh,andi,bagvalal,botlikh,chamalal,kaitag,karata,khwarshi,tindi",
|
||||
"their_languages": 9,
|
||||
"map_shows_groups": 9
|
||||
},
|
||||
{
|
||||
"language": "Tamazight, Central Atlas",
|
||||
"iso639_3": "tzm",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 2,
|
||||
"people_with_nothing": 111800,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Chenoua; Belbali",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/tamazight-central-atlas",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=belbali,chenoua",
|
||||
"their_languages": 2,
|
||||
"map_shows_groups": 2
|
||||
},
|
||||
{
|
||||
"language": "Japanese",
|
||||
"iso639_3": "jpn",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 5,
|
||||
"people_with_nothing": 111100,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Yaeyama; Toku-no-shima; Oki-No-Erabu",
|
||||
"scripture_url": "https://ebible.org/jpn1965/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/japanese",
|
||||
"training_url": "https://zume.training/ja",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=oki-no-erabu,toku-no-shima,yaeyama,yonaguni,yoron",
|
||||
"their_languages": 5,
|
||||
"map_shows_groups": 5
|
||||
},
|
||||
{
|
||||
"language": "Ale",
|
||||
"iso639_3": "gwd",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 4,
|
||||
"people_with_nothing": 94900,
|
||||
"countries": 1,
|
||||
"nobody_praying": 2,
|
||||
"largest": "Begi-Mao; Seze; Opuua Shita",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/ale-gawwada",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=begi-mao,opuua-shita,seze,shabo",
|
||||
"their_languages": 4,
|
||||
"map_shows_groups": 4
|
||||
},
|
||||
{
|
||||
"language": "Shimaore",
|
||||
"iso639_3": "swb",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 87000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Bushi",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/shimaore",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=bushi",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Tigrinya, Eritrea",
|
||||
"iso639_3": "tir",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 73500,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Nara",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/tigrinya-eritrea",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=nara",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Moore",
|
||||
"iso639_3": "mos",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 2,
|
||||
"people_with_nothing": 72100,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Senara Senufo; Khe",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/moore",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=khe,senara-senufo",
|
||||
"their_languages": 2,
|
||||
"map_shows_groups": 2
|
||||
},
|
||||
{
|
||||
"language": "Hausa",
|
||||
"iso639_3": "hau",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 72000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Tagdal",
|
||||
"scripture_url": "https://ebible.org/hausa/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/hausa",
|
||||
"training_url": "https://zume.training/ha",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=tagdal",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Urdu",
|
||||
"iso639_3": "urd",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 5,
|
||||
"people_with_nothing": 71375,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Bateri; Damel; Kalkoti",
|
||||
"scripture_url": "https://ebible.org/urd/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/urdu",
|
||||
"training_url": "https://zume.training/ur",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=bateri,damel,gowro,kalkoti,ushojo",
|
||||
"their_languages": 5,
|
||||
"map_shows_groups": 5
|
||||
},
|
||||
{
|
||||
"language": "Bemba",
|
||||
"iso639_3": "bem",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 69000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Totela",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/bemba",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=totela",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Persian, Iranian",
|
||||
"iso639_3": "pes",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 3,
|
||||
"people_with_nothing": 61400,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Northern Tati; Soi; Bashkardi",
|
||||
"scripture_url": "https://ebible.org/pesopcb/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/farsi-western",
|
||||
"training_url": "https://zume.training/fa",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=bashkardi,northern-tati,soi",
|
||||
"their_languages": 3,
|
||||
"map_shows_groups": 3
|
||||
},
|
||||
{
|
||||
"language": "Hausa",
|
||||
"iso639_3": "hau",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 6,
|
||||
"people_with_nothing": 57800,
|
||||
"countries": 1,
|
||||
"nobody_praying": 4,
|
||||
"largest": "Maha; Koro Zuba; Ibuoro",
|
||||
"scripture_url": "https://ebible.org/hausa/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/hausa",
|
||||
"training_url": "https://zume.training/ha",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=gwa,ibuoro,jimi,koro-zuba,maha,tsagu",
|
||||
"their_languages": 6,
|
||||
"map_shows_groups": 6
|
||||
},
|
||||
{
|
||||
"language": "Vietnamese",
|
||||
"iso639_3": "vie",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 7,
|
||||
"people_with_nothing": 55100,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Tsun-Lao; Lati; Phula",
|
||||
"scripture_url": "https://ebible.org/vie1934/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/vietnamese",
|
||||
"training_url": "https://zume.training/vi",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=chut-vietnam,laha,lati-vietnam,phula,pu-peo,sila-vietnam,tsun-lao",
|
||||
"their_languages": 7,
|
||||
"map_shows_groups": 7
|
||||
},
|
||||
{
|
||||
"language": "English",
|
||||
"iso639_3": "eng",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 4,
|
||||
"people_with_nothing": 44000,
|
||||
"countries": 2,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Wandya; Banda-Mbres; Bari Bai",
|
||||
"scripture_url": "https://ebible.org/engamp/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/english",
|
||||
"training_url": "https://zume.training/en",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=banda-mbres,bari-bai,ngalgulgule,wandya",
|
||||
"their_languages": 4,
|
||||
"map_shows_groups": 4
|
||||
},
|
||||
{
|
||||
"language": "Portuguese",
|
||||
"iso639_3": "por",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 28000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Nyengo",
|
||||
"scripture_url": "https://ebible.org/porblt/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/portuguese-portugal",
|
||||
"training_url": "https://zume.training/pt",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=nyengo",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Dzongkha",
|
||||
"iso639_3": "dzo",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 6,
|
||||
"people_with_nothing": 20725,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Nyenpa; Gongduk; Chali",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/dzongkha",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=brokkat,chali,gongduk,lunape,nyenpa,ole",
|
||||
"their_languages": 6,
|
||||
"map_shows_groups": 6
|
||||
},
|
||||
{
|
||||
"language": "Telugu",
|
||||
"iso639_3": "tel",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 8,
|
||||
"people_with_nothing": 16460,
|
||||
"countries": 1,
|
||||
"nobody_praying": 6,
|
||||
"largest": "Malai Pandaram; Jadupetia; Koiren",
|
||||
"scripture_url": "https://ebible.org/tel2010/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/telugu",
|
||||
"training_url": "https://zume.training/te",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=jadupetia,jarawas,khamba,koiren,malai-pandaram,na,onge,sentinelese",
|
||||
"their_languages": 8,
|
||||
"map_shows_groups": 8
|
||||
},
|
||||
{
|
||||
"language": "Thai",
|
||||
"iso639_3": "tha",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 14000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Phunoi",
|
||||
"scripture_url": "https://ebible.org/thaKJV/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/thai",
|
||||
"training_url": "https://zume.training/th",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=phunoi-thailand",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Nepali",
|
||||
"iso639_3": "npi",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 3,
|
||||
"people_with_nothing": 13800,
|
||||
"countries": 1,
|
||||
"nobody_praying": 3,
|
||||
"largest": "Tseku; Gyasumdoba; Pahari Nagarkotis",
|
||||
"scripture_url": "https://ebible.org/npi2010/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/nepali",
|
||||
"training_url": "https://zume.training/ne",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=gyasumdoba,pahari-nagarkotis,tseku",
|
||||
"their_languages": 3,
|
||||
"map_shows_groups": 3
|
||||
},
|
||||
{
|
||||
"language": "Hebrew (modern)",
|
||||
"iso639_3": "heb",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 13000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Jew, Kurdistani",
|
||||
"scripture_url": "https://ebible.org/heb/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/hebrew",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=kurdistani-jews",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Burmese",
|
||||
"iso639_3": "mya",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 5600,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Danau",
|
||||
"scripture_url": "https://ebible.org/myajvb/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/burmese-common",
|
||||
"training_url": "https://zume.training/my",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=danau",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Portuguese",
|
||||
"iso639_3": "por",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 23,
|
||||
"people_with_nothing": 4795,
|
||||
"countries": 1,
|
||||
"nobody_praying": 16,
|
||||
"largest": "Waimiri-Atroari; Enawenê-Nawê; Korubo",
|
||||
"scripture_url": "https://ebible.org/porblt/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/portuguese-portugal",
|
||||
"training_url": "https://zume.training/pt",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=amundava,arawete,asurini-xingu,ava-canoeiro,enawen-naw,korubo,morerebi,sapanawas,suruwaha,txikao,uncontacted-of-bararati,uncontacted-of-cumina,uncontacted-of-madeirinha,uncontacted-of-mapuera,uncontacted-of-parauari,uncontacted-of-rio-liberdade,uncontacted-of-rio-tapirape,uncontacted-of-serra-do-taquaral,uncontacted-of-teles-pires,uraparaquara,uru-pa-in,waimiri-atroari,zoe",
|
||||
"their_languages": 14,
|
||||
"map_shows_groups": 23
|
||||
},
|
||||
{
|
||||
"language": "Spanish",
|
||||
"iso639_3": "spa",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 4,
|
||||
"people_with_nothing": 2475,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Macaguan; Eastern Tunebo; Cabiyari",
|
||||
"scripture_url": "https://ebible.org/spabes/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/spanish-latin-american",
|
||||
"training_url": "https://zume.training/es",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=cabiyari,carabayo,eastern-tunebo,macaguan",
|
||||
"their_languages": 4,
|
||||
"map_shows_groups": 4
|
||||
},
|
||||
{
|
||||
"language": "Spanish",
|
||||
"iso639_3": "spa",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 2100,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Huachipaire",
|
||||
"scripture_url": "https://ebible.org/spabes/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/spanish-latin-american",
|
||||
"training_url": "https://zume.training/es",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=huachipaire",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
"why": "Published so no other build has to repeat this point-in-polygon. gospel-internet ran the identical ray-casting over the identical geometry and could only check itself against our aggregates; a second implementation of the same geometry is a second place for it to drift.",
|
||||
"generated": "2026-09-27",
|
||||
"grain": "one row per PLACED people group; the four that fall outside every polygon are in the aggregate file's `unassigned`",
|
||||
"rows": 1005,
|
||||
"rows": 1009,
|
||||
"agrees_with": "gospel-by-province.json — per-province counts and the assigned total are reconciled at build time, and neither file is written if they differ",
|
||||
"approximate": "Every row is approximate. The coordinate marks where a PEOPLE is found, not a settlement, and near a border it can fall on the wrong side. No surface may present a province as a fact about a group."
|
||||
},
|
||||
|
|
@ -2761,6 +2761,16 @@
|
|||
"tier": 2,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Great Andamanese",
|
||||
"country": "India",
|
||||
"iso3": "IND",
|
||||
"province": "Andaman and Nicobar Islands",
|
||||
"iso639_3": "hca",
|
||||
"population": 60,
|
||||
"tier": 1,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Guddi Eluguwallu",
|
||||
"country": "India",
|
||||
|
|
@ -7421,6 +7431,16 @@
|
|||
"tier": 2,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Sentinelese",
|
||||
"country": "India",
|
||||
"iso3": "IND",
|
||||
"province": "Andaman and Nicobar Islands",
|
||||
"iso639_3": "std",
|
||||
"population": 60,
|
||||
"tier": 0,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Seok",
|
||||
"country": "India",
|
||||
|
|
@ -9071,6 +9091,17 @@
|
|||
"tier": 1,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Jing",
|
||||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"province": "Guangxi Zhuang Autonomous Region",
|
||||
"iso639_3": "vie",
|
||||
"population": 29500,
|
||||
"tier": 2,
|
||||
"approximate": true,
|
||||
"near_border_km": 8.7
|
||||
},
|
||||
{
|
||||
"people_group": "Jino",
|
||||
"country": "China",
|
||||
|
|
@ -9551,6 +9582,17 @@
|
|||
"tier": 2,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Pana",
|
||||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"province": "Yunnan Province",
|
||||
"iso639_3": "phq",
|
||||
"population": 5400,
|
||||
"tier": 1,
|
||||
"approximate": true,
|
||||
"near_border_km": 5.4
|
||||
},
|
||||
{
|
||||
"people_group": "Panxian Nasu",
|
||||
"country": "China",
|
||||
|
|
|
|||
|
|
@ -5,11 +5,12 @@
|
|||
"generated": "2026-09-27",
|
||||
"provinces_with_groups": 46,
|
||||
"provinces_available": 48,
|
||||
"groups_assigned": 1005,
|
||||
"groups_unassigned": 4,
|
||||
"groups_assigned": 1009,
|
||||
"groups_unassigned": 0,
|
||||
"per_group_file": "gospel-by-province-groups.json — one row per placed group, reconciled with these counts at build time",
|
||||
"india_note": "India is read from the COMPLETE ADM1 (36 states, geoBoundaries via DataMeet India, CC BY 2.5 IN). The first build of this table read gb-IND-ADM1.geojson, which is the UPG-100 list's curated 34-unit partition, and eleven groups came out with no province because they stood in states that partition does not draw. Switching the file moved 998 assigned to 1,005 and 44 province rows to 46, and turned the province names into India's own states.",
|
||||
"unassigned_note": "Four remain, each one legible rather than lost. Great Andamanese and the Sentinelese sit on small islands whose simplified coastline the point falls just outside — Andaman and Nicobar IS in the file, so this is geometry precision, not a missing province. Jing and Pana are on China's Vietnam and Laos borders, outside the twelve-province subset. They are listed in `unassigned` with their coordinates.",
|
||||
"groups_placed_by_nearest_province": 2,
|
||||
"near_border_note": "NONE unassigned now, and two rows say why. Jing and Pana fell in no province: measured 8.7 km outside Guangxi and 5.4 km outside Yunnan — across the border, not outside the file, which is what an earlier version of this note wrongly said (both provinces are in it). Sourcing China's complete 34-unit ADM1 moved neither distance: same source geometry, 22 more provinces, none of them theirs — so better data is not the answer and nobody need repeat it. A point within 15 km of exactly ONE province now joins it and carries near_border_km; two provinces within the tolerance leave it unassigned, because a hint between two answers is not one. A single coordinate for a whole people is not precise to 9 km, which is why this is a correction and not a guess.",
|
||||
"china_note": "China's ADM1 file carries 12 provinces, not 31+. Measured rather than assumed: 152 of 154 Chinese groups fall inside them and all twelve are used, so the file is cut to the provinces where the unreached peoples are.",
|
||||
"ways_in": "Chosen FOR THE PROVINCE where the province can answer: the languages of groups standing in it that already have Scripture AND film, ranked by the people here who already hold them. The column says which basis was used. This replaces a country-level answer that produced a measured absurdity — Arunachal Pradesh, in the far north-east, was offered TELUGU, because the curated bridge table is keyed by country and a curated bridge outranks a computed one. A province with no tier-2 language of its own still falls back to the country answer, and ways_in_basis says so rather than hiding it. It is a NEIGHBOUR, not a recommendation: whether a group actually speaks it is a question for someone on the ground.",
|
||||
"approximate": "A province is assigned by point-in-polygon on the group's coordinate, and that coordinate marks where a PEOPLE is found, not a settlement — 108 groups across the roster even share a coordinate with another group. Near a border the point can fall on the wrong side. Every row is flagged approximate and the unassigned are counted, never dropped. No surface may present a province as a fact about a group."
|
||||
|
|
@ -91,20 +92,20 @@
|
|||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"province": "Yunnan Province",
|
||||
"groups": 61,
|
||||
"people": 3524875,
|
||||
"groups": 62,
|
||||
"people": 3530275,
|
||||
"zero_access_groups": 14,
|
||||
"zero_access_people": 602850,
|
||||
"zero_access_examples": "Hongjin Tai; Wenma Zhuang; Mosuo",
|
||||
"prayer_pages": 45,
|
||||
"prayer_pages": 46,
|
||||
"pray_first": {
|
||||
"name": "Hongjin Tai",
|
||||
"url": "https://pray.doxa.life/hongjin-tai?source=doxalife&utm_source=agwm",
|
||||
"people": 209000,
|
||||
"has_nothing": true
|
||||
},
|
||||
"nobody_praying_groups": 35,
|
||||
"nobody_praying_people": 1430325,
|
||||
"nobody_praying_groups": 36,
|
||||
"nobody_praying_people": 1435725,
|
||||
"ways_in": "Chinese, Mandarin (63,825 here); Tai Dam (48,000 here)",
|
||||
"ways_in_basis": "in this province",
|
||||
"ways_in_country": "Chinese, Mandarin",
|
||||
|
|
@ -160,20 +161,20 @@
|
|||
"country": "India",
|
||||
"iso3": "IND",
|
||||
"province": "Andaman and Nicobar Islands",
|
||||
"groups": 7,
|
||||
"people": 81900,
|
||||
"zero_access_groups": 2,
|
||||
"zero_access_people": 500,
|
||||
"zero_access_examples": "Jarawas; Onge",
|
||||
"prayer_pages": 5,
|
||||
"groups": 9,
|
||||
"people": 82020,
|
||||
"zero_access_groups": 3,
|
||||
"zero_access_people": 560,
|
||||
"zero_access_examples": "Jarawas; Onge; Sentinelese",
|
||||
"prayer_pages": 7,
|
||||
"pray_first": {
|
||||
"name": "Onge",
|
||||
"url": "https://pray.doxa.life/onge?source=doxalife&utm_source=agwm",
|
||||
"people": 150,
|
||||
"has_nothing": true
|
||||
},
|
||||
"nobody_praying_groups": 4,
|
||||
"nobody_praying_people": 69450,
|
||||
"nobody_praying_groups": 5,
|
||||
"nobody_praying_people": 69510,
|
||||
"ways_in": "Telugu (67,000 here)",
|
||||
"ways_in_basis": "in this province",
|
||||
"ways_in_country": "Telugu",
|
||||
|
|
@ -321,21 +322,21 @@
|
|||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"province": "Guangxi Zhuang Autonomous Region",
|
||||
"groups": 6,
|
||||
"people": 121150,
|
||||
"groups": 7,
|
||||
"people": 150650,
|
||||
"zero_access_groups": 1,
|
||||
"zero_access_people": 750,
|
||||
"zero_access_examples": "Yerong",
|
||||
"prayer_pages": 5,
|
||||
"prayer_pages": 6,
|
||||
"pray_first": {
|
||||
"name": "Yerong",
|
||||
"url": "https://pray.doxa.life/yerong?source=doxalife&utm_source=agwm",
|
||||
"people": 750,
|
||||
"has_nothing": true
|
||||
},
|
||||
"nobody_praying_groups": 4,
|
||||
"nobody_praying_people": 51150,
|
||||
"ways_in": "Chinese, Mandarin (50,400 here)",
|
||||
"nobody_praying_groups": 5,
|
||||
"nobody_praying_people": 80650,
|
||||
"ways_in": "Chinese, Mandarin (50,400 here); Vietnamese (29,500 here)",
|
||||
"ways_in_basis": "in this province",
|
||||
"ways_in_country": "Chinese, Mandarin",
|
||||
"approximate": true
|
||||
|
|
@ -1116,34 +1117,5 @@
|
|||
"approximate": true
|
||||
}
|
||||
],
|
||||
"unassigned": [
|
||||
{
|
||||
"country": "India",
|
||||
"iso3": "IND",
|
||||
"people_group": "Great Andamanese",
|
||||
"lat": 12.211728,
|
||||
"lng": 92.833491
|
||||
},
|
||||
{
|
||||
"country": "India",
|
||||
"iso3": "IND",
|
||||
"people_group": "Sentinelese",
|
||||
"lat": 11.557662,
|
||||
"lng": 92.267154
|
||||
},
|
||||
{
|
||||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"people_group": "Jing",
|
||||
"lat": 21.577774,
|
||||
"lng": 108.126828
|
||||
},
|
||||
{
|
||||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"people_group": "Pana",
|
||||
"lat": 21.246492,
|
||||
"lng": 101.27182
|
||||
}
|
||||
]
|
||||
"unassigned": []
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,11 +9,12 @@ again, so every parameter below is a promise kept by a gate
|
|||
style="width:100%;height:600px;border:0" title="Gospel access"></iframe>
|
||||
```
|
||||
|
||||
## The five addresses
|
||||
## The six addresses
|
||||
|
||||
| Address | What the reader gets |
|
||||
|---|---|
|
||||
| `?codes=<iso3,iso3,…>` | Only those languages' people groups, framed on them. Shows `74 / 2,107`, and that count is the button back to the whole map. |
|
||||
| `?groups=<slug,slug,…>` | Exactly those **people groups**, by doxa.life's own slug, framed on them. Use this when your list is peoples rather than languages: a language filter shows every group speaking it, which for one bridge language was 55 pins against a list of 36. |
|
||||
| `?country=<ISO3>` | That country's sheet open, framed on its groups. The country's own name also works (`?country=India`). |
|
||||
| `?code=<iso3>` | The people group's sheet, with its resources. `&name=` and `&country=` disambiguate when a language has many groups. |
|
||||
| `?view=zero` | The groups with **nothing found** — the question this map exists for. `?view=gap` is the same view. |
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.6 MiB After Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 1.6 MiB After Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 926 KiB After Width: | Height: | Size: 924 KiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 872 KiB After Width: | Height: | Size: 828 KiB |
|
Before Width: | Height: | Size: 2 MiB After Width: | Height: | Size: 2 MiB |
|
Before Width: | Height: | Size: 284 KiB After Width: | Height: | Size: 2.4 MiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 376 KiB After Width: | Height: | Size: 391 KiB |
|
Before Width: | Height: | Size: 1 MiB After Width: | Height: | Size: 1 MiB |
|
Before Width: | Height: | Size: 332 KiB After Width: | Height: | Size: 330 KiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 771 KiB After Width: | Height: | Size: 809 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 205 KiB After Width: | Height: | Size: 205 KiB |
|
Before Width: | Height: | Size: 761 KiB After Width: | Height: | Size: 768 KiB |
|
Before Width: | Height: | Size: 752 KiB After Width: | Height: | Size: 728 KiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.6 MiB |
|
|
@ -1,102 +1,102 @@
|
|||
{
|
||||
"cap1-single-element": {
|
||||
"bundle": "all-people-groups",
|
||||
"sha256": "9e94ebdea30cb458a3bf6d28342ecbe7c4f403157b27b3b0bde9543a1882ac53"
|
||||
"sha256": "3260659777752cdc1916a4870980850fb12000f133fe956b944745fa8c91cf4a"
|
||||
},
|
||||
"cap2-adoption": {
|
||||
"bundle": "doxa-simple-map",
|
||||
"sha256": "e429739d0fe8ca87943f8e7c1192193d0979a6a7be9d3aada3229833d722a9ec"
|
||||
"sha256": "f83d60377976d81e96e0c217dc2e6146c271ef7a2c47e13084c2d7a28f12ecfe"
|
||||
},
|
||||
"cap2-engagement": {
|
||||
"bundle": "doxa-simple-map",
|
||||
"sha256": "e429739d0fe8ca87943f8e7c1192193d0979a6a7be9d3aada3229833d722a9ec"
|
||||
"sha256": "f83d60377976d81e96e0c217dc2e6146c271ef7a2c47e13084c2d7a28f12ecfe"
|
||||
},
|
||||
"cap2-prayer": {
|
||||
"bundle": "doxa-simple-map",
|
||||
"sha256": "e429739d0fe8ca87943f8e7c1192193d0979a6a7be9d3aada3229833d722a9ec"
|
||||
"sha256": "f83d60377976d81e96e0c217dc2e6146c271ef7a2c47e13084c2d7a28f12ecfe"
|
||||
},
|
||||
"cap3-monolithic-research": {
|
||||
"bundle": "doxa-research-map",
|
||||
"sha256": "11ea5ecc91ecdbfd16e0638cfceecf9c835e0a88f3de2a2aea4fb282828c287f"
|
||||
"sha256": "e49811c929a624570ab850a8a7f5e9cc45c3f9de18d1ef79e902a230ffd369a5"
|
||||
},
|
||||
"cap4-upg100-list": {
|
||||
"bundle": "my-upg-100-list",
|
||||
"sha256": "eca013c97650809080806967337b54bbdf5c5817dc318554ccffc00fc66c601f"
|
||||
"sha256": "2116fcbcdea5e7ea05d5b9c7d72e02f2ff921185f9805903b1fe640a6be265ff"
|
||||
},
|
||||
"cap4-upg100-mfe": {
|
||||
"bundle": "my-upg-100-list",
|
||||
"sha256": "a7bbbab52d5418e2745215ef204ac548daa551335859b5f58ed81fd611ed850b"
|
||||
"sha256": "2116fcbcdea5e7ea05d5b9c7d72e02f2ff921185f9805903b1fe640a6be265ff"
|
||||
},
|
||||
"cap4-upg100-poster-wall": {
|
||||
"bundle": "my-upg-100-list",
|
||||
"sha256": "a7bbbab52d5418e2745215ef204ac548daa551335859b5f58ed81fd611ed850b"
|
||||
"sha256": "2116fcbcdea5e7ea05d5b9c7d72e02f2ff921185f9805903b1fe640a6be265ff"
|
||||
},
|
||||
"cap5-doxa-maps-spa": {
|
||||
"bundle": "doxa-maps-spa",
|
||||
"sha256": "a8b01a95f0362c7a97fa510eb41e668abe0b13671abc3bb174ae2b97dda8280d"
|
||||
"sha256": "1d2619fdb65538616b4acfae05ead24e0cce93cf4bd382b0b52e8ea47db8c00f"
|
||||
},
|
||||
"cap5-plugin-studio": {
|
||||
"bundle": "plugin-studio",
|
||||
"sha256": "9108858e3f055a0b09a56206d7f0354e2f1f2b8a5d80d5f6f9fe12eea54ed484"
|
||||
"sha256": "d2ea03976a0ee1d804398736528d78fe0ca51ffeff89d1aa07f434ed32715469"
|
||||
},
|
||||
"deploy2-mobile-upg100": {
|
||||
"bundle": "my-upg-100-list",
|
||||
"sha256": "a7bbbab52d5418e2745215ef204ac548daa551335859b5f58ed81fd611ed850b"
|
||||
"sha256": "2116fcbcdea5e7ea05d5b9c7d72e02f2ff921185f9805903b1fe640a6be265ff"
|
||||
},
|
||||
"exp-prayer-walk-planner": {
|
||||
"bundle": "prayer-walk-planner",
|
||||
"sha256": "5f0e799cf04331c65e7724820ae34b96ee5a4c0583dd66b5a40c7ea106822acf"
|
||||
"sha256": "dd232bb45a86f3b91f2f90907eb6a27d69c21d1546d5e37a39504f8ebe64c469"
|
||||
},
|
||||
"exp-wall-of-people-groups": {
|
||||
"bundle": "wall-of-people-groups",
|
||||
"sha256": "9a8fc9c4a39c7113590a9dab8e9e3f5f4ecaa274467ab1d095fb717e60ac5765"
|
||||
"sha256": "2834da2244a51e9ced4252bd0a79514b05dcf11e8d55d5007914be424641deb1"
|
||||
},
|
||||
"lang-arabic-upg100": {
|
||||
"bundle": "my-upg-100-list",
|
||||
"sha256": "a7bbbab52d5418e2745215ef204ac548daa551335859b5f58ed81fd611ed850b"
|
||||
"sha256": "2116fcbcdea5e7ea05d5b9c7d72e02f2ff921185f9805903b1fe640a6be265ff"
|
||||
},
|
||||
"prod-big-picture": {
|
||||
"bundle": "dashboard-plus-grid",
|
||||
"sha256": "fb9da1169851cc2ab49c4c1f289935367841f2367fe071d74c01849f45337ffa"
|
||||
"sha256": "676b3f8a05c45ed3d0aab1adb671b8277ed15e0a424ab3ec2d6d7ff56ee72f6d"
|
||||
},
|
||||
"prod-cities-internet": {
|
||||
"bundle": "cities-internet",
|
||||
"sha256": "35d8936e0164f94a41d5330f53105dcabf41aefc356090743144c0fce4847bd1"
|
||||
"sha256": "bfccab06c3085d7a7bd601b889e196e360e01a9cf32561e35112d947430400b6"
|
||||
},
|
||||
"prod-cities-internet-phone": {
|
||||
"bundle": "cities-internet",
|
||||
"sha256": "35d8936e0164f94a41d5330f53105dcabf41aefc356090743144c0fce4847bd1"
|
||||
"sha256": "bfccab06c3085d7a7bd601b889e196e360e01a9cf32561e35112d947430400b6"
|
||||
},
|
||||
"prod-gospel-resources": {
|
||||
"bundle": "gospel-resources",
|
||||
"sha256": "44e9f631ec66d74b50f142811424583cb4df946c725c3264a02f8306db35096d"
|
||||
"sha256": "c16c3eb4613493a709b5d242f4354bc9c5cb468e89ee8c1f090a9eeb3bba3ef4"
|
||||
},
|
||||
"prod-gospel-resources-phone": {
|
||||
"bundle": "gospel-resources",
|
||||
"sha256": "44e9f631ec66d74b50f142811424583cb4df946c725c3264a02f8306db35096d"
|
||||
"sha256": "c16c3eb4613493a709b5d242f4354bc9c5cb468e89ee8c1f090a9eeb3bba3ef4"
|
||||
},
|
||||
"prod-prayer-phone": {
|
||||
"bundle": "doxa-simple-map",
|
||||
"sha256": "e429739d0fe8ca87943f8e7c1192193d0979a6a7be9d3aada3229833d722a9ec"
|
||||
"sha256": "f83d60377976d81e96e0c217dc2e6146c271ef7a2c47e13084c2d7a28f12ecfe"
|
||||
},
|
||||
"prod-regions": {
|
||||
"bundle": "regions-dashboard",
|
||||
"sha256": "b036622f55012b6917bf691d87f738d9f64c1705c5ee78db2127f57c315e41d1"
|
||||
"sha256": "da59e6f88d0cc7ff9aebc32d513e73c7c224101dabbed7deced03f5220bdb67c"
|
||||
},
|
||||
"prod-regions-phone": {
|
||||
"bundle": "regions-dashboard",
|
||||
"sha256": "b036622f55012b6917bf691d87f738d9f64c1705c5ee78db2127f57c315e41d1"
|
||||
"sha256": "da59e6f88d0cc7ff9aebc32d513e73c7c224101dabbed7deced03f5220bdb67c"
|
||||
},
|
||||
"prod-research-gallery-phone": {
|
||||
"bundle": "doxa-maps-spa",
|
||||
"sha256": "a8b01a95f0362c7a97fa510eb41e668abe0b13671abc3bb174ae2b97dda8280d"
|
||||
"sha256": "1d2619fdb65538616b4acfae05ead24e0cce93cf4bd382b0b52e8ea47db8c00f"
|
||||
},
|
||||
"prod-simple-research": {
|
||||
"bundle": "research-map-plus-grid",
|
||||
"sha256": "a393659aa63df90410b93cfb1625fcc50cb9fe2b639c4ac286faedbaf658a078"
|
||||
"sha256": "67e3ff971d68c41cd42b0e3c7f78f86c65d0da422a2770d2aea060bd61a48749"
|
||||
},
|
||||
"prod-simple-research-phone": {
|
||||
"bundle": "research-map-plus-grid",
|
||||
"sha256": "a393659aa63df90410b93cfb1625fcc50cb9fe2b639c4ac286faedbaf658a078"
|
||||
"sha256": "67e3ff971d68c41cd42b0e3c7f78f86c65d0da422a2770d2aea060bd61a48749"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,6 +97,27 @@ try {
|
|||
else console.log(` ok ?codes=${CODES.join(',')}`.padEnd(34) + `notice "${a.notice}"`)
|
||||
}
|
||||
|
||||
/* 1b — ?groups= names the PEOPLES, where ?codes= names their languages. The reach table's rows
|
||||
count groups, and a language filter drew 55 pins for a 36-group row; this is the filter that
|
||||
makes a row and the map agree, so it is asserted on exact equality, not on "some pins". */
|
||||
const slugs = drawn.filter((r) => r.slug).slice(0, 3).map((r) => r.slug)
|
||||
if (slugs.length < 3) fails.push('fewer than 3 slugs in the roster — the ?groups= arm would pass vacuously')
|
||||
else {
|
||||
const g = await read(page, `?groups=${slugs.join(',')}`)
|
||||
if (!g.mounted) fails.push('?groups: the leaf did not mount')
|
||||
else if (!g.notice) fails.push('?groups: no partner-list notice rendered')
|
||||
else {
|
||||
const n = nums(g.notice)
|
||||
if (n[0] !== slugs.length || n[1] !== total) fails.push(`?groups: notice reads "${g.notice}" — expected ${slugs.length} / ${total}`)
|
||||
else console.log(` ok ?groups=${slugs.join(',').slice(0, 22)}`.padEnd(34) + `notice "${g.notice}"`)
|
||||
}
|
||||
/* A slug nobody has must match NOTHING, not everything — the failure that would quietly turn a
|
||||
partner's 40-group embed into the whole roster. */
|
||||
const none = await read(page, '?groups=not-a-people-anywhere')
|
||||
if (none.mounted && none.notice && nums(none.notice)[0] !== 0) fails.push(`?groups=<unknown>: notice reads "${none.notice}" — an unknown slug must match 0`)
|
||||
else console.log(' ok ?groups=<unknown>'.padEnd(34) + 'matches nothing')
|
||||
}
|
||||
|
||||
/* 2 — a country, with no pin */
|
||||
const b = await read(page, '?country=IND')
|
||||
if (!b.mounted) fails.push('?country: the leaf did not mount')
|
||||
|
|
@ -161,7 +182,7 @@ try {
|
|||
for (const f of fails) console.error(` ${f}`)
|
||||
process.exit(1)
|
||||
}
|
||||
console.log(`EMBED-CONTRACT: PASS — ${matched} of ${total} pins for a three-code link; a country opens from its ISO3 alone and an unknown one is ignored; a province deep-links into the table with its diacritics folded and an unknown one matches nothing; ?view=zero still renders.`)
|
||||
console.log(`EMBED-CONTRACT: PASS — ${matched} of ${total} pins for a three-code link and exactly 3 for a three-SLUG link, with an unknown slug matching none; a country opens from its ISO3 alone and an unknown one is ignored; a province deep-links into the table with its diacritics folded and an unknown one matches nothing; ?view=zero still renders.`)
|
||||
} finally {
|
||||
try { await browser?.close() } catch (_) {}
|
||||
try { srv?.close?.() } catch (_) {}
|
||||
|
|
|
|||
|
|
@ -93,28 +93,20 @@ const run = async (browser, provider, block) => {
|
|||
|
||||
const fails = []
|
||||
|
||||
/* ═══ THE STATIC ARM, AND WHY THE SELF-TEST LIVES HERE ════════════════════════════════════════
|
||||
* The six runtime measurements are the behavioural evidence, but they cannot be made to fail on
|
||||
* demand: with the fallback deleted, planting a substitute engine on the PAGE proves nothing —
|
||||
* the leaf correctly ignores it, so the arms pass and a --poison that expected a failure was
|
||||
* asserting the wrong thing (measured: it reported "this check cannot see the defect", about
|
||||
* itself). The defect is a line of SOURCE, so the falsifiable arm reads the source. */
|
||||
const LEAF_SRC = resolve(HERE, '../plugin-designs/gospel-resources/resources-map.vue')
|
||||
let src = readFileSync(LEAF_SRC, 'utf8')
|
||||
if (POISON) src = src.replace('const gl = engineGlobal(grProvider)\n', 'const gl = engineGlobal(grProvider) || window.mapboxgl\n')
|
||||
/* COMMENTS STRIPPED FIRST. The fix's own comment QUOTES the deleted line — "this used to read
|
||||
`engineGlobal(grProvider) || window.mapboxgl`" — and the first version of this arm read that
|
||||
quotation as the defect, failing the very commit that removed it. A gate that cannot tell code
|
||||
from prose about code will keep flagging the explanation forever. */
|
||||
const code = src.replace(/\/\*[\s\S]*?\*\//g, ' ').replace(/(^|[^:'"\\])\/\/[^\n]*/g, '$1')
|
||||
const BAD = /engineGlobal\([^)]*\)\s*\|\|/
|
||||
if (BAD.test(code)) {
|
||||
fails.push('resources-map.vue falls back from engineGlobal() to another engine global — a page that asked for the keyless engine would silently get the one that needs a token')
|
||||
}
|
||||
/* ⚠ THE STATIC ARM LIVES ELSEWHERE NOW, DELIBERATELY. It used to read this leaf's source for a
|
||||
* cross-engine fallback, and check:no-silent-engine-substitution does that for EVERY plugin. Two
|
||||
* gates owning one source-level rule means this leaf was checked twice while the others were
|
||||
* checked once, and the copy that drifts is always the narrower one. What stays here is the part
|
||||
* no source read can do: the six RUNTIME measurements below.
|
||||
*
|
||||
* ⚠ SO --poison HAS NOTHING TO FALSIFY HERE. With the fallback deleted, planting a substitute
|
||||
* engine on the PAGE proves nothing (the leaf correctly ignores it), which is measured: an earlier
|
||||
* runtime poison reported "this check cannot see the defect" about itself. The falsifiable arm went
|
||||
* with the static check, and this one says so rather than pretending.
|
||||
*/
|
||||
if (POISON) {
|
||||
if (!fails.length) { console.error('ENGINE-CONTRACT --poison: the reintroduced `|| window.mapboxgl` was NOT caught — this check cannot see the defect it exists for.'); process.exit(1) }
|
||||
console.log(`ENGINE-CONTRACT --poison: caught it — ${fails[0]}`)
|
||||
console.log('ENGINE-CONTRACT: SELF-TEST PASS — the static arm fails as designed. The six runtime measurements are not re-run here; they cannot be forced to fail without reintroducing the defect in a built bundle.')
|
||||
console.log('ENGINE-CONTRACT --poison: the falsifiable source arm is check:no-silent-engine, run with --self-test; it owns that rule tree-wide and sits in gates:post as of main 23976fb0.')
|
||||
console.log('ENGINE-CONTRACT: the six runtime measurements cannot be forced to fail without reintroducing the defect in a built bundle.')
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
|
|
@ -152,7 +144,7 @@ try {
|
|||
for (const f of fails) console.error(` ${f}`)
|
||||
process.exit(1)
|
||||
}
|
||||
console.log('ENGINE-CONTRACT: PASS — the source keeps no cross-engine fallback, and 2 providers x 3 load states: the engine asked for or a named failure, never a substitute.')
|
||||
console.log('ENGINE-CONTRACT: PASS — 2 providers x 3 load states: the engine asked for or a named failure, never a substitute.')
|
||||
} finally {
|
||||
try { await browser?.close() } catch (_) {}
|
||||
try { srv?.close?.() } catch (_) {}
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@
|
|||
"check:embed-contract": "node internal/check-gospel-embed-contract.mjs",
|
||||
"check:engine-contract": "node internal/check-gospel-engine-contract.mjs",
|
||||
"check:link-coverage": "node internal/check-link-verification-coverage.mjs",
|
||||
"gospel:bridge-reach": "node plugin-designs/gospel-resources/scripts/build-bridge-reach-table.mjs",
|
||||
"check:link-coverage:poison": "node internal/check-link-verification-coverage.mjs --poison",
|
||||
"check:engine-contract:poison": "node internal/check-gospel-engine-contract.mjs --poison",
|
||||
"check:embed-contract:poison": "node internal/check-gospel-embed-contract.mjs --poison",
|
||||
|
|
@ -417,10 +418,10 @@
|
|||
"check:shot-fidelity": "warns when THIS machine cannot RENDER what the shots must SHOW. `bun run shots` printed 13x OK while every emoji rendered as a tofu box — a glyph fallback loads perfectly (0 console errors, 0 HTTP>=400), so the generator cannot see it. Reports by default; the `check:shot-fidelity:strict` script to block once an emoji font is installed.",
|
||||
"check:shot-fonts": "can THIS machine render the emoji the UI uses? Run BEFORE `bun run shots` — no font = tofu boxes in every committed PNG, which every other shot gate passes. Deliberately NOT in build:unlocked: it reports an ENVIRONMENT condition (this box has no emoji font), and a gate that always fails in the build makes the build useless.",
|
||||
"check:shots": "a README screenshot that predates the bundle it shows is a picture telling a lie — and it looks IDENTICAL to a current one. Compares each shot's PNG against the BUILT BUNDLE it renders (not raw sources: an unbuilt edit is not yet in any leaf). Fix: node internal/readme-shots.mjs",
|
||||
"check:studio-rail": "the Plugin Studio rail is laid out like plugin-designs/: one folder per bundle with its elements inside, bundles in the section of their highest capability (5 \u2192 1) and in name order, one canonical node per plugin. Runs the studio's real rail code on the built manifest, headless.",
|
||||
"check:translator-contacts": "the credit line LINKS the translating organisation now, and a contact URL is a link this map stands behind. Reads ALLOWED_CONTACT out of internal/verify-gospel-map.mjs rather than restating it (two copies of an allowlist drift, and the drifting copy is the one nobody reads), then asserts every cr.u is on that list, was recorded `verified` by a real fetch, is never also serving a RESOURCE (wycliffe.org is somewhere to write to, not a publisher this map reads text from), and is actually RENDERED as an anchor \u2014 the data can carry 838 URLs while the template shows none. Static, sub-second. Self-test: `bun run check:translator-contacts:poison`.",
|
||||
"check:embed-contract": "the map's URL is a PUBLIC INTERFACE: a partner embeds ?codes=<iso3 list>, ?country=<ISO3> or ?view=zero in an iframe and never touches it again. A refactor breaks those links SILENTLY \u2014 the leaf still mounts, renders and logs no errors, it just shows the whole world to a church that asked for its forty groups. Asserts through the reader's eyes (the partner-list notice's two numbers), with both numbers and the probe codes derived from the roster the leaf itself reads, never typed in. Browser gate; needs no server of its own. Self-test: `bun run check:embed-contract:poison`.",
|
||||
"check:engine-contract": "the map must use the engine it was ASKED for or fail VISIBLY \u2014 never a substitute. resources-map read `engineGlobal(provider) || window.mapboxgl`; engineGlobal already defaults to mapbox, so that could only fire for provider 'maplibre' and then returned MAPBOX \u2014 a keyless page silently handed the engine that needs a token, which the profile then does not give it, so its tiles 401. Invisible to every other gate: the leaf mounts, renders and logs nothing. Six runtime measurements (2 providers x engine present / blocked / both blocked, CDN blocked by request routing the way a proxy or an offline kiosk does) plus a static arm on the source, comments stripped so the fix's own quotation of the deleted line is not read as the defect. Mapbox arms inject a dummy MAP_TOKEN, because without one the element never mounts on a static tree and that is the environment, not the product. Engine attribution is read off the canvas class, not a debug handle. Browser gate. Self-test: `bun run check:engine-contract:poison`.",
|
||||
"check:studio-rail": "the Plugin Studio rail is laid out like plugin-designs/: one folder per bundle with its elements inside, bundles in the section of their highest capability (5 → 1) and in name order, one canonical node per plugin. Runs the studio's real rail code on the built manifest, headless.",
|
||||
"check:translator-contacts": "the credit line LINKS the translating organisation now, and a contact URL is a link this map stands behind. Reads ALLOWED_CONTACT out of internal/verify-gospel-map.mjs rather than restating it (two copies of an allowlist drift, and the drifting copy is the one nobody reads), then asserts every cr.u is on that list, was recorded `verified` by a real fetch, is never also serving a RESOURCE (wycliffe.org is somewhere to write to, not a publisher this map reads text from), and is actually RENDERED as an anchor — the data can carry 838 URLs while the template shows none. Static, sub-second. Self-test: `bun run check:translator-contacts:poison`.",
|
||||
"check:embed-contract": "the map's URL is a PUBLIC INTERFACE: a partner embeds ?codes=<iso3 list>, ?country=<ISO3> or ?view=zero in an iframe and never touches it again. A refactor breaks those links SILENTLY — the leaf still mounts, renders and logs no errors, it just shows the whole world to a church that asked for its forty groups. Asserts through the reader's eyes (the partner-list notice's two numbers), with both numbers and the probe codes derived from the roster the leaf itself reads, never typed in. Browser gate; needs no server of its own. Self-test: `bun run check:embed-contract:poison`.",
|
||||
"check:engine-contract": "the map must use the engine it was ASKED for or fail VISIBLY — never a substitute. resources-map read `engineGlobal(provider) || window.mapboxgl`; engineGlobal already defaults to mapbox, so that could only fire for provider 'maplibre' and then returned MAPBOX — a keyless page silently handed the engine that needs a token, which the profile then does not give it, so its tiles 401. Invisible to every other gate: the leaf mounts, renders and logs nothing. Six runtime measurements (2 providers x engine present / blocked / both blocked, CDN blocked by request routing the way a proxy or an offline kiosk does) The static arm was DELETED once check:no-silent-engine went into gates:post (main 23976fb0): two gates owning one source rule meant this leaf was checked twice and every other leaf once, and the narrower copy is the one that drifts. Mapbox arms inject a dummy MAP_TOKEN, because without one the element never mounts on a static tree and that is the environment, not the product. Engine attribution is read off the canvas class, not a debug handle. Browser gate. --poison names where the falsifiable source arm went rather than pretending to have one; the tree-wide gate self-tests with --self-test, not --poison.",
|
||||
"check:link-coverage": "rule 4 of the brief — 'verify a URL resolves before shipping it' — as a gate instead of a habit. verify-gospel-links.mjs does the verifying; nothing asserted the record COVERS what is shipped, so the honest state of the corpus was a number someone had to go and measure. DISCOVERS the URLs by recursing the pin index for any http string rather than naming fields: every field list in this bundle has gone stale (ga and se shipped unscreened, the SUN block and the access table were each added after the fact), and the recursion found 16 links my own hand-rolled measurement had missed. Resolves each against THREE records — the verification table, translator-org-links.json (contacts, fetched by their own script) and sun-deaf-index.json (proved by content against a catch-all control, which is stronger than a status code) — and fails on any unrecorded link, any shipped link recorded BROKEN, and any 'unknown' on a target a status code CAN prove. The status-blind list holds one URL SHAPE, not a host: jesusfilm.org/watch/jesus/<slug> discriminates and 2,049 links depend on that, while /watch/?languageId= does not. Static, sub-second. Self-test: `bun run check:link-coverage:poison`.",
|
||||
"check:snapshot-guard": "every gospel-resources catalogue fetcher must write through scripts/_snapshot-guard.mjs, which refuses a write that loses more than a tenth of the previous snapshot. Written after a rate-limited FCBH run silently replaced 1,666 video scopes with 1,103. Static, sub-second. Self-test: `bun run check:snapshot-guard:poison` injects a raw write and the check must fail on it.",
|
||||
"check:spa-tab-order": "the cap-5 SPA must open on Big Picture and keep the agent's order (Big Picture, UPG-100, Prayer Progress, Gospel Resources) — asserted as PRESENCE + tab-1 + RELATIVE order on the RENDERED rail, because the rail gained three sections and now renders 12 rows with others between them. ⚠ NOT WAVE-WIRED: it FAILS rather than skips when the SPA is unreachable, deliberately (\"a gate that cannot reach its subject has not passed, it has not run\") — correct standalone, but gates:post runs on checkouts with no server. Needs `bun run serve` on 4173.",
|
||||
|
|
|
|||
|
|
@ -230,10 +230,25 @@ const partial = computed(() => {
|
|||
const ck = new Set(poolSets.value.ck.map(bare))
|
||||
return poolSets.value.un.map(bare).filter((x) => ck.has(x))
|
||||
})
|
||||
/* ⚠ "STILL RUNNING" WAS TRUE AND MISLEADING, WHICH IS THE WORSE KIND OF SENTENCE. It is measured
|
||||
by check:no-stale-sweep-claim, which SKIPS rather than fails because a code really is undecided —
|
||||
and the number it skips on is ONE code out of 1,184. A reader who sees "the sweep is still
|
||||
running" discounts the whole audio column on the strength of 0.08%. So the proportion is stated,
|
||||
from counts the pin index now publishes and the gate counts the same way; and when the last code
|
||||
is decided the pool stops being described as partial at all, which is the behaviour the gate
|
||||
then demands rather than something anyone has to remember. */
|
||||
const grnLeft = computed(() => {
|
||||
const c = tables.value.pins?.counts || {}
|
||||
return { pending: c.grnPending ?? null, of: c.grnGapCodes ?? null }
|
||||
})
|
||||
const checkedPools = computed(() => {
|
||||
const part = new Set(partial.value)
|
||||
const { pending, of } = grnLeft.value
|
||||
/* Nothing left to check: it is simply a checked pool, however the code fields still read. */
|
||||
const part = new Set(pending === 0 ? [] : partial.value)
|
||||
const full = poolSets.value.ck.filter((x) => !part.has(bare(x)))
|
||||
const partTxt = partial.value.map((x) => `${x} (partly — the sweep is still running)`)
|
||||
const partTxt = [...part].map((x) => (pending && of
|
||||
? `${x} (partly — ${pending.toLocaleString()} of ${of.toLocaleString()} still to check)`
|
||||
: `${x} (partly)`))
|
||||
return [...full, ...partTxt].join(', ') || 'unknown'
|
||||
})
|
||||
const uncheckedPools = computed(() => {
|
||||
|
|
|
|||
|
|
@ -96,7 +96,23 @@ const TABS = [
|
|||
// province its map point falls in, and a point is one dot for a people that may live across
|
||||
// several. It is the same file the map's province sheet reads, so the two cannot disagree.
|
||||
{ id: 'province', labelKey: 'gospel.tables.t_province', file: 'gospel-by-province' },
|
||||
// THE INVERSE QUESTION, and nothing else here asks it. Every other tab answers "who has
|
||||
// nothing" and then, group by group, "what is the way in for this one". A mobiliser with a
|
||||
// budget asks: if I resource ONE language, how many peoples does that reach? 35 rows cover all
|
||||
// 369 groups with nothing — SUN is the way in for 93 Deaf groups across 93 countries, Mandarin
|
||||
// for 36, Akha for 33. Same data as the group-by-group answer, turned around.
|
||||
{ id: 'bridgereach', labelKey: 'gospel.tables.t_bridgereach', file: 'bridge-language-reach',
|
||||
en: 'One Language, How Many Peoples' },
|
||||
]
|
||||
|
||||
/* A LABEL THAT IS MISSING MUST NOT RENDER AS ITS KEY. tr() falls back to the shipped English
|
||||
catalogue and then to the key itself, which on a TAB reads "gospel.tables.t_bridgereach" —
|
||||
worse than the English it replaced. A tab may carry its own English until its key lands, and
|
||||
switches to the catalogue the moment it does, with no second change here. */
|
||||
const tabLabel = (t) => {
|
||||
const v = tr(t.labelKey)
|
||||
return v && v !== t.labelKey ? v : (t.en || t.labelKey)
|
||||
}
|
||||
// DEEP-LINK FILTER. The map and this table are separate PAGES, so "click a pin and the
|
||||
// table follows" is a URL, not shared state. The map links here with ?tab=links&iso=<code>
|
||||
// or &country=<ISO3>, and the rows are filtered HERE rather than by teaching the shared
|
||||
|
|
@ -201,8 +217,18 @@ const table = computed(() => {
|
|||
return out
|
||||
})
|
||||
}
|
||||
/* ⚠ TWO PATHS, AND THE FIRST VERSION OF THIS FIX ONLY TOOK THE SECOND. The unfiltered table
|
||||
returns through localise() and the filtered one builds its own object; I added the title
|
||||
lookup to the filtered path and measured the bug on an UNFILTERED table, which would have
|
||||
shipped a fix for the state a reader is rarely in. One resolver, called from both. */
|
||||
const localTitle = (tbl) => {
|
||||
const id = current.value?.id
|
||||
const v = id ? tr('gospel.tableTitles.' + id) : ''
|
||||
return v && !v.startsWith('gospel.tableTitles.') ? v : tbl?.meta?.title
|
||||
}
|
||||
const localise = (tbl) => ({
|
||||
...tbl,
|
||||
meta: { ...tbl.meta, title: localTitle(tbl) },
|
||||
columns: (tbl.columns || []).map((c) => {
|
||||
const k = 'gospel.columns.' + String(c.title || '')
|
||||
const v = tr(k)
|
||||
|
|
@ -236,8 +262,19 @@ const table = computed(() => {
|
|||
* already made — that component has other consumers and none of them need this — and it
|
||||
* fixes the on-screen heading in the same move: it read "every link, and who it reaches"
|
||||
* over a table showing one country's. */
|
||||
const title = t.meta?.title
|
||||
? `${t.meta.title} — ${fLabel.value || fProvince.value || fIso.value || fCountry.value}`
|
||||
/* ═══ AND THE TITLE ITSELF WAS NEVER LOCALISED ════════════════════════════════════════
|
||||
* Measured at ?lang=ar: the tabs render in Arabic and then the heading above the table reads
|
||||
* "Gospel Resources — every link, and who it reaches" in English, over English column headers.
|
||||
* The headers have had a lookup since cell E; the TITLE had none at all, so it came straight
|
||||
* out of the data file in every locale.
|
||||
*
|
||||
* Keyed by the tab's ID rather than by its English text, unlike the columns: a title is a
|
||||
* sentence, and keying 'gospel.tableTitles.Gospel Resources — every link, and who it reaches'
|
||||
* would break the day a builder rewords its own meta. The English stays the fallback, so this
|
||||
* renders exactly what it renders today until each key lands. */
|
||||
const base = localTitle(t)
|
||||
const title = base
|
||||
? `${base} — ${fLabel.value || fProvince.value || fIso.value || fCountry.value}`
|
||||
: t.meta?.title
|
||||
/* ═══ COLUMN HEADERS ARE CHROME, BUT THEY LIVE IN THE DATA FILE ══════════════════════
|
||||
* A reader navigates a table by its headers, so they are UI strings by any fair reading of
|
||||
|
|
@ -362,7 +399,7 @@ useShadowStyles(
|
|||
<div class="gt-tabs">
|
||||
<button v-for="t in TABS" :key="t.id" type="button"
|
||||
class="gt-tab" :class="{ on: active === t.id }" @click="active = t.id">
|
||||
{{ tr(t.labelKey) }}<span class="gt-n" v-if="cache[t.file]">{{ (cache[t.file].rows || []).length.toLocaleString() }}</span>
|
||||
{{ tabLabel(t) }}<span class="gt-n" v-if="cache[t.file]">{{ (cache[t.file].rows || []).length.toLocaleString() }}</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ const linkVerify = ref(null)
|
|||
const pgLoading = ref(false)
|
||||
const pgErr = ref(null)
|
||||
const selectedGroup = ref(null) // set = the people-group detail is showing
|
||||
const pinRows = shallowRef([]) // [name, lat, lng, iso3, code, population, tier]
|
||||
const pinRows = shallowRef([]) // [name, lat, lng, iso3, code, population, tier, slug]
|
||||
const doxaTotal = ref(0) // every group on Doxa's roster, placed or not
|
||||
const doxaUnplaced = ref(0) // on the roster, no coordinates in this build yet
|
||||
const doxaByCountry = shallowRef({})
|
||||
|
|
@ -323,15 +323,42 @@ const canHear = (c) =>
|
|||
* an empty map reading "0 / 12,379", which is the truth about that link — showing the full map
|
||||
* instead would tell a partner their broken list works.
|
||||
*/
|
||||
/* ═══ TWO NUMBERS THAT WERE TYPED INTO A SENTENCE ═════════════════════════════════════════════
|
||||
* The folded explainer says "106 of these 175 countries hold one or two groups" to justify why a
|
||||
* country shows a COUNT and never a percentage. Audited today: both were exactly right. They were
|
||||
* also typed in, which is how every stale claim I have fixed this flight began — so they are
|
||||
* derived from the same pins the map draws, and the sentence cannot outlive the data. */
|
||||
const countryScale = computed(() => {
|
||||
const per = new Map()
|
||||
for (const r of pinRows.value) per.set(r[3], (per.get(r[3]) || 0) + 1)
|
||||
let small = 0
|
||||
for (const n of per.values()) if (n <= 2) small++
|
||||
return { countries: per.size, small }
|
||||
})
|
||||
|
||||
const linkCodes = (() => {
|
||||
try {
|
||||
const raw = new URLSearchParams(window.location.search).get('codes') || ''
|
||||
return new Set(raw.split(',').map((c) => c.trim().toLowerCase()).filter((c) => /^[a-z]{3}$/.test(c)))
|
||||
} catch { return new Set() }
|
||||
})()
|
||||
const linkActive = ref(linkCodes.size > 0)
|
||||
/* ═══ ?groups= — THESE PEOPLES, NOT THE LANGUAGES THEY SPEAK ══════════════════════════════════
|
||||
* ?codes= answers "show me these languages", which is what a partner's list usually is. It is the
|
||||
* WRONG filter for a list of peoples, and the reach table measured the gap: its Mandarin row counts
|
||||
* 36 groups, those 36 speak 30 codes, and 55 Doxa groups speak those 30 — so a ?codes= link from a
|
||||
* 36-group row drew 55 pins. The extra groups are real and also have nothing; they simply belong to
|
||||
* a different row. Naming the peoples by slug makes the row and the map agree exactly.
|
||||
* The slug is doxa.life's own, carried from the roster, so nothing here invents an identifier. */
|
||||
const linkSlugs = (() => {
|
||||
try {
|
||||
const raw = new URLSearchParams(window.location.search).get('groups') || ''
|
||||
return new Set(raw.split(',').map((c) => c.trim().toLowerCase()).filter(Boolean))
|
||||
} catch { return new Set() }
|
||||
})()
|
||||
const linkActive = ref(linkCodes.size > 0 || linkSlugs.size > 0)
|
||||
const inLinkList = (r) => (linkSlugs.size ? linkSlugs.has(r[7]) : linkCodes.has(r[4]))
|
||||
const linkMatched = computed(() => (linkActive.value
|
||||
? pinRows.value.reduce((n, r) => n + (linkCodes.has(r[4]) ? 1 : 0), 0)
|
||||
? pinRows.value.reduce((n, r) => n + (inLinkList(r) ? 1 : 0), 0)
|
||||
: 0))
|
||||
|
||||
/* THE WAY BACK. A reader who arrives on a partner's embed is looking at somebody else's forty
|
||||
|
|
@ -1160,8 +1187,10 @@ async function load() {
|
|||
const tierByCode = pinData.tiers || {}
|
||||
pinRows.value = roster
|
||||
.filter((r) => r.mapped && r.lat != null && r.lng != null)
|
||||
/* [7] is the SLUG, carried so a link can name these peoples exactly rather than naming the
|
||||
languages they speak. It costs nothing: the roster already has it, from doxa.life. */
|
||||
.map((r) => [r.name, r.lat, r.lng, r.iso3, r.iso639_3 || '', r.population || 0,
|
||||
tierByCode[r.iso639_3] ?? r.tier ?? 0])
|
||||
tierByCode[r.iso639_3] ?? r.tier ?? 0, r.slug || ''])
|
||||
pinCount.value = pinRows.value.length
|
||||
doxaUnplaced.value = doxaTotal.value - pinCount.value
|
||||
|
||||
|
|
@ -1337,7 +1366,7 @@ function pinFC() {
|
|||
type: 'Feature',
|
||||
// hnr is baked so the filter stays a GL-side predicate like the others: recomputing it
|
||||
// per toggle would re-upload 12,379 features to answer a yes/no already known here.
|
||||
properties: { i, tier: p[6], color: PIN_COLOR[p[6]], rim: PIN_RIM[p[6]], hnr: hnrFor(p[4]), lc: linkCodes.has(p[4]) },
|
||||
properties: { i, tier: p[6], color: PIN_COLOR[p[6]], rim: PIN_RIM[p[6]], hnr: hnrFor(p[4]), lc: inLinkList(p) },
|
||||
geometry: { type: 'Point', coordinates: [p[2], p[1]] },
|
||||
}
|
||||
}
|
||||
|
|
@ -1618,7 +1647,7 @@ onMounted(async () => {
|
|||
/* The link clause lives in setPinFilter, and nothing has called it yet at first paint —
|
||||
so without this the partner's list would be baked into the features and ignored. */
|
||||
if (linkActive.value) setPinFilter(pinFilter.value)
|
||||
fitToPins(map, linkActive.value ? (r) => linkCodes.has(r[4]) : null)
|
||||
fitToPins(map, linkActive.value ? inLinkList : null)
|
||||
openFromUrl()
|
||||
}
|
||||
if (typeof map.isStyleLoaded === 'function' && map.isStyleLoaded()) draw()
|
||||
|
|
@ -1970,7 +1999,23 @@ useShadowStyles(
|
|||
'.gm-back{border:1px solid rgba(0,0,0,.16);background:transparent;color:inherit;' +
|
||||
'font:600 11px inherit;padding:5px 11px;border-radius:8px;cursor:pointer;min-height:30px}' +
|
||||
'.is-dark .gm-back{border-color:rgba(255,255,255,.22)}' +
|
||||
'.gm-more{font-size:14px;opacity:.66;margin-top:2px}',
|
||||
'.gm-more{font-size:14px;opacity:.66;margin-top:2px}' +
|
||||
/* ═══ THUMB-SIZED ON A PHONE, MEASURED AT 390x844 ═══════════════════════════════════════════
|
||||
* The Gap / Resources toggle rendered 48x26 and 129x26, and the legend's fold button 316x32.
|
||||
* WCAG 2.5.8 puts the AA floor at 24x24, so none of these FAILED — they were simply small for a
|
||||
* thumb on a map that is mostly drag and pinch, where a missed tap pans the map instead. 44px is
|
||||
* the comfortable target, and it costs nothing here: the legend is 124px of an 844px screen after
|
||||
* the fold, so there is room. Narrow screens only — on a desktop these sit in a 290px card beside
|
||||
* a pointer and 26px is the right density there.
|
||||
*
|
||||
* ⚠ AND IT MUST COME LAST. Written above .gm-mode's own rule it changed the font size and nothing
|
||||
* else: a media query adds NO specificity, and that rule sets min-height:26px, so the later plain
|
||||
* selector won. Measured by reading the computed style — min-height resolved to 26px while my
|
||||
* font-size had applied, which is what told me the rule was live and merely losing. */
|
||||
'@media(max-width:699px){' +
|
||||
'.gm-mode{min-height:44px;padding:0 14px;font-size:12px}' +
|
||||
'.gm-fold{min-height:44px;font-size:12px}' +
|
||||
'}',
|
||||
'doxa-gospel-map',
|
||||
)
|
||||
</script>
|
||||
|
|
@ -2161,8 +2206,9 @@ useShadowStyles(
|
|||
<span dir="ltr">A way in is not the gospel in someone's own language; the gap it is
|
||||
counted against is unchanged by it.</span>
|
||||
<span dir="ltr"> A country is a COUNT of those groups — how many of
|
||||
Doxa's are there with nothing found — never a percentage: 106 of these 175 countries hold
|
||||
one or two groups, and a share over a denominator of two says nothing. A country Doxa does
|
||||
Doxa's are there with nothing found — never a percentage: {{ fmt(countryScale.small) }} of
|
||||
these {{ fmt(countryScale.countries) }} countries hold one or two groups, and a share over a
|
||||
denominator of two says nothing. A country Doxa does
|
||||
not work is left UNCOLOURED rather than drawn as covered, because this dataset has no
|
||||
finding about it either way.</span>
|
||||
<span dir="ltr">The pools checked are eBible, PNG.Bible, JESUS Film, Door43,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,164 @@
|
|||
/**
|
||||
* build-bridge-reach-table.mjs — how far does ONE language reach?
|
||||
*
|
||||
* WHY THIS TABLE EXISTS. Every other surface here answers "who has nothing" and then, group by
|
||||
* group, "what is the way in for THIS one". A mobiliser with a budget is asking the inverse
|
||||
* question and had nowhere to ask it: if I resource ONE language, how many peoples does that
|
||||
* reach? Measured over the 369 groups with nothing of their own, the answer is that THIRTY-TWO
|
||||
* languages cover all of them — SUN alone is the way in for 93 Deaf groups across 93 countries,
|
||||
* Mandarin for 36, Indonesian for 28, Akha for 33. That is a different shape of decision from a
|
||||
* list of 369, and it is the one a sending church or a translation agency actually makes.
|
||||
*
|
||||
* ⚠ A WAY IN IS NOT THE GOSPEL IN SOMEONE'S OWN LANGUAGE, and aggregating makes that easier to
|
||||
* forget, not harder. Every row says so: the groups counted here still have NOTHING of their own,
|
||||
* and this table ranks the second-best answer. It is a bridge, and the word travels with it.
|
||||
*
|
||||
* ⚠ THREE KINDS OF WAY IN, COUNTED APART. A CURATED bridge is a language the analysis has checked
|
||||
* for those groups; a CANDIDATE is computed from published CLDR data about what a country speaks,
|
||||
* which is a fact about the country and not about these people; SIGNED is SUN, which is a
|
||||
* constructed signed language and has to be learned. Summing them into one "reach" number would
|
||||
* flatten a checked answer into a plausible one.
|
||||
*
|
||||
* No new link enters the map here: the resources shown for a bridge language are the ones the pin
|
||||
* index already carries for that ISO code, which the verification record has already proved.
|
||||
*/
|
||||
import { readFileSync } from 'node:fs'
|
||||
import { resolve, dirname } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import { writeSnapshot } from './_snapshot-guard.mjs'
|
||||
|
||||
const HERE = dirname(fileURLToPath(import.meta.url))
|
||||
const REPO = resolve(HERE, '../../..')
|
||||
const OUT = resolve(REPO, 'data/tables/bridge-language-reach.json')
|
||||
const T = (f) => JSON.parse(readFileSync(resolve(REPO, 'data/tables', f), 'utf8'))
|
||||
|
||||
const access = T('doxa-gospel-access.json').rows || []
|
||||
const pins = T('people-group-pins.json')
|
||||
const codes = pins.codes || {}
|
||||
const sun = pins.sun || {}
|
||||
|
||||
const zero = access.filter((r) => r.access === 'nothing found')
|
||||
if (zero.length < 100) {
|
||||
console.error(`BRIDGE-REACH: REFUSING TO WRITE — only ${zero.length} group(s) with nothing found; the access table changed shape.`)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const agg = new Map()
|
||||
let noWayIn = 0
|
||||
for (const r of zero) {
|
||||
/* The SAME precedence every other surface uses: a curated bridge outranks a computed candidate,
|
||||
and a Deaf group is never offered a spoken one. */
|
||||
let code, name, kind
|
||||
if (r.bridge_iso639_3) { code = r.bridge_iso639_3; name = r.bridge_language; kind = 'curated' }
|
||||
else if (r.bridge_candidate_iso) { code = r.bridge_candidate_iso; name = r.bridge_candidate; kind = 'candidate' }
|
||||
else if (r.deaf_bridge) { code = 'SUN'; name = r.deaf_bridge; kind = 'signed' }
|
||||
else { noWayIn++; continue }
|
||||
const key = `${kind}|${code}`
|
||||
if (!agg.has(key)) agg.set(key, { code, language: name, kind, groups: 0, people: 0, countries: new Set(), nobody_praying: 0, biggest: [], reached: new Set(), slugs: new Set() })
|
||||
const a = agg.get(key)
|
||||
a.groups++
|
||||
a.people += r.population || 0
|
||||
a.countries.add(r.country)
|
||||
if (!(r.people_praying || 0)) a.nobody_praying++
|
||||
a.biggest.push([r.population || 0, r.people_group])
|
||||
/* The OWN languages of the groups this bridge reaches — the map's ?codes= filter joins on
|
||||
exactly that, so the row can put those peoples on the map instead of describing them. */
|
||||
if (/^[a-z]{3}$/.test(String(r.iso639_3 || ''))) a.reached.add(r.iso639_3)
|
||||
/* The PEOPLES themselves, by doxa.life's slug — what ?groups= takes. The access table has no
|
||||
slug column, so it is read off the prayer URL, which doxa.life's own API built from that slug.
|
||||
Measured before relying on it: all 369 of these rows carry a pray_url. Never constructed from
|
||||
the name — a slug this build invented could name somebody else's people. */
|
||||
const slug = String(r.pray_url || '').split('/').pop().split('?')[0]
|
||||
if (slug) a.slugs.add(slug)
|
||||
}
|
||||
|
||||
const c = (code) => codes[code] || {}
|
||||
/* How many Doxa groups the map will actually draw for a set of language codes — counted from the
|
||||
same pin rows the map draws, so this number cannot drift from what the reader sees. */
|
||||
const pinRows = pins.pins || []
|
||||
const allByCode = (set) => pinRows.reduce((n, p) => n + (set.has(p[4]) ? 1 : 0), 0)
|
||||
const rows = [...agg.values()].map((a) => ({
|
||||
language: a.language,
|
||||
iso639_3: a.code === 'SUN' ? '' : a.code,
|
||||
way_in: a.kind === 'curated' ? 'bridge — checked for these groups'
|
||||
: a.kind === 'candidate' ? 'bridge — computed from what the country speaks'
|
||||
: 'bridge — a constructed signed language, learned',
|
||||
groups_with_nothing: a.groups,
|
||||
people_with_nothing: a.people,
|
||||
countries: a.countries.size,
|
||||
nobody_praying: a.nobody_praying,
|
||||
largest: a.biggest.sort((x, y) => y[0] - x[0]).slice(0, 3).map(([, n]) => n).join('; '),
|
||||
/* The bridge's OWN resources, from the index, so a reader can act in one click rather than
|
||||
going to look the language up. SUN's are the ones its own verified block carries. */
|
||||
scripture_url: a.code === 'SUN' ? (sun.scripture?.u || '') : (c(a.code).s || ''),
|
||||
film_url: a.code === 'SUN' ? '' : (c(a.code).f || ''),
|
||||
training_url: a.code === 'SUN' ? '' : (c(a.code).z || ''),
|
||||
still_nothing_of_their_own: true,
|
||||
/* ═══ FROM THE TABLE BACK TO THE MAP, EXACTLY THESE PEOPLES ════════════════════════════════
|
||||
* First written with ?codes=, which filters by LANGUAGE, and it contradicted its own row:
|
||||
* Mandarin's 36 groups speak 30 codes and 55 Doxa groups speak those 30, so a 36-group row drew
|
||||
* 55 pins (Akha 33 drew 57, SUN 93 drew 116). The extra groups are real and also have nothing —
|
||||
* they belong to a different row. Rather than relabel the column to excuse the mismatch, the map
|
||||
* learned ?groups=, which names the peoples by doxa.life's own slug. Row and map now agree by
|
||||
* construction, and `map_shows_groups` is computed from the same roster the map draws so the
|
||||
* claim stays falsifiable rather than assumed.
|
||||
*
|
||||
* The field is named *_url because that is what makes DataTable render it as a link — a naming
|
||||
* convention, not a type declaration, worth knowing before renaming it. */
|
||||
map_url: a.slugs.size ? `../resources-map/index.html?groups=${[...a.slugs].sort().join(',')}` : '',
|
||||
their_languages: a.reached.size,
|
||||
map_shows_groups: a.slugs.size,
|
||||
})).sort((x, y) => y.people_with_nothing - x.people_with_nothing)
|
||||
|
||||
if (noWayIn) console.log(`note: ${noWayIn} group(s) with nothing have no way in recorded — they are absent from this table, not counted as zero`)
|
||||
|
||||
writeSnapshot(
|
||||
OUT,
|
||||
`${JSON.stringify({
|
||||
meta: {
|
||||
title: 'One language, how many peoples — the way in, ranked by reach',
|
||||
why: 'Every other surface answers "what is the way in for THIS group". A mobiliser with a ' +
|
||||
'budget asks the inverse: if I resource ONE language, how many peoples does it reach? ' +
|
||||
`${rows.length} languages are the way in to all ${zero.length} groups with nothing of their own.`,
|
||||
generated: new Date().toISOString().slice(0, 10),
|
||||
grain: 'one row per (way-in kind, language); a language offered both as a checked bridge and as a computed candidate appears once per kind, because those are different claims',
|
||||
groups_with_nothing: zero.length,
|
||||
groups_with_no_way_in: noWayIn,
|
||||
a_bridge_is_not_their_own_language: 'Every group counted here still has NOTHING in its own ' +
|
||||
'language. This table ranks the second-best answer, and the word bridge travels with every row.',
|
||||
three_kinds: 'CURATED — checked for those groups. CANDIDATE — computed from published CLDR ' +
|
||||
'data about what the country speaks, which is a fact about the country and not about these ' +
|
||||
'people. SIGNED — SUN, a constructed signed language that has to be learned. Never summed.',
|
||||
the_map_link_names_the_peoples: 'The link uses ?groups=<slug list>, which filters the map by ' +
|
||||
'PEOPLE GROUP, so it shows exactly the groups this row counts. Written first with ?codes=, ' +
|
||||
'which filters by language, it drew 55 pins for Mandarin\'s 36-group row and 57 for Akha\'s ' +
|
||||
'33 — those extra groups also have nothing but belong to a different row. The map gained the ' +
|
||||
'per-group filter rather than the column gaining an excuse.',
|
||||
links: 'No new link enters the map here. A bridge language\'s resources are the ones the pin ' +
|
||||
'index already carries for that ISO code, already proved by the verification record.',
|
||||
},
|
||||
columns: [
|
||||
{ title: 'Language', field: 'language', type: 'string' },
|
||||
{ title: 'Code', field: 'iso639_3', type: 'string' },
|
||||
{ title: 'Kind of way in', field: 'way_in', type: 'string' },
|
||||
{ title: 'Groups with nothing', field: 'groups_with_nothing', type: 'number' },
|
||||
{ title: 'People with nothing', field: 'people_with_nothing', type: 'number' },
|
||||
{ title: 'Countries', field: 'countries', type: 'number' },
|
||||
{ title: 'Nobody praying', field: 'nobody_praying', type: 'number' },
|
||||
{ title: 'Largest groups', field: 'largest', type: 'string' },
|
||||
{ title: 'Scripture in this language', field: 'scripture_url', type: 'link' },
|
||||
{ title: 'Film in this language', field: 'film_url', type: 'link' },
|
||||
{ title: 'Training', field: 'training_url', type: 'link' },
|
||||
{ title: 'Languages they speak', field: 'their_languages', type: 'number' },
|
||||
{ title: 'Groups the map link shows', field: 'map_shows_groups', type: 'number' },
|
||||
{ title: 'These peoples on the map', field: 'map_url', type: 'link' },
|
||||
],
|
||||
rows,
|
||||
}, null, 1)}\n`,
|
||||
(j) => (j.rows || []).length,
|
||||
'bridge language row(s)',
|
||||
)
|
||||
console.log(`bridge-language-reach: ${rows.length} language(s) reach ${zero.length} group(s) with nothing`)
|
||||
console.log(` by kind: ${['curated', 'candidate', 'signed'].map((k) => `${k} ${rows.filter((r) => r.way_in.includes(k === 'curated' ? 'checked for' : k === 'candidate' ? 'computed' : 'signed')).length}`).join(', ')}`)
|
||||
console.log(` widest: ${rows.slice(0, 3).map((r) => `${r.language} ${r.groups_with_nothing} groups / ${r.people_with_nothing.toLocaleString('en-US')} people`).join(' | ')}`)
|
||||
console.log(`wrote ${OUT}`)
|
||||
|
|
@ -104,13 +104,42 @@ const prayKey = (name, iso3) =>
|
|||
does not draw. gb-IND-ADM1-full.geojson is the complete ADM1 (36 states, geoBoundaries via
|
||||
DataMeet India, CC BY 2.5 IN). A partition of somebody else's list is not a country's states,
|
||||
even when the filename looks like it is. */
|
||||
/* ⚠ THE WEB-SIZED GEOMETRY, BECAUSE THE MAP DRAWS THAT ONE. f728831d switched the interactive
|
||||
maps to the -web boundaries (232 KB against 1.84 MB, which matters on a leaf meant for thousands
|
||||
of embeds), and this builder kept reading the full-precision file — so the map would have drawn
|
||||
provinces from one outline while the table counted them from another. My own staged-assets gate
|
||||
caught it on the merge, which is what it was written for.
|
||||
Measured before following: same 36 states, same names, 0 groups move province, 0 dropped, and 2
|
||||
GAINED — Great Andamanese and the Sentinelese, whose points fell just outside the detailed island
|
||||
coastline, land inside Andaman and Nicobar on the simplified one. A coarser outline is not a
|
||||
worse answer here; it is a more forgiving one at the scale a coordinate is honest to. */
|
||||
const COUNTRIES = [
|
||||
{ iso3: 'IND', file: 'gb-IND-ADM1-full.geojson', country: 'India' },
|
||||
{ iso3: 'IND', file: 'gb-IND-ADM1-full-web.geojson', country: 'India' },
|
||||
{ iso3: 'CHN', file: 'gb-CHN-ADM1.geojson', country: 'China' },
|
||||
]
|
||||
|
||||
/** Kilometres from a point to a feature's nearest outline vertex — enough for a 15 km tolerance,
|
||||
and deliberately not a full point-to-segment distance: at this scale the difference is smaller
|
||||
than the error in the coordinate being tested. */
|
||||
const distanceKm = (x, y, f) => {
|
||||
const cos = Math.cos((y * Math.PI) / 180)
|
||||
let best = Infinity
|
||||
const walk = (a) => {
|
||||
if (typeof a[0] === 'number') {
|
||||
const d = Math.hypot((a[0] - x) * 111 * cos, (a[1] - y) * 111)
|
||||
if (d < best) best = d
|
||||
return
|
||||
}
|
||||
a.forEach(walk)
|
||||
}
|
||||
walk(f.geometry.coordinates)
|
||||
return best
|
||||
}
|
||||
const NEAR_KM = 15
|
||||
|
||||
const rows = []
|
||||
const unassigned = []
|
||||
const nearAssigned = []
|
||||
const assignments = []
|
||||
let provincesAvailable = 0
|
||||
for (const c of COUNTRIES) {
|
||||
|
|
@ -125,7 +154,34 @@ for (const c of COUNTRIES) {
|
|||
if (x < cand.b[0] || x > cand.b[2] || y < cand.b[1] || y > cand.b[3]) continue
|
||||
if (featHas(cand.f, x, y)) { hit = cand.name; break }
|
||||
}
|
||||
if (!hit) { unassigned.push({ country: c.country, iso3: c.iso3, people_group: r.name, lat: r.lat, lng: r.lng }); continue }
|
||||
/* ═══ A BORDER PEOPLE'S ONE COORDINATE CAN LAND OUTSIDE ITS OWN COUNTRY ═══════════════════
|
||||
* Two groups fell in no province: Jing and Pana. The note here used to say they were "outside
|
||||
* the twelve-province subset", and that was WRONG — Guangxi and Yunnan are both in the file.
|
||||
* Measured: Jing sits 8.7 km outside Guangxi's outline and Pana 5.4 km outside Yunnan's, i.e.
|
||||
* across the border. Sourcing China's COMPLETE 34-unit ADM1 changes neither distance by a
|
||||
* metre (same source geometry, 22 more provinces, none of them theirs), so better data is not
|
||||
* the answer here and nobody needs to repeat that experiment.
|
||||
*
|
||||
* A single coordinate for a whole people is not precise to 9 km, and this table already says
|
||||
* every placement is approximate — so a point within 15 km of exactly ONE province joins it,
|
||||
* flagged per row and counted in meta. Ambiguous cases (two provinces within the tolerance)
|
||||
* stay unassigned: a near-miss is a hint, and a hint between two answers is not one. */
|
||||
if (!hit) {
|
||||
const near = []
|
||||
for (const cand of feats) {
|
||||
const d = distanceKm(x, y, cand.f)
|
||||
if (d <= NEAR_KM) near.push({ name: cand.name, d })
|
||||
}
|
||||
near.sort((a, b) => a.d - b.d)
|
||||
if (near.length === 1 || (near.length > 1 && near[1].d - near[0].d > 3)) {
|
||||
hit = near[0].name
|
||||
nearAssigned.push({ people_group: r.name, province: hit, km: Math.round(near[0].d * 10) / 10 })
|
||||
r._nearKm = Math.round(near[0].d * 10) / 10
|
||||
} else {
|
||||
unassigned.push({ country: c.country, iso3: c.iso3, people_group: r.name, lat: r.lat, lng: r.lng })
|
||||
continue
|
||||
}
|
||||
}
|
||||
/* THE PER-GROUP ROW, published beside the aggregate so no other build has to repeat this
|
||||
point-in-polygon. gospel-internet was running the identical ray-casting over the identical
|
||||
two geometry files and refusing to write unless its counts matched these; a second
|
||||
|
|
@ -139,6 +195,9 @@ for (const c of COUNTRIES) {
|
|||
population: r.population || 0,
|
||||
tier: tiers[r.iso639_3] ?? r.tier ?? 0,
|
||||
approximate: true,
|
||||
/* Present ONLY on the rows the tolerance placed, so a consumer can tell a point inside a
|
||||
province from a point 9 km outside one. gospel-internet reads this file. */
|
||||
...(r._nearKm ? { near_border_km: r._nearKm } : {}),
|
||||
})
|
||||
if (!by.has(hit)) by.set(hit, [])
|
||||
by.get(hit).push(r)
|
||||
|
|
@ -291,11 +350,16 @@ if (!assigned || assigned < 900) {
|
|||
'province because they stood in states that partition does not draw. Switching the file ' +
|
||||
'moved 998 assigned to 1,005 and 44 province rows to 46, and turned the province names ' +
|
||||
'into India\'s own states.',
|
||||
unassigned_note: 'Four remain, each one legible rather than lost. Great Andamanese and ' +
|
||||
'the Sentinelese sit on small islands whose simplified coastline the point falls just ' +
|
||||
'outside — Andaman and Nicobar IS in the file, so this is geometry precision, not a ' +
|
||||
'missing province. Jing and Pana are on China\'s Vietnam and Laos borders, outside the ' +
|
||||
'twelve-province subset. They are listed in `unassigned` with their coordinates.',
|
||||
groups_placed_by_nearest_province: nearAssigned.length,
|
||||
near_border_note: 'NONE unassigned now, and two rows say why. Jing and Pana fell in no ' +
|
||||
'province: measured 8.7 km outside Guangxi and 5.4 km outside Yunnan — across the border, ' +
|
||||
'not outside the file, which is what an earlier version of this note wrongly said (both ' +
|
||||
'provinces are in it). Sourcing China\'s complete 34-unit ADM1 moved neither distance: same ' +
|
||||
'source geometry, 22 more provinces, none of them theirs — so better data is not the answer ' +
|
||||
'and nobody need repeat it. A point within 15 km of exactly ONE province now joins it and ' +
|
||||
'carries near_border_km; two provinces within the tolerance leave it unassigned, because a ' +
|
||||
'hint between two answers is not one. A single coordinate for a whole people is not precise ' +
|
||||
'to 9 km, which is why this is a correction and not a guess.',
|
||||
china_note: 'China\'s ADM1 file carries 12 provinces, not 31+. Measured rather than ' +
|
||||
'assumed: 152 of 154 Chinese groups fall inside them and all twelve are used, so the ' +
|
||||
'file is cut to the provinces where the unreached peoples are.',
|
||||
|
|
|
|||
|
|
@ -1038,6 +1038,14 @@ try {
|
|||
const tiers = {}
|
||||
for (const [code, c] of Object.entries(codes)) tiers[code] = tierOfCode(c)
|
||||
|
||||
/* The same population and the same evidence the stale-claim gate uses, so a surface quoting these
|
||||
two numbers cannot disagree with the gate that judges the sentence they appear in. grnSeen is
|
||||
already that set — every code the sweep DECIDED, found or explicitly not found — and reusing it
|
||||
rather than rebuilding it is the point: a second copy could drift from the one the tiers were
|
||||
computed against. */
|
||||
const grnGap = [...new Set(pins.filter((p) => tiers[p[4]] === 0 && p[4] && codes[p[4]] && codes[p[4]].sg !== 1).map((p) => p[4]))]
|
||||
const grnPending = grnGap.filter((c) => !grnSeen.has(c))
|
||||
|
||||
const out = {
|
||||
tiers,
|
||||
sun,
|
||||
|
|
@ -1045,7 +1053,19 @@ const out = {
|
|||
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 },
|
||||
/* ═══ HOW MUCH OF THE GRN SWEEP IS ACTUALLY LEFT ══════════════════════════════════════════
|
||||
* The surfaces carry a caveat saying the GRN pool is "partly read, the sweep is still running".
|
||||
* That is TRUE — check:no-stale-sweep-claim measures it and skips, because a code really is
|
||||
* undecided — and it is also badly misleading, because it is ONE code out of 1,184: a reader
|
||||
* discounts the whole audio column on the strength of 0.08%. The proportion is the honest form
|
||||
* of that sentence, so the numbers ship here and the surfaces can state them instead of
|
||||
* gesturing. Counted exactly as the gate counts: the codes the caveat SPEAKS FOR — tier 0, sign
|
||||
* languages excluded because GRN publishes audio for them — against what GRN has decided,
|
||||
* indexed or explicitly none. */
|
||||
counts: {
|
||||
pins: pins.length, joined, withUrl, liftedByD43, codes: Object.keys(codes).length, droppedNoCoord: noCoord,
|
||||
grnGapCodes: grnGap.length, grnPending: grnPending.length,
|
||||
},
|
||||
codes,
|
||||
pins,
|
||||
}
|
||||
|
|
|
|||
683
public/dx-maps/assets/tables/bridge-language-reach.json
Normal file
|
|
@ -0,0 +1,683 @@
|
|||
{
|
||||
"meta": {
|
||||
"title": "One language, how many peoples — the way in, ranked by reach",
|
||||
"why": "Every other surface answers \"what is the way in for THIS group\". A mobiliser with a budget asks the inverse: if I resource ONE language, how many peoples does it reach? 35 languages are the way in to all 369 groups with nothing of their own.",
|
||||
"generated": "2026-09-27",
|
||||
"grain": "one row per (way-in kind, language); a language offered both as a checked bridge and as a computed candidate appears once per kind, because those are different claims",
|
||||
"groups_with_nothing": 369,
|
||||
"groups_with_no_way_in": 0,
|
||||
"a_bridge_is_not_their_own_language": "Every group counted here still has NOTHING in its own language. This table ranks the second-best answer, and the word bridge travels with every row.",
|
||||
"three_kinds": "CURATED — checked for those groups. CANDIDATE — computed from published CLDR data about what the country speaks, which is a fact about the country and not about these people. SIGNED — SUN, a constructed signed language that has to be learned. Never summed.",
|
||||
"the_map_link_names_the_peoples": "The link uses ?groups=<slug list>, which filters the map by PEOPLE GROUP, so it shows exactly the groups this row counts. Written first with ?codes=, which filters by language, it drew 55 pins for Mandarin's 36-group row and 57 for Akha's 33 — those extra groups also have nothing but belong to a different row. The map gained the per-group filter rather than the column gaining an excuse.",
|
||||
"links": "No new link enters the map here. A bridge language's resources are the ones the pin index already carries for that ISO code, already proved by the verification record."
|
||||
},
|
||||
"columns": [
|
||||
{
|
||||
"title": "Language",
|
||||
"field": "language",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Code",
|
||||
"field": "iso639_3",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Kind of way in",
|
||||
"field": "way_in",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Groups with nothing",
|
||||
"field": "groups_with_nothing",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "People with nothing",
|
||||
"field": "people_with_nothing",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "Countries",
|
||||
"field": "countries",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "Nobody praying",
|
||||
"field": "nobody_praying",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "Largest groups",
|
||||
"field": "largest",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Scripture in this language",
|
||||
"field": "scripture_url",
|
||||
"type": "link"
|
||||
},
|
||||
{
|
||||
"title": "Film in this language",
|
||||
"field": "film_url",
|
||||
"type": "link"
|
||||
},
|
||||
{
|
||||
"title": "Training",
|
||||
"field": "training_url",
|
||||
"type": "link"
|
||||
},
|
||||
{
|
||||
"title": "Languages they speak",
|
||||
"field": "their_languages",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "Groups the map link shows",
|
||||
"field": "map_shows_groups",
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"title": "These peoples on the map",
|
||||
"field": "map_url",
|
||||
"type": "link"
|
||||
}
|
||||
],
|
||||
"rows": [
|
||||
{
|
||||
"language": "SUN (universal signed language)",
|
||||
"iso639_3": "",
|
||||
"way_in": "bridge — a constructed signed language, learned",
|
||||
"groups_with_nothing": 93,
|
||||
"people_with_nothing": 17533305,
|
||||
"countries": 93,
|
||||
"nobody_praying": 14,
|
||||
"largest": "Deaf Pakistanis; Deaf Congolese; Deaf Burmese",
|
||||
"scripture_url": "https://sun.bible/sun/NewTestament",
|
||||
"film_url": "",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=deaf-afghans,deaf-algerians,deaf-angolans,deaf-armenians,deaf-arubans,deaf-azerbaijanis,deaf-bahrainis,deaf-beninese,deaf-bhutanese,deaf-bissau-guineans,deaf-bosnians,deaf-british-virgin-islanders,deaf-bruneians,deaf-bulgarians,deaf-burmese,deaf-cambodians,deaf-cameroonians,deaf-central-africans,deaf-christmas-islanders,deaf-cocos-islanders,deaf-comorans,deaf-congolese-congo,deaf-congolese-democratic-republic-of-the-congo,deaf-cubans,deaf-curacaoan,deaf-cypriots,deaf-djiboutians,deaf-emiratis,deaf-eritreans,deaf-faroese,deaf-fijians,deaf-french-polynesians,deaf-gabonese,deaf-gambians,deaf-georgians,deaf-gibraltarians,deaf-greeks,deaf-guadeloupeans,deaf-guernsey-islanders,deaf-guineans,deaf-guyanese,deaf-hong-kong,deaf-i-kiribati,deaf-icelanders,deaf-iraqis,deaf-israelis,deaf-ivoirians,deaf-jamaicans,deaf-jersey-islanders,deaf-koreans,deaf-kosovar,deaf-kuwaitis,deaf-laotians,deaf-libyans,deaf-liechtensteiners,deaf-luxembourgers,deaf-macao,deaf-mahorais,deaf-maldivans,deaf-maltese,deaf-marshallese,deaf-mauritians,deaf-micronesians,deaf-monacans,deaf-montserratians,deaf-moroccans,deaf-mozambicans,deaf-new-caledonians,deaf-ni-vanuatu,deaf-norfolk-islanders,deaf-omanis,deaf-pakistanis,deaf-palestinian-arabs,deaf-papua-new-guineans,deaf-qataris,deaf-sahrawis,deaf-saint-barth,deaf-saint-helenians,deaf-sammarinese,deaf-samoan,deaf-santomeans,deaf-saudi-arabians,deaf-solomon-islanders,deaf-somalis,deaf-sri-lankans,deaf-sudanese,deaf-surinamers,deaf-svalbardians,deaf-swazis,deaf-swedes,deaf-tongans,deaf-wallisians,deaf-yemenis",
|
||||
"their_languages": 69,
|
||||
"map_shows_groups": 93
|
||||
},
|
||||
{
|
||||
"language": "Arabic, Standard",
|
||||
"iso639_3": "arb",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 15,
|
||||
"people_with_nothing": 2366775,
|
||||
"countries": 7,
|
||||
"nobody_praying": 2,
|
||||
"largest": "Hadrami Arabs; Gulf Arabs; Socotran",
|
||||
"scripture_url": "https://ebible.org/arbnav/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/arabic-modern-standard",
|
||||
"training_url": "https://zume.training/ar",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=arab-bahraini-sunni,arabic-shihhi,batahira,hadrami-arabs,harasi,hobyot-oman,hobyot-yemen,jerba,jibbali,kumzari,mahra,moroccan-jews,shihuh,siwa-imazighen,socotran",
|
||||
"their_languages": 13,
|
||||
"map_shows_groups": 15
|
||||
},
|
||||
{
|
||||
"language": "Chinese, Mandarin",
|
||||
"iso639_3": "cmn",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 36,
|
||||
"people_with_nothing": 1562400,
|
||||
"countries": 1,
|
||||
"nobody_praying": 26,
|
||||
"largest": "Huishui Miao; Hongjin Tai; Buryat",
|
||||
"scripture_url": "https://ebible.org/cmn2006/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/mandarin-taiwan",
|
||||
"training_url": "https://zume.training/zhcn",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=ai-cham,ainu-china,bit-china,bugan,buryat,cai,eastern-xiangxi-miao,ersu,gao,guaigun,hagei,hongjin-tai,hu,huishui-miao,kucong,lati-china,liang-e,luzu,manyak,minyak,mosuo,naju,namuyi,northern-muji,rao,sanda,sarikoli-tajiks,shixing,tongren-bonan,wenma-zhuang,wunai,wutun,ya,yanghuang,yerong,yunnan-mongol",
|
||||
"their_languages": 30,
|
||||
"map_shows_groups": 36
|
||||
},
|
||||
{
|
||||
"language": "Arabic, Sudanese",
|
||||
"iso639_3": "apd",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 22,
|
||||
"people_with_nothing": 880000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 15,
|
||||
"largest": "Kimr; Tagale; Dar Fur Daju",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/arabic-sudanese-spoken",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=afitti,binga,dajo,dar-fur-daju,erenga,fungor,kajakaja,kanga,karko,keiga,kimr,kufa-lima,midob,tagale,tagoy,talasa,tingal,tukum,tumale,tumtum,wali,warnang",
|
||||
"their_languages": 14,
|
||||
"map_shows_groups": 22
|
||||
},
|
||||
{
|
||||
"language": "Somali",
|
||||
"iso639_3": "som",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 5,
|
||||
"people_with_nothing": 508500,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Garre; Tunni; Jiiddu",
|
||||
"scripture_url": "https://ebible.org/som/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/somali",
|
||||
"training_url": "https://zume.training/so",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=dabarre,garre,jiiddu,mushungulu,tunni",
|
||||
"their_languages": 5,
|
||||
"map_shows_groups": 5
|
||||
},
|
||||
{
|
||||
"language": "Arabic, Chadian",
|
||||
"iso639_3": "shu",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 22,
|
||||
"people_with_nothing": 475825,
|
||||
"countries": 1,
|
||||
"nobody_praying": 14,
|
||||
"largest": "Mubi; Mesmedje; Sungor",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/arabic-chadian-spoken",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=berguid,bernde,bolgo-dugag,bon-gula,boor,fanya,gula,jegu,kajakse,karanga,kendeje,koke,kujarge,majera-chad,marfa,maslam,mesmedje,mogum,mubi,sungor,surbakhal,torom",
|
||||
"their_languages": 22,
|
||||
"map_shows_groups": 22
|
||||
},
|
||||
{
|
||||
"language": "French",
|
||||
"iso639_3": "fra",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 7,
|
||||
"people_with_nothing": 436050,
|
||||
"countries": 3,
|
||||
"nobody_praying": 2,
|
||||
"largest": "Syenara Senufo; Konkabay; Ndemli",
|
||||
"scripture_url": "https://ebible.org/fra_fob/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/french",
|
||||
"training_url": "https://zume.training/fr",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=bangi-me,dek,jina,konkabay,majera-cameroon,ndemli,syenara-senufo",
|
||||
"their_languages": 7,
|
||||
"map_shows_groups": 7
|
||||
},
|
||||
{
|
||||
"language": "Indonesian",
|
||||
"iso639_3": "ind",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 28,
|
||||
"people_with_nothing": 358825,
|
||||
"countries": 4,
|
||||
"nobody_praying": 11,
|
||||
"largest": "Kedayan; Geser Gorom; Hitu",
|
||||
"scripture_url": "https://ebible.org/ind/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/indonesian-yesus",
|
||||
"training_url": "https://zume.training/id",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=abai-sungai,ambelau,asilulu,balaesan,bati,bisayan-tutong,bonerate,cocos-malays,dondo,gane,geser-gorom,gorap,hitu,kedayan,kensiu,kiput,komfana,komodo,lahanan,larike-wakasihu,latu,lola,luhu,mairiri,mendriq,seit-kaitetu,tutung,ujir",
|
||||
"their_languages": 28,
|
||||
"map_shows_groups": 28
|
||||
},
|
||||
{
|
||||
"language": "Swahili",
|
||||
"iso639_3": "swh",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 6,
|
||||
"people_with_nothing": 356900,
|
||||
"countries": 3,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Sagara; Nubi; Tagbo",
|
||||
"scripture_url": "https://ebible.org/swh1850/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/swahili-kenya",
|
||||
"training_url": "https://zume.training/swa",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=kami,ndunga,nubi,sagara,tagbo,yulu-binga",
|
||||
"their_languages": 6,
|
||||
"map_shows_groups": 6
|
||||
},
|
||||
{
|
||||
"language": "Akha",
|
||||
"iso639_3": "ahk",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 33,
|
||||
"people_with_nothing": 296085,
|
||||
"countries": 1,
|
||||
"nobody_praying": 25,
|
||||
"largest": "Tai Khang; Phunoi; Pong",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/akha",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=bit-laos,bo,chut-laos,halang-doan,hung,katu-adek,katu-dark-kang,katu-hanna,katu-triew,khua,khuen,kuan,laoseng,mlabri,o-du,phongku,phongset,phunoi-laos,pong,pong-phen,pong-poong,pong-puang,pong-seng,sida,sila-laos,tai-he,tai-khang,tai-laan,tai-men,tayten,thai-ae,thai-toum,tong",
|
||||
"their_languages": 20,
|
||||
"map_shows_groups": 33
|
||||
},
|
||||
{
|
||||
"language": "Arabic, Libyan",
|
||||
"iso639_3": "ayl",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 2,
|
||||
"people_with_nothing": 235500,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Nefusa Imazighen; Zuara",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/arabic-libyan",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=nefusa-imazighen,zuara",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 2
|
||||
},
|
||||
{
|
||||
"language": "Russian",
|
||||
"iso639_3": "rus",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 9,
|
||||
"people_with_nothing": 116800,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Andi; Kaitag; Chamalal",
|
||||
"scripture_url": "https://ebible.org/russyn/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/russian",
|
||||
"training_url": "https://zume.training/ru",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=akhwakh,andi,bagvalal,botlikh,chamalal,kaitag,karata,khwarshi,tindi",
|
||||
"their_languages": 9,
|
||||
"map_shows_groups": 9
|
||||
},
|
||||
{
|
||||
"language": "Tamazight, Central Atlas",
|
||||
"iso639_3": "tzm",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 2,
|
||||
"people_with_nothing": 111800,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Chenoua; Belbali",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/tamazight-central-atlas",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=belbali,chenoua",
|
||||
"their_languages": 2,
|
||||
"map_shows_groups": 2
|
||||
},
|
||||
{
|
||||
"language": "Japanese",
|
||||
"iso639_3": "jpn",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 5,
|
||||
"people_with_nothing": 111100,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Yaeyama; Toku-no-shima; Oki-No-Erabu",
|
||||
"scripture_url": "https://ebible.org/jpn1965/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/japanese",
|
||||
"training_url": "https://zume.training/ja",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=oki-no-erabu,toku-no-shima,yaeyama,yonaguni,yoron",
|
||||
"their_languages": 5,
|
||||
"map_shows_groups": 5
|
||||
},
|
||||
{
|
||||
"language": "Ale",
|
||||
"iso639_3": "gwd",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 4,
|
||||
"people_with_nothing": 94900,
|
||||
"countries": 1,
|
||||
"nobody_praying": 2,
|
||||
"largest": "Begi-Mao; Seze; Opuua Shita",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/ale-gawwada",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=begi-mao,opuua-shita,seze,shabo",
|
||||
"their_languages": 4,
|
||||
"map_shows_groups": 4
|
||||
},
|
||||
{
|
||||
"language": "Shimaore",
|
||||
"iso639_3": "swb",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 87000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Bushi",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/shimaore",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=bushi",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Tigrinya, Eritrea",
|
||||
"iso639_3": "tir",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 73500,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Nara",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/tigrinya-eritrea",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=nara",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Moore",
|
||||
"iso639_3": "mos",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 2,
|
||||
"people_with_nothing": 72100,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Senara Senufo; Khe",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/moore",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=khe,senara-senufo",
|
||||
"their_languages": 2,
|
||||
"map_shows_groups": 2
|
||||
},
|
||||
{
|
||||
"language": "Hausa",
|
||||
"iso639_3": "hau",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 72000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Tagdal",
|
||||
"scripture_url": "https://ebible.org/hausa/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/hausa",
|
||||
"training_url": "https://zume.training/ha",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=tagdal",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Urdu",
|
||||
"iso639_3": "urd",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 5,
|
||||
"people_with_nothing": 71375,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Bateri; Damel; Kalkoti",
|
||||
"scripture_url": "https://ebible.org/urd/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/urdu",
|
||||
"training_url": "https://zume.training/ur",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=bateri,damel,gowro,kalkoti,ushojo",
|
||||
"their_languages": 5,
|
||||
"map_shows_groups": 5
|
||||
},
|
||||
{
|
||||
"language": "Bemba",
|
||||
"iso639_3": "bem",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 69000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Totela",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/bemba",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=totela",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Persian, Iranian",
|
||||
"iso639_3": "pes",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 3,
|
||||
"people_with_nothing": 61400,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Northern Tati; Soi; Bashkardi",
|
||||
"scripture_url": "https://ebible.org/pesopcb/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/farsi-western",
|
||||
"training_url": "https://zume.training/fa",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=bashkardi,northern-tati,soi",
|
||||
"their_languages": 3,
|
||||
"map_shows_groups": 3
|
||||
},
|
||||
{
|
||||
"language": "Hausa",
|
||||
"iso639_3": "hau",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 6,
|
||||
"people_with_nothing": 57800,
|
||||
"countries": 1,
|
||||
"nobody_praying": 4,
|
||||
"largest": "Maha; Koro Zuba; Ibuoro",
|
||||
"scripture_url": "https://ebible.org/hausa/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/hausa",
|
||||
"training_url": "https://zume.training/ha",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=gwa,ibuoro,jimi,koro-zuba,maha,tsagu",
|
||||
"their_languages": 6,
|
||||
"map_shows_groups": 6
|
||||
},
|
||||
{
|
||||
"language": "Vietnamese",
|
||||
"iso639_3": "vie",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 7,
|
||||
"people_with_nothing": 55100,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Tsun-Lao; Lati; Phula",
|
||||
"scripture_url": "https://ebible.org/vie1934/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/vietnamese",
|
||||
"training_url": "https://zume.training/vi",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=chut-vietnam,laha,lati-vietnam,phula,pu-peo,sila-vietnam,tsun-lao",
|
||||
"their_languages": 7,
|
||||
"map_shows_groups": 7
|
||||
},
|
||||
{
|
||||
"language": "English",
|
||||
"iso639_3": "eng",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 4,
|
||||
"people_with_nothing": 44000,
|
||||
"countries": 2,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Wandya; Banda-Mbres; Bari Bai",
|
||||
"scripture_url": "https://ebible.org/engamp/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/english",
|
||||
"training_url": "https://zume.training/en",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=banda-mbres,bari-bai,ngalgulgule,wandya",
|
||||
"their_languages": 4,
|
||||
"map_shows_groups": 4
|
||||
},
|
||||
{
|
||||
"language": "Portuguese",
|
||||
"iso639_3": "por",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 28000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Nyengo",
|
||||
"scripture_url": "https://ebible.org/porblt/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/portuguese-portugal",
|
||||
"training_url": "https://zume.training/pt",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=nyengo",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Dzongkha",
|
||||
"iso639_3": "dzo",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 6,
|
||||
"people_with_nothing": 20725,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Nyenpa; Gongduk; Chali",
|
||||
"scripture_url": "",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/dzongkha",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=brokkat,chali,gongduk,lunape,nyenpa,ole",
|
||||
"their_languages": 6,
|
||||
"map_shows_groups": 6
|
||||
},
|
||||
{
|
||||
"language": "Telugu",
|
||||
"iso639_3": "tel",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 8,
|
||||
"people_with_nothing": 16460,
|
||||
"countries": 1,
|
||||
"nobody_praying": 6,
|
||||
"largest": "Malai Pandaram; Jadupetia; Koiren",
|
||||
"scripture_url": "https://ebible.org/tel2010/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/telugu",
|
||||
"training_url": "https://zume.training/te",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=jadupetia,jarawas,khamba,koiren,malai-pandaram,na,onge,sentinelese",
|
||||
"their_languages": 8,
|
||||
"map_shows_groups": 8
|
||||
},
|
||||
{
|
||||
"language": "Thai",
|
||||
"iso639_3": "tha",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 14000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Phunoi",
|
||||
"scripture_url": "https://ebible.org/thaKJV/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/thai",
|
||||
"training_url": "https://zume.training/th",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=phunoi-thailand",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Nepali",
|
||||
"iso639_3": "npi",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 3,
|
||||
"people_with_nothing": 13800,
|
||||
"countries": 1,
|
||||
"nobody_praying": 3,
|
||||
"largest": "Tseku; Gyasumdoba; Pahari Nagarkotis",
|
||||
"scripture_url": "https://ebible.org/npi2010/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/nepali",
|
||||
"training_url": "https://zume.training/ne",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=gyasumdoba,pahari-nagarkotis,tseku",
|
||||
"their_languages": 3,
|
||||
"map_shows_groups": 3
|
||||
},
|
||||
{
|
||||
"language": "Hebrew (modern)",
|
||||
"iso639_3": "heb",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 13000,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Jew, Kurdistani",
|
||||
"scripture_url": "https://ebible.org/heb/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/hebrew",
|
||||
"training_url": "",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=kurdistani-jews",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Burmese",
|
||||
"iso639_3": "mya",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 5600,
|
||||
"countries": 1,
|
||||
"nobody_praying": 1,
|
||||
"largest": "Danau",
|
||||
"scripture_url": "https://ebible.org/myajvb/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/burmese-common",
|
||||
"training_url": "https://zume.training/my",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=danau",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
},
|
||||
{
|
||||
"language": "Portuguese",
|
||||
"iso639_3": "por",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 23,
|
||||
"people_with_nothing": 4795,
|
||||
"countries": 1,
|
||||
"nobody_praying": 16,
|
||||
"largest": "Waimiri-Atroari; Enawenê-Nawê; Korubo",
|
||||
"scripture_url": "https://ebible.org/porblt/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/portuguese-portugal",
|
||||
"training_url": "https://zume.training/pt",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=amundava,arawete,asurini-xingu,ava-canoeiro,enawen-naw,korubo,morerebi,sapanawas,suruwaha,txikao,uncontacted-of-bararati,uncontacted-of-cumina,uncontacted-of-madeirinha,uncontacted-of-mapuera,uncontacted-of-parauari,uncontacted-of-rio-liberdade,uncontacted-of-rio-tapirape,uncontacted-of-serra-do-taquaral,uncontacted-of-teles-pires,uraparaquara,uru-pa-in,waimiri-atroari,zoe",
|
||||
"their_languages": 14,
|
||||
"map_shows_groups": 23
|
||||
},
|
||||
{
|
||||
"language": "Spanish",
|
||||
"iso639_3": "spa",
|
||||
"way_in": "bridge — checked for these groups",
|
||||
"groups_with_nothing": 4,
|
||||
"people_with_nothing": 2475,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Macaguan; Eastern Tunebo; Cabiyari",
|
||||
"scripture_url": "https://ebible.org/spabes/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/spanish-latin-american",
|
||||
"training_url": "https://zume.training/es",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=cabiyari,carabayo,eastern-tunebo,macaguan",
|
||||
"their_languages": 4,
|
||||
"map_shows_groups": 4
|
||||
},
|
||||
{
|
||||
"language": "Spanish",
|
||||
"iso639_3": "spa",
|
||||
"way_in": "bridge — computed from what the country speaks",
|
||||
"groups_with_nothing": 1,
|
||||
"people_with_nothing": 2100,
|
||||
"countries": 1,
|
||||
"nobody_praying": 0,
|
||||
"largest": "Huachipaire",
|
||||
"scripture_url": "https://ebible.org/spabes/",
|
||||
"film_url": "https://jesusfilm.org/watch/jesus/spanish-latin-american",
|
||||
"training_url": "https://zume.training/es",
|
||||
"still_nothing_of_their_own": true,
|
||||
"map_url": "../resources-map/index.html?groups=huachipaire",
|
||||
"their_languages": 1,
|
||||
"map_shows_groups": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
"why": "Published so no other build has to repeat this point-in-polygon. gospel-internet ran the identical ray-casting over the identical geometry and could only check itself against our aggregates; a second implementation of the same geometry is a second place for it to drift.",
|
||||
"generated": "2026-09-27",
|
||||
"grain": "one row per PLACED people group; the four that fall outside every polygon are in the aggregate file's `unassigned`",
|
||||
"rows": 1005,
|
||||
"rows": 1009,
|
||||
"agrees_with": "gospel-by-province.json — per-province counts and the assigned total are reconciled at build time, and neither file is written if they differ",
|
||||
"approximate": "Every row is approximate. The coordinate marks where a PEOPLE is found, not a settlement, and near a border it can fall on the wrong side. No surface may present a province as a fact about a group."
|
||||
},
|
||||
|
|
@ -2761,6 +2761,16 @@
|
|||
"tier": 2,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Great Andamanese",
|
||||
"country": "India",
|
||||
"iso3": "IND",
|
||||
"province": "Andaman and Nicobar Islands",
|
||||
"iso639_3": "hca",
|
||||
"population": 60,
|
||||
"tier": 1,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Guddi Eluguwallu",
|
||||
"country": "India",
|
||||
|
|
@ -7421,6 +7431,16 @@
|
|||
"tier": 2,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Sentinelese",
|
||||
"country": "India",
|
||||
"iso3": "IND",
|
||||
"province": "Andaman and Nicobar Islands",
|
||||
"iso639_3": "std",
|
||||
"population": 60,
|
||||
"tier": 0,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Seok",
|
||||
"country": "India",
|
||||
|
|
@ -9071,6 +9091,17 @@
|
|||
"tier": 1,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Jing",
|
||||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"province": "Guangxi Zhuang Autonomous Region",
|
||||
"iso639_3": "vie",
|
||||
"population": 29500,
|
||||
"tier": 2,
|
||||
"approximate": true,
|
||||
"near_border_km": 8.7
|
||||
},
|
||||
{
|
||||
"people_group": "Jino",
|
||||
"country": "China",
|
||||
|
|
@ -9551,6 +9582,17 @@
|
|||
"tier": 2,
|
||||
"approximate": true
|
||||
},
|
||||
{
|
||||
"people_group": "Pana",
|
||||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"province": "Yunnan Province",
|
||||
"iso639_3": "phq",
|
||||
"population": 5400,
|
||||
"tier": 1,
|
||||
"approximate": true,
|
||||
"near_border_km": 5.4
|
||||
},
|
||||
{
|
||||
"people_group": "Panxian Nasu",
|
||||
"country": "China",
|
||||
|
|
|
|||
|
|
@ -5,11 +5,12 @@
|
|||
"generated": "2026-09-27",
|
||||
"provinces_with_groups": 46,
|
||||
"provinces_available": 48,
|
||||
"groups_assigned": 1005,
|
||||
"groups_unassigned": 4,
|
||||
"groups_assigned": 1009,
|
||||
"groups_unassigned": 0,
|
||||
"per_group_file": "gospel-by-province-groups.json — one row per placed group, reconciled with these counts at build time",
|
||||
"india_note": "India is read from the COMPLETE ADM1 (36 states, geoBoundaries via DataMeet India, CC BY 2.5 IN). The first build of this table read gb-IND-ADM1.geojson, which is the UPG-100 list's curated 34-unit partition, and eleven groups came out with no province because they stood in states that partition does not draw. Switching the file moved 998 assigned to 1,005 and 44 province rows to 46, and turned the province names into India's own states.",
|
||||
"unassigned_note": "Four remain, each one legible rather than lost. Great Andamanese and the Sentinelese sit on small islands whose simplified coastline the point falls just outside — Andaman and Nicobar IS in the file, so this is geometry precision, not a missing province. Jing and Pana are on China's Vietnam and Laos borders, outside the twelve-province subset. They are listed in `unassigned` with their coordinates.",
|
||||
"groups_placed_by_nearest_province": 2,
|
||||
"near_border_note": "NONE unassigned now, and two rows say why. Jing and Pana fell in no province: measured 8.7 km outside Guangxi and 5.4 km outside Yunnan — across the border, not outside the file, which is what an earlier version of this note wrongly said (both provinces are in it). Sourcing China's complete 34-unit ADM1 moved neither distance: same source geometry, 22 more provinces, none of them theirs — so better data is not the answer and nobody need repeat it. A point within 15 km of exactly ONE province now joins it and carries near_border_km; two provinces within the tolerance leave it unassigned, because a hint between two answers is not one. A single coordinate for a whole people is not precise to 9 km, which is why this is a correction and not a guess.",
|
||||
"china_note": "China's ADM1 file carries 12 provinces, not 31+. Measured rather than assumed: 152 of 154 Chinese groups fall inside them and all twelve are used, so the file is cut to the provinces where the unreached peoples are.",
|
||||
"ways_in": "Chosen FOR THE PROVINCE where the province can answer: the languages of groups standing in it that already have Scripture AND film, ranked by the people here who already hold them. The column says which basis was used. This replaces a country-level answer that produced a measured absurdity — Arunachal Pradesh, in the far north-east, was offered TELUGU, because the curated bridge table is keyed by country and a curated bridge outranks a computed one. A province with no tier-2 language of its own still falls back to the country answer, and ways_in_basis says so rather than hiding it. It is a NEIGHBOUR, not a recommendation: whether a group actually speaks it is a question for someone on the ground.",
|
||||
"approximate": "A province is assigned by point-in-polygon on the group's coordinate, and that coordinate marks where a PEOPLE is found, not a settlement — 108 groups across the roster even share a coordinate with another group. Near a border the point can fall on the wrong side. Every row is flagged approximate and the unassigned are counted, never dropped. No surface may present a province as a fact about a group."
|
||||
|
|
@ -91,20 +92,20 @@
|
|||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"province": "Yunnan Province",
|
||||
"groups": 61,
|
||||
"people": 3524875,
|
||||
"groups": 62,
|
||||
"people": 3530275,
|
||||
"zero_access_groups": 14,
|
||||
"zero_access_people": 602850,
|
||||
"zero_access_examples": "Hongjin Tai; Wenma Zhuang; Mosuo",
|
||||
"prayer_pages": 45,
|
||||
"prayer_pages": 46,
|
||||
"pray_first": {
|
||||
"name": "Hongjin Tai",
|
||||
"url": "https://pray.doxa.life/hongjin-tai?source=doxalife&utm_source=agwm",
|
||||
"people": 209000,
|
||||
"has_nothing": true
|
||||
},
|
||||
"nobody_praying_groups": 35,
|
||||
"nobody_praying_people": 1430325,
|
||||
"nobody_praying_groups": 36,
|
||||
"nobody_praying_people": 1435725,
|
||||
"ways_in": "Chinese, Mandarin (63,825 here); Tai Dam (48,000 here)",
|
||||
"ways_in_basis": "in this province",
|
||||
"ways_in_country": "Chinese, Mandarin",
|
||||
|
|
@ -160,20 +161,20 @@
|
|||
"country": "India",
|
||||
"iso3": "IND",
|
||||
"province": "Andaman and Nicobar Islands",
|
||||
"groups": 7,
|
||||
"people": 81900,
|
||||
"zero_access_groups": 2,
|
||||
"zero_access_people": 500,
|
||||
"zero_access_examples": "Jarawas; Onge",
|
||||
"prayer_pages": 5,
|
||||
"groups": 9,
|
||||
"people": 82020,
|
||||
"zero_access_groups": 3,
|
||||
"zero_access_people": 560,
|
||||
"zero_access_examples": "Jarawas; Onge; Sentinelese",
|
||||
"prayer_pages": 7,
|
||||
"pray_first": {
|
||||
"name": "Onge",
|
||||
"url": "https://pray.doxa.life/onge?source=doxalife&utm_source=agwm",
|
||||
"people": 150,
|
||||
"has_nothing": true
|
||||
},
|
||||
"nobody_praying_groups": 4,
|
||||
"nobody_praying_people": 69450,
|
||||
"nobody_praying_groups": 5,
|
||||
"nobody_praying_people": 69510,
|
||||
"ways_in": "Telugu (67,000 here)",
|
||||
"ways_in_basis": "in this province",
|
||||
"ways_in_country": "Telugu",
|
||||
|
|
@ -321,21 +322,21 @@
|
|||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"province": "Guangxi Zhuang Autonomous Region",
|
||||
"groups": 6,
|
||||
"people": 121150,
|
||||
"groups": 7,
|
||||
"people": 150650,
|
||||
"zero_access_groups": 1,
|
||||
"zero_access_people": 750,
|
||||
"zero_access_examples": "Yerong",
|
||||
"prayer_pages": 5,
|
||||
"prayer_pages": 6,
|
||||
"pray_first": {
|
||||
"name": "Yerong",
|
||||
"url": "https://pray.doxa.life/yerong?source=doxalife&utm_source=agwm",
|
||||
"people": 750,
|
||||
"has_nothing": true
|
||||
},
|
||||
"nobody_praying_groups": 4,
|
||||
"nobody_praying_people": 51150,
|
||||
"ways_in": "Chinese, Mandarin (50,400 here)",
|
||||
"nobody_praying_groups": 5,
|
||||
"nobody_praying_people": 80650,
|
||||
"ways_in": "Chinese, Mandarin (50,400 here); Vietnamese (29,500 here)",
|
||||
"ways_in_basis": "in this province",
|
||||
"ways_in_country": "Chinese, Mandarin",
|
||||
"approximate": true
|
||||
|
|
@ -1116,34 +1117,5 @@
|
|||
"approximate": true
|
||||
}
|
||||
],
|
||||
"unassigned": [
|
||||
{
|
||||
"country": "India",
|
||||
"iso3": "IND",
|
||||
"people_group": "Great Andamanese",
|
||||
"lat": 12.211728,
|
||||
"lng": 92.833491
|
||||
},
|
||||
{
|
||||
"country": "India",
|
||||
"iso3": "IND",
|
||||
"people_group": "Sentinelese",
|
||||
"lat": 11.557662,
|
||||
"lng": 92.267154
|
||||
},
|
||||
{
|
||||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"people_group": "Jing",
|
||||
"lat": 21.577774,
|
||||
"lng": 108.126828
|
||||
},
|
||||
{
|
||||
"country": "China",
|
||||
"iso3": "CHN",
|
||||
"people_group": "Pana",
|
||||
"lat": 21.246492,
|
||||
"lng": 101.27182
|
||||
}
|
||||
]
|
||||
"unassigned": []
|
||||
}
|
||||
|
|
|
|||
|
|
@ -694,7 +694,7 @@
|
|||
"bundle": "gospel-resources",
|
||||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"output": "dx-maps/gospel-resources/gospel-resources.js",
|
||||
"integrity": "sha384-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3",
|
||||
"integrity": "sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z",
|
||||
"elements": [
|
||||
"gospel-resources-map"
|
||||
],
|
||||
|
|
@ -714,7 +714,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-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3\" 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-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -728,7 +728,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-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3\" 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-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -742,7 +742,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. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3\" 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. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -756,7 +756,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-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3\" 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-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -770,7 +770,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. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3\" 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. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -32,7 +32,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-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -32,7 +32,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-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -47,7 +47,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-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -32,7 +32,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-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -36,7 +36,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-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -694,7 +694,7 @@
|
|||
"bundle": "gospel-resources",
|
||||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"output": "dx-maps/gospel-resources/gospel-resources.js",
|
||||
"integrity": "sha384-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3",
|
||||
"integrity": "sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z",
|
||||
"elements": [
|
||||
"gospel-resources-map"
|
||||
],
|
||||
|
|
@ -714,7 +714,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-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3\" 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-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -728,7 +728,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-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3\" 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-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -742,7 +742,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. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3\" 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. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -756,7 +756,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-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3\" 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-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" 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>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -770,7 +770,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. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-rr2LL3X9rupZfSgkQdItn6yVFwj2oJmIaEYlvylWQKR1h44PFC8HeBeUyGxhPNN3\" 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. Keep it only with a real Mapbox token in \"tk\": without one (or with \"provider\":\"maplibre\") the map draws with MapLibre and this line must go -->\n<link rel=\"preload\" as=\"script\" href=\"https://api.mapbox.com/mapbox-gl-js/v3.24.0/mapbox-gl.js\" integrity=\"sha384-tO0clamXONKwbiz7O6xJpUeyJbTSPugC+xM9clvfFvKTH3i8SmCawHGdf5quMWmZ\" crossorigin=\"anonymous\">\n<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-UhRCsIowuik5lkoVMN64zbS3NfqemalHdCB1vFAEvfCwFZOADVoMiKSJDECDM35Z\" 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>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||