From 8d8fd1bdf5a95609528e5e2e585f8bddd0b14d57 Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Fri, 16 Jun 2023 00:43:30 +0300 Subject: [PATCH] grammar: add classes Closes #12 --- examples/classes.d2 | 34 +++ flake.lock | 127 +++++++- flake.nix | 4 +- grammar.js | 90 +++++- queries/highlights.scm | 10 +- src/grammar.json | 557 ++++++++++++++++++++++++++++++++---- src/node-types.json | 144 ++++++++++ src/parser.c | Bin 211766 -> 257392 bytes test/corpus/attributes.txt | 56 ++-- test/corpus/classes.txt | 198 +++++++++++++ test/highlight/attribute.d2 | 7 +- test/highlight/classes.d2 | 40 +++ 12 files changed, 1159 insertions(+), 108 deletions(-) create mode 100644 examples/classes.d2 create mode 100644 test/corpus/classes.txt create mode 100644 test/highlight/classes.d2 diff --git a/examples/classes.d2 b/examples/classes.d2 new file mode 100644 index 0000000..6ca1dcf --- /dev/null +++ b/examples/classes.d2 @@ -0,0 +1,34 @@ +direction: right +classes: { + load balancer { + label: load\nbalancer + width: 100 + height: 200 + style: { + stroke-width: 0 + fill: "#44C7B1" + shadow: true + border-radius: 5 + } + } + unhealthy: { + style: { + fill: "#FE7070" + stroke: "#F69E03" + } + } +} + +web traffic -> web lb +web lb.class: load balancer + +web lb -> api1 +web lb -> api2 +web lb -> api3 + +api2.class: unhealthy + +api1 -> cache lb +api3 -> cache lb + +cache lb.class: load balancer diff --git a/flake.lock b/flake.lock index a6d455d..197a9a8 100644 --- a/flake.lock +++ b/flake.lock @@ -15,13 +15,28 @@ "type": "github" } }, + "flake-utils_2": { + "locked": { + "lastModified": 1678901627, + "narHash": "sha256-U02riOqrKKzwjsxc/400XnElV+UtPUQWpANPlyazjH0=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "93a2b84fc4b70d9e089d029deacc3583435c2ed6", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1669927173, - "narHash": "sha256-Z7rSKzC5OuWv5Q7RRNQPZb0jVJRJk0BJB6/fGZzaAIU=", + "lastModified": 1686737040, + "narHash": "sha256-R+JicNaI9mcxodtHkci894txjt4IMsfOnlAarA/r0xQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9063accddd2e68dcc71032459a58399e977374c9", + "rev": "6d1d80a232a355a65dc4d3bfea1f108e8dac1340", "type": "github" }, "original": { @@ -31,10 +46,114 @@ "type": "github" } }, + "nixpkgs_2": { + "locked": { + "lastModified": 1680005833, + "narHash": "sha256-BTMEjs+7hpmaP3n4hFVddrObMssANidP4EHgSpB0Lk0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "bd4e35e14a0130268c8f7b253a15e09d76ec95b7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_volar": { + "locked": { + "lastModified": 1682598396, + "narHash": "sha256-vheqVF2Cfa2+gpqeymDukd/7ecNp+eamV5Ll0S9ElQ8=", + "owner": "ehllie", + "repo": "nixpkgs", + "rev": "fc9529215f7ebd9ff5a5c498c60f781f0beeaedd", + "type": "github" + }, + "original": { + "owner": "ehllie", + "ref": "volar", + "repo": "nixpkgs", + "type": "github" + } + }, + "poetry2nix": { + "inputs": { + "flake-utils": [ + "tools", + "flake-utils" + ], + "nixpkgs": [ + "tools", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1679994832, + "narHash": "sha256-LSsvtnkambdSWeNYT8wWTjSFVFyyIYxrI77QDfzUCHI=", + "owner": "nix-community", + "repo": "poetry2nix", + "rev": "2a72eea5fbccc262855c87e3032837f8465db385", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "poetry2nix", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "tools": "tools" + } + }, + "tools": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_2", + "nixpkgs_volar": "nixpkgs_volar", + "poetry2nix": "poetry2nix", + "wd2": "wd2" + }, + "locked": { + "lastModified": 1686758138, + "narHash": "sha256-aisJq5OU8qcvt82B6eSm8kOEukPAn7R5Qz9nIx1e7UQ=", + "ref": "refs/heads/main", + "rev": "32e27cb105f1ed5c7ee89032be6fb1a087eaa977", + "revCount": 44, + "type": "git", + "url": "https://git.pleshevski.ru/mynix/tools" + }, + "original": { + "type": "git", + "url": "https://git.pleshevski.ru/mynix/tools" + } + }, + "wd2": { + "inputs": { + "flake-utils": [ + "tools", + "flake-utils" + ], + "nixpkgs": [ + "tools", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1680536082, + "narHash": "sha256-vGZxdADceCFjJAEuNYkpEvAPT8SD4Wd0cGSlhHTBDZk=", + "ref": "refs/heads/main", + "rev": "c4f9e3ea2679800dc04dc02957a8b460b2fc36cc", + "revCount": 22, + "type": "git", + "url": "https://git.pleshevski.ru/pleshevskiy/wd2" + }, + "original": { + "type": "git", + "url": "https://git.pleshevski.ru/pleshevskiy/wd2" } } }, diff --git a/flake.nix b/flake.nix index d35a900..e6d9597 100644 --- a/flake.nix +++ b/flake.nix @@ -2,9 +2,10 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; + tools.url = "git+https://git.pleshevski.ru/mynix/tools"; }; - outputs = { self, nixpkgs, flake-utils, ... }: + outputs = { self, nixpkgs, flake-utils, tools, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; @@ -13,6 +14,7 @@ devShells.default = pkgs.mkShell { packages = with pkgs; [ jq + tools.packages.${system}.d2 nodejs-18_x tree-sitter nodePackages.eslint diff --git a/grammar.js b/grammar.js index b9987e6..49315ef 100644 --- a/grammar.js +++ b/grammar.js @@ -6,6 +6,7 @@ const PREC = { CONTAINER: 2, CONNECTION: 2, SHAPE: 3, + CLASSES: 4, IDENTIFIER: 0, ARROW: 0, ATTRIBUTE: 0, @@ -33,6 +34,9 @@ module.exports = grammar({ [$._container_block], [$._connection_block], [$._style_attribute_block], + [$._classes_block], + [$._classes_item_block], + [$.class_list], ], rules: { @@ -44,6 +48,7 @@ module.exports = grammar({ seq( choice( alias($._root_attribute, $.attribute), + $.classes, $.shape, $.container, $.connection @@ -82,6 +87,57 @@ module.exports = grammar({ "}" ), + // classes + + classes: ($) => + prec( + PREC.CLASSES, + seq( + $.keyword_classes, + choice( + optional(seq($.dot, $._classes_item)), + seq( + optional(seq($._colon, optional($.label))), + optional(alias($._classes_block, $.block)) + ) + ) + ) + ), + + _classes_block: ($) => + seq( + "{", + repeat(choice($._eol, seq($._classes_item, $._end))), + optional(seq($._classes_item, optional($._end))), + "}" + ), + + _classes_item: ($) => + seq( + $._class_name, + choice( + optional(seq($.dot, $._shape_attribute)), + seq( + optional(seq($._colon, optional($.label))), + optional(alias($._classes_item_block, $.class_block)) + ) + ) + ), + + _classes_item_block: ($) => + seq( + "{", + repeat(choice($._eol, seq($._classes_item_attribute, $._end))), + optional(seq($._classes_item_attribute, optional($._end))), + "}" + ), + + _classes_item_attribute: ($) => + choice( + alias($._base_shape_attribute, $.attribute), + alias($._style_attribute, $.attribute) + ), + // containers container: ($) => @@ -93,7 +149,7 @@ module.exports = grammar({ seq($.dot, choice($.shape, $.container)), seq( optional(seq($._colon, optional($.label))), - optional(seq(alias($._container_block, $.block))) + optional(alias($._container_block, $.block)) ) ) ) @@ -119,8 +175,8 @@ module.exports = grammar({ $.shape_key, optional( choice( - seq($.dot, alias($._style_attribute, $.attribute)), - seq(optional(seq($._colon, choice($.label, $.text_block)))) + seq($.dot, $._shape_attribute), + seq($._colon, choice($.label, $.text_block)) ) ) ) @@ -168,7 +224,7 @@ module.exports = grammar({ "label", "constraint", "icon", - "style", + $.keyword_style, $._common_style_attr_key, $._text_attr_key ), @@ -177,11 +233,24 @@ module.exports = grammar({ ), _shape_attribute: ($) => - choice( - alias($._base_shape_attribute, $.attribute), - alias($._style_attribute, $.attribute) + alias( + choice($._class_attribute, $._base_shape_attribute, $._style_attribute), + $.attribute ), + _class_attribute: ($) => + seq($.keyword_class, $._colon, choice($.class_list, $._class_name)), + + class_list: ($) => + seq( + "[", + repeat(choice($._eol, seq($._class_name, $._end))), + optional(seq($._class_name, optional($._end))), + "]" + ), + + _class_name: ($) => alias($.shape_key, $.class_name), + _base_shape_attribute: ($) => seq(alias($._shape_attr_key, $.attr_key), $._colon, $.attr_value), @@ -208,7 +277,7 @@ module.exports = grammar({ prec( PREC.ATTRIBUTE, seq( - alias("style", $.attr_key), + $.keyword_style, choice( seq($.dot, alias($._inner_style_attribute, $.attribute)), seq($._colon, alias($._style_attribute_block, $.block)) @@ -245,6 +314,7 @@ module.exports = grammar({ "grid-columns", "grid-rows" ), + _style_attr_key: ($) => choice($._common_style_attr_key, "3d"), _common_style_attr_key: ($) => @@ -295,6 +365,10 @@ module.exports = grammar({ _connection_arrowhead_attr_key: ($) => choice("source-arrowhead", "target-arrowhead"), + keyword_classes: (_) => "classes", + keyword_class: (_) => "class", + keyword_style: (_) => "style", + // label: ($) => choice($.string, $._unquoted_string), diff --git a/queries/highlights.scm b/queries/highlights.scm index b3f4cee..9484360 100644 --- a/queries/highlights.scm +++ b/queries/highlights.scm @@ -1,9 +1,15 @@ ;------------------------------------------------------------------------------- -(container_key) @constant +(container_key) @string.special (shape_key) @variable (attr_key) @property (reserved) @error +[ + (keyword_style) + (keyword_classes) + (keyword_class) +] @keyword +(class_name) @constant ; Literals ;------------------------------------------------------------------------------- @@ -37,6 +43,8 @@ ] @punctuation.delimiter [ + "[" + "]" "{" "}" "|" diff --git a/src/grammar.json b/src/grammar.json index 08bf7eb..6a69750 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -30,6 +30,10 @@ "named": true, "value": "attribute" }, + { + "type": "SYMBOL", + "name": "classes" + }, { "type": "SYMBOL", "name": "shape" @@ -251,6 +255,339 @@ } ] }, + "classes": { + "type": "PREC", + "value": 4, + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "keyword_classes" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "dot" + }, + { + "type": "SYMBOL", + "name": "_classes_item" + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "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": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_classes_block" + }, + "named": true, + "value": "block" + }, + { + "type": "BLANK" + } + ] + } + ] + } + ] + } + ] + } + }, + "_classes_block": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "REPEAT", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_eol" + }, + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_classes_item" + }, + { + "type": "SYMBOL", + "name": "_end" + } + ] + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_classes_item" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_end" + }, + { + "type": "BLANK" + } + ] + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_classes_item": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_class_name" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "dot" + }, + { + "type": "SYMBOL", + "name": "_shape_attribute" + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "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": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_classes_item_block" + }, + "named": true, + "value": "class_block" + }, + { + "type": "BLANK" + } + ] + } + ] + } + ] + } + ] + }, + "_classes_item_block": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "REPEAT", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_eol" + }, + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_classes_item_attribute" + }, + { + "type": "SYMBOL", + "name": "_end" + } + ] + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_classes_item_attribute" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_end" + }, + { + "type": "BLANK" + } + ] + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_classes_item_attribute": { + "type": "CHOICE", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_base_shape_attribute" + }, + "named": true, + "value": "attribute" + }, + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_style_attribute" + }, + "named": true, + "value": "attribute" + } + ] + }, "container": { "type": "PREC", "value": 2, @@ -327,18 +664,13 @@ "type": "CHOICE", "members": [ { - "type": "SEQ", - "members": [ - { - "type": "ALIAS", - "content": { - "type": "SYMBOL", - "name": "_container_block" - }, - "named": true, - "value": "block" - } - ] + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_container_block" + }, + "named": true, + "value": "block" }, { "type": "BLANK" @@ -464,46 +796,28 @@ "name": "dot" }, { - "type": "ALIAS", - "content": { - "type": "SYMBOL", - "name": "_style_attribute" - }, - "named": true, - "value": "attribute" + "type": "SYMBOL", + "name": "_shape_attribute" } ] }, { "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": "SYMBOL", - "name": "text_block" - } - ] - } - ] + "type": "SYMBOL", + "name": "label" }, { - "type": "BLANK" + "type": "SYMBOL", + "name": "text_block" } ] } @@ -704,8 +1018,8 @@ "value": "icon" }, { - "type": "STRING", - "value": "style" + "type": "SYMBOL", + "name": "keyword_style" }, { "type": "SYMBOL", @@ -723,28 +1037,129 @@ ] }, "_shape_attribute": { - "type": "CHOICE", - "members": [ - { - "type": "ALIAS", - "content": { + "type": "ALIAS", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_class_attribute" + }, + { "type": "SYMBOL", "name": "_base_shape_attribute" }, - "named": true, - "value": "attribute" - }, - { - "type": "ALIAS", - "content": { + { "type": "SYMBOL", "name": "_style_attribute" - }, - "named": true, - "value": "attribute" + } + ] + }, + "named": true, + "value": "attribute" + }, + "_class_attribute": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "keyword_class" + }, + { + "type": "SYMBOL", + "name": "_colon" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "class_list" + }, + { + "type": "SYMBOL", + "name": "_class_name" + } + ] } ] }, + "class_list": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "[" + }, + { + "type": "REPEAT", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_eol" + }, + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_class_name" + }, + { + "type": "SYMBOL", + "name": "_end" + } + ] + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_class_name" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_end" + }, + { + "type": "BLANK" + } + ] + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "]" + } + ] + }, + "_class_name": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "shape_key" + }, + "named": true, + "value": "class_name" + }, "_base_shape_attribute": { "type": "SEQ", "members": [ @@ -823,13 +1238,8 @@ "type": "SEQ", "members": [ { - "type": "ALIAS", - "content": { - "type": "STRING", - "value": "style" - }, - "named": true, - "value": "attr_key" + "type": "SYMBOL", + "name": "keyword_style" }, { "type": "CHOICE", @@ -1264,6 +1674,18 @@ } ] }, + "keyword_classes": { + "type": "STRING", + "value": "classes" + }, + "keyword_class": { + "type": "STRING", + "value": "class" + }, + "keyword_style": { + "type": "STRING", + "value": "style" + }, "label": { "type": "CHOICE", "members": [ @@ -1591,6 +2013,15 @@ ], [ "_style_attribute_block" + ], + [ + "_classes_block" + ], + [ + "_classes_item_block" + ], + [ + "class_list" ] ], "precedences": [], diff --git a/src/node-types.json b/src/node-types.json index 18b88b5..45b6b0d 100644 --- a/src/node-types.json +++ b/src/node-types.json @@ -69,10 +69,26 @@ "type": "block", "named": true }, + { + "type": "class_list", + "named": true + }, + { + "type": "class_name", + "named": true + }, { "type": "dot", "named": true }, + { + "type": "keyword_class", + "named": true + }, + { + "type": "keyword_style", + "named": true + }, { "type": "label", "named": true @@ -92,6 +108,14 @@ "type": "attribute", "named": true }, + { + "type": "class_block", + "named": true + }, + { + "type": "class_name", + "named": true + }, { "type": "connection", "named": true @@ -100,6 +124,14 @@ "type": "container", "named": true }, + { + "type": "dot", + "named": true + }, + { + "type": "label", + "named": true + }, { "type": "shape", "named": true @@ -112,6 +144,94 @@ "named": true, "fields": {} }, + { + "type": "class_block", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": false, + "types": [ + { + "type": "attribute", + "named": true + } + ] + } + }, + { + "type": "class_list", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": false, + "types": [ + { + "type": "class_name", + "named": true + } + ] + } + }, + { + "type": "class_name", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": false, + "types": [ + { + "type": "escape_sequence", + "named": true + }, + { + "type": "string", + "named": true + } + ] + } + }, + { + "type": "classes", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "attribute", + "named": true + }, + { + "type": "block", + "named": true + }, + { + "type": "class_block", + "named": true + }, + { + "type": "class_name", + "named": true + }, + { + "type": "dot", + "named": true + }, + { + "type": "keyword_classes", + "named": true + }, + { + "type": "label", + "named": true + } + ] + } + }, { "type": "connection", "named": true, @@ -287,6 +407,10 @@ "type": "attribute", "named": true }, + { + "type": "classes", + "named": true + }, { "type": "connection", "named": true @@ -364,6 +488,14 @@ "type": ";", "named": false }, + { + "type": "[", + "named": false + }, + { + "type": "]", + "named": false + }, { "type": "animated", "named": false @@ -460,6 +592,18 @@ "type": "italic", "named": false }, + { + "type": "keyword_class", + "named": true + }, + { + "type": "keyword_classes", + "named": true + }, + { + "type": "keyword_style", + "named": true + }, { "type": "label", "named": false diff --git a/src/parser.c b/src/parser.c index e9074d9f1c08bc15399ef3a734563eeb144ccb82..f80d5ff3ddfcd70a224843bfdbe1112c354e558c 100644 GIT binary patch literal 257392 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 literal 211766 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 A7ytkO diff --git a/test/corpus/attributes.txt b/test/corpus/attributes.txt index 6e580a6..5e98b4f 100644 --- a/test/corpus/attributes.txt +++ b/test/corpus/attributes.txt @@ -62,18 +62,18 @@ foo.style.text-transform: uppercase -------------------------------------------------------------------------------- (source_file - (shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value (float))))) - (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 (integer))))) - (shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value (integer))))) - (shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value (integer))))) - (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 (boolean))))) - (shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value (boolean))))) - (shape (shape_key) (dot) (attribute (attr_key) (dot) (attribute (attr_key) (attr_value (boolean))))) - (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 (keyword_style) (dot) (attribute (attr_key) (attr_value (float))))) + (shape (shape_key) (dot) (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value)))) + (shape (shape_key) (dot) (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value)))) + (shape (shape_key) (dot) (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (integer))))) + (shape (shape_key) (dot) (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (integer))))) + (shape (shape_key) (dot) (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (integer))))) + (shape (shape_key) (dot) (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value)))) + (shape (shape_key) (dot) (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (boolean))))) + (shape (shape_key) (dot) (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (boolean))))) + (shape (shape_key) (dot) (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (boolean))))) + (shape (shape_key) (dot) (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value)))) + (shape (shape_key) (dot) (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value)))) ) ================================================================================ @@ -100,7 +100,7 @@ foo.style: { (shape (shape_key) (dot) (attribute - (attr_key) + (keyword_style) (block (attribute (attr_key) (attr_value (float))) (attribute (attr_key) (attr_value)) @@ -174,17 +174,17 @@ foo: { (container (container_key) (block - (attribute (attr_key) (dot) (attribute (attr_key) (attr_value (float)))) - (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 (integer)))) - (attribute (attr_key) (dot) (attribute (attr_key) (attr_value (integer)))) - (attribute (attr_key) (dot) (attribute (attr_key) (attr_value (integer)))) - (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))) - (attribute (attr_key) (dot) (attribute (attr_key) (attr_value (boolean)))) - (attribute (attr_key) (dot) (attribute (attr_key) (attr_value (boolean)))) - (attribute (attr_key) (dot) (attribute (attr_key) (attr_value (boolean)))) - (attribute (attr_key) (dot) (attribute (attr_key) (attr_value))) + (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (float)))) + (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value))) + (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value))) + (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (integer)))) + (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (integer)))) + (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (integer)))) + (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value))) + (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (boolean)))) + (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (boolean)))) + (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value (boolean)))) + (attribute (keyword_style) (dot) (attribute (attr_key) (attr_value))) ) ) ) @@ -215,7 +215,7 @@ foo: { (container_key) (block (attribute - (attr_key) + (keyword_style) (block (attribute (attr_key) (attr_value (float))) (attribute (attr_key) (attr_value)) @@ -262,7 +262,7 @@ foo -> bar: { (shape_key) (block (attribute - (attr_key) + (keyword_style) (block (attribute (attr_key) (attr_value (float))) (attribute (attr_key) (attr_value)) @@ -367,7 +367,7 @@ foo -> bar: { (attr_key) (block (attribute - (attr_key) + (keyword_style) (block (attribute (attr_key) (attr_value (float))) (attribute (attr_key) (attr_value)) @@ -436,7 +436,7 @@ foo.style: {opacity: 0.5; fill: red} (shape (shape_key) (dot) (attribute - (attr_key) + (keyword_style) (block (attribute (attr_key) (attr_value (float))) (attribute (attr_key) (attr_value)) diff --git a/test/corpus/classes.txt b/test/corpus/classes.txt new file mode 100644 index 0000000..a840f96 --- /dev/null +++ b/test/corpus/classes.txt @@ -0,0 +1,198 @@ +================================================================================ +Declare empty classes keyword in the root +================================================================================ +classes + +-------------------------------------------------------------------------------- + +(source_file + (classes (keyword_classes)) +) + +================================================================================ +Declare classes block with item block +================================================================================ +classes: { + foo: { + style: { + fill: "#44C7B1" + } + } +} + +-------------------------------------------------------------------------------- + +(source_file + (classes + (keyword_classes) + (block + (class_name) + (class_block + (attribute + (keyword_style) + (block + (attribute + (attr_key) + (attr_value + (string (string_fragment)) + ) + ) + ) + ) + ) + ) + ) +) + +================================================================================ +Declare classes block with item inline +================================================================================ +classes: { + foo.style: { + fill: "#44C7B1" + } +} + +-------------------------------------------------------------------------------- + +(source_file + (classes + (keyword_classes) + (block + (class_name) + (dot) + (attribute + (keyword_style) + (block + (attribute + (attr_key) + (attr_value + (string (string_fragment)) + ) + ) + ) + ) + ) + ) +) + +================================================================================ +Declare classes inline with item inline +================================================================================ +classes.foo.style: { + fill: "#44C7B1" +} + +-------------------------------------------------------------------------------- + +(source_file + (classes + (keyword_classes) + (dot) + (class_name) + (dot) + (attribute + (keyword_style) + (block + (attribute + (attr_key) + (attr_value + (string (string_fragment)) + ) + ) + ) + ) + ) +) + +================================================================================ +Declare classes inline with item block +================================================================================ +classes.foo: { + style: { + fill: "#44C7B1" + } +} + +-------------------------------------------------------------------------------- + +(source_file + (classes + (keyword_classes) + (dot) + (class_name) + (class_block + (attribute + (keyword_style) + (block + (attribute + (attr_key) + (attr_value + (string (string_fragment)) + ) + ) + ) + ) + ) + ) +) + +================================================================================ +Declare shape with a class +================================================================================ +foo.class: biz + +-------------------------------------------------------------------------------- + +(source_file + (shape + (shape_key) + (dot) + (attribute + (keyword_class) + (class_name) + ) + ) +) + +================================================================================ +Declare shape with many classes +================================================================================ +foo.class: [biz; baz] + +-------------------------------------------------------------------------------- + +(source_file + (shape + (shape_key) + (dot) + (attribute + (keyword_class) + (class_list + (class_name) + (class_name) + ) + ) + ) +) + +================================================================================ +Declare a class in the container +================================================================================ +foo: { + class: biz +} + +-------------------------------------------------------------------------------- + +(source_file + (container + (container_key) + (block + (attribute + (keyword_class) + (class_name) + ) + ) + ) +) diff --git a/test/highlight/attribute.d2 b/test/highlight/attribute.d2 index 3dfd5a2..c9187c1 100644 --- a/test/highlight/attribute.d2 +++ b/test/highlight/attribute.d2 @@ -10,7 +10,7 @@ shape: oval baaaz.style: { # <- variable - # ^ property + # ^ keyword fill: red # <- property # ^ string @@ -22,12 +22,13 @@ foo: Label { # ^ string style.fill: red; - # <- property + # <- keyword # ^ property } foo: { style: { + # <- keyword opacity: 0.5 # ^ float fill: red @@ -54,6 +55,6 @@ foo: Label { # ^ string style.fill: red - # <- property + # <- keyword # ^ property } diff --git a/test/highlight/classes.d2 b/test/highlight/classes.d2 new file mode 100644 index 0000000..5f24a74 --- /dev/null +++ b/test/highlight/classes.d2 @@ -0,0 +1,40 @@ +classes: { +# <- keyword +# ^ punctuation.delimiter +# ^ punctuation.bracket + load balancer { + label: load\nbalancer + width: 100 + height: 200 + style: { + stroke-width: 0 + fill: "#44C7B1" + shadow: true + border-radius: 5 + } + } + unhealthy: { + style: { + fill: "#FE7070" + stroke: "#F69E03" + } + } +} + +web traffic -> web lb +web lb.class: load balancer +# <- variable +# ^ punctuation.delimiter +# ^ keyword +# ^ punctuation.delimiter + +web lb -> api1 +web lb -> api2 +web lb -> api3 + +api2.class: unhealthy + +api1 -> cache lb +api3 -> cache lb + +cache lb.class: load balancer