diff --git a/Models/ThemeConfig/Conversion/PrepareLayer.ts b/Models/ThemeConfig/Conversion/PrepareLayer.ts index 10b021c75a..5ca0f007af 100644 --- a/Models/ThemeConfig/Conversion/PrepareLayer.ts +++ b/Models/ThemeConfig/Conversion/PrepareLayer.ts @@ -7,22 +7,22 @@ import { FirstOf, Fuse, On, - SetDefault -} from "./Conversion"; -import { LayerConfigJson } from "../Json/LayerConfigJson"; -import { TagRenderingConfigJson } from "../Json/TagRenderingConfigJson"; -import { Utils } from "../../../Utils"; -import RewritableConfigJson from "../Json/RewritableConfigJson"; -import SpecialVisualizations from "../../../UI/SpecialVisualizations"; -import Translations from "../../../UI/i18n/Translations"; -import { Translation } from "../../../UI/i18n/Translation"; -import tagrenderingconfigmeta from "../../../assets/tagrenderingconfigmeta.json"; -import { AddContextToTranslations } from "./AddContextToTranslations"; -import FilterConfigJson from "../Json/FilterConfigJson"; -import predifined_filters from "../../../assets/layers/filters/filters.json"; -import { TagConfigJson } from "../Json/TagConfigJson"; -import PointRenderingConfigJson from "../Json/PointRenderingConfigJson"; -import LineRenderingConfigJson from "../Json/LineRenderingConfigJson"; + SetDefault, +} from "./Conversion" +import { LayerConfigJson } from "../Json/LayerConfigJson" +import { TagRenderingConfigJson } from "../Json/TagRenderingConfigJson" +import { Utils } from "../../../Utils" +import RewritableConfigJson from "../Json/RewritableConfigJson" +import SpecialVisualizations from "../../../UI/SpecialVisualizations" +import Translations from "../../../UI/i18n/Translations" +import { Translation } from "../../../UI/i18n/Translation" +import tagrenderingconfigmeta from "../../../assets/tagrenderingconfigmeta.json" +import { AddContextToTranslations } from "./AddContextToTranslations" +import FilterConfigJson from "../Json/FilterConfigJson" +import predifined_filters from "../../../assets/layers/filters/filters.json" +import { TagConfigJson } from "../Json/TagConfigJson" +import PointRenderingConfigJson from "../Json/PointRenderingConfigJson" +import LineRenderingConfigJson from "../Json/LineRenderingConfigJson" class ExpandFilter extends DesugaringStep { private static readonly predefinedFilters = ExpandFilter.load_filters() @@ -99,12 +99,13 @@ class ExpandTagRendering extends Conversion< private readonly _options: { /* If true, will copy the 'osmSource'-tags into the condition */ applyCondition?: true | boolean + noHardcodedStrings?: false | boolean } constructor( state: DesugaringContext, self: LayerConfigJson, - options?: { applyCondition?: true | boolean } + options?: { applyCondition?: true | boolean; noHardcodedStrings?: false | boolean } ) { super( "Converts a tagRenderingSpec into the full tagRendering, e.g. by substituting the tagRendering by the shared-question", @@ -130,7 +131,7 @@ class ExpandTagRendering extends Conversion< } } - private lookup(name: string): TagRenderingConfigJson[] { + private lookup(name: string): TagRenderingConfigJson[] | undefined { const direct = this.directLookup(name) if (direct === undefined) { return undefined @@ -159,9 +160,9 @@ class ExpandTagRendering extends Conversion< } /** - * Looks up a tagRendering based on the name. + * Looks up a tagRendering or group of tagRenderings based on the name. */ - private directLookup(name: string): TagRenderingConfigJson[] { + private directLookup(name: string): TagRenderingConfigJson[] | undefined { const state = this._state if (state.tagRenderings.has(name)) { return [state.tagRenderings.get(name)] @@ -192,7 +193,7 @@ class ExpandTagRendering extends Conversion< const id_ = id.substring(1) matchingTrs = layerTrs.filter((tr) => tr.group === id_ || tr.labels?.indexOf(id_) >= 0) } else { - matchingTrs = layerTrs.filter((tr) => tr.id === id) + matchingTrs = layerTrs.filter((tr) => tr.id === id || tr.labels?.indexOf(id) >= 0) } const contextWriter = new AddContextToTranslations("layers:") @@ -237,8 +238,24 @@ class ExpandTagRendering extends Conversion< if (lookup === undefined) { const isTagRendering = ctx.indexOf("On(mapRendering") < 0 if (isTagRendering) { - warnings.push(ctx + "A literal rendering was detected: " + tr) + warnings.push( + `${ctx}: A literal rendering was detected: ${tr} + Did you perhaps forgot to add a layer name as 'layername.${tr}'? ` + + Array.from(state.sharedLayers.keys()).join(", ") + ) } + + if (this._options?.noHardcodedStrings && this._state.sharedLayers.size > 0) { + errors.push( + ctx + + "Detected an invocation to a builtin tagRendering, but this tagrendering was not found: " + + tr + + " \n Did you perhaps forget to add the layer as prefix, such as `icons." + + tr + + "`? " + ) + } + return [ { render: tr, @@ -867,7 +884,11 @@ export class PrepareLayer extends Fuse { (layer) => new Each(new PreparePointRendering(state, layer)) ), new SetDefault("titleIcons", ["icons.defaults"]), - new On("titleIcons", (layer) => new Concat(new ExpandTagRendering(state, layer))), + new On( + "titleIcons", + (layer) => + new Concat(new ExpandTagRendering(state, layer, { noHardcodedStrings: true })) + ), new ExpandFilter() ) } diff --git a/Models/ThemeConfig/Conversion/Validation.ts b/Models/ThemeConfig/Conversion/Validation.ts index a155c41cf4..06ae6f585d 100644 --- a/Models/ThemeConfig/Conversion/Validation.ts +++ b/Models/ThemeConfig/Conversion/Validation.ts @@ -714,7 +714,6 @@ export class ValidateLayer extends DesugaringStep { `At ${context}: minzoom is ${json.minzoom}, this should be at most ${Constants.userJourney.minZoomLevelToAddNewPoints} as a preset is set. Why? Selecting the pin for a new item will zoom in to level before adding the point. Having a greater minzoom will hide the points, resulting in possible duplicates` ) } - { // duplicate ids in tagrenderings check const duplicates = Utils.Dedup( diff --git a/assets/layers/bicycle_library/bicycle_library.json b/assets/layers/bicycle_library/bicycle_library.json index 05a67322c8..6d26855a52 100644 --- a/assets/layers/bicycle_library/bicycle_library.json +++ b/assets/layers/bicycle_library/bicycle_library.json @@ -52,7 +52,7 @@ }, "render": "" }, - "defaults" + "icons.defaults" ], "description": { "en": "A facility where bicycles can be lent for longer period of times", diff --git a/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json b/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json index dabde6f78f..ed2d3fa311 100644 --- a/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json +++ b/assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json @@ -39,7 +39,7 @@ "render": "", "condition": "operator=De Fietsambassade Gent" }, - "defaults" + "icons.defaults" ], "source": { "osmTags": { @@ -315,4 +315,4 @@ "cs": "Vrstva zobrazující automaty na cyklistické duše (buď speciální automaty na cyklistické duše, nebo klasické automaty s cyklistickými dušemi a případně dalšími předměty souvisejícími s jízdními koly, jako jsou světla, rukavice, zámky, ...)", "ca": "Una capa que mostra màquines expenedores per a tubs de bicicleta (ja siguin màquines expenedores de tubs de bicicleta o màquines expenedores clàssiques amb tubs de bicicleta i opcionalment objectes addicionals relacionats amb la bicicleta com ara llums, guants, panys, ...)" } -} \ No newline at end of file +} diff --git a/assets/layers/bike_repair_station/bike_repair_station.json b/assets/layers/bike_repair_station/bike_repair_station.json index 667b567af2..fd7e0ba600 100644 --- a/assets/layers/bike_repair_station/bike_repair_station.json +++ b/assets/layers/bike_repair_station/bike_repair_station.json @@ -158,7 +158,7 @@ "render": "", "condition": "operator=De Fietsambassade Gent" }, - "defaults" + "icons.defaults" ], "tagRenderings": [ "images", @@ -1015,4 +1015,4 @@ "fr": "Une couche montrant les pompes à vélo et les centres de réparation", "cs": "Vrstva zobrazující vzduchové kompresory na jízdní kola a stojany na nářadí pro opravu jízdních kol" } -} \ No newline at end of file +} diff --git a/assets/layers/bike_shop/bike_shop.json b/assets/layers/bike_shop/bike_shop.json index 70e63386d9..78407accf4 100644 --- a/assets/layers/bike_shop/bike_shop.json +++ b/assets/layers/bike_shop/bike_shop.json @@ -197,7 +197,7 @@ "condition": "service:bicycle:cleaning=yes", "render": "" }, - "defaults" + "icons.defaults" ], "description": { "en": "A shop specifically selling bicycles or related items",