summaryrefslogtreecommitdiff
path: root/std/encoding/toml.ts
diff options
context:
space:
mode:
authoruki00a <uki00a@gmail.com>2020-07-17 07:36:15 +0900
committerGitHub <noreply@github.com>2020-07-16 18:36:15 -0400
commit121eaa4efcaa5c8a4cab25eed15de07642e0407d (patch)
tree352526a65d6a9ead0f2321caf6c22e27ef5ab54f /std/encoding/toml.ts
parent2d58fee8071987567a25f26b14e29cdcca9cb5ab (diff)
fix(std/encoding/toml): could not parse strings with apostrophes/semicolons (#6781)
Diffstat (limited to 'std/encoding/toml.ts')
-rw-r--r--std/encoding/toml.ts35
1 files changed, 31 insertions, 4 deletions
diff --git a/std/encoding/toml.ts b/std/encoding/toml.ts
index 7d340c8e8..43788c06a 100644
--- a/std/encoding/toml.ts
+++ b/std/encoding/toml.ts
@@ -2,6 +2,8 @@
import { deepAssign } from "../_util/deep_assign.ts";
import { assert } from "../_util/assert.ts";
+class TOMLError extends Error {}
+
class KeyValuePair {
constructor(public key: string, public value: unknown) {}
}
@@ -230,10 +232,7 @@ class Parser {
if (invalidArr) {
dataString = dataString.replace(/,]/g, "]");
}
- const m = /(?:\'|\[|{|\").*(?:\'|\]|\"|})\s*[^#]/g.exec(dataString);
- if (m) {
- dataString = m[0].trim();
- }
+ dataString = this._stripComment(dataString);
if (dataString[0] === "{" && dataString[dataString.length - 1] === "}") {
const reg = /([a-zA-Z0-9-_\.]*) (=)/gi;
let result;
@@ -260,6 +259,34 @@ class Parser {
}
return eval(dataString);
}
+ private _stripComment(dataString: string): string {
+ const isString = dataString.startsWith('"') || dataString.startsWith("'");
+ if (isString) {
+ const [quote] = dataString;
+ let indexOfNextQuote = 0;
+ while (
+ (indexOfNextQuote = dataString.indexOf(quote, indexOfNextQuote + 1)) !==
+ -1
+ ) {
+ const isEscaped = dataString[indexOfNextQuote - 1] === "\\";
+ if (!isEscaped) {
+ break;
+ }
+ }
+ if (indexOfNextQuote === -1) {
+ throw new TOMLError("imcomplete string literal");
+ }
+ const endOfString = indexOfNextQuote + 1;
+ return dataString.slice(0, endOfString);
+ }
+
+ const m = /(?:|\[|{|).*(?:|\]||})\s*[^#]/g.exec(dataString);
+ if (m) {
+ return m[0].trim();
+ } else {
+ return dataString;
+ }
+ }
_isLocalTime(str: string): boolean {
const reg = /(\d{2}):(\d{2}):(\d{2})/;
return reg.test(str);