From 6a1df730c5c1d0fd83c64abc41d0d2b32bf3b408 Mon Sep 17 00:00:00 2001 From: BigAru Date: Mon, 10 Dec 2018 00:24:23 +0100 Subject: [PATCH] complete handling for octal escape --- .../convertStringOrTemplateLiteral.ts | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/services/refactors/convertStringOrTemplateLiteral.ts b/src/services/refactors/convertStringOrTemplateLiteral.ts index dde46dd924c..80d5fac3708 100644 --- a/src/services/refactors/convertStringOrTemplateLiteral.ts +++ b/src/services/refactors/convertStringOrTemplateLiteral.ts @@ -139,7 +139,7 @@ namespace ts.refactor.convertStringOrTemplateLiteral { while (begin < nodes.length && isStringLiteral(nodes[begin])) { const next = nodes[begin] as StringLiteral; - text = text + next.text; + text = text + decodeRawString(next.getText()); begin++; } @@ -161,7 +161,7 @@ namespace ts.refactor.convertStringOrTemplateLiteral { while (i + 1 < nodes.length && isStringLiteral(nodes[i + 1])) { const next = nodes[i + 1] as StringLiteral; - text = text + next.text; + text = text + decodeRawString(next.getText()); i++; } @@ -175,13 +175,27 @@ namespace ts.refactor.convertStringOrTemplateLiteral { return createTemplateExpression(head, templateSpans); } + const hexToUnicode = (_match: string, grp: string) => String.fromCharCode(parseInt(grp, 16)); + const octalToUnicode = (_match: string, grp: string) => String.fromCharCode(parseInt(grp, 8)); + + function decodeRawString(content: string) { + const outerQuotes = /"((.|\s)*)"/; + const unicodeEscape = /\\u([\d\w]+)/gi; + const unicodeEscapeWithBraces = /\\u\{([\d\w]+\})/gi; + const hexEscape = /\\x([\d\w]+)/gi; + const octalEscape = /\\([0-7]+)/g; + + return content.replace(outerQuotes, (_match, grp) => grp) + .replace(unicodeEscape, hexToUnicode) + .replace(unicodeEscapeWithBraces, hexToUnicode) + .replace(hexEscape, hexToUnicode) + .replace(octalEscape, octalToUnicode); + + } + function escapeText(content: string) { - // back-tick - return content.replace("`", "\`") - // placeholder alike beginning - .replace("\${", `$\\{`) - // octal escape - .replace(/\\([0-7]+)/g, (_whole, n) => "\\x" + parseInt(n, 8).toString(16)); + return content.replace("`", "\`") // back-tick + .replace("\${", `$\\{`); // placeholder alike beginning } }