import { PlatformPackager } from "app-builder-lib" import { getLicenseAssets } from "app-builder-lib/out/util/license" import { log } from "builder-util" import { readFile } from "fs-extra" import * as iconv from "iconv-lite" import { load } from "js-yaml" import { serializeString } from "./dmgUtil" import { getDefaultButtons } from "./licenseDefaultButtons" export async function getLicenseButtonsFile(packager: PlatformPackager): Promise> { return getLicenseAssets( (await packager.resourceList).filter(it => { const name = it.toLowerCase() // noinspection SpellCheckingInspection return name.startsWith("licensebuttons_") && (name.endsWith(".json") || name.endsWith(".yml")) }), packager ) } export interface LicenseButtonsFile { file: string lang: string langWithRegion: string langName: string } export async function getLicenseButtons(licenseButtonFiles: Array, langWithRegion: string, id: number, name: string) { let data = getDefaultButtons(langWithRegion, id, name) for (const item of licenseButtonFiles) { if (item.langWithRegion !== langWithRegion) { continue } try { const fileData = load(await readFile(item.file, "utf-8")) as any const buttonsStr = labelToHex(fileData.lang, item.lang, item.langWithRegion) + labelToHex(fileData.agree, item.lang, item.langWithRegion) + labelToHex(fileData.disagree, item.lang, item.langWithRegion) + labelToHex(fileData.print, item.lang, item.langWithRegion) + labelToHex(fileData.save, item.lang, item.langWithRegion) + labelToHex(fileData.description, item.lang, item.langWithRegion) data = `data 'STR#' (${id}, "${name}") {\n` data += serializeString("0006" + buttonsStr) data += `\n};` if (log.isDebugEnabled) { log.debug({ lang: item.langName, data }, `overwriting license buttons`) } return data } catch (e: any) { log.debug({ error: e }, "cannot overwrite license buttons") return data } } return data } function labelToHex(label: string, lang: string, langWithRegion: string) { const lbl = hexEncode(label, lang, langWithRegion).toString().toUpperCase() const len = numberToHex(lbl.length / 2) return len + lbl } function numberToHex(nb: number) { return ("0" + nb.toString(16)).slice(-2) } function hexEncode(str: string, lang: string, langWithRegion: string) { const macCodePages = getMacCodePage(lang, langWithRegion) let result = "" for (let i = 0; i < str.length; i++) { try { let hex = getMacHexCode(str, i, macCodePages) if (hex === undefined) { hex = "3F" //? } result += hex } catch (e: any) { log.debug({ error: e, char: str[i] }, "cannot convert") result += "3F" //? } } return result } function getMacCodePage(lang: string, langWithRegion: string) { switch (lang) { case "ja": //japanese return ["euc-jp"] //Apple Japanese case "zh": //chinese if (langWithRegion === "zh_CN") { return ["gb2312"] //Apple Simplified Chinese (GB 2312) } return ["big5"] //Apple Traditional Chinese (Big5) case "ko": //korean return ["euc-kr"] //Apple Korean case "ar": //arabic case "ur": //urdu return ["macarabic"] //Apple Arabic case "he": //hebrew return ["machebrew"] //Apple Hebrew case "el": //greek case "elc": //greek return ["macgreek"] //Apple Greek case "ru": //russian case "be": //belarussian case "sr": //serbian case "bg": //bulgarian case "uz": //uzbek return ["maccyrillic"] //Apple Macintosh Cyrillic case "ro": //romanian return ["macromania"] //Apple Romanian case "uk": //ukrainian return ["macukraine"] //Apple Ukrainian case "th": //thai return ["macthai"] //Apple Thai case "et": //estonian case "lt": //lithuanian case "lv": //latvian case "pl": //polish case "hu": //hungarian case "cs": //czech case "sk": //slovak return ["maccenteuro"] //Apple Macintosh Central Europe case "is": //icelandic case "fo": //faroese return ["maciceland"] //Apple Icelandic case "tr": //turkish return ["macturkish"] //Apple Turkish case "hr": //croatian case "sl": //slovenian return ["maccroatian"] //Apple Croatian default: return ["macroman"] //Apple Macintosh Roman } } function getMacHexCode(str: string, i: number, macCodePages: any) { const code = str.charCodeAt(i) if (code < 128) { return code.toString(16) } else if (code < 256) { return iconv.encode(str[i], "macroman").toString("hex") } else { for (let i = 0; i < macCodePages.length; i++) { const result = iconv.encode(str[i], macCodePages[i]).toString("hex") if (result !== undefined) { return result } } } return code }