forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			98 lines
		
	
	
		
			No EOL
		
	
	
		
			3.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			No EOL
		
	
	
		
			3.6 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: "Various tagrenderings which are generated from Wikidata. Automatically generated with a script, don't edit manually",
 | 
						|
        "#dont-translate": "*",
 | 
						|
        "source": {
 | 
						|
            "osmTags": "id~*"
 | 
						|
        },
 | 
						|
        "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() |