forked from MapComplete/MapComplete
		
	Improve validation of tagRenderings
This commit is contained in:
		
							parent
							
								
									ee9646a176
								
							
						
					
					
						commit
						7a68e83afa
					
				
					 1 changed files with 39 additions and 29 deletions
				
			
		| 
						 | 
				
			
			@ -4,7 +4,12 @@ import * as licenses from "../assets/generated/license_info.json"
 | 
			
		|||
import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson";
 | 
			
		||||
import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson";
 | 
			
		||||
import Constants from "../Models/Constants";
 | 
			
		||||
import {PrevalidateTheme, ValidateLayer, ValidateThemeAndLayers} from "../Models/ThemeConfig/Conversion/Validation";
 | 
			
		||||
import {
 | 
			
		||||
    PrevalidateTheme,
 | 
			
		||||
    ValidateLayer,
 | 
			
		||||
    ValidateTagRenderings,
 | 
			
		||||
    ValidateThemeAndLayers
 | 
			
		||||
} from "../Models/ThemeConfig/Conversion/Validation";
 | 
			
		||||
import {Translation} from "../UI/i18n/Translation";
 | 
			
		||||
import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson";
 | 
			
		||||
import * as questions from "../assets/tagRenderings/questions.json";
 | 
			
		||||
| 
						 | 
				
			
			@ -20,18 +25,18 @@ import {Utils} from "../Utils";
 | 
			
		|||
 | 
			
		||||
class LayerOverviewUtils {
 | 
			
		||||
 | 
			
		||||
    writeSmallOverview(themes: { id: string, title: any, shortDescription: any, icon: string, hideFromOverview: boolean, mustHaveLanguage: boolean, layers: (LayerConfigJson | string | {builtin})[] }[]) {
 | 
			
		||||
    writeSmallOverview(themes: { id: string, title: any, shortDescription: any, icon: string, hideFromOverview: boolean, mustHaveLanguage: boolean, layers: (LayerConfigJson | string | { builtin })[] }[]) {
 | 
			
		||||
        const perId = new Map<string, any>();
 | 
			
		||||
        for (const theme of themes) {
 | 
			
		||||
            
 | 
			
		||||
            const keywords : {}[] = []
 | 
			
		||||
 | 
			
		||||
            const keywords: {}[] = []
 | 
			
		||||
            for (const layer of (theme.layers ?? [])) {
 | 
			
		||||
                const l = <LayerConfigJson> layer;
 | 
			
		||||
                const l = <LayerConfigJson>layer;
 | 
			
		||||
                keywords.push({"*": l.id})
 | 
			
		||||
                keywords.push(l.title)
 | 
			
		||||
                keywords.push(l.description)
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            const data = {
 | 
			
		||||
                id: theme.id,
 | 
			
		||||
                title: theme.title,
 | 
			
		||||
| 
						 | 
				
			
			@ -77,16 +82,19 @@ class LayerOverviewUtils {
 | 
			
		|||
        writeFileSync(`./assets/generated/layers/${layer.id}.json`, JSON.stringify(layer, null, "  "), "UTF8");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getSharedTagRenderings(): Map<string, TagRenderingConfigJson> {
 | 
			
		||||
    getSharedTagRenderings(knownImagePaths: Set<string>): Map<string, TagRenderingConfigJson> {
 | 
			
		||||
        const dict = new Map<string, TagRenderingConfigJson>();
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        const validator = new ValidateTagRenderings(undefined, knownImagePaths);
 | 
			
		||||
        for (const key in questions["default"]) {
 | 
			
		||||
            if (key === "id") {
 | 
			
		||||
                continue
 | 
			
		||||
            }
 | 
			
		||||
            questions[key].id = key;
 | 
			
		||||
            questions[key]["source"] = "shared-questions"
 | 
			
		||||
            dict.set(key, <TagRenderingConfigJson>questions[key])
 | 
			
		||||
            const config = <TagRenderingConfigJson>questions[key]
 | 
			
		||||
            validator.convertStrict(config, "generate-layer-overview:tagRenderings/questions.json:"+key)
 | 
			
		||||
            dict.set(key, config)
 | 
			
		||||
        }
 | 
			
		||||
        for (const key in icons["default"]) {
 | 
			
		||||
            if (key === "id") {
 | 
			
		||||
| 
						 | 
				
			
			@ -96,7 +104,9 @@ class LayerOverviewUtils {
 | 
			
		|||
                continue
 | 
			
		||||
            }
 | 
			
		||||
            icons[key].id = key;
 | 
			
		||||
            dict.set(key, <TagRenderingConfigJson>icons[key])
 | 
			
		||||
            const config =  <TagRenderingConfigJson>icons[key]
 | 
			
		||||
            validator.convertStrict(config, "generate-layer-overview:tagRenderings/icons.json:"+key)
 | 
			
		||||
            dict.set(key,config)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        dict.forEach((value, key) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -114,9 +124,9 @@ class LayerOverviewUtils {
 | 
			
		|||
            .filter(path => path.endsWith(".svg"))
 | 
			
		||||
            .filter(path => !path.startsWith("./assets/generated"))
 | 
			
		||||
        let errCount = 0;
 | 
			
		||||
        const exempt = ["assets/SocialImageTemplate.svg","assets/SocialImageTemplateWide.svg","assets/SocialImageBanner.svg", "assets/svg/osm-logo.svg"];
 | 
			
		||||
        const exempt = ["assets/SocialImageTemplate.svg", "assets/SocialImageTemplateWide.svg", "assets/SocialImageBanner.svg", "assets/svg/osm-logo.svg"];
 | 
			
		||||
        for (const path of allSvgs) {
 | 
			
		||||
            if(exempt.some(p => "./"+p === path)) {
 | 
			
		||||
            if (exempt.some(p => "./" + p === path)) {
 | 
			
		||||
                continue
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -128,7 +138,7 @@ class LayerOverviewUtils {
 | 
			
		|||
                    throw "A core SVG is actually a PNG. Don't do this!"
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if(contents.indexOf("<text")>0){
 | 
			
		||||
            if (contents.indexOf("<text") > 0) {
 | 
			
		||||
                console.warn("The SVG at " + path + " contains a `text`-tag. This is highly discouraged. Every machine viewing your theme has their own font libary, and the font you choose might not be present, resulting in a different font being rendered. Solution: open your .svg in inkscape (or another program), select the text and convert it to a path")
 | 
			
		||||
                errCount++;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -183,7 +193,7 @@ class LayerOverviewUtils {
 | 
			
		|||
        // At the same time, an index of available layers is built.
 | 
			
		||||
        console.log("   ---------- VALIDATING BUILTIN LAYERS ---------")
 | 
			
		||||
 | 
			
		||||
        const sharedTagRenderings = this.getSharedTagRenderings();
 | 
			
		||||
        const sharedTagRenderings = this.getSharedTagRenderings(knownImagePaths);
 | 
			
		||||
        const layerFiles = ScriptUtils.getLayerFiles();
 | 
			
		||||
        const sharedLayers = new Map<string, LayerConfigJson>()
 | 
			
		||||
        const state: DesugaringContext = {
 | 
			
		||||
| 
						 | 
				
			
			@ -194,7 +204,7 @@ class LayerOverviewUtils {
 | 
			
		|||
        for (const sharedLayerJson of layerFiles) {
 | 
			
		||||
            const context = "While building builtin layer " + sharedLayerJson.path
 | 
			
		||||
            const fixed = prepLayer.convertStrict(sharedLayerJson.parsed, context)
 | 
			
		||||
            const validator = new ValidateLayer(sharedLayerJson.path, true);
 | 
			
		||||
            const validator = new ValidateLayer(sharedLayerJson.path, true, knownImagePaths);
 | 
			
		||||
            validator.convertStrict(fixed, context)
 | 
			
		||||
 | 
			
		||||
            if (sharedLayers.has(fixed.id)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -208,25 +218,25 @@ class LayerOverviewUtils {
 | 
			
		|||
        }
 | 
			
		||||
        return sharedLayers;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private static publicLayerIdsFrom(themefiles: LayoutConfigJson[]): Set<string>{
 | 
			
		||||
 | 
			
		||||
    private static publicLayerIdsFrom(themefiles: LayoutConfigJson[]): Set<string> {
 | 
			
		||||
        const publicLayers = [].concat(...themefiles
 | 
			
		||||
            .filter(th => !th.hideFromOverview)
 | 
			
		||||
            .map(th => th.layers))
 | 
			
		||||
 | 
			
		||||
        const publicLayerIds = new Set<string>()
 | 
			
		||||
        for (const publicLayer of publicLayers) {
 | 
			
		||||
            if(typeof publicLayer === "string"){
 | 
			
		||||
            if (typeof publicLayer === "string") {
 | 
			
		||||
                publicLayerIds.add(publicLayer)
 | 
			
		||||
                continue
 | 
			
		||||
            }
 | 
			
		||||
            if(publicLayer["builtin"] !== undefined){
 | 
			
		||||
            if (publicLayer["builtin"] !== undefined) {
 | 
			
		||||
                const bi = publicLayer["builtin"]
 | 
			
		||||
                if(typeof bi === "string"){
 | 
			
		||||
                if (typeof bi === "string") {
 | 
			
		||||
                    publicLayerIds.add(bi)
 | 
			
		||||
                    continue
 | 
			
		||||
                }
 | 
			
		||||
                bi.forEach(id=>publicLayerIds.add(id))
 | 
			
		||||
                bi.forEach(id => publicLayerIds.add(id))
 | 
			
		||||
                continue
 | 
			
		||||
            }
 | 
			
		||||
            publicLayerIds.add(publicLayer.id)
 | 
			
		||||
| 
						 | 
				
			
			@ -243,7 +253,7 @@ class LayerOverviewUtils {
 | 
			
		|||
 | 
			
		||||
        const convertState: DesugaringContext = {
 | 
			
		||||
            sharedLayers,
 | 
			
		||||
            tagRenderings: this.getSharedTagRenderings(),
 | 
			
		||||
            tagRenderings: this.getSharedTagRenderings(knownImagePaths),
 | 
			
		||||
            publicLayers
 | 
			
		||||
        }
 | 
			
		||||
        for (const themeInfo of themeFiles) {
 | 
			
		||||
| 
						 | 
				
			
			@ -251,20 +261,20 @@ class LayerOverviewUtils {
 | 
			
		|||
            const themePath = themeInfo.path
 | 
			
		||||
 | 
			
		||||
            new PrevalidateTheme().convertStrict(themeFile, themePath)
 | 
			
		||||
            try{
 | 
			
		||||
                
 | 
			
		||||
            try {
 | 
			
		||||
 | 
			
		||||
                themeFile = new PrepareTheme(convertState).convertStrict(themeFile, themePath)
 | 
			
		||||
    
 | 
			
		||||
                if(knownImagePaths === undefined){
 | 
			
		||||
 | 
			
		||||
                if (knownImagePaths === undefined) {
 | 
			
		||||
                    throw "Could not load known images/licenses"
 | 
			
		||||
                }
 | 
			
		||||
                new ValidateThemeAndLayers(knownImagePaths, themePath, true, convertState.tagRenderings)
 | 
			
		||||
                    .convertStrict(themeFile, themePath)
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
                this.writeTheme(themeFile)
 | 
			
		||||
                fixed.set(themeFile.id, themeFile)
 | 
			
		||||
            }catch(e){
 | 
			
		||||
                console.error("ERROR: could not prepare theme "+themePath+" due to "+e)
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                console.error("ERROR: could not prepare theme " + themePath + " due to " + e)
 | 
			
		||||
                throw e;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue