forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			102 lines
		
	
	
		
			No EOL
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			No EOL
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import TagRenderingConfig from "./TagRenderingConfig";
 | 
						|
import SharedTagRenderings from "../../Customizations/SharedTagRenderings";
 | 
						|
import {TagRenderingConfigJson} from "./Json/TagRenderingConfigJson";
 | 
						|
import {Utils} from "../../Utils";
 | 
						|
 | 
						|
export default class WithContextLoader {
 | 
						|
    private readonly _json: any;
 | 
						|
    protected readonly _context: string;
 | 
						|
 | 
						|
    constructor(json: any, context: string) {
 | 
						|
        this._json = json;
 | 
						|
        this._context = context;
 | 
						|
    }
 | 
						|
 | 
						|
    /** Given a key, gets the corresponding property from the json (or the default if not found
 | 
						|
     *
 | 
						|
     * The found value is interpreted as a tagrendering and fetched/parsed
 | 
						|
     * */
 | 
						|
    public tr(key: string, deflt) {
 | 
						|
        const v = this._json[key];
 | 
						|
        if (v === undefined || v === null) {
 | 
						|
            if (deflt === undefined) {
 | 
						|
                return undefined;
 | 
						|
            }
 | 
						|
            return new TagRenderingConfig(
 | 
						|
                deflt,
 | 
						|
                `${this._context}.${key}.default value`
 | 
						|
            );
 | 
						|
        }
 | 
						|
        if (typeof v === "string") {
 | 
						|
            const shared = SharedTagRenderings.SharedTagRendering.get(v);
 | 
						|
            if (shared) {
 | 
						|
                return shared;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return new TagRenderingConfig(
 | 
						|
            v,
 | 
						|
            `${this._context}.${key}`
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Converts a list of tagRenderingCOnfigJSON in to TagRenderingConfig
 | 
						|
     * A string is interpreted as a name to call
 | 
						|
     */
 | 
						|
    public ParseTagRenderings(
 | 
						|
        tagRenderings?: (string | { builtin: string, override: any } | TagRenderingConfigJson)[],
 | 
						|
        readOnly = false,
 | 
						|
        prepConfig: ((config: TagRenderingConfigJson) => TagRenderingConfigJson) = undefined
 | 
						|
    ) : TagRenderingConfig[]{
 | 
						|
        if (tagRenderings === undefined) {
 | 
						|
            return [];
 | 
						|
        }
 | 
						|
 | 
						|
        const context = this._context
 | 
						|
        const renderings: TagRenderingConfig[] = []
 | 
						|
        if (prepConfig === undefined) {
 | 
						|
            prepConfig = c => c
 | 
						|
        }
 | 
						|
        for (let i = 0; i < tagRenderings.length; i++) {
 | 
						|
            let renderingJson = tagRenderings[i]
 | 
						|
            if (typeof renderingJson === "string") {
 | 
						|
                renderingJson = {builtin: renderingJson, override: undefined}
 | 
						|
            }
 | 
						|
 | 
						|
            if (renderingJson["builtin"] !== undefined) {
 | 
						|
                const renderingId = renderingJson["builtin"]
 | 
						|
                if (renderingId === "questions") {
 | 
						|
                    if (readOnly) {
 | 
						|
                        throw `A tagrendering has a question, but asking a question does not make sense here: is it a title icon or a geojson-layer? ${context}. The offending tagrendering is ${JSON.stringify(
 | 
						|
                            renderingJson
 | 
						|
                        )}`;
 | 
						|
                    }
 | 
						|
 | 
						|
                    const tr = new TagRenderingConfig("questions", context);
 | 
						|
                    renderings.push(tr)
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                let sharedJson = SharedTagRenderings.SharedTagRenderingJson.get(renderingId)
 | 
						|
                if (sharedJson === undefined) {
 | 
						|
                    const keys = Array.from(SharedTagRenderings.SharedTagRenderingJson.keys());
 | 
						|
                    throw `Predefined tagRendering ${renderingId} not found in ${context}.\n    Try one of ${keys.join(
 | 
						|
                        ", "
 | 
						|
                    )}\n    If you intent to output this text literally, use {\"render\": <your text>} instead"}`;
 | 
						|
                }
 | 
						|
                if (renderingJson["override"] !== undefined) {
 | 
						|
                    sharedJson = Utils.Merge(renderingJson["override"], sharedJson)
 | 
						|
                }
 | 
						|
                renderingJson = sharedJson
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            const patchedConfig = prepConfig(<TagRenderingConfigJson>renderingJson)
 | 
						|
 | 
						|
            const tr = new TagRenderingConfig(patchedConfig, `${context}.tagrendering[${i}]`);
 | 
						|
            renderings.push(tr)
 | 
						|
        }
 | 
						|
 | 
						|
        return renderings;
 | 
						|
    }
 | 
						|
} |