summaryrefslogtreecommitdiff
path: root/std/encoding/toml.ts
diff options
context:
space:
mode:
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);