import * as known_layers from "../assets/generated/known_layers_and_themes.json" import {Utils} from "../Utils"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson"; import SharedTagRenderings from "./SharedTagRenderings"; import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; import WithContextLoader from "../Models/ThemeConfig/WithContextLoader"; export default class AllKnownLayers { public static inited = (_ => { WithContextLoader.getKnownTagRenderings = (id => AllKnownLayers.getTagRendering(id)) return true })() // Must be below the list... public static sharedLayers: Map = AllKnownLayers.getSharedLayers(); public static sharedLayersJson: Map = AllKnownLayers.getSharedLayersJson(); public static added_by_default: string[] = ["gps_location", "home_location", "gps_track"] public static no_include: string[] = [ "conflation", "left_right_style"] /** * Layer IDs of layers which have special properties through built-in hooks */ public static priviliged_layers: string[] = [...AllKnownLayers.added_by_default, "type_node",...AllKnownLayers.no_include] private static getSharedLayers(): Map { const sharedLayers = new Map(); for (const layer of known_layers.layers) { try { // @ts-ignore const parsed = new LayerConfig(layer, "shared_layers") sharedLayers.set(layer.id, parsed); } catch (e) { if (!Utils.runningFromConsole) { console.error("CRITICAL: Could not parse a layer configuration!", layer.id, " due to", e) } } } for (const layout of known_layers.themes) { for (const layer of layout.layers) { if (typeof layer === "string") { continue; } if (layer.builtin !== undefined) { // This is a builtin layer of which stuff is overridden - skip continue; } try { const parsed = new LayerConfig(layer, "shared_layer_in_theme") sharedLayers.set(layer.id, parsed); sharedLayers[layer.id] = parsed; } catch (e) { if (!Utils.runningFromConsole) { console.error("Could not parse a layer in theme ", layout.id, "due to", e) } } } } return sharedLayers; } private static getSharedLayersJson(): Map { const sharedLayers = new Map(); for (const layer of known_layers.layers) { sharedLayers.set(layer.id, layer); sharedLayers[layer.id] = layer; } return sharedLayers; } /** * 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){ return SharedTagRenderings.SharedTagRenderingJson.get(renderingId) } const [layerId, id] = renderingId.split(".") const layer = AllKnownLayers.getSharedLayersJson().get(layerId) if(layer === undefined){ if(Utils.runningFromConsole){ // Probably generating the layer overview return { id: "dummy" } } throw "Builtin layer "+layerId+" not found" } const renderings = layer?.tagRenderings ?? [] for (const rendering of renderings) { if(rendering["id"] === id){ const found = JSON.parse(JSON.stringify(rendering)) if(found.condition === undefined){ found.condition = layer.source.osmTags }else{ found.condition = {and: [found.condition, layer.source.osmTags]} } return found } } 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(", ")}` } }