From 781eb62b37ca779ffe5fe2839c52da537234bb69 Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Fri, 9 Dec 2022 11:24:48 +0300 Subject: [PATCH] add style attributes --- grammar.js | 45 ++++++- src/grammar.json | 259 +++++++++++++++++++++++++++++-------- src/node-types.json | 24 ++++ src/parser.c | Bin 76455 -> 116286 bytes test/corpus/attributes.txt | 71 ++++++++++ 5 files changed, 338 insertions(+), 61 deletions(-) diff --git a/grammar.js b/grammar.js index f397ded..2c28145 100644 --- a/grammar.js +++ b/grammar.js @@ -111,9 +111,12 @@ module.exports = grammar({ seq( $.shape_key, optional( - seq( - optional(seq($._colon, optional($.label))), - optional(seq(alias($._new_shape_block, $.block))) + choice( + seq($._dot, alias($._style_attribute, $.attribute)), + seq( + optional(seq($._colon, optional($.label))), + optional(seq(alias($._new_shape_block, $.block))) + ) ) ) ) @@ -132,10 +135,7 @@ module.exports = grammar({ // attributes _new_root_attribute: ($) => - prec( - PREC.ATTRIBUTE, - seq(alias($._root_attr_key, $.attr_key), $._colon, $.attr_value) - ), + seq(alias($._root_attr_key, $.attr_key), $._colon, $.attr_value), _root_attr_key: ($) => choice( @@ -147,6 +147,7 @@ module.exports = grammar({ "label", "constraint", "icon", + "style", $._common_style_attr_key, $._text_attr_key ), @@ -169,6 +170,36 @@ module.exports = grammar({ ) ), + _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( + "{", + repeat( + choice( + $._eol, + seq(alias($._inner_style_attribute, $.attribute), $._end) + ) + ), + "}" + ), + + _inner_style_attribute: ($) => + prec( + PREC.ATTRIBUTE, + seq(alias($._style_attr_key, $.attr_key), $._colon, $.attr_value) + ), + _style_attr_key: ($) => choice($._common_style_attr_key, "3d"), _common_style_attr_key: ($) => diff --git a/src/grammar.json b/src/grammar.json index e973575..48a9f29 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -316,56 +316,79 @@ "type": "CHOICE", "members": [ { - "type": "SEQ", + "type": "CHOICE", "members": [ { - "type": "CHOICE", + "type": "SEQ", "members": [ { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "_colon" - }, - { - "type": "CHOICE", - "members": [ - { - "type": "SYMBOL", - "name": "label" - }, - { - "type": "BLANK" - } - ] - } - ] + "type": "SYMBOL", + "name": "_dot" }, { - "type": "BLANK" + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_style_attribute" + }, + "named": true, + "value": "attribute" } ] }, { - "type": "CHOICE", + "type": "SEQ", "members": [ { - "type": "SEQ", + "type": "CHOICE", "members": [ { - "type": "ALIAS", - "content": { - "type": "SYMBOL", - "name": "_new_shape_block" - }, - "named": true, - "value": "block" + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_colon" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "label" + }, + { + "type": "BLANK" + } + ] + } + ] + }, + { + "type": "BLANK" } ] }, { - "type": "BLANK" + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_new_shape_block" + }, + "named": true, + "value": "block" + } + ] + }, + { + "type": "BLANK" + } + ] } ] } @@ -458,30 +481,26 @@ } }, "_new_root_attribute": { - "type": "PREC", - "value": 0, - "content": { - "type": "SEQ", - "members": [ - { - "type": "ALIAS", - "content": { - "type": "SYMBOL", - "name": "_root_attr_key" - }, - "named": true, - "value": "attr_key" - }, - { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { "type": "SYMBOL", - "name": "_colon" + "name": "_root_attr_key" }, - { - "type": "SYMBOL", - "name": "attr_value" - } - ] - } + "named": true, + "value": "attr_key" + }, + { + "type": "SYMBOL", + "name": "_colon" + }, + { + "type": "SYMBOL", + "name": "attr_value" + } + ] }, "_root_attr_key": { "type": "CHOICE", @@ -511,6 +530,10 @@ "type": "STRING", "value": "icon" }, + { + "type": "STRING", + "value": "style" + }, { "type": "SYMBOL", "name": "_common_style_attr_key" @@ -559,6 +582,134 @@ ] } }, + "_style_attribute": { + "type": "PREC", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "STRING", + "value": "style" + }, + "named": true, + "value": "attr_key" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_dot" + }, + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_inner_style_attribute" + }, + "named": true, + "value": "attribute" + } + ] + }, + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_colon" + }, + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_style_attribute_block" + }, + "named": true, + "value": "block" + } + ] + } + ] + } + ] + } + }, + "_style_attribute_block": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "REPEAT", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_eol" + }, + { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_inner_style_attribute" + }, + "named": true, + "value": "attribute" + }, + { + "type": "SYMBOL", + "name": "_end" + } + ] + } + ] + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_inner_style_attribute": { + "type": "PREC", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_style_attr_key" + }, + "named": true, + "value": "attr_key" + }, + { + "type": "SYMBOL", + "name": "_colon" + }, + { + "type": "SYMBOL", + "name": "attr_value" + } + ] + } + }, "_style_attr_key": { "type": "CHOICE", "members": [ diff --git a/src/node-types.json b/src/node-types.json index 17e7779..fbd7a09 100644 --- a/src/node-types.json +++ b/src/node-types.json @@ -44,6 +44,18 @@ { "type": "attr_value", "named": true + }, + { + "type": "attribute", + "named": true + }, + { + "type": "block", + "named": true + }, + { + "type": "dot", + "named": true } ] } @@ -56,6 +68,10 @@ "multiple": true, "required": false, "types": [ + { + "type": "attribute", + "named": true + }, { "type": "connection", "named": true @@ -180,10 +196,18 @@ "multiple": true, "required": true, "types": [ + { + "type": "attribute", + "named": true + }, { "type": "block", "named": true }, + { + "type": "dot", + "named": true + }, { "type": "label", "named": true diff --git a/src/parser.c b/src/parser.c index adddd4d9b02c9effa675f63554e4952e190ecdc4..aa657a9d30ee213df834dfd269fc34d2bc28c557 100644 GIT binary patch literal 116286 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 literal 76455 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 diff --git a/test/corpus/attributes.txt b/test/corpus/attributes.txt index 660ef47..733a6ec 100644 --- a/test/corpus/attributes.txt +++ b/test/corpus/attributes.txt @@ -43,3 +43,74 @@ near: abc (attribute (attr_key (reserved)) (attr_value)) ) +================================================================================ +Style attribute +================================================================================ +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 + (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)))) +) + +================================================================================ +Block style attributes +================================================================================ +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 + (shape + (shape_key) (dot) + (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)) + ) + ) + ) +)