Skip to content

Commit 3dd2c7e

Browse files
committed
Implement unescapeLuaString
1 parent f168977 commit 3dd2c7e

2 files changed

Lines changed: 8 additions & 4 deletions

File tree

src/LuaPrinter.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as lua from "./LuaAST";
66
import { loadLuaLibFeatures, LuaLibFeature } from "./LuaLib";
77
import { isValidLuaIdentifier } from "./transformation/utils/safe-names";
88
import { EmitHost } from "./transpilation";
9-
import { assert, intersperse, normalizeSlashes, trimExtension } from "./utils";
9+
import { assert, intersperse, invertObject, normalizeSlashes, trimExtension } from "./utils";
1010

1111
// https://www.lua.org/pil/2.4.html
1212
// https://www.ecma-international.org/ecma-262/10.0/index.html#table-34
@@ -25,10 +25,11 @@ const escapeStringMap: Record<string, string> = {
2525

2626
export const escapeString = (value: string) => `"${value.replace(escapeStringRegExp, char => escapeStringMap[char])}"`;
2727

28+
const unescapeStringRegExp = new RegExp(`\\\\${escapeStringRegExp.source}`, "g");
29+
const unescapeStingMap = invertObject(escapeStringMap);
2830
export const unescapeLuaString = (value: string) => {
29-
assert(value.startsWith('"') && value.endsWith(""), 'Only strings generated by "escapeString" can be unescaped');
30-
// TODO: Unescape
31-
return value.slice(1, -1);
31+
assert(value.startsWith('"') && value.endsWith('"'), 'Only strings generated by "escapeString" can be unescaped');
32+
return value.slice(1, -1).replace(unescapeStringRegExp, char => unescapeStingMap[char]);
3233
};
3334

3435
/**

src/utils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ export const union = <T>(...values: Array<Iterable<T>>): T[] => [...new Set(...v
1616
export const intersection = <T>(first: readonly T[], ...rest: Array<readonly T[]>): T[] =>
1717
union(first).filter(x => rest.every(r => r.includes(x)));
1818

19+
export const invertObject = <K extends keyof any, V extends keyof any>(record: Record<K, V>): Record<V, K> =>
20+
Object.fromEntries(Object.entries(record).map(([key, value]) => [value, key]));
21+
1922
type DiagnosticFactory = (...args: any) => Partial<ts.Diagnostic> & Pick<ts.Diagnostic, "messageText">;
2023
export const createDiagnosticFactoryWithCode = <T extends DiagnosticFactory>(code: number, create: T) =>
2124
Object.assign(

0 commit comments

Comments
 (0)