Add structure for container and shapes (#1)

![image](/attachments/5bf879cc-b94c-414e-b69b-92cbc018671e)

Co-authored-by: Dmitriy Pleshevskiy <dmitriy@ideascup.me>
Reviewed-on: #1
This commit is contained in:
Dmitriy Pleshevskiy 2022-12-09 12:36:31 +03:00
parent a5758ca249
commit be8db7ca48
13 changed files with 1296 additions and 1238 deletions

2
.gitignore vendored
View File

@ -2,5 +2,7 @@
.envrc .envrc
.direnv .direnv
# test data
test.d2
# produced by d2 # produced by d2
*.svg *.svg

View File

@ -1,155 +1,194 @@
const spaces = repeat(choice(" ", "\t")); const PREC = {
COMMENT: -2,
EOL: -1,
UNQUOTED_STRING: 0,
CONTAINER: 2,
CONNECTION: 2,
SHAPE: 3,
IDENTIFIER: 0,
ARROW: 0,
ATTRIBUTE: 0,
ATTRIBUTE_KEY: 0,
};
module.exports = grammar({ module.exports = grammar({
name: "d2", name: "d2",
extras: ($) => [$.line_comment], extras: ($) => [
/[ \f\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]/,
word: ($) => $._word, $.line_comment,
conflicts: ($) => [
[$.shape_key],
[$._shape_path],
[$._shape_block],
[$._shape_block_definition],
[$._style_attr_block],
[$._inner_style_attribute],
[$._emptyline],
], ],
word: ($) => $._identifier,
conflicts: ($) => [[$._connection_path, $.container]],
rules: { rules: {
source_file: ($) => repeat($._root_definition), source_file: ($) => repeat($._root_definition),
_root_definition: ($) => _root_definition: ($) =>
choice( choice(
$._emptyline, $._eol,
$._root_attribute, seq(
$.connection, choice(
$._shape_definition alias($._root_attribute, $.attribute),
$.shape,
$.container,
$.connection
),
$._end
)
), ),
// connections
connection: ($) => connection: ($) =>
seq( seq(
$._shape_path, $._connection_path,
repeat1(seq($._arrow, $._shape_path)), repeat1(seq($.arrow, $._connection_path)),
optional( optional(seq($._colon, $.label))
choice(seq($.dot, $._connection_attribute), seq($._colon, $.label))
),
$._end
), ),
_shape_definition: ($) => _connection_path: ($) =>
seq( seq(
$._shape_path, repeat(
optional( prec(PREC.CONNECTION, seq(alias($.shape_key, $.container_key), $.dot))
choice(
seq($.dot, $._shape_attribute),
seq(
optional(seq($._colon, optional(seq(spaces, $.label)))),
optional(alias($._shape_block, $.block))
)
)
), ),
$._end
),
_shape_path: ($) =>
seq(
spaces,
repeat(seq(alias($.shape_key, $.container_key), spaces, $.dot, spaces)),
$.shape_key $.shape_key
), ),
shape_key: ($) => // containers
choice(
$.string, container: ($) =>
prec(
PREC.CONTAINER,
seq( seq(
optional($._dash), alias($.shape_key, $.container_key),
choice( choice(
$._word, seq($.dot, choice($.shape, $.container)),
repeat1(seq($._word, choice(repeat1(" "), $._dash), $._word)) seq(
), seq(
optional($._dash) optional(seq($._colon, optional($.label))),
optional(seq(alias($._container_block, $.block)))
)
)
)
) )
), ),
_dash: ($) => token.immediate("-"), _container_block: ($) =>
seq("{", repeat($._container_block_definition), "}"),
label: ($) => choice($.string, $._unquoted_string), _container_block_definition: ($) =>
choice(
$._eol,
seq(
choice($.shape, $.container, $.connection, $._shape_attribute),
$._end
)
),
attr_value: ($) => seq(spaces, choice($.string, $._unquoted_string)), // shapes
shape: ($) =>
prec(
PREC.SHAPE,
seq(
$.shape_key,
optional(
choice(
seq($.dot, alias($._style_attribute, $.attribute)),
seq(optional(seq($._colon, optional($.label))))
)
)
)
),
shape_key: ($) => choice($.string, seq($._identifier, optional($._dash))),
_identifier: ($) =>
token(prec(PREC.IDENTIFIER, /\-?([\w\d]+|([\w\d]+( +|\-)[\w\d]+)+)/)),
// attributes
_root_attribute: ($) => _root_attribute: ($) =>
seq(alias($._root_attr_key, $.attr_key), $._colon, $.attr_value),
_root_attr_key: ($) =>
choice( choice(
seq( "direction",
alias($._root_attr_key, $.attr_key), // reserved but doesn't affected for root
$._colon, alias(
$.attr_value, choice(
$._end "shape",
), "label",
alias(seq($._shape_attribute, $._end), $.invalid) "constraint",
"icon",
"style",
$._common_style_attr_key,
$._text_attr_key
),
$.reserved
)
), ),
_root_attr_key: ($) => "direction",
_shape_block: ($) =>
seq(
spaces,
"{",
repeat(choice($._emptyline, seq(spaces, $._shape_block_definition))),
optional(seq($._shape_block_definition, optional($._end))),
spaces,
"}"
),
_shape_block_definition: ($) =>
choice($.connection, $._shape_definition, $._shape_attribute),
_shape_attribute: ($) => _shape_attribute: ($) =>
choice( choice(
seq(alias($._shape_attr_key, $.attr_key), $._colon, $.attr_value), alias($._base_shape_attribute, $.attribute),
$._style_attribute alias($._style_attribute, $.attribute)
), ),
_style_attribute: ($) => _base_shape_attribute: ($) =>
seq( seq(alias($._shape_attr_key, $.attr_key), $._colon, $.attr_value),
alias("style", $.attr_key),
_shape_attr_key: ($) =>
prec(
PREC.ATTRIBUTE_KEY,
choice( choice(
seq($.dot, $._inner_style_attribute), "shape",
seq($._colon, alias($._style_attr_block, $.block)) "label",
// sql
"constraint",
// image
"icon",
"width",
"height"
) )
), ),
_style_attr_block: ($) => _style_attribute: ($) =>
prec(
PREC.ATTRIBUTE,
seq(
alias("style", $.attr_key),
choice(
seq($.dot, alias($._inner_style_attribute, $.attribute)),
seq($._colon, alias($._style_attribute_block, $.block))
)
)
),
_style_attribute_block: ($) =>
seq( seq(
spaces,
"{", "{",
spaces, repeat(
repeat(choice($._emptyline, seq($._inner_style_attribute, $._end))), choice(
optional(seq($._inner_style_attribute, optional($._end))), $._eol,
spaces, seq(alias($._inner_style_attribute, $.attribute), $._end)
)
),
"}" "}"
), ),
_inner_style_attribute: ($) => _inner_style_attribute: ($) =>
seq(spaces, alias($._style_attr_key, $.attr_key), $._colon, $.attr_value), prec(
PREC.ATTRIBUTE,
_connection_attribute: ($) => seq(alias($._style_attr_key, $.attr_key), $._colon, $.attr_value)
seq(alias($._connection_attr_key, $.attr_key), $._colon, $.attr_value),
_shape_attr_key: ($) =>
choice(
"shape",
"label",
// sql
"constraint",
// image
"icon",
"width",
"height"
), ),
_style_attr_key: ($) => _style_attr_key: ($) => choice($._common_style_attr_key, "3d"),
_common_style_attr_key: ($) =>
choice( choice(
"opacity", "opacity",
"fill", "fill",
@ -161,7 +200,6 @@ module.exports = grammar({
"shadow", "shadow",
"multiple", "multiple",
"animated", "animated",
"3d",
"link" "link"
), ),
@ -169,15 +207,24 @@ module.exports = grammar({
_connection_attr_key: ($) => choice("source-arrowhead", "target-arrowhead"), _connection_attr_key: ($) => choice("source-arrowhead", "target-arrowhead"),
_colon: ($) => seq(spaces, ":"), //
_arrow: ($) => seq(spaces, $.arrow), label: ($) => choice($.string, $._unquoted_string),
arrow: ($) => choice(/-+>/, /--+/, /<-+/, /<-+>/), attr_value: ($) => seq(choice($.string, $._unquoted_string)),
dot: ($) => token.immediate("."), // --------------------------------------------
_unquoted_string: ($) => token.immediate(/[^'"`\n;{}]+/), _dash: ($) => token.immediate("-"),
_colon: ($) => seq(":"),
arrow: ($) => token(prec(PREC.ARROW, choice(/-+>/, /--+/, /<-+/, /<-+>/))),
dot: ($) => token("."),
_unquoted_string: ($) =>
token(prec(PREC.UNQUOTED_STRING, /[\w\-?!]([^'"`\n;{}]*[\w\-?!])?/)),
string: ($) => string: ($) =>
choice( choice(
@ -186,12 +233,9 @@ module.exports = grammar({
seq("`", repeat(token.immediate(/[^`\n]+/)), "`") seq("`", repeat(token.immediate(/[^`\n]+/)), "`")
), ),
line_comment: ($) => token(prec(-2, seq("#", /.*/))), line_comment: ($) => token(prec(PREC.COMMENT, seq("#", /.*/))),
_word: ($) => /[\w\d]+/, _eol: ($) => token(prec(PREC.EOL, "\n")),
_end: ($) => seq(choice(";", $._eol)),
_emptyline: ($) => seq(spaces, $._eof),
_eof: ($) => choice("\n", "\0"),
_end: ($) => seq(spaces, choice(";", $._eof)),
}, },
}); });

View File

@ -1,13 +1,9 @@
; Special (treesitter don't overwrite)
;-------------------------------------------------------------------------------
(ERROR) @error
(invalid (_) @error)
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
(container_key) @constant (container_key) @constant
(shape_key) @variable (shape_key) @variable
(attr_key) @property (attr_key) @property
(reserved) @error
; Literals ; Literals
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
@ -42,4 +38,3 @@
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
(ERROR) @error (ERROR) @error
(invalid (_) @error)

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,18 @@
[ [
{
"type": "arrow",
"named": true,
"fields": {}
},
{ {
"type": "attr_key", "type": "attr_key",
"named": true, "named": true,
"fields": {} "fields": {},
"children": {
"multiple": false,
"required": false,
"types": [
{
"type": "reserved",
"named": true
}
]
}
}, },
{ {
"type": "attr_value", "type": "attr_value",
@ -25,12 +30,12 @@
} }
}, },
{ {
"type": "block", "type": "attribute",
"named": true, "named": true,
"fields": {}, "fields": {},
"children": { "children": {
"multiple": true, "multiple": true,
"required": false, "required": true,
"types": [ "types": [
{ {
"type": "attr_key", "type": "attr_key",
@ -40,28 +45,43 @@
"type": "attr_value", "type": "attr_value",
"named": true "named": true
}, },
{
"type": "attribute",
"named": true
},
{ {
"type": "block", "type": "block",
"named": true "named": true
}, },
{
"type": "dot",
"named": true
}
]
}
},
{
"type": "block",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "attribute",
"named": true
},
{ {
"type": "connection", "type": "connection",
"named": true "named": true
}, },
{ {
"type": "container_key", "type": "container",
"named": true "named": true
}, },
{ {
"type": "dot", "type": "shape",
"named": true
},
{
"type": "label",
"named": true
},
{
"type": "shape_key",
"named": true "named": true
} }
] ]
@ -80,11 +100,38 @@
"named": true "named": true
}, },
{ {
"type": "attr_key", "type": "container_key",
"named": true "named": true
}, },
{ {
"type": "attr_value", "type": "dot",
"named": true
},
{
"type": "label",
"named": true
},
{
"type": "shape_key",
"named": true
}
]
}
},
{
"type": "container",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "block",
"named": true
},
{
"type": "container",
"named": true "named": true
}, },
{ {
@ -100,7 +147,7 @@
"named": true "named": true
}, },
{ {
"type": "shape_key", "type": "shape",
"named": true "named": true
} }
] ]
@ -121,33 +168,6 @@
] ]
} }
}, },
{
"type": "invalid",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "attr_key",
"named": true
},
{
"type": "attr_value",
"named": true
},
{
"type": "block",
"named": true
},
{
"type": "dot",
"named": true
}
]
}
},
{ {
"type": "label", "type": "label",
"named": true, "named": true,
@ -163,6 +183,38 @@
] ]
} }
}, },
{
"type": "reserved",
"named": true,
"fields": {}
},
{
"type": "shape",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "attribute",
"named": true
},
{
"type": "dot",
"named": true
},
{
"type": "label",
"named": true
},
{
"type": "shape_key",
"named": true
}
]
}
},
{ {
"type": "shape_key", "type": "shape_key",
"named": true, "named": true,
@ -187,15 +239,7 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "attr_key", "type": "attribute",
"named": true
},
{
"type": "attr_value",
"named": true
},
{
"type": "block",
"named": true "named": true
}, },
{ {
@ -203,23 +247,11 @@
"named": true "named": true
}, },
{ {
"type": "container_key", "type": "container",
"named": true "named": true
}, },
{ {
"type": "dot", "type": "shape",
"named": true
},
{
"type": "invalid",
"named": true
},
{
"type": "label",
"named": true
},
{
"type": "shape_key",
"named": true "named": true
} }
] ]
@ -230,22 +262,6 @@
"named": true, "named": true,
"fields": {} "fields": {}
}, },
{
"type": "\u0000",
"named": false
},
{
"type": "\t",
"named": false
},
{
"type": "\n",
"named": false
},
{
"type": " ",
"named": false
},
{ {
"type": "\"", "type": "\"",
"named": false "named": false
@ -274,6 +290,10 @@
"type": "animated", "type": "animated",
"named": false "named": false
}, },
{
"type": "arrow",
"named": true
},
{ {
"type": "border-radius", "type": "border-radius",
"named": false "named": false
@ -282,6 +302,10 @@
"type": "constraint", "type": "constraint",
"named": false "named": false
}, },
{
"type": "direction",
"named": false
},
{ {
"type": "dot", "type": "dot",
"named": true "named": true

Binary file not shown.

View File

@ -3,59 +3,75 @@ Root attribute
================================================================================ ================================================================================
direction: value direction: value
-------------------------------------------------------------------------------- shape: oval
label: ten
(source_file constraint: utehu
(attr_key) (attr_value) icon: huell
) opacity: 1
fill: red
================================================================================ stroke: red
Block shape attribute stroke-width: 5
================================================================================ stroke-dash: 4
foo: { border-radius: 1
shape: oval font-color: red
shadow: true
foo.bar.baz: { multiple: true
shape: oval animated: true
} link: https://to
} near: abc
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (attribute (attr_key) (attr_value))
(block
(attr_key) (attr_value)
(container_key) (dot) (container_key) (dot) (shape_key)
(block
(attr_key) (attr_value)
)
)
)
(attribute (attr_key (reserved)) (attr_value))
================================================================================ (attribute (attr_key (reserved)) (attr_value))
Inline shape attribute (attribute (attr_key (reserved)) (attr_value))
================================================================================ (attribute (attr_key (reserved)) (attr_value))
foo.shape: oval (attribute (attr_key (reserved)) (attr_value))
foo.bar.baz.shape: oval (attribute (attr_key (reserved)) (attr_value))
(attribute (attr_key (reserved)) (attr_value))
-------------------------------------------------------------------------------- (attribute (attr_key (reserved)) (attr_value))
(attribute (attr_key (reserved)) (attr_value))
(source_file (attribute (attr_key (reserved)) (attr_value))
(shape_key) (dot) (attr_key) (attr_value) (attribute (attr_key (reserved)) (attr_value))
(container_key) (dot) (container_key) (dot) (shape_key) (dot) (attr_key) (attr_value) (attribute (attr_key (reserved)) (attr_value))
(attribute (attr_key (reserved)) (attr_value))
(attribute (attr_key (reserved)) (attr_value))
(attribute (attr_key (reserved)) (attr_value))
(attribute (attr_key (reserved)) (attr_value))
) )
================================================================================ ================================================================================
Inline style attribute Style attribute
================================================================================ ================================================================================
foo.style.opacity: 5 foo.style.opacity: 5
foo.style.fill: red
foo.style.stroke: red
foo.style.stroke-width: 5
foo.style.stroke-dash: 4
foo.style.border-radius: 1
foo.style.font-color: red
foo.style.shadow: true
foo.style.multiple: true
foo.style.animated: true
foo.style.link: https://to
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (dot) (attr_key) (dot) (attr_key) (attr_value) (shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))))
(shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))))
(shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))))
(shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))))
(shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))))
(shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))))
(shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))))
(shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))))
(shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))))
(shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))))
(shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))))
) )
================================================================================ ================================================================================
@ -63,48 +79,150 @@ Block style attributes
================================================================================ ================================================================================
foo.style: { foo.style: {
opacity: 5 opacity: 5
fill: red
fill: red; stroke: red
stroke-width: 5
stroke-dash: 4
border-radius: 1
font-color: red
shadow: true
multiple: true
animated: true
link: https://to
} }
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (dot) (attr_key) (shape
(block (shape_key) (dot)
(attr_key) (attr_value) (attribute
(attr_key) (attr_value) (attr_key)
(block
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
)
)
) )
) )
================================================================================ ================================================================================
Inline block style attributes Container attributes
================================================================================ ================================================================================
foo.style: { opacity: 5; fill: red; } foo: {
foo.style: { opacity: 5 } shape: oval
label: Baz
constraint: primary-key
icon: pathto
width: 100
height: 200
}
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (dot) (attr_key) (container
(block (container_key)
(attr_key) (attr_value) (block
(attr_key) (attr_value) (attribute (attr_key) (attr_value))
) (attribute (attr_key) (attr_value))
(shape_key) (dot) (attr_key) (attribute (attr_key) (attr_value))
(block (attribute (attr_key) (attr_value))
(attr_key) (attr_value) (attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
)
) )
) )
================================================================================ ================================================================================
Color in string Container style attributes
================================================================================ ================================================================================
foo.style.fill: "#ffffff"; foo: {
style.opacity: 5
style.fill: red
style.stroke: red
style.stroke-width: 5
style.stroke-dash: 4
style.border-radius: 1
style.font-color: red
style.shadow: true
style.multiple: true
style.animated: true
style.link: https://to
}
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (dot) (attr_key) (dot) (attr_key) (attr_value (string)) (container
(container_key)
(block
(attribute (attr_key) (dot) (attribute (attr_key) (attr_value)))
(attribute (attr_key) (dot) (attribute (attr_key) (attr_value)))
(attribute (attr_key) (dot) (attribute (attr_key) (attr_value)))
(attribute (attr_key) (dot) (attribute (attr_key) (attr_value)))
(attribute (attr_key) (dot) (attribute (attr_key) (attr_value)))
(attribute (attr_key) (dot) (attribute (attr_key) (attr_value)))
(attribute (attr_key) (dot) (attribute (attr_key) (attr_value)))
(attribute (attr_key) (dot) (attribute (attr_key) (attr_value)))
(attribute (attr_key) (dot) (attribute (attr_key) (attr_value)))
(attribute (attr_key) (dot) (attribute (attr_key) (attr_value)))
(attribute (attr_key) (dot) (attribute (attr_key) (attr_value)))
)
)
)
================================================================================
Block style attributes inside a container
================================================================================
foo: {
style: {
opacity: 5
fill: red
stroke: red
stroke-width: 5
stroke-dash: 4
border-radius: 1
font-color: red
shadow: true
multiple: true
animated: true
link: https://to
}
}
--------------------------------------------------------------------------------
(source_file
(container
(container_key)
(block
(attribute
(attr_key)
(block
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
(attribute (attr_key) (attr_value))
)
)
)
)
) )

View File

@ -196,3 +196,29 @@ foo.biz.baz -> bar.baz.biz: Label
(label) (label)
) )
) )
================================================================================
Connection of shapes inside a block of container
================================================================================
foo.baz: {
foo -> biz: Label
}
--------------------------------------------------------------------------------
(source_file
(container
(container_key) (dot)
(container
(container_key)
(block
(connection
(shape_key)
(arrow)
(shape_key)
(label)
)
)
)
)
)

View File

@ -2,22 +2,36 @@
Declare a shape inside a container Declare a shape inside a container
================================================================================ ================================================================================
foo.baz foo.baz
foo.bar.biz
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(container_key) (dot) (shape_key) (container
(container_key) (dot)
(shape (shape_key))
)
(container
(container_key) (dot)
(container
(container_key) (dot)
(shape (shape_key))
)
)
) )
================================================================================ ================================================================================
Use quoted string as a shape key Use quoted string as keys
================================================================================ ================================================================================
'foo'.'baz' 'foo'.'baz'
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(container_key (string)) (dot) (shape_key (string)) (container
(container_key (string)) (dot)
(shape (shape_key (string)))
)
) )
================================================================================ ================================================================================
@ -35,20 +49,26 @@ foo: {
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (container
(block (container_key)
(shape_key)
(block (block
(shape_key) (container
(block (container_key)
(shape_key) (block
(container
(container_key)
(block
(shape (shape_key))
)
)
)
) )
) )
) )
) )
================================================================================ ================================================================================
Declare labaled container inside a labeled container using block Declare labeled container inside a labeled container using block
================================================================================ ================================================================================
foo: Foo { foo: Foo {
@ -62,13 +82,22 @@ foo: Foo {
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (label) (container
(block (container_key)
(shape_key) (label) (label)
(block (block
(shape_key) (label) (container
(block (container_key)
(shape_key) (label) (label)
(block
(container
(container_key)
(label)
(block
(shape (shape_key) (label))
)
)
)
) )
) )
) )
@ -87,11 +116,111 @@ foo: {
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (container
(block (container_key)
(shape_key) (block
(shape_key) (shape (shape_key))
(shape_key) (shape (shape_key))
(shape (shape_key))
)
) )
) )
================================================================================
Declare a container with complex keys
================================================================================
Foo biz bar: {
bar biz baz: {
-biz-baz-Baz-: {
Helo world
}
}
}
--------------------------------------------------------------------------------
(source_file
(container
(container_key)
(block
(container
(container_key)
(block
(container
(container_key)
(block
(shape (shape_key))
)
)
)
)
)
)
)
================================================================================
Declare a container with complex keys and labels
================================================================================
Foo biz bar: Biz biz Bar {
bar biz baz: baz baz biz {
-biz-baz-Baz-: Biz buz Baz {
Helo world
}
}
}
--------------------------------------------------------------------------------
(source_file
(container
(container_key)
(label)
(block
(container
(container_key)
(label)
(block
(container
(container_key)
(label)
(block
(shape (shape_key))
)
)
)
)
)
)
)
================================================================================
Declare shapes sparsely in a container
================================================================================
Foo: Baz {
biz
baz
bar
}
--------------------------------------------------------------------------------
(source_file
(container
(container_key)
(label)
(block
(shape (shape_key))
(shape (shape_key))
(shape (shape_key))
)
)
)

View File

@ -7,8 +7,8 @@ bar
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (shape (shape_key))
(shape_key) (shape (shape_key))
) )
================================================================================ ================================================================================
@ -20,8 +20,8 @@ Complex shape key
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (shape (shape_key))
(shape_key) (shape (shape_key))
) )
================================================================================ ================================================================================
@ -32,7 +32,7 @@ Use quoted string as a shape key
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key (string)) (shape (shape_key (string)))
) )
================================================================================ ================================================================================
@ -43,9 +43,9 @@ a;b;c
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (shape (shape_key))
(shape_key) (shape (shape_key))
(shape_key) (shape (shape_key))
) )
================================================================================ ================================================================================
@ -57,9 +57,9 @@ a: Foo Bar; b: Biz Baz
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (label) (shape (shape_key) (label))
(shape_key) (label) (shape (shape_key) (label))
(shape_key) (label) (shape (shape_key) (label))
) )
================================================================================ ================================================================================
@ -73,62 +73,19 @@ bar : Foo Bar; baz
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (shape (shape_key))
(shape_key) (label) (shape (shape_key) (label))
(shape_key) (shape (shape_key))
) )
================================================================================ ================================================================================
Shape block Use quoted string as shape key and label
================================================================================ ================================================================================
'foo': "Label"
foo: {
bar: {
baz: {
biz
}
}
}
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
(source_file (source_file
(shape_key) (shape (shape_key (string)) (label (string)))
(block
(shape_key)
(block
(shape_key)
(block
(shape_key)
)
)
)
)
================================================================================
Aliased shape block
================================================================================
foo: Foo {
bar: Bar {
baz: Baz {
biz: Biz
}
}
}
--------------------------------------------------------------------------------
(source_file
(shape_key) (label)
(block
(shape_key) (label)
(block
(shape_key) (label)
(block
(shape_key) (label)
)
)
)
) )

View File

@ -6,7 +6,7 @@ direction: right;
shape: oval shape: oval
# <- error # <- error
# ^ error # ^ string
baaaz.style: { baaaz.style: {
# <- variable # <- variable

View File

@ -15,7 +15,7 @@ foo: Foo Bar
# ^ string # ^ string
foo: Foo Bar { foo: Foo Bar {
# <- variable # <- constant
# ^ string # ^ string
# ^ punctuation.bracket # ^ punctuation.bracket

Binary file not shown.