forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			84 lines
		
	
	
		
			No EOL
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			No EOL
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {Utils} from "../Utils";
 | 
						|
import {RegexTag} from "./RegexTag";
 | 
						|
import {TagsFilter} from "./TagsFilter";
 | 
						|
import {TagUtils} from "./TagUtils";
 | 
						|
 | 
						|
export class Tag extends TagsFilter {
 | 
						|
    public key: string
 | 
						|
    public value: string
 | 
						|
 | 
						|
    constructor(key: string, value: string) {
 | 
						|
        super()
 | 
						|
        this.key = key
 | 
						|
        this.value = value
 | 
						|
        if (key === undefined || key === "") {
 | 
						|
            throw "Invalid key: undefined or empty";
 | 
						|
        }
 | 
						|
        if (value === undefined) {
 | 
						|
            throw "Invalid value: value is undefined";
 | 
						|
        }
 | 
						|
        if (value === "*") {
 | 
						|
            console.warn(`Got suspicious tag ${key}=*   ; did you mean ${key}~* ?`)
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    matchesProperties(properties: any): boolean {
 | 
						|
        for (const propertiesKey in properties) {
 | 
						|
            if (this.key === propertiesKey) {
 | 
						|
                const value = properties[propertiesKey];
 | 
						|
                return value === this.value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        // The tag was not found
 | 
						|
        if (this.value === "") {
 | 
						|
            // and it shouldn't be found!
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    asOverpass(): string[] {
 | 
						|
        if (this.value === "") {
 | 
						|
            // NOT having this key
 | 
						|
            return ['[!"' + this.key + '"]'];
 | 
						|
        }
 | 
						|
        return [`["${this.key}"="${this.value}"]`];
 | 
						|
    }
 | 
						|
 | 
						|
    substituteValues(tags: any) {
 | 
						|
        return new Tag(this.key, TagUtils.ApplyTemplate(this.value as string, tags));
 | 
						|
    }
 | 
						|
 | 
						|
    asHumanString(linkToWiki: boolean, shorten: boolean) {
 | 
						|
        let v = this.value;
 | 
						|
        if (shorten) {
 | 
						|
            v = Utils.EllipsesAfter(v, 25);
 | 
						|
        }
 | 
						|
        if (linkToWiki) {
 | 
						|
            return `<a href='https://wiki.openstreetmap.org/wiki/Key:${this.key}' target='_blank'>${this.key}</a>` +
 | 
						|
                `=` +
 | 
						|
                `<a href='https://wiki.openstreetmap.org/wiki/Tag:${this.key}%3D${this.value}' target='_blank'>${v}</a>`
 | 
						|
        }
 | 
						|
        return this.key + "=" + v;
 | 
						|
    }
 | 
						|
 | 
						|
    isUsableAsAnswer(): boolean {
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    isEquivalent(other: TagsFilter): boolean {
 | 
						|
        if (other instanceof Tag) {
 | 
						|
            return this.key === other.key && this.value === other.value;
 | 
						|
        }
 | 
						|
        if (other instanceof RegexTag) {
 | 
						|
            other.isEquivalent(this);
 | 
						|
        }
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    usedKeys(): string[] {
 | 
						|
        return [this.key];
 | 
						|
    }
 | 
						|
} |