From c8b87e92f7f2d73e9393ee26d0bf7c02c5d71fe3 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Mon, 8 Jul 2024 23:35:40 +0200 Subject: [PATCH] Remove images in overview, fix #2007 --- scripts/generateLayerOverview.ts | 141 ++++++++++++++++--------------- 1 file changed, 72 insertions(+), 69 deletions(-) diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index 87e2c7d737..659e49a53e 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -31,6 +31,8 @@ import PointRenderingConfig from "../src/Models/ThemeConfig/PointRenderingConfig import { ConversionContext } from "../src/Models/ThemeConfig/Conversion/ConversionContext" import { GenerateFavouritesLayer } from "./generateFavouritesLayer" import LayoutConfig from "../src/Models/ThemeConfig/LayoutConfig" +import Translations from "../src/UI/i18n/Translations" +import { Translatable } from "../src/Models/ThemeConfig/Json/Translatable" // This scripts scans 'src/assets/layers/*.json' for layer definition files and 'src/assets/themes/*.json' for theme definition files. // It spits out an overview of those to be used to load them @@ -53,7 +55,7 @@ class ParseLayer extends Conversion< convert( path: string, - context: ConversionContext + context: ConversionContext, ): { parsed: LayerConfig raw: LayerConfigJson @@ -108,7 +110,7 @@ class AddIconSummary extends DesugaringStep<{ raw: LayerConfigJson; parsed: Laye const fixed = json.raw const layerConfig = json.parsed const pointRendering: PointRenderingConfig = layerConfig.mapRendering.find((pr) => - pr.location.has("point") + pr.location.has("point"), ) const defaultTags = layerConfig.GetBaseTags() fixed["_layerIcon"] = Utils.NoNull( @@ -123,7 +125,7 @@ class AddIconSummary extends DesugaringStep<{ raw: LayerConfigJson; parsed: Laye result["color"] = c } return result - }) + }), ) return { raw: fixed, parsed: layerConfig } } @@ -145,7 +147,7 @@ class LayerOverviewUtils extends Script { private static extractLayerIdsFrom( themeFile: LayoutConfigJson, - includeInlineLayers = true + includeInlineLayers = true, ): string[] { const publicLayerIds: string[] = [] if (!Array.isArray(themeFile.layers)) { @@ -177,6 +179,10 @@ class LayerOverviewUtils extends Script { return publicLayerIds } + public static cleanTranslation(t: Record | Translation): Translatable { + return Translations.T(t).OnEveryLanguage((s) => parse_html(s).textContent).translations + } + shouldBeUpdated(sourcefile: string | string[], targetfile: string): boolean { if (!existsSync(targetfile)) { return true @@ -208,10 +214,10 @@ class LayerOverviewUtils extends Script { | LayerConfigJson | string | { - builtin - } - )[] - }[] + builtin + } + )[] + }[], ) { const perId = new Map() for (const theme of themes) { @@ -226,7 +232,7 @@ class LayerOverviewUtils extends Script { const data = { id: theme.id, title: theme.title, - shortDescription: theme.shortDescription, + shortDescription: LayerOverviewUtils.cleanTranslation(theme.shortDescription), icon: theme.icon, hideFromOverview: theme.hideFromOverview, mustHaveLanguage: theme.mustHaveLanguage, @@ -252,7 +258,7 @@ class LayerOverviewUtils extends Script { writeFileSync( "./src/assets/generated/theme_overview.json", JSON.stringify(sorted, null, " "), - { encoding: "utf8" } + { encoding: "utf8" }, ) } @@ -264,7 +270,7 @@ class LayerOverviewUtils extends Script { writeFileSync( `${LayerOverviewUtils.themePath}${theme.id}.json`, JSON.stringify(theme, null, " "), - { encoding: "utf8" } + { encoding: "utf8" }, ) } @@ -275,12 +281,12 @@ class LayerOverviewUtils extends Script { writeFileSync( `${LayerOverviewUtils.layerPath}${layer.id}.json`, JSON.stringify(layer, null, " "), - { encoding: "utf8" } + { encoding: "utf8" }, ) } static asDict( - trs: QuestionableTagRenderingConfigJson[] + trs: QuestionableTagRenderingConfigJson[], ): Map { const d = new Map() for (const tr of trs) { @@ -293,12 +299,12 @@ class LayerOverviewUtils extends Script { getSharedTagRenderings( doesImageExist: DoesImageExist, bootstrapTagRenderings: Map, - bootstrapTagRenderingsOrder: string[] + bootstrapTagRenderingsOrder: string[], ): QuestionableTagRenderingConfigJson[] getSharedTagRenderings( doesImageExist: DoesImageExist, bootstrapTagRenderings: Map = null, - bootstrapTagRenderingsOrder: string[] = [] + bootstrapTagRenderingsOrder: string[] = [], ): QuestionableTagRenderingConfigJson[] { const prepareLayer = new PrepareLayer( { @@ -309,7 +315,7 @@ class LayerOverviewUtils extends Script { }, { addTagRenderingsToContext: true, - } + }, ) const path = "assets/layers/questions/questions.json" @@ -329,7 +335,7 @@ class LayerOverviewUtils extends Script { return this.getSharedTagRenderings( doesImageExist, dict, - sharedQuestions.tagRenderings.map((tr) => tr["id"]) + sharedQuestions.tagRenderings.map((tr) => tr["id"]), ) } @@ -369,8 +375,8 @@ class LayerOverviewUtils extends Script { if (contents.indexOf(" 0) { console.warn( "The SVG at " + - path + - " contains a `text`-tag. This is highly discouraged. Every machine viewing your theme has their own font libary, and the font you choose might not be present, resulting in a different font being rendered. Solution: open your .svg in inkscape (or another program), select the text and convert it to a path" + path + + " contains a `text`-tag. This is highly discouraged. Every machine viewing your theme has their own font libary, and the font you choose might not be present, resulting in a different font being rendered. Solution: open your .svg in inkscape (or another program), select the text and convert it to a path", ) errCount++ } @@ -386,14 +392,14 @@ class LayerOverviewUtils extends Script { args .find((a) => a.startsWith("--themes=")) ?.substring("--themes=".length) - ?.split(",") ?? [] + ?.split(",") ?? [], ) const layerWhitelist = new Set( args .find((a) => a.startsWith("--layers=")) ?.substring("--layers=".length) - ?.split(",") ?? [] + ?.split(",") ?? [], ) const forceReload = args.some((a) => a == "--force") @@ -422,11 +428,11 @@ class LayerOverviewUtils extends Script { sharedLayers, recompiledThemes, forceReload, - themeWhitelist + themeWhitelist, ) new ValidateThemeEnsemble().convertStrict( - Array.from(sharedThemes.values()).map((th) => new LayoutConfig(th, true)) + Array.from(sharedThemes.values()).map((th) => new LayoutConfig(th, true)), ) if (recompiledThemes.length > 0) { @@ -434,7 +440,7 @@ class LayerOverviewUtils extends Script { "./src/assets/generated/known_layers.json", JSON.stringify({ layers: Array.from(sharedLayers.values()).filter((l) => l.id !== "favourite"), - }) + }), ) } @@ -455,7 +461,7 @@ class LayerOverviewUtils extends Script { const proto: LayoutConfigJson = JSON.parse( readFileSync("./assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json", { encoding: "utf8", - }) + }), ) const protolayer = ( proto.layers.filter((l) => l["id"] === "mapcomplete-changes")[0] @@ -472,12 +478,12 @@ class LayerOverviewUtils extends Script { layers: ScriptUtils.getLayerFiles().map((f) => f.parsed), themes: ScriptUtils.getThemeFiles().map((f) => f.parsed), }, - ConversionContext.construct([], []) + ConversionContext.construct([], []), ) for (const [_, theme] of sharedThemes) { theme.layers = theme.layers.filter( - (l) => Constants.added_by_default.indexOf(l["id"]) < 0 + (l) => Constants.added_by_default.indexOf(l["id"]) < 0, ) } @@ -486,7 +492,7 @@ class LayerOverviewUtils extends Script { "./src/assets/generated/known_themes.json", JSON.stringify({ themes: Array.from(sharedThemes.values()), - }) + }), ) } @@ -498,7 +504,7 @@ class LayerOverviewUtils extends Script { private parseLayer( doesImageExist: DoesImageExist, prepLayer: PrepareLayer, - sharedLayerPath: string + sharedLayerPath: string, ): { raw: LayerConfigJson parsed: LayerConfig @@ -509,7 +515,7 @@ class LayerOverviewUtils extends Script { const parsed = parser.convertStrict(sharedLayerPath, context) const result = AddIconSummary.singleton.convertStrict( parsed, - context.inOperation("AddIconSummary") + context.inOperation("AddIconSummary"), ) return { ...result, context } } @@ -517,7 +523,7 @@ class LayerOverviewUtils extends Script { private buildLayerIndex( doesImageExist: DoesImageExist, forceReload: boolean, - whitelist: Set + whitelist: Set, ): Map { // First, we expand and validate all builtin layers. These are written to src/assets/generated/layers // At the same time, an index of available layers is built. @@ -572,17 +578,17 @@ class LayerOverviewUtils extends Script { console.log( "Recompiled layers " + - recompiledLayers.join(", ") + - " and skipped " + - skippedLayers.length + - " layers. Detected " + - warningCount + - " warnings" + recompiledLayers.join(", ") + + " and skipped " + + skippedLayers.length + + " layers. Detected " + + warningCount + + " warnings", ) // We always need the calculated tags of 'usersettings', so we export them separately this.extractJavascriptCodeForLayer( state.sharedLayers.get("usersettings"), - "./src/Logic/State/UserSettingsMetaTagging.ts" + "./src/Logic/State/UserSettingsMetaTagging.ts", ) return sharedLayers @@ -599,8 +605,8 @@ class LayerOverviewUtils extends Script { private extractJavascriptCode(themeFile: LayoutConfigJson) { const allCode = [ "import {Feature} from 'geojson'", - 'import { ExtraFuncType } from "../../../Logic/ExtraFunctions";', - 'import { Utils } from "../../../Utils"', + "import { ExtraFuncType } from \"../../../Logic/ExtraFunctions\";", + "import { Utils } from \"../../../Utils\"", "export class ThemeMetaTagging {", " public static readonly themeName = " + JSON.stringify(themeFile.id), "", @@ -612,8 +618,8 @@ class LayerOverviewUtils extends Script { allCode.push( " public metaTaggging_for_" + - id + - "(feat: Feature, helperFunctions: Record Function>) {" + id + + "(feat: Feature, helperFunctions: Record Function>) {", ) allCode.push(" const {" + ExtraFunctions.types.join(", ") + "} = helperFunctions") for (const line of code) { @@ -624,10 +630,10 @@ class LayerOverviewUtils extends Script { if (!isStrict) { allCode.push( " Utils.AddLazyProperty(feat.properties, '" + - attributeName + - "', () => " + - expression + - " ) " + attributeName + + "', () => " + + expression + + " ) ", ) } else { attributeName = attributeName.substring(0, attributeName.length - 1).trim() @@ -672,7 +678,7 @@ class LayerOverviewUtils extends Script { const code = l.calculatedTags ?? [] allCode.push( - " public metaTaggging_for_" + l.id + "(feat: {properties: Record}) {" + " public metaTaggging_for_" + l.id + "(feat: {properties: Record}) {", ) for (const line of code) { const firstEq = line.indexOf("=") @@ -682,10 +688,10 @@ class LayerOverviewUtils extends Script { if (!isStrict) { allCode.push( " Utils.AddLazyProperty(feat.properties, '" + - attributeName + - "', () => " + - expression + - " ) " + attributeName + + "', () => " + + expression + + " ) ", ) } else { attributeName = attributeName.substring(0, attributeName.length - 2).trim() @@ -710,14 +716,14 @@ class LayerOverviewUtils extends Script { sharedLayers: Map, recompiledThemes: string[], forceReload: boolean, - whitelist: Set + whitelist: Set, ): Map { console.log(" ---------- VALIDATING BUILTIN THEMES ---------") const themeFiles = ScriptUtils.getThemeFiles() const fixed = new Map() const publicLayers = LayerOverviewUtils.publicLayerIdsFrom( - themeFiles.map((th) => th.parsed) + themeFiles.map((th) => th.parsed), ) const trs = this.getSharedTagRenderings(new DoesImageExist(licensePaths, existsSync)) @@ -757,15 +763,15 @@ class LayerOverviewUtils extends Script { LayerOverviewUtils.themePath + "/" + themePath.substring(themePath.lastIndexOf("/")) const usedLayers = Array.from( - LayerOverviewUtils.extractLayerIdsFrom(themeFile, false) + LayerOverviewUtils.extractLayerIdsFrom(themeFile, false), ).map((id) => LayerOverviewUtils.layerPath + id + ".json") if (!forceReload && !this.shouldBeUpdated([themePath, ...usedLayers], targetPath)) { fixed.set( themeFile.id, JSON.parse( - readFileSync(LayerOverviewUtils.themePath + themeFile.id + ".json", "utf8") - ) + readFileSync(LayerOverviewUtils.themePath + themeFile.id + ".json", "utf8"), + ), ) ScriptUtils.erasableLog("Skipping", themeFile.id) skippedThemes.push(themeFile.id) @@ -776,23 +782,23 @@ class LayerOverviewUtils extends Script { new PrevalidateTheme().convertStrict( themeFile, - ConversionContext.construct([themePath], ["PrepareLayer"]) + ConversionContext.construct([themePath], ["PrepareLayer"]), ) try { themeFile = new PrepareTheme(convertState, { skipDefaultLayers: true, }).convertStrict( themeFile, - ConversionContext.construct([themePath], ["PrepareLayer"]) + ConversionContext.construct([themePath], ["PrepareLayer"]), ) new ValidateThemeAndLayers( new DoesImageExist(licensePaths, existsSync, knownTagRenderings), themePath, true, - knownTagRenderings + knownTagRenderings, ).convertStrict( themeFile, - ConversionContext.construct([themePath], ["PrepareLayer"]) + ConversionContext.construct([themePath], ["PrepareLayer"]), ) if (themeFile.icon.endsWith(".svg")) { @@ -841,22 +847,19 @@ class LayerOverviewUtils extends Script { ...t, hideFromOverview: t.hideFromOverview ?? false, shortDescription: - t.shortDescription ?? - new Translation(t.description) - .FirstSentence() - .OnEveryLanguage((s) => parse_html(s).textContent).translations, + t.shortDescription ?? new Translation(t.description).FirstSentence(), mustHaveLanguage: t.mustHaveLanguage?.length > 0, } - }) + }), ) } console.log( "Recompiled themes " + - recompiledThemes.join(", ") + - " and skipped " + - skippedThemes.length + - " themes" + recompiledThemes.join(", ") + + " and skipped " + + skippedThemes.length + + " themes", ) return fixed