diff --git a/tools/deploy/lang.js b/tools/deploy/lang.js index 85953a99..37115e1d 100644 --- a/tools/deploy/lang.js +++ b/tools/deploy/lang.js @@ -39,30 +39,26 @@ function addPair(src, dst) { const ENV = { toPSID(dst) { - const parsed = pathlib.parse(dst); - delete parsed.base; - parsed.name = util.toPSID(util.decode(parsed.name)); + const parsed = util.parse(dst); + parsed.name = util.toPSID(parsed.data[0]); return pathlib.format(parsed); }, toPSSpriteID(dst) { - const parsed = pathlib.parse(dst); - delete parsed.base; - parsed.name = util.toPSSpriteID(util.decode(parsed.name)); + const parsed = util.parse(dst); + parsed.name = util.toPSSpriteID(parsed.data); return pathlib.format(parsed); }, toSmogonAlias(dst) { - const parsed = pathlib.parse(dst); - delete parsed.base; - parsed.name = util.toSmogonAlias(util.decode(parsed.name)); + const parsed = util.parse(dst); + parsed.name = util.toSmogonAlias(parsed.data[0]); return pathlib.format(parsed); }, toSmogonSpriteAlias(dst) { - const parsed = pathlib.parse(dst); - delete parsed.base; - parsed.name = util.toSmogonSpriteAlias(util.decode(parsed.name)); + const parsed = util.parse(dst); + parsed.name = util.toSmogonSpriteAlias(parsed.data); return pathlib.format(parsed); }, diff --git a/tools/deploy/util.js b/tools/deploy/util.js index 6b80c8b6..fabb8ced 100644 --- a/tools/deploy/util.js +++ b/tools/deploy/util.js @@ -1,10 +1,49 @@ -export function decode(s) { - return s.replace(/__(....)/g, (_, m) => String.fromCharCode(parseInt(m, 16))).replace("_", " "); +import pathlib from 'path'; + +export function decodeComponent(s) { + return s + .replace(/([^_])_([^_])/g, "$1 $2") + .replace(/~/g, "-") + // Must occur last, or escaped ~/_ will be transformed + .replace(/__(....)/g, (_, m) => String.fromCharCode(parseInt(m, 16))); } -export function decomposeName(name) { - const [num, formeNum, base, forme=null] = name.split("-").map(s => s.replace(/~/g, "-")); +export function decode(s) { + return s.split("-").map(c => decodeComponent(c)); +} + +export function parse(s) { + const {dir, root, name, ext} = pathlib.parse(s); + return { + dir, + root, + data: decode(name), + ext + }; +} + +export function encodeComponent(s) { + return s + .replace(/[^0-9a-zA-Z-. ]/g, c => '__' + c.charCodeAt(0).toString(16).padStart(4, "0")) + .replace(" ", "_") + .replace("-", "~"); +} + +export function encode(l) { + return l.map(c => encodeComponent(c)).join("-"); +} + +export function format({dir, root, data, ext}) { + return pathlib.format({ + dir, + root, + name: encode(data), + ext + }); +} + +export function parsePokemonFilename([num, formeNum, base, forme=null]) { return {num: parseInt(num, 10), formeNum: parseInt(formeNum, 10), base, forme}; } @@ -12,8 +51,8 @@ export function toPSID(name) { return name.toLowerCase().replace(/[^a-z0-9]+/g, ''); } -export function toPSSpriteID(name) { - const info = decomposeName(name); +export function toPSSpriteID(data) { + const info = parsePokemonFilename(data); let result = toPSID(info.base); if (info.forme !== null) { if (info.forme === 'Female') { @@ -30,8 +69,8 @@ export function toSmogonAlias(name) { replace(/[^a-z0-9-]+/g, ''); } -export function toSmogonSpriteAlias(name) { - const info = decomposeName(name); +export function toSmogonSpriteAlias(data) { + const info = parsePokemonFilename(data); let result = toSmogonAlias(info.base); if (info.forme !== null) { result += '-' + toSmogonAlias(info.forme);