87 lines
No EOL
3.2 KiB
TypeScript
87 lines
No EOL
3.2 KiB
TypeScript
/*
|
|
* This script attempt to automatically fix some basic issues when a theme from the custom generator is loaded
|
|
*/
|
|
import {Utils} from "../Utils"
|
|
Utils.runningFromConsole = true;
|
|
|
|
import {readFileSync, writeFileSync} from "fs";
|
|
import {LayoutConfigJson} from "../Customizations/JSON/LayoutConfigJson";
|
|
import LayerConfig from "../Customizations/JSON/LayerConfig";
|
|
import SmallLicense from "../Models/smallLicense";
|
|
import AllKnownLayers from "../Customizations/AllKnownLayers";
|
|
import ScriptUtils from "./ScriptUtils";
|
|
import AllImageProviders from "../Logic/ImageProviders/AllImageProviders";
|
|
|
|
|
|
ScriptUtils.fixUtils()
|
|
|
|
if(process.argv.length == 2){
|
|
console.log("USAGE: ts-node scripts/fixTheme <path to theme>")
|
|
throw "No path specified"
|
|
}
|
|
|
|
const path = process.argv[2]
|
|
const dir = path.substring(0, path.lastIndexOf("/"))
|
|
|
|
console.log("Fixing up ", path)
|
|
|
|
const themeConfigJson : LayoutConfigJson = JSON.parse(readFileSync(path, "UTF8"))
|
|
|
|
const licenses : SmallLicense[] = []
|
|
|
|
const replacements: {source: string, destination: string}[] = []
|
|
|
|
for (const layerConfigJson of themeConfigJson.layers) {
|
|
if(typeof (layerConfigJson) === "string"){
|
|
continue;
|
|
}
|
|
if(layerConfigJson["overpassTags"] !== undefined){
|
|
const tags = layerConfigJson["overpassTags"];
|
|
layerConfigJson["overpassTags"] = undefined;
|
|
layerConfigJson["source"] = { osmTags : tags}
|
|
}
|
|
// @ts-ignore
|
|
const layerConfig = new LayerConfig(layerConfigJson, AllKnownLayers.sharedUnits, "fix theme",true)
|
|
const images : string[] = Array.from(layerConfig.ExtractImages())
|
|
const remoteImages = images.filter(img => img.startsWith("http"))
|
|
|
|
for (const remoteImage of remoteImages) {
|
|
|
|
|
|
const filename = remoteImage.substring(remoteImage.lastIndexOf("/"))
|
|
ScriptUtils.DownloadFileTo(remoteImage, dir + "/" + filename)
|
|
|
|
|
|
const imgPath = remoteImage.substring(remoteImage.lastIndexOf("/") + 1)
|
|
|
|
for (const attributionSrc of AllImageProviders.ImageAttributionSource) {
|
|
try {
|
|
attributionSrc.GetAttributionFor(remoteImage).addCallbackAndRun(license => {
|
|
console.log("Downloaded an attribution!")
|
|
licenses.push({
|
|
path: imgPath,
|
|
license: license?.license ?? "",
|
|
authors:Utils.NoNull([license?.artist]),
|
|
sources: [remoteImage]
|
|
})
|
|
})
|
|
}catch(e){
|
|
// Hush hush
|
|
}
|
|
}
|
|
|
|
replacements.push({source: remoteImage, destination: `${dir}/${imgPath}`})
|
|
}
|
|
}
|
|
|
|
let fixedThemeJson = JSON.stringify(themeConfigJson, null , " ")
|
|
for (const replacement of replacements) {
|
|
fixedThemeJson = fixedThemeJson.replace(new RegExp(replacement.source, "g"), replacement.destination)
|
|
}
|
|
|
|
writeFileSync(dir + "/generated.license_info.json", JSON.stringify(licenses, null, " "))
|
|
writeFileSync(path+".autofixed.json", fixedThemeJson)
|
|
|
|
console.log(`IMPORTANT:
|
|
1) Copy generated.license_info.json over into license_info.json and add the missing attributions and authors
|
|
2) Verify ${path}.autofixed.json as theme, and rename it to ${path}`) |