| 
									
										
										
										
											2021-04-10 03:50:44 +02:00
										 |  |  | import * as known_layers from "../assets/generated/known_layers_and_themes.json" | 
					
						
							|  |  |  | import {Utils} from "../Utils"; | 
					
						
							| 
									
										
										
										
											2021-08-07 23:11:34 +02:00
										 |  |  | import LayerConfig from "../Models/ThemeConfig/LayerConfig"; | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  | import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson"; | 
					
						
							|  |  |  | import SharedTagRenderings from "./SharedTagRenderings"; | 
					
						
							|  |  |  | import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; | 
					
						
							|  |  |  | import WithContextLoader from "../Models/ThemeConfig/WithContextLoader"; | 
					
						
							| 
									
										
										
										
											2020-10-27 01:01:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-26 17:22:24 +01:00
										 |  |  | export default class AllKnownLayers { | 
					
						
							| 
									
										
										
										
											2020-10-27 01:01:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |     public static inited = (_ => { | 
					
						
							|  |  |  |         WithContextLoader.getKnownTagRenderings = (id => AllKnownLayers.getTagRendering(id)) | 
					
						
							| 
									
										
										
										
											2021-11-14 18:01:48 +01:00
										 |  |  |         return true | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |     })() | 
					
						
							| 
									
										
										
										
											2021-11-14 18:01:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-06 02:52:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Must be below the list...
 | 
					
						
							| 
									
										
										
										
											2021-02-26 17:22:24 +01:00
										 |  |  |     public static sharedLayers: Map<string, LayerConfig> = AllKnownLayers.getSharedLayers(); | 
					
						
							|  |  |  |     public static sharedLayersJson: Map<string, any> = AllKnownLayers.getSharedLayersJson(); | 
					
						
							| 
									
										
										
										
											2021-07-03 22:00:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-08 02:36:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-14 18:01:48 +01:00
										 |  |  |     public static added_by_default: string[] = ["gps_location", "gps_location_history", "home_location", "gps_track",] | 
					
						
							| 
									
										
										
										
											2021-12-03 01:29:09 +01:00
										 |  |  |     public static no_include: string[] = ["conflation", "left_right_style", "split_point"] | 
					
						
							| 
									
										
										
										
											2021-11-08 02:36:01 +01:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Layer IDs of layers which have special properties through built-in hooks | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-11-14 18:01:48 +01:00
										 |  |  |     public static priviliged_layers: string[] = [...AllKnownLayers.added_by_default, "type_node", ...AllKnownLayers.no_include] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Gets the appropriate tagRenderingJSON | 
					
						
							|  |  |  |      * Allows to steal them from other layers. | 
					
						
							|  |  |  |      * This will add the tags of the layer to the configuration though! | 
					
						
							|  |  |  |      * @param renderingId | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static getTagRendering(renderingId: string): TagRenderingConfigJson[] { | 
					
						
							|  |  |  |         if (renderingId.indexOf(".") < 0) { | 
					
						
							|  |  |  |             const found = SharedTagRenderings.SharedTagRenderingJson.get(renderingId) | 
					
						
							|  |  |  |             if(found === undefined){ | 
					
						
							|  |  |  |                 return [] | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return [found] | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const [layerId, id] = renderingId.split(".") | 
					
						
							|  |  |  |         const layer = AllKnownLayers.getSharedLayersJson().get(layerId) | 
					
						
							|  |  |  |         if (layer === undefined) { | 
					
						
							|  |  |  |             if (Utils.runningFromConsole) { | 
					
						
							|  |  |  |                 // Probably generating the layer overview
 | 
					
						
							|  |  |  |                 return <TagRenderingConfigJson[]>[{ | 
					
						
							|  |  |  |                     id: "dummy" | 
					
						
							|  |  |  |                 }] | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             throw "Builtin layer " + layerId + " not found" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const renderings = layer?.tagRenderings ?? [] | 
					
						
							|  |  |  |         if (id === "*") { | 
					
						
							|  |  |  |             return <TagRenderingConfigJson[]>JSON.parse(JSON.stringify(renderings)) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-11-08 02:36:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-14 18:01:48 +01:00
										 |  |  |         const selectByGroup = id.startsWith("*") | 
					
						
							|  |  |  |         const expectedGroupName = id.substring(1) | 
					
						
							| 
									
										
										
										
											2021-11-08 02:36:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-14 18:01:48 +01:00
										 |  |  |         const allValidValues = [] | 
					
						
							|  |  |  |         for (const rendering of renderings) { | 
					
						
							|  |  |  |             if ((!selectByGroup && rendering["id"] === id) || (selectByGroup && rendering["group"] === expectedGroupName)) { | 
					
						
							|  |  |  |                 const found = <TagRenderingConfigJson>JSON.parse(JSON.stringify(rendering)) | 
					
						
							|  |  |  |                 if (found.condition === undefined) { | 
					
						
							|  |  |  |                     found.condition = layer.source.osmTags | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     found.condition = {and: [found.condition, layer.source.osmTags]} | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 allValidValues.push(found) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if(allValidValues.length === 0){ | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |         throw `The rendering with id ${id} was not found in the builtin layer ${layerId}. Try one of ${Utils.NoNull(renderings.map(r => r["id"])).join(", ")}` | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return allValidValues | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-08 02:36:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-06 02:52:38 +01:00
										 |  |  |     private static getSharedLayers(): Map<string, LayerConfig> { | 
					
						
							| 
									
										
										
										
											2020-10-27 01:01:34 +01:00
										 |  |  |         const sharedLayers = new Map<string, LayerConfig>(); | 
					
						
							| 
									
										
										
										
											2021-04-10 03:50:44 +02:00
										 |  |  |         for (const layer of known_layers.layers) { | 
					
						
							|  |  |  |             try { | 
					
						
							| 
									
										
										
										
											2021-10-11 23:52:17 +02:00
										 |  |  |                 // @ts-ignore
 | 
					
						
							| 
									
										
										
										
											2021-09-13 01:21:47 +02:00
										 |  |  |                 const parsed = new LayerConfig(layer, "shared_layers") | 
					
						
							| 
									
										
										
										
											2021-04-10 03:50:44 +02:00
										 |  |  |                 sharedLayers.set(layer.id, parsed); | 
					
						
							|  |  |  |             } catch (e) { | 
					
						
							|  |  |  |                 if (!Utils.runningFromConsole) { | 
					
						
							|  |  |  |                     console.error("CRITICAL: Could not parse a layer configuration!", layer.id, " due to", e) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-01-06 02:52:38 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-05-17 00:31:10 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for (const layout of known_layers.themes) { | 
					
						
							| 
									
										
										
										
											2021-05-17 00:18:21 +02:00
										 |  |  |             for (const layer of layout.layers) { | 
					
						
							| 
									
										
										
										
											2021-05-17 00:31:10 +02:00
										 |  |  |                 if (typeof layer === "string") { | 
					
						
							| 
									
										
										
										
											2021-05-17 00:18:21 +02:00
										 |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-05-19 19:39:55 +02:00
										 |  |  |                 if (layer.builtin !== undefined) { | 
					
						
							| 
									
										
										
										
											2021-05-17 17:10:54 +02:00
										 |  |  |                     // This is a builtin layer of which stuff is overridden - skip
 | 
					
						
							|  |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-05-17 00:31:10 +02:00
										 |  |  |                 try { | 
					
						
							| 
									
										
										
										
											2021-09-13 01:21:47 +02:00
										 |  |  |                     const parsed = new LayerConfig(layer, "shared_layer_in_theme") | 
					
						
							| 
									
										
										
										
											2021-05-17 00:31:10 +02:00
										 |  |  |                     sharedLayers.set(layer.id, parsed); | 
					
						
							|  |  |  |                     sharedLayers[layer.id] = parsed; | 
					
						
							|  |  |  |                 } catch (e) { | 
					
						
							| 
									
										
										
										
											2021-05-19 19:39:55 +02:00
										 |  |  |                     if (!Utils.runningFromConsole) { | 
					
						
							|  |  |  |                         console.error("Could not parse a layer in theme ", layout.id, "due to", e) | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2021-05-17 00:31:10 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-05-17 00:18:21 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-05-17 00:31:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-06 02:52:38 +01:00
										 |  |  |         return sharedLayers; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |     private static getSharedLayersJson(): Map<string, LayerConfigJson> { | 
					
						
							| 
									
										
										
										
											2021-01-06 02:52:38 +01:00
										 |  |  |         const sharedLayers = new Map<string, any>(); | 
					
						
							| 
									
										
										
										
											2021-04-10 03:50:44 +02:00
										 |  |  |         for (const layer of known_layers.layers) { | 
					
						
							| 
									
										
										
										
											2020-10-27 01:01:34 +01:00
										 |  |  |             sharedLayers.set(layer.id, layer); | 
					
						
							|  |  |  |             sharedLayers[layer.id] = layer; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return sharedLayers; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-01-06 02:52:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-27 14:23:45 +01:00
										 |  |  | } |