From 6ec0bb5c59fbdd38868ae0fe958b54069866a815 Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Fri, 9 Dec 2022 14:09:39 +0300 Subject: [PATCH] add attributes for connections Closes #5 --- grammar.js | 43 ++++- src/grammar.json | 314 ++++++++++++++++++++++++++++++++----- src/node-types.json | 12 ++ src/parser.c | Bin 113709 -> 124009 bytes test/corpus/attributes.txt | 166 ++++++++++++++++++++ tree-sitter-d2.wasm | Bin 26122 -> 27491 bytes 6 files changed, 491 insertions(+), 44 deletions(-) diff --git a/grammar.js b/grammar.js index 9ad7fa8..0c942ab 100644 --- a/grammar.js +++ b/grammar.js @@ -46,7 +46,12 @@ module.exports = grammar({ seq( $._connection_path, repeat1(seq($.arrow, $._connection_path)), - optional(seq($._colon, $.label)) + optional( + seq( + optional(seq($._colon, optional($.label))), + optional(seq(alias($._connection_block, $.block))) + ) + ) ), _connection_path: ($) => @@ -57,6 +62,12 @@ module.exports = grammar({ $.shape_key ), + _connection_block: ($) => + seq("{", repeat($._connection_block_definition), "}"), + + _connection_block_definition: ($) => + choice($._eol, seq($._connection_attribute, $._end)), + // containers container: ($) => @@ -67,10 +78,8 @@ module.exports = grammar({ choice( seq($.dot, choice($.shape, $.container)), seq( - seq( - optional(seq($._colon, optional($.label))), - optional(seq(alias($._container_block, $.block))) - ) + optional(seq($._colon, optional($.label))), + optional(seq(alias($._container_block, $.block))) ) ) ) @@ -205,7 +214,29 @@ module.exports = grammar({ _text_attr_key: ($) => "near", - _connection_attr_key: ($) => choice("source-arrowhead", "target-arrowhead"), + _connection_attribute: ($) => + choice( + alias($._connection_arrowhead_attribute, $.attribute), + alias($._style_attribute, $.attribute) + ), + + _connection_arrowhead_attribute: ($) => + seq( + alias($._connection_arrowhead_attr_key, $.attr_key), + choice( + seq($.dot, alias($._style_attribute, $.attribute)), + seq( + optional(seq($._colon, optional($.label))), + optional(seq(alias($._container_block, $.block))) + ) + ) + ), + + _connection_arrowhead_block: ($) => + seq("{", repeat(choice($._eol, seq($._shape_attribute, $._end))), "}"), + + _connection_arrowhead_attr_key: ($) => + choice("source-arrowhead", "target-arrowhead"), // diff --git a/src/grammar.json b/src/grammar.json index 9b6a3e6..3d2e8fd 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -51,6 +51,10 @@ { "type": "SYMBOL", "name": "_end" + }, + { + "type": "STRING", + "value": "\u0000" } ] } @@ -88,12 +92,55 @@ "type": "SEQ", "members": [ { - "type": "SYMBOL", - "name": "_colon" + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_colon" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "label" + }, + { + "type": "BLANK" + } + ] + } + ] + }, + { + "type": "BLANK" + } + ] }, { - "type": "SYMBOL", - "name": "label" + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_connection_block" + }, + "named": true, + "value": "block" + } + ] + }, + { + "type": "BLANK" + } + ] } ] }, @@ -138,6 +185,48 @@ } ] }, + "_connection_block": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_connection_block_definition" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_connection_block_definition": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_eol" + }, + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_connection_attribute" + }, + { + "type": "SYMBOL", + "name": "_end" + } + ] + } + ] + }, "container": { "type": "PREC", "value": 2, @@ -182,58 +271,53 @@ "type": "SEQ", "members": [ { - "type": "SEQ", + "type": "CHOICE", "members": [ { - "type": "CHOICE", + "type": "SEQ", "members": [ { - "type": "SEQ", + "type": "SYMBOL", + "name": "_colon" + }, + { + "type": "CHOICE", "members": [ { "type": "SYMBOL", - "name": "_colon" + "name": "label" }, { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "label" - }, - { - "type": "BLANK" - } - ] + "type": "BLANK" } ] - }, - { - "type": "BLANK" } ] }, { - "type": "CHOICE", + "type": "BLANK" + } + ] + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", "members": [ { - "type": "SEQ", - "members": [ - { - "type": "ALIAS", - "content": { - "type": "SYMBOL", - "name": "_container_block" - }, - "named": true, - "value": "block" - } - ] - }, - { - "type": "BLANK" + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_container_block" + }, + "named": true, + "value": "block" } ] + }, + { + "type": "BLANK" } ] } @@ -763,7 +847,161 @@ "type": "STRING", "value": "near" }, - "_connection_attr_key": { + "_connection_attribute": { + "type": "CHOICE", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_connection_arrowhead_attribute" + }, + "named": true, + "value": "attribute" + }, + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_style_attribute" + }, + "named": true, + "value": "attribute" + } + ] + }, + "_connection_arrowhead_attribute": { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_connection_arrowhead_attr_key" + }, + "named": true, + "value": "attr_key" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "dot" + }, + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_style_attribute" + }, + "named": true, + "value": "attribute" + } + ] + }, + { + "type": "SEQ", + "members": [ + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_colon" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "label" + }, + { + "type": "BLANK" + } + ] + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_container_block" + }, + "named": true, + "value": "block" + } + ] + }, + { + "type": "BLANK" + } + ] + } + ] + } + ] + } + ] + }, + "_connection_arrowhead_block": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "REPEAT", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_eol" + }, + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_shape_attribute" + }, + { + "type": "SYMBOL", + "name": "_end" + } + ] + } + ] + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_connection_arrowhead_attr_key": { "type": "CHOICE", "members": [ { diff --git a/src/node-types.json b/src/node-types.json index 810cf29..419c1eb 100644 --- a/src/node-types.json +++ b/src/node-types.json @@ -56,6 +56,10 @@ { "type": "dot", "named": true + }, + { + "type": "label", + "named": true } ] } @@ -99,6 +103,10 @@ "type": "arrow", "named": true }, + { + "type": "block", + "named": true + }, { "type": "container_key", "named": true @@ -262,6 +270,10 @@ "named": true, "fields": {} }, + { + "type": "\u0000", + "named": false + }, { "type": "\"", "named": false diff --git a/src/parser.c b/src/parser.c index ab92f908956e862cf13bdeded950d225c1770623..6356a1e24d15b95e812a4f2bdbf27d61f6a8be00 100644 GIT binary patch literal 124009 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 delta 12329 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 bar: { + 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 + (connection + (shape_key) + (arrow) + (shape_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)) + ) + ) + ) + ) +) + +================================================================================ +Labels for connection arrowheads +================================================================================ +foo -> bar: { + source-arrowhead: 0 + target-arrowhead: 1 +} + +-------------------------------------------------------------------------------- + +(source_file + (connection + (shape_key) + (arrow) + (shape_key) + (block + (attribute + (attr_key) + (label) + ) + (attribute + (attr_key) + (label) + ) + ) + ) +) + +================================================================================ +Block style attributes inside a connection arrowhead +================================================================================ +foo -> bar: { + target-arrowhead: { + 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 + (connection + (shape_key) + (arrow) + (shape_key) + (block + (attribute + (attr_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)) + ) + ) + ) + ) + ) + ) +) + +================================================================================ +Container attributes inside a connection arrowhead +================================================================================ +foo -> bar: { + target-arrowhead: { + shape: oval + label: Baz + constraint: primary-key + icon: pathto + width: 100 + height: 200 + } +} + +-------------------------------------------------------------------------------- + +(source_file + (connection + (shape_key) + (arrow) + (shape_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)) + ) + ) + ) + ) +) + diff --git a/tree-sitter-d2.wasm b/tree-sitter-d2.wasm index bb3ea26fd436aea46f49f5eae1946c3e5b2d6113..c0b5f8af89c2c1036f416845bbe6434268b579e1 100755 GIT binary patch delta 7099 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