forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			117 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import * as fs from "fs"
 | 
						|
import { DesugaringStep } from "../src/Models/ThemeConfig/Conversion/Conversion"
 | 
						|
import { LayerConfigJson } from "../src/Models/ThemeConfig/Json/LayerConfigJson"
 | 
						|
import { QuestionableTagRenderingConfigJson } from "../src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson"
 | 
						|
import * as fakedom from "fake-dom"
 | 
						|
import Script from "./Script"
 | 
						|
import { FixedUiElement } from "../src/UI/Base/FixedUiElement"
 | 
						|
 | 
						|
class ExtractQuestionHint extends DesugaringStep<QuestionableTagRenderingConfigJson> {
 | 
						|
    constructor() {
 | 
						|
        super(
 | 
						|
            "Tries to extract a 'questionHint' from the question",
 | 
						|
            ["question", "questionhint"],
 | 
						|
            "ExtractQuestionHint"
 | 
						|
        )
 | 
						|
    }
 | 
						|
 | 
						|
    convert(
 | 
						|
        json: QuestionableTagRenderingConfigJson,
 | 
						|
        context: string
 | 
						|
    ): {
 | 
						|
        result: QuestionableTagRenderingConfigJson
 | 
						|
        errors?: string[]
 | 
						|
        warnings?: string[]
 | 
						|
        information?: string[]
 | 
						|
    } {
 | 
						|
        json = { ...json }
 | 
						|
        if (json.question === undefined || json.questionHint !== undefined) {
 | 
						|
            return { result: json }
 | 
						|
        }
 | 
						|
 | 
						|
        if (typeof json.question === "string") {
 | 
						|
            return { result: json }
 | 
						|
        }
 | 
						|
 | 
						|
        const hint: Record<string, string> = {}
 | 
						|
 | 
						|
        for (const language in json.question) {
 | 
						|
            const q = json.question[language]
 | 
						|
            const parts = q.split(/<br ?\/>/i)
 | 
						|
            if (parts.length == 2) {
 | 
						|
                json.question[language] = parts[0]
 | 
						|
                const txt = new FixedUiElement(parts[1]).ConstructElement().textContent
 | 
						|
                if (txt.length > 0) {
 | 
						|
                    hint[language] = txt
 | 
						|
                }
 | 
						|
                continue
 | 
						|
            }
 | 
						|
 | 
						|
            const divStart = [q.indexOf("<div "), q.indexOf("<span "), q.indexOf("<p ")].find(
 | 
						|
                (i) => i > 0
 | 
						|
            ) // note: > 0, not >= : we are not interested in a span starting right away!
 | 
						|
            if (divStart > 0) {
 | 
						|
                json.question[language] = q.substring(0, divStart)
 | 
						|
                const txt = new FixedUiElement(q.substring(divStart)).ConstructElement().textContent
 | 
						|
                if (txt !== "") {
 | 
						|
                    hint[language] = txt
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (Object.keys(hint).length > 0) {
 | 
						|
            json.questionHint = hint
 | 
						|
        }
 | 
						|
 | 
						|
        console.log("Inspecting ", json.question)
 | 
						|
 | 
						|
        return { result: json }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class FixQuestionHint extends Script {
 | 
						|
    private fs: any
 | 
						|
    constructor() {
 | 
						|
        super("Extracts a 'questionHint' from a question for a given 'layer.json' or 'theme.json'")
 | 
						|
        if (fakedom === undefined) {
 | 
						|
            throw "Fakedom not active"
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    async main(args: string[]): Promise<void> {
 | 
						|
        const filepath = args[0]
 | 
						|
        const contents = JSON.parse(fs.readFileSync(filepath, { encoding: "utf8" }))
 | 
						|
        const convertor = new ExtractQuestionHint()
 | 
						|
        if (filepath.endsWith("/questions.json")) {
 | 
						|
            for (const key in contents) {
 | 
						|
                const tr = contents[key]
 | 
						|
                if (typeof tr !== "object") {
 | 
						|
                    continue
 | 
						|
                }
 | 
						|
                contents[key] = convertor.convertStrict(
 | 
						|
                    tr,
 | 
						|
                    "While automatically extracting questiondHints of " + filepath
 | 
						|
                )
 | 
						|
            }
 | 
						|
            fs.writeFileSync(filepath, JSON.stringify(contents, null, "  "), { encoding: "utf-8" })
 | 
						|
 | 
						|
            return
 | 
						|
        }
 | 
						|
        const layers: LayerConfigJson[] = contents["layers"] ?? [contents]
 | 
						|
        for (const layer of layers) {
 | 
						|
            for (let i = 0; i < layer.tagRenderings?.length; i++) {
 | 
						|
                const tagRendering = layer.tagRenderings[i]
 | 
						|
                if (typeof tagRendering !== "object" || tagRendering["question"] === undefined) {
 | 
						|
                    continue
 | 
						|
                }
 | 
						|
                layer.tagRenderings[i] = convertor.convertStrict(
 | 
						|
                    <QuestionableTagRenderingConfigJson>tagRendering,
 | 
						|
                    "While automatically extracting questionHints of " + filepath
 | 
						|
                )
 | 
						|
            }
 | 
						|
        }
 | 
						|
        // The layer(s) are modified inPlace, so we can simply write to disk
 | 
						|
        fs.writeFileSync(filepath, JSON.stringify(contents, null, "  "), { encoding: "utf8" })
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
new FixQuestionHint().run()
 |