forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			84 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			84 lines
		
	
	
	
		
			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];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |