mirror of
https://github.com/denoland/deno.git
synced 2024-12-27 01:29:14 -05:00
TOML: Full support of inline table (#320)
This commit is contained in:
parent
a0ff487a12
commit
d16072a334
4 changed files with 95 additions and 9 deletions
|
@ -22,7 +22,7 @@ TypeScript side is a bit different.
|
||||||
- :heavy_check_mark: [Local Date](https://github.com/toml-lang/toml#local-date)
|
- :heavy_check_mark: [Local Date](https://github.com/toml-lang/toml#local-date)
|
||||||
- :exclamation: [Local Time](https://github.com/toml-lang/toml#local-time)
|
- :exclamation: [Local Time](https://github.com/toml-lang/toml#local-time)
|
||||||
- :heavy_check_mark: [Table](https://github.com/toml-lang/toml#table)
|
- :heavy_check_mark: [Table](https://github.com/toml-lang/toml#table)
|
||||||
- :exclamation: [Inline Table](https://github.com/toml-lang/toml#inline-table)
|
- :heavy_check_mark: [Inline Table](https://github.com/toml-lang/toml#inline-table)
|
||||||
- :exclamation: [Array of Tables](https://github.com/toml-lang/toml#array-of-tables)
|
- :exclamation: [Array of Tables](https://github.com/toml-lang/toml#array-of-tables)
|
||||||
|
|
||||||
:exclamation: _Supported with warnings see [Warning](#Warning)._
|
:exclamation: _Supported with warnings see [Warning](#Warning)._
|
||||||
|
@ -45,12 +45,18 @@ Because local time does not exist in JavaScript, the local time is stored as a s
|
||||||
|
|
||||||
#### Inline Table
|
#### Inline Table
|
||||||
|
|
||||||
Inline tables are supported but nested inline property name are **not**. See below:
|
Inline tables are supported. See below:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
animal = { type = { name = "pug" } } # Supported
|
animal = { type = { name = "pug" } }
|
||||||
|
# Output
|
||||||
animal = { type.name = "pug" }
|
animal = { type.name = "pug" }
|
||||||
# not supported. Will output { "animal" : {"type.name":"pug"} }
|
# Output { animal : { type : { name : "pug" } }
|
||||||
|
animal.as.leaders = "tosin"
|
||||||
|
# Output { animal: { as: { leaders: "tosin" } } }
|
||||||
|
"tosin.abasi" = "guitarist"
|
||||||
|
# Output
|
||||||
|
"tosin.abasi" : "guitarist"
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Array of Tables
|
#### Array of Tables
|
||||||
|
|
|
@ -238,7 +238,6 @@ class Parser {
|
||||||
.replace(result[2], ":");
|
.replace(result[2], ":");
|
||||||
dataString = dataString.replace(ogVal, newVal);
|
dataString = dataString.replace(ogVal, newVal);
|
||||||
}
|
}
|
||||||
// TODO : unflat if necessary
|
|
||||||
return JSON.parse(dataString);
|
return JSON.parse(dataString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,6 +270,38 @@ class Parser {
|
||||||
const reg = /\d{4}-\d{2}-\d{2}/;
|
const reg = /\d{4}-\d{2}-\d{2}/;
|
||||||
return reg.test(dateStr);
|
return reg.test(dateStr);
|
||||||
}
|
}
|
||||||
|
_parseDeclarationName(declaration: string): string[] {
|
||||||
|
const out = [];
|
||||||
|
let acc = [];
|
||||||
|
let inLitteral = false;
|
||||||
|
for (let i = 0; i < declaration.length; i++) {
|
||||||
|
const c = declaration[i];
|
||||||
|
switch (c) {
|
||||||
|
case ".":
|
||||||
|
if (!inLitteral) {
|
||||||
|
out.push(acc.join(""));
|
||||||
|
acc = [];
|
||||||
|
} else {
|
||||||
|
acc.push(c);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case `"`:
|
||||||
|
if (inLitteral) {
|
||||||
|
inLitteral = false;
|
||||||
|
} else {
|
||||||
|
inLitteral = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
acc.push(c);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (acc.length !== 0) {
|
||||||
|
out.push(acc.join(""));
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
_parseLines(): void {
|
_parseLines(): void {
|
||||||
for (let i = 0; i < this.tomlLines.length; i++) {
|
for (let i = 0; i < this.tomlLines.length; i++) {
|
||||||
const line = this.tomlLines[i];
|
const line = this.tomlLines[i];
|
||||||
|
@ -301,10 +332,12 @@ class Parser {
|
||||||
}
|
}
|
||||||
if (this._isDeclaration(line)) {
|
if (this._isDeclaration(line)) {
|
||||||
let kv = this._processDeclaration(line);
|
let kv = this._processDeclaration(line);
|
||||||
|
let key = kv.key;
|
||||||
|
let value = kv.value;
|
||||||
if (!this.context.currentGroup) {
|
if (!this.context.currentGroup) {
|
||||||
this.context.output[kv.key] = kv.value;
|
this.context.output[key] = value;
|
||||||
} else {
|
} else {
|
||||||
this.context.currentGroup.objValues[kv.key] = kv.value;
|
this.context.currentGroup.objValues[key] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -317,9 +350,33 @@ class Parser {
|
||||||
this._groupToOutput();
|
this._groupToOutput();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_cleanOutput(): void {
|
||||||
|
this._propertyClean(this.context.output);
|
||||||
|
}
|
||||||
|
_propertyClean(obj: object): void {
|
||||||
|
const keys = Object.keys(obj);
|
||||||
|
for (let i = 0; i < keys.length; i++) {
|
||||||
|
let k = keys[i];
|
||||||
|
let v = obj[k];
|
||||||
|
let pathDeclaration = this._parseDeclarationName(k);
|
||||||
|
delete obj[k];
|
||||||
|
if (pathDeclaration.length > 1) {
|
||||||
|
k = pathDeclaration.shift();
|
||||||
|
k = k.replace(/"/g, "");
|
||||||
|
v = this._unflat(pathDeclaration, v as object);
|
||||||
|
} else {
|
||||||
|
k = k.replace(/"/g, "");
|
||||||
|
}
|
||||||
|
obj[k] = v;
|
||||||
|
if (v instanceof Object) {
|
||||||
|
this._propertyClean(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
parse(): object {
|
parse(): object {
|
||||||
this._sanitize();
|
this._sanitize();
|
||||||
this._parseLines();
|
this._parseLines();
|
||||||
|
this._cleanOutput();
|
||||||
return this.context.output;
|
return this.context.output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -181,6 +181,20 @@ test({
|
||||||
fn() {
|
fn() {
|
||||||
const expected = {
|
const expected = {
|
||||||
inlinetable: {
|
inlinetable: {
|
||||||
|
nile: {
|
||||||
|
also: {
|
||||||
|
malevolant: {
|
||||||
|
creation: {
|
||||||
|
drum: {
|
||||||
|
kit: "Tama"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
derek: {
|
||||||
|
roddy: "drummer"
|
||||||
|
}
|
||||||
|
},
|
||||||
name: {
|
name: {
|
||||||
first: "Tom",
|
first: "Tom",
|
||||||
last: "Preston-Werner"
|
last: "Preston-Werner"
|
||||||
|
@ -189,10 +203,16 @@ test({
|
||||||
x: 1,
|
x: 1,
|
||||||
y: 2
|
y: 2
|
||||||
},
|
},
|
||||||
animal: {
|
dog: {
|
||||||
type: {
|
type: {
|
||||||
name: "pug"
|
name: "pug"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"tosin.abasi": "guitarist",
|
||||||
|
animal: {
|
||||||
|
as: {
|
||||||
|
leaders: "tosin"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
5
toml/testdata/inlineTable.toml
vendored
5
toml/testdata/inlineTable.toml
vendored
|
@ -1,4 +1,7 @@
|
||||||
[inlinetable]
|
[inlinetable]
|
||||||
name = { first = "Tom", last = "Preston-Werner" }
|
name = { first = "Tom", last = "Preston-Werner" }
|
||||||
point = { x = 1, y = 2 }
|
point = { x = 1, y = 2 }
|
||||||
animal = { type = { name = "pug" } }
|
dog = { type = { name = "pug" } }
|
||||||
|
animal.as.leaders = "tosin"
|
||||||
|
"tosin.abasi" = "guitarist"
|
||||||
|
nile = { derek.roddy = "drummer", also = { malevolant.creation = { drum.kit = "Tama" } } }
|
Loading…
Reference in a new issue