forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			80 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import Script from "./Script"
 | |
| import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"
 | |
| import { LayerConfigJson } from "../src/Models/ThemeConfig/Json/LayerConfigJson"
 | |
| import LayerConfig from "../src/Models/ThemeConfig/LayerConfig"
 | |
| import { DoesImageExist } from "../src/Models/ThemeConfig/Conversion/Validation"
 | |
| import { ExtractImages } from "../src/Models/ThemeConfig/Conversion/FixImages"
 | |
| import { ThemeConfigJson } from "../src/Models/ThemeConfig/Json/ThemeConfigJson"
 | |
| import { ConversionContext } from "../src/Models/ThemeConfig/Conversion/ConversionContext"
 | |
| import Constants from "../src/Models/Constants"
 | |
| import { main as downloadCommons } from "./downloadCommons"
 | |
| import { WikimediaImageProvider } from "../src/Logic/ImageProviders/WikimediaImageProvider"
 | |
| import { Utils } from "../src/Utils"
 | |
| import { GenerateLicenseInfo } from "./generateLicenseInfo"
 | |
| 
 | |
| class ImportCustomTheme extends Script {
 | |
|     constructor() {
 | |
|         super("Given the path of a custom layer, will load the layer into mapcomplete as official")
 | |
|     }
 | |
| 
 | |
|     async main(args: string[]) {
 | |
|         const path = args[0]
 | |
| 
 | |
|         const layerconfig = <LayerConfigJson>JSON.parse(readFileSync(path, "utf-8"))
 | |
|         const id = layerconfig.id
 | |
|         const dirPath = "./assets/layers/" + id
 | |
|         if (!existsSync(dirPath)) {
 | |
|             mkdirSync(dirPath)
 | |
|         }
 | |
|         const imageFinder = new ExtractImages(true)
 | |
|         const theme: ThemeConfigJson = <ThemeConfigJson>{
 | |
|             layers: [layerconfig],
 | |
|             id: "dummy-theme-during-import",
 | |
|             title: {
 | |
|                 en: "Dummy",
 | |
|             },
 | |
|             icon: "./assets/svg/plus.svg",
 | |
|             description: {
 | |
|                 en: "Dummy",
 | |
|             },
 | |
|         }
 | |
|         const usedImagesAll: {
 | |
|             path: string
 | |
|             context: string
 | |
|             location: (string | number)[]
 | |
|         }[] = imageFinder.convert(theme, ConversionContext.construct([], ["checking images"]))
 | |
|         const usedImages = usedImagesAll
 | |
|             .filter((img) => !img.path.startsWith("./assets"))
 | |
|             .filter((img) => Constants.defaultPinIcons.indexOf(img.path) < 0)
 | |
|         console.log(usedImages)
 | |
|         const wm = WikimediaImageProvider.singleton
 | |
|         for (const usedImage of usedImages) {
 | |
|             if (usedImage.path.indexOf("wikimedia") >= 0) {
 | |
|                 const filename = WikimediaImageProvider.extractFileName(usedImage.path)
 | |
|                 console.log("Canonical URL is", filename)
 | |
|                 await downloadCommons([
 | |
|                     dirPath,
 | |
|                     "https://commons.wikimedia.org/wiki/File:" + filename,
 | |
|                 ])
 | |
|                 console.log("Used image context:", usedImage.context)
 | |
|                 const replaceAt = usedImage.location
 | |
|                     .slice(2) // We drop ".layer.0" as we put this in a dummy theme
 | |
|                     .map((breadcrumb) =>
 | |
|                         isNaN(Number(breadcrumb)) ? breadcrumb : Number(breadcrumb)
 | |
|                     )
 | |
|                 console.log("Replacement target location is", replaceAt)
 | |
|                 Utils.WalkPath(replaceAt, layerconfig, (_, path) => {
 | |
|                     console.log("Found", path, "to replace with", filename, "origvalue:", _)
 | |
|                     return `./assets/layers/${id}/${filename}`
 | |
|                 })
 | |
|             }
 | |
|         }
 | |
|         writeFileSync(
 | |
|             "./assets/layers/" + id + "/" + id + ".json",
 | |
|             JSON.stringify(layerconfig, null, "  ")
 | |
|         )
 | |
|     }
 | |
| }
 | |
| 
 | |
| new ImportCustomTheme().run()
 | |
| new GenerateLicenseInfo().run()
 |