From b974b3df3e5f1c15198fdb2afcb748ac3a06f040 Mon Sep 17 00:00:00 2001 From: Trey Evans Date: Mon, 1 Feb 2021 13:21:49 -0500 Subject: [PATCH] Add class name literals. --- src/diagrams/class/classDiagram.spec.js | 47 ++++++++++++++++++++ src/diagrams/class/parser/classDiagram.jison | 14 +++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/diagrams/class/classDiagram.spec.js b/src/diagrams/class/classDiagram.spec.js index baaa9ca65..75fb8699f 100644 --- a/src/diagrams/class/classDiagram.spec.js +++ b/src/diagrams/class/classDiagram.spec.js @@ -8,6 +8,14 @@ describe('class diagram, ', function () { parser.yy = classDb; }); + it('should handle backquoted class names', function() { + const str = + 'classDiagram\n' + + 'class `Car`'; + + parser.parse(str); + }); + it('should handle relation definitions', function () { const str = 'classDiagram\n' + @@ -20,6 +28,18 @@ describe('class diagram, ', function () { parser.parse(str); }); + it('should handle backquoted relation definitions', function () { + const str = + 'classDiagram\n' + + '`Class01` <|-- Class02\n' + + 'Class03 *-- Class04\n' + + 'Class05 o-- Class06\n' + + 'Class07 .. Class08\n' + + 'Class09 -- Class1'; + + parser.parse(str); + }); + it('should handle relation definition of different types and directions', function () { const str = 'classDiagram\n' + @@ -67,6 +87,17 @@ describe('class diagram, ', function () { parser.parse(str); }); + it('should handle generic class with a literal name', function() { + const str = + 'classDiagram\n' + + 'class `Car`~T~\n' + + 'Driver -- `Car` : drives >\n' + + '`Car` *-- Wheel : have 4 >\n' + + '`Car` -- Person : < owns'; + + parser.parse(str); + }); + it('should break when another `{`is encountered before closing the first one while defining generic class with brackets', function() { const str = 'classDiagram\n' + @@ -125,6 +156,22 @@ describe('class diagram, ', function () { parser.parse(str); }); + it('should handle generic class with brackets and a literal name', function() { + const str = + 'classDiagram\n' + + 'class `Dummy_Class`~T~ {\n' + + 'String data\n' + + ' void methods()\n' + + '}\n' + + '\n' + + 'class Flight {\n' + + ' flightNumber : Integer\n' + + ' departureTime : Date\n' + + '}'; + + parser.parse(str); + }); + it('should handle class definitions', function() { const str = 'classDiagram\n' + diff --git a/src/diagrams/class/parser/classDiagram.jison b/src/diagrams/class/parser/classDiagram.jison index 9e740b47f..dca4d0189 100644 --- a/src/diagrams/class/parser/classDiagram.jison +++ b/src/diagrams/class/parser/classDiagram.jison @@ -7,6 +7,7 @@ /* lexical grammar */ %lex %x string +%x bqstring %x generic %x struct %x href @@ -49,6 +50,10 @@ ["] this.popState(); [^"]* return "STR"; +[`] this.begin("bqstring"); +[`] this.popState(); +[^`]+ return "BQUOTE_STR"; + /* ---interactivity command--- 'href' adds a link to the specified node. 'href' can only be specified when the @@ -214,10 +219,15 @@ statements ; className - : alphaNumToken { $$=$1; } + : + | alphaNumToken { $$=$1; } + | classLiteralName { $$=$1; } | alphaNumToken className { $$=$1+$2; } + | classLiteralName className { $$=$1+$2; } | alphaNumToken GENERICTYPE className { $$=$1+'~'+$2+$3; } + | classLiteralName GENERICTYPE className { $$=$1+'~'+$2+$3; } | alphaNumToken GENERICTYPE { $$=$1+'~'+$2; } + | classLiteralName GENERICTYPE { $$=$1+'~'+$2; } ; statement @@ -309,4 +319,6 @@ textNoTagsToken: alphaNumToken | SPACE | MINUS | keywords ; alphaNumToken : UNICODE_TEXT | NUM | ALPHA; +classLiteralName : BQUOTE_STR; + %%