forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			108 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /*
 | |
|  * Uses the languages in and to every translation from wikidata to generate a language question in wikidata/wikidata
 | |
|  * */
 | |
| 
 | |
| import WikidataUtils from "../../Utils/WikidataUtils"
 | |
| import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"
 | |
| import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson"
 | |
| import { MappingConfigJson } from "../../Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson"
 | |
| import LanguageUtils from "../../Utils/LanguageUtils"
 | |
| import * as perCountry from "../../assets/language_in_country.json"
 | |
| import { Utils } from "../../Utils"
 | |
| function main() {
 | |
|     const sourcepath = "assets/generated/languages-wd.json"
 | |
|     console.log(`Converting language data file '${sourcepath}' into a tagMapping`)
 | |
|     const languages = WikidataUtils.extractLanguageData(
 | |
|         JSON.parse(readFileSync(sourcepath, "utf8")),
 | |
|         {}
 | |
|     )
 | |
|     const mappings: MappingConfigJson[] = []
 | |
|     const schoolmappings: MappingConfigJson[] = []
 | |
| 
 | |
|     const countryToLanguage: Record<string, string[]> = perCountry
 | |
|     const officialLanguagesPerCountry = Utils.TransposeMap(countryToLanguage)
 | |
| 
 | |
|     languages.forEach((l, code) => {
 | |
|         const then: Record<string, string> = {}
 | |
|         l.forEach((tr, lng) => {
 | |
|             const languageCodeWeblate = WikidataUtils.languageRemapping[lng] ?? lng
 | |
|             if (!LanguageUtils.usedLanguages.has(languageCodeWeblate)) {
 | |
|                 return
 | |
|             }
 | |
|             then[languageCodeWeblate] = tr
 | |
|         })
 | |
| 
 | |
|         const officialCountries = Utils.Dedup(
 | |
|             officialLanguagesPerCountry[code]?.map((s) => s.toLowerCase()) ?? []
 | |
|         )
 | |
|         const prioritySearch =
 | |
|             officialCountries.length > 0
 | |
|                 ? "_country~" + officialCountries.map((c) => "((^|;)" + c + "($|;))").join("|")
 | |
|                 : undefined
 | |
|         mappings.push(<MappingConfigJson>{
 | |
|             if: "language:" + code + "=yes",
 | |
|             ifnot: "language:" + code + "=",
 | |
|             searchTerms: {
 | |
|                 "*": [code],
 | |
|             },
 | |
|             then,
 | |
|             priorityIf: prioritySearch,
 | |
|         })
 | |
| 
 | |
|         schoolmappings.push(<MappingConfigJson>{
 | |
|             if: "school:language=" + code,
 | |
|             then,
 | |
|             priorityIf: prioritySearch,
 | |
|             searchTerms: {
 | |
|                 "*": [code],
 | |
|             },
 | |
|         })
 | |
|     })
 | |
| 
 | |
|     const wikidataLayer = <LayerConfigJson>{
 | |
|         id: "wikidata",
 | |
|         description: {
 | |
|             en: "Various tagrenderings which are generated from Wikidata. Automatically generated with a script, don't edit manually",
 | |
|         },
 | |
|         "#dont-translate": "*",
 | |
|         source: {
 | |
|             osmTags: "id~*",
 | |
|         },
 | |
|         title: null,
 | |
|         mapRendering: null,
 | |
|         tagRenderings: [
 | |
|             {
 | |
|                 id: "language",
 | |
|                 // @ts-ignore
 | |
|                 description: "Enables to pick *a single* 'language:<lng>=yes' within the mappings",
 | |
|                 mappings,
 | |
|             },
 | |
|             {
 | |
|                 builtin: "wikidata.language",
 | |
|                 override: {
 | |
|                     id: "language-multi",
 | |
|                     // @ts-ignore
 | |
|                     description:
 | |
|                         "Enables to pick *multiple* 'language:<lng>=yes' within the mappings",
 | |
|                     multiAnswer: true,
 | |
|                 },
 | |
|             },
 | |
|             {
 | |
|                 id: "school-language",
 | |
|                 // @ts-ignore
 | |
|                 description: "Enables to pick a single 'school:language=<lng>' within the mappings",
 | |
|                 multiAnswer: true,
 | |
|                 mappings: schoolmappings,
 | |
|             },
 | |
|         ],
 | |
|     }
 | |
|     const dir = "./assets/layers/wikidata/"
 | |
|     if (!existsSync(dir)) {
 | |
|         mkdirSync(dir)
 | |
|     }
 | |
|     const path = dir + "wikidata.json"
 | |
|     writeFileSync(path, JSON.stringify(wikidataLayer, null, "  "))
 | |
|     console.log("Written " + path)
 | |
| }
 | |
| 
 | |
| main()
 |