diff options
Diffstat (limited to 'std/encoding/toml.ts')
-rw-r--r-- | std/encoding/toml.ts | 35 |
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); |