forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			65 lines
		
	
	
		
			No EOL
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			No EOL
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {readFileSync, writeFileSync} from "fs";
 | 
						|
import {DesugaringStep} from "../Models/ThemeConfig/Conversion/Conversion";
 | 
						|
import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson";
 | 
						|
import {Utils} from "../Utils";
 | 
						|
import Translations from "../UI/i18n/Translations";
 | 
						|
 | 
						|
class ConvertImagesToIcon extends DesugaringStep<LayerConfigJson> {
 | 
						|
    private _iconClass: string;
 | 
						|
 | 
						|
    constructor(iconClass: string) {
 | 
						|
        super("Searches for images in the 'then' path, removes the <img> block and extracts the image itself a 'icon'",
 | 
						|
            [], "ConvertImagesToIcon")
 | 
						|
        this._iconClass = iconClass;
 | 
						|
    }
 | 
						|
 | 
						|
    convert(json: LayerConfigJson, context: string): { result: LayerConfigJson; errors?: string[]; warnings?: string[]; information?: string[] } {
 | 
						|
        const information = []
 | 
						|
        const errors = []
 | 
						|
        json = Utils.Clone(json)
 | 
						|
        Utils.WalkPath(
 | 
						|
            ["tagRenderings", "mappings"],
 | 
						|
            json,
 | 
						|
            mapping => {
 | 
						|
                const then = Translations.T(mapping.then)
 | 
						|
                const images = Utils.Dedup(then.ExtractImages())
 | 
						|
                if (images.length == 0) {
 | 
						|
                    return mapping
 | 
						|
                }
 | 
						|
                if (images.length > 1) {
 | 
						|
                    errors.push("The mapping " + mapping.then + " has multiple images: " + images.join(", "))
 | 
						|
                }
 | 
						|
                information.push("Replaced image " + images[0])
 | 
						|
                const replaced = then.OnEveryLanguage((s) => {
 | 
						|
                    return s.replace(/(<div [^>]*>)?<img [^>]*> ?/, "").replace(/<\/div>$/, "").trim()
 | 
						|
                })
 | 
						|
 | 
						|
                mapping.then = replaced.translations
 | 
						|
                mapping.icon = {path: images[0], class: this._iconClass}
 | 
						|
                return mapping
 | 
						|
            }
 | 
						|
        )
 | 
						|
 | 
						|
        return {
 | 
						|
            information,
 | 
						|
            result: json
 | 
						|
        };
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * One-of script to load one layer.json-file and rewrite all tagrenderings
 | 
						|
 */
 | 
						|
function main() {
 | 
						|
    let args = [...process.argv]
 | 
						|
    args.splice(0, 2)
 | 
						|
    const path = args[0]
 | 
						|
    const iconClass = args[1] ?? "small"
 | 
						|
    const targetFile = args[2] ?? path + ".autoconverted.json"
 | 
						|
    const parsed = JSON.parse(readFileSync(path, "UTF8"))
 | 
						|
    const converted = new ConvertImagesToIcon(iconClass).convertStrict(parsed, "While running the fixImagesInTagRenderings-script")
 | 
						|
    writeFileSync(targetFile, JSON.stringify(converted, null, "  "))
 | 
						|
    console.log("Written fixed version to " + targetFile)
 | 
						|
}
 | 
						|
 | 
						|
main(); |