diff --git a/src/Models/Constants.ts b/src/Models/Constants.ts index 326087e09..08beb6a97 100644 --- a/src/Models/Constants.ts +++ b/src/Models/Constants.ts @@ -35,6 +35,8 @@ export default class Constants { "current_view", "import_candidate", "usersettings", + "icons", + "filters" ] as const /** * Layer IDs of layers which have special properties through built-in hooks diff --git a/src/Models/ThemeConfig/Conversion/PrepareLayer.ts b/src/Models/ThemeConfig/Conversion/PrepareLayer.ts index 32dbd513e..16611e0d7 100644 --- a/src/Models/ThemeConfig/Conversion/PrepareLayer.ts +++ b/src/Models/ThemeConfig/Conversion/PrepareLayer.ts @@ -32,7 +32,6 @@ import { ConfigMeta } from "../../../UI/Studio/configMeta" import LineRenderingConfigJson from "../Json/LineRenderingConfigJson" import { ConversionContext } from "./ConversionContext" import { ExpandRewrite } from "./ExpandRewrite" -import { ALL } from "node:dns" class ExpandFilter extends DesugaringStep { private static readonly predefinedFilters = ExpandFilter.load_filters() @@ -700,6 +699,15 @@ export class RewriteSpecial extends DesugaringStep { ) } + private static escapeStr(v: string): string{ + return v + .replace(/,/g, "&COMMA") + .replace(/\{/g, "&LBRACE") + .replace(/}/g, "&RBRACE") + .replace(/\(/g, "&LPARENS") + .replace(/\)/g, "&RPARENS") + } + /** * Does the heavy lifting and conversion * @@ -756,6 +764,19 @@ export class RewriteSpecial extends DesugaringStep { * const context = ConversionContext.test() * RewriteSpecial.convertIfNeeded(special, context) // => {"en": "

Entrances

This building has {_entrances_count} entrances:{multi(_entrance_properties_with_width,An entrance of &LBRACEcanonical&LPARENSwidth&RPARENS&RBRACE)}{_entrances_count_without_width_count} entrances don't have width information yet"} * context.getAll("error") // => [] + * + * // another actual test + * const special = { + * "special":{ + * "type": "multi", + * "key": "_nearby_bicycle_parkings:props", + * "tagrendering": { + * "*": "{id} ({distance}m) {tagApply(a,b,c)}" + * } + * }} + * const context = ConversionContext.test() + * RewriteSpecial.convertIfNeeded(special, context) // => {"*": "{multi(_nearby_bicycle_parkings:props,&LBRACEid&RBRACE &LPARENS&LBRACEdistance&RBRACEm&RPARENS &LBRACEtagApply&LPARENSa&COMMAb&COMMAc&RPARENS&RBRACE)}"} + * context.getAll("error") // => [] */ private static convertIfNeeded( input: @@ -838,7 +859,7 @@ export class RewriteSpecial extends DesugaringStep { const translatedArgs = argNamesList .map((nm) => special[nm]) .filter((v) => v !== undefined) - .filter((v) => Translations.isProbablyATranslation(v)) + .filter((v) => Translations.isProbablyATranslation(v) || v["*"] !== undefined) for (const translatedArg of translatedArgs) { for (const ln of Object.keys(translatedArg)) { foundLanguages.add(ln) @@ -856,7 +877,7 @@ export class RewriteSpecial extends DesugaringStep { } if (foundLanguages.size === 0) { - const args = argNamesList.map((nm) => special[nm] ?? "").join(",") + const args = argNamesList.map((nm) => RewriteSpecial.escapeStr(special[nm] ?? "")).join(",") return { "*": `{${type}(${args})}`, } @@ -874,13 +895,7 @@ export class RewriteSpecial extends DesugaringStep { } if (typeof v === "string") { - const txt = v - .replace(/,/g, "&COMMA") - .replace(/\{/g, "&LBRACE") - .replace(/}/g, "&RBRACE") - .replace(/\(/g, "&LPARENS") - .replace(/\)/g, "&RPARENS") - args.push(txt) + args.push(RewriteSpecial.escapeStr(v)) } else if (typeof v === "object") { args.push(JSON.stringify(v)) } else {