import * as fs from "fs" import { DesugaringStep } from "../Models/ThemeConfig/Conversion/Conversion" import { LayerConfigJson } from "../Models/ThemeConfig/Json/LayerConfigJson" import { QuestionableTagRenderingConfigJson } from "../Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson" import * as fakedom from "fake-dom" import Script from "./Script" import { FixedUiElement } from "../UI/Base/FixedUiElement" class ExtractQuestionHint extends DesugaringStep { 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 = {} for (const language in json.question) { const q = json.question[language] const parts = q.split(/
/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("
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 { 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( 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()