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]; | ||
|  |     } | ||
|  | } |