forked from MapComplete/MapComplete
		
	Add substituting tag, remove some old code
This commit is contained in:
		
							parent
							
								
									120832f241
								
							
						
					
					
						commit
						cd1171e678
					
				
					 8 changed files with 112 additions and 31 deletions
				
			
		|  | @ -46,14 +46,6 @@ export class And extends TagsFilter { | |||
|         return allChoices; | ||||
|     } | ||||
| 
 | ||||
|     substituteValues(tags: any): TagsFilter { | ||||
|         const newChoices = []; | ||||
|         for (const c of this.and) { | ||||
|             newChoices.push(c.substituteValues(tags)); | ||||
|         } | ||||
|         return new And(newChoices); | ||||
|     } | ||||
| 
 | ||||
|     asHumanString(linkToWiki: boolean, shorten: boolean) { | ||||
|         return this.and.map(t => t.asHumanString(linkToWiki, shorten)).join("&"); | ||||
|     } | ||||
|  |  | |||
|  | @ -30,14 +30,6 @@ export class Or extends TagsFilter { | |||
|         return choices; | ||||
|     } | ||||
| 
 | ||||
|     substituteValues(tags: any): TagsFilter { | ||||
|         const newChoices = []; | ||||
|         for (const c of this.or) { | ||||
|             newChoices.push(c.substituteValues(tags)); | ||||
|         } | ||||
|         return new Or(newChoices); | ||||
|     } | ||||
| 
 | ||||
|     asHumanString(linkToWiki: boolean, shorten: boolean) { | ||||
|         return this.or.map(t => t.asHumanString(linkToWiki, shorten)).join("|"); | ||||
|     } | ||||
|  |  | |||
							
								
								
									
										59
									
								
								Logic/Tags/SubstitutingTag.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								Logic/Tags/SubstitutingTag.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,59 @@ | |||
| import {TagsFilter} from "./TagsFilter"; | ||||
| 
 | ||||
| /** | ||||
|  * The substituting-tag uses the tags of a feature a variables and replaces them. | ||||
|  * | ||||
|  * e.g. key:={other_key}_{ref} will match an object that has at least 'key'. | ||||
|  * If {other_key} is _not_ defined, it will not be substituted. | ||||
|  * | ||||
|  * The 'key' is always fixed and should not contain substitutions. | ||||
|  * This cannot be used to query features | ||||
|  */ | ||||
| export default class SubstitutingTag implements TagsFilter { | ||||
|     private readonly _key: string; | ||||
|     private readonly _value: string; | ||||
| 
 | ||||
|     constructor(key: string, value: string) { | ||||
|         this._key = key; | ||||
|         this._value = value; | ||||
|     } | ||||
| 
 | ||||
|     private static substituteString(template: string, dict: any) { | ||||
|         for (const k in dict) { | ||||
|             template = template.replace(new RegExp("\\{" + k + "\\}", 'g'), dict[k]) | ||||
|         } | ||||
|         return template; | ||||
|     } | ||||
| 
 | ||||
|     asHumanString(linkToWiki: boolean, shorten: boolean) { | ||||
|         return this._key + ":=" + this._value; | ||||
|     } | ||||
| 
 | ||||
|     asOverpass(): string[] { | ||||
|         throw "A variable with substitution can not be used to query overpass" | ||||
|     } | ||||
| 
 | ||||
|     isEquivalent(other: TagsFilter): boolean { | ||||
|         if (!(other instanceof SubstitutingTag)) { | ||||
|             return false; | ||||
|         } | ||||
|         return other._key === this._key && other._value === this._value; | ||||
|     } | ||||
| 
 | ||||
|     isUsableAsAnswer(): boolean { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     matchesProperties(properties: any): boolean { | ||||
|         const value = properties[this._key]; | ||||
|         if (value === undefined || value === "") { | ||||
|             return false; | ||||
|         } | ||||
|         const expectedValue = SubstitutingTag.substituteString(this._value, properties); | ||||
|         return value === expectedValue; | ||||
|     } | ||||
| 
 | ||||
|     usedKeys(): string[] { | ||||
|         return [this._key]; | ||||
|     } | ||||
| } | ||||
|  | @ -2,8 +2,6 @@ export abstract class TagsFilter { | |||
| 
 | ||||
|     abstract asOverpass(): string[] | ||||
| 
 | ||||
|     abstract substituteValues(tags: any): TagsFilter; | ||||
| 
 | ||||
|     abstract isUsableAsAnswer(): boolean; | ||||
| 
 | ||||
|     abstract isEquivalent(other: TagsFilter): boolean; | ||||
|  | @ -13,12 +11,5 @@ export abstract class TagsFilter { | |||
|     abstract asHumanString(linkToWiki: boolean, shorten: boolean); | ||||
| 
 | ||||
|     abstract usedKeys(): string[]; | ||||
| 
 | ||||
|     public matches(tags: { k: string, v: string }[]) { | ||||
|         const properties = {}; | ||||
|         for (const kv of tags) { | ||||
|             properties[kv.k] = kv.v; | ||||
|         } | ||||
|         return this.matchesProperties(properties); | ||||
|     } | ||||
|      | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue