forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			100 lines
		
	
	
		
			No EOL
		
	
	
		
			3.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			No EOL
		
	
	
		
			3.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {AndOrTagConfigJson} from "./TagConfigJson";
 | 
						|
import {And, Or, RegexTag, Tag, TagsFilter} from "../../Logic/Tags";
 | 
						|
import {Translation} from "../../UI/i18n/Translations";
 | 
						|
 | 
						|
import {Utils} from "../../Utils";
 | 
						|
 | 
						|
export class FromJSON {
 | 
						|
 | 
						|
 | 
						|
    public static Translation(json: string | any): Translation {
 | 
						|
        if (json === undefined) {
 | 
						|
            return undefined;
 | 
						|
        }
 | 
						|
        if (typeof (json) === "string") {
 | 
						|
            return new Translation({"*": json});
 | 
						|
        }
 | 
						|
        if(json.render !== undefined){
 | 
						|
            console.error("Using a 'render' where a translation is expected. Content is", json.render);
 | 
						|
            throw "ERROR: using a 'render' where none is expected"
 | 
						|
        }
 | 
						|
        const tr = {};
 | 
						|
        let keyCount = 0;
 | 
						|
        for (let key in json) {
 | 
						|
            keyCount++;
 | 
						|
            tr[key] = json[key]; // I'm doing this wrong, I know
 | 
						|
        }
 | 
						|
        if(keyCount == 0){
 | 
						|
            return undefined;
 | 
						|
        }
 | 
						|
        const transl = new Translation(tr);
 | 
						|
        return transl;
 | 
						|
    }
 | 
						|
 | 
						|
    public static SimpleTag(json: string): Tag {
 | 
						|
        const tag = Utils.SplitFirst(json, "=");
 | 
						|
        return new Tag(tag[0], tag[1]);
 | 
						|
    }
 | 
						|
 | 
						|
    public static Tag(json: AndOrTagConfigJson | string, context: string = ""): TagsFilter {
 | 
						|
        if(json === undefined){
 | 
						|
            throw `Error while parsing a tag: 'json' is undefined in ${context}. Make sure all the tags are defined and at least one tag is present in a complex expression`
 | 
						|
        }
 | 
						|
        if (typeof (json) == "string") {
 | 
						|
            const tag = json as string;
 | 
						|
            if (tag.indexOf("!~") >= 0) {
 | 
						|
                const split = Utils.SplitFirst(tag, "!~");
 | 
						|
                if (split[1] === "*") {
 | 
						|
                    throw `Don't use 'key!~*' - use 'key=' instead (empty string as value (in the tag ${tag} while parsing ${context})`
 | 
						|
                }
 | 
						|
                return new RegexTag(
 | 
						|
                    split[0],
 | 
						|
                    new RegExp("^" + split[1] + "$"),
 | 
						|
                    true
 | 
						|
                );
 | 
						|
            }
 | 
						|
            if (tag.indexOf("~~") >= 0) {
 | 
						|
                const split = Utils.SplitFirst(tag, "~~");
 | 
						|
                if (split[1] === "*") {
 | 
						|
                    split[1] = "..*"
 | 
						|
                }
 | 
						|
                return new RegexTag(
 | 
						|
                        new RegExp("^" + split[0] + "$"),
 | 
						|
                    new RegExp("^" + split[1] + "$")
 | 
						|
                );
 | 
						|
            }
 | 
						|
            if (tag.indexOf("!=") >= 0) {
 | 
						|
                const split = Utils.SplitFirst(tag, "!=");
 | 
						|
                if (split[1] === "*") {
 | 
						|
                    split[1] = "..*"
 | 
						|
                }
 | 
						|
                return new RegexTag(
 | 
						|
                    split[0],
 | 
						|
                    new RegExp("^" + split[1] + "$"),
 | 
						|
                    true
 | 
						|
                );
 | 
						|
            }
 | 
						|
            if (tag.indexOf("~") >= 0) {
 | 
						|
                const split = Utils.SplitFirst(tag, "~");
 | 
						|
                if (split[1] === "*") {
 | 
						|
                    split[1] = "..*"
 | 
						|
                }
 | 
						|
                return new RegexTag(
 | 
						|
                    split[0],
 | 
						|
                    new RegExp("^" + split[1] + "$")
 | 
						|
                );
 | 
						|
            }
 | 
						|
            const split = Utils.SplitFirst(tag, "=");
 | 
						|
            if(split[1] == "*"){
 | 
						|
                throw `Error while parsing tag '${tag}' in ${context}: detected a wildcard on a normal value. Use a regex pattern instead`
 | 
						|
            }
 | 
						|
            return new Tag(split[0], split[1])
 | 
						|
        }
 | 
						|
        if (json.and !== undefined) {
 | 
						|
            return new And(json.and.map(t => FromJSON.Tag(t, context)));
 | 
						|
        }
 | 
						|
        if (json.or !== undefined) {
 | 
						|
            return new Or(json.or.map(t => FromJSON.Tag(t, context)));
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |