diff --git a/plantuml-mode.el b/plantuml-mode.el index 5e34393..df30bcd 100644 --- a/plantuml-mode.el +++ b/plantuml-mode.el @@ -350,32 +350,41 @@ Uses prefix (as PREFIX) to choose where to display it: Plantuml elements like skinparam, rectangle, sprite, package, …. The opening { has to be the last visible character in the line (whitespace might follow).") - (defvar plantuml-indent-regexp-note-start "^\s*\\(note\s+over\\|note\sas\s.*\\|note\s+\\(\\(?:\\(?:button\\|left\\|right\\|top\\)\\)\\)\\(?:\s+of\\)?\\)" - "Indentation regex for all plantuml note elements") + ;; (defconst plantuml-indent-regexp-note-color "\\(?:\s+#\\w+\\)?" "optional color specification") + ;; (defconst plantuml-indent-regexp-note-position "\\(?:\s+\\(?:left\\|right\\|top\\|bottom\\)\\)?" "optional position specification") + ;; (defconst plantuml-indent-regexp-note-floating "\\(floating\s+\\)?" "optional floating specification") + ;; (defvar plantuml-indent-regexp-base-note-start (concat "^\s*" plantuml-indent-regexp-note-floating "note" plantuml-indent-regexp-note-position "\\(?:\s+of\s+[^:]+?\\)?" plantuml-indent-regexp-note-color "$") + ;; "Indentation regex for plantuml: note, note right, note left, note bottom, note top, note xxx of") + ;; (defvar plantuml-indent-regexp-note-on-link-start (concat "^\s*note" plantuml-indent-regexp-note-position "\s+on\s+link" plantuml-indent-regexp-note-color "$") + ;; "Indentation regex for plantuml: note on link") + ;; (defvar plantuml-indent-regexp-note-over-start "^\s*note\s+over[^:]+?$" + ;; "Indentation regex for plantuml: note over") + (defvar plantuml-indent-regexp-note-start "^\s*\\(floating\s+\\)?[hr]?note[^:]*?$" "simplyfied regex; note syntax is especially inconsistent across diagrams") (defvar plantuml-indent-regexp-group-start "^\s*\\(alt\\|else\\|opt\\|loop\\|par\\|break\\|critical\\|group\\)\\(?:\s+.+\\|$\\)" "Indentation regex for plantuml group elements that are defined for sequence diagrams. Two variants for groups: keyword is either followed by whitespace and some text or it is followed by line end.") (defvar plantuml-indent-regexp-activate-start "^\s*activate\s+.+$") (defvar plantuml-indent-regexp-box-start "^\s*box\s+.+$") - (defvar plantuml-indent-regexp-ref-start "^ref +over +[^:]+?$") + (defvar plantuml-indent-regexp-ref-start "^ref\s+over\s+[^:]+?$") (defvar plantuml-indent-regexp-title-start "^\s*title$") (defvar plantuml-indent-regexp-header-start "^\s*\\(?:\\(?:center\\|left\\|right\\)\s+header\\|header\\)$") (defvar plantuml-indent-regexp-footer-start "^\s*\\(?:\\(?:center\\|left\\|right\\)\s+footer\\|footer\\)$") (defvar plantuml-indent-regexp-legend-start "^\s*\\(?:legend\\|legend\s+\\(?:bottom\\|top\\)\\|legend\s+\\(?:center\\|left\\|right\\)\\|legend\s+\\(?:bottom\\|top\\)\s+\\(?:center\\|left\\|right\\)\\)$") - (defvar plantuml-indent-regexp-oldif-start "^.*if\s+\".*\"\s+then$") + (defvar plantuml-indent-regexp-oldif-start "^.*if\s+\".*\"\s+then$" "current activity diagram, sometimes already mentioned as deprecated") (defvar plantuml-indent-regexp-start (list plantuml-indent-regexp-block-start - plantuml-indent-regexp-note-start plantuml-indent-regexp-group-start plantuml-indent-regexp-activate-start plantuml-indent-regexp-box-start plantuml-indent-regexp-ref-start + plantuml-indent-regexp-legend-start + plantuml-indent-regexp-note-start + plantuml-indent-regexp-oldif-start plantuml-indent-regexp-title-start plantuml-indent-regexp-header-start plantuml-indent-regexp-footer-start - plantuml-indent-regexp-legend-start plantuml-indent-regexp-oldif-start)) - (defvar plantuml-indent-regexp-end "^\s*\\(?:}\\|endif\\|else\s*.*\\|end\\|end\s+note\\|end\s+box\\|end\s+ref\\|deactivate\s+.+\\|end\s+title\\|endheader\\|endfooter\\|endlegend\\)$") + (defvar plantuml-indent-regexp-end "^\s*\\(?:}\\|endif\\|else\s*.*\\|end\\|end\s+note\\|endhnote\\|endrnote\\|end\s+box\\|end\s+ref\\|deactivate\s+.+\\|end\s+title\\|endheader\\|endfooter\\|endlegend\\)$") (setq plantuml-font-lock-keywords `( (,plantuml-types-regexp . font-lock-type-face) diff --git a/test/plantuml-indentation-commons-test.el b/test/plantuml-indentation-commons-test.el index f93b158..8069098 100644 --- a/test/plantuml-indentation-commons-test.el +++ b/test/plantuml-indentation-commons-test.el @@ -313,22 +313,4 @@ this is no correct legend endlegend ")) - -(ert-deftest plantuml-test-block-indentation/note-as () - "Test correct indentation of a note-as block." - (plantuml-test-indent-block - " -note as N1 -This is a note -end note -" - " -note as N1 - This is a note -end note -" - )) - -(provide 'plantuml-indentation-commons-test) - ;;; plantuml-indentation-commons-test.el ends here diff --git a/test/plantuml-indentation-notes-test.el b/test/plantuml-indentation-notes-test.el new file mode 100644 index 0000000..b58f2b4 --- /dev/null +++ b/test/plantuml-indentation-notes-test.el @@ -0,0 +1,403 @@ +;;; plantuml-indentation-notes-test.el --- PlantUML Mode indentation tests -*- lexical-binding: t; -*- + +;; Author: René Schmelzer +;; Maintainer: Carlo Sciolla (skuro) +;; URL: https://github.com/skuro/plantuml-mode + +;;; Commentary: + +;; Test indentation of note elements. +;; Notes are used in almost all diagrams, but not all types of notes +;; are supported in every diagram type. + +;;; Code: + +(ert-deftest plantuml-test-block-indentation/note-simple () + "Test correct indentation of a simple note block." + (plantuml-test-indent-block + " +note: single line note + +note +multi line note +end note +" + " +note: single line note + +note + multi line note +end note +" + )) + +(ert-deftest plantuml-test-block-indentation/note-left-right () + "Test correct indentation of a note left/right block." + (plantuml-test-indent-block + " +(*) --> \"Some Activity\" +note right: This activity has to be defined +\"Some Activity\" --> (*) + +note right +This note is on +several lines +end note + +(*) --> \"Some Activity\" +note left: This activity has to be defined +\"Some Activity\" --> (*) + +note left +This note is on +several lines +end note +" + " +(*) --> \"Some Activity\" +note right: This activity has to be defined +\"Some Activity\" --> (*) + +note right + This note is on + several lines +end note + +(*) --> \"Some Activity\" +note left: This activity has to be defined +\"Some Activity\" --> (*) + +note left + This note is on + several lines +end note +" )) + +(ert-deftest plantuml-test-block-indentation/note-xxx-of () + "Test correct indentation of a note xxx of block. +plantuml.com: +You can use the note left of, note right of, note top of, +note bottom of keywords to define notes related to a single +object." + (plantuml-test-indent-block + " +note right of Alice: This is displayed right of Alice. + +note left of Alice #aqua +This is displayed +left of Alice. +end note + +note left of Alice: This is displayed left of Alice. + +note right of Alice #aqua +This is displayed +right of Alice. +end note + +note right of (Use) +A note can also +be on several lines +end note + +note left of HTTP : Web Service only + +note right of [First Component] +A note can also +be on several lines +end note +" + " +note right of Alice: This is displayed right of Alice. + +note left of Alice #aqua + This is displayed + left of Alice. +end note + +note left of Alice: This is displayed left of Alice. + +note right of Alice #aqua + This is displayed + right of Alice. +end note + +note right of (Use) + A note can also + be on several lines +end note + +note left of HTTP : Web Service only + +note right of [First Component] + A note can also + be on several lines +end note +" + )) + +(ert-deftest plantuml-test-block-indentation/note-on-link () + "Test correct indentation of a note xxx of block. +plantuml.com: +“You can also use note left on link, note right on link, +note top on link, note bottom on link if you want to change +the relative position of the note with the label.”" + (plantuml-test-indent-block + " +class Dummy +Dummy --> Foo : A link +note on link #red: note that is red + +Dummy --> Foo2 : Another link +note right on link #blue +this is my note on right link +and in blue +end note + +note left on link #00FFFF +this is my note on left link +and in color as number +end note +" + " +class Dummy +Dummy --> Foo : A link +note on link #red: note that is red + +Dummy --> Foo2 : Another link +note right on link #blue + this is my note on right link + and in blue +end note + +note left on link #00FFFF + this is my note on left link + and in color as number +end note +" + )) + +(ert-deftest plantuml-test-block-indentation/note-over () + "Test correct indentation of a note-over block." + (plantuml-test-indent-block + " +note over Alice: This is displayed over Alice. + +note over Alice, Bob #FFAAAA: This is displayed over Bob and Alice. + +note over Bob, Alice +This is yet another +example of +a long note. +end note +" + " +note over Alice: This is displayed over Alice. + +note over Alice, Bob #FFAAAA: This is displayed over Bob and Alice. + +note over Bob, Alice + This is yet another + example of + a long note. +end note +" + )) + +;; Here we have an inconsistency (again) in plantuml syntax +;; single line ‘note as …’ does not contain a ?: +;; +;; (ert-deftest plantuml-test-block-indentation/note-as () +;; "Test correct indentation of a note-as block." +;; (plantuml-test-indent-block +;; " +;; :Main Admin: as Admin +;; (Use the application) as (Use) + +;; User -> (Start) +;; User --> (Use) + +;; Admin ---> (Use) + +;; note right of Admin : This is an example. + +;; note right of (Use) +;; A note can also +;; be on several lines +;; end note + +;; note \"This note is connected to several objects.\" as N2 #RED +;; (Start) .. N2 +;; N2 .. (Use) + +;; note as N3 #blue +;; This note is connected +;; to several objects as well. +;; end note +;; (Start) .. N3 +;; N3 .. Admin +;; " +;; " +;; :Main Admin: as Admin +;; (Use the application) as (Use) + +;; User -> (Start) +;; User --> (Use) + +;; Admin ---> (Use) + +;; note right of Admin : This is an example. + +;; note right of (Use) +;; A note can also +;; be on several lines +;; end note + +;; note \"This note is connected to several objects.\" as N2 #RED +;; (Start) .. N2 +;; N2 .. (Use) + +;; note as N3 #blue +;; This note is connected +;; to several objects as well. +;; end note + +;; (Start) .. N3 +;; N3 .. Admin +;; " +;; )) + +(ert-deftest plantuml-test-block-indentation/note-floating () + "Test correct indentation of a floating note block." + (plantuml-test-indent-block + + " +floating note left: This is a note +:foo2; + +floating note right +This note is on several +//lines// and can +contain HTML +==== +* Calling the method \"\"foo()\"\" is prohibited +end note +" + " +floating note left: This is a note +:foo2; + +floating note right + This note is on several + //lines// and can + contain HTML + ==== + * Calling the method \"\"foo()\"\" is prohibited +end note +" + )) + +(ert-deftest plantuml-test-block-indentation/note-h-r-note () + "Test correct indentation of a [hr]note block." + (plantuml-test-indent-block + " +caller -> server : conReq +rnote over caller : idle +hnote over caller : idle +caller <- server : conConf + +rnote over server +r as rectangle +h as hexagon +endrnote + +hnote over server +r as rectangle +h as hexagon +endrnote +" + " +caller -> server : conReq +rnote over caller : idle +hnote over caller : idle +caller <- server : conConf + +rnote over server + r as rectangle + h as hexagon +endrnote + +hnote over server + r as rectangle + h as hexagon +endrnote +" + )) + +(ert-deftest plantuml-test-block-indentation/note-creole-html () + "Test correct indentation of a note block with creole/html." + (plantuml-test-indent-block + + " +participant Alice +participant \"The **Famous** Bob\" as Bob + +Alice -> Bob : hello --there-- +... Some ~~long delay~~ ... +Bob -> Alice : ok +note left +This is **bold** +This is //italics// +This is \"\"monospaced\"\" +This is --stroked-- +This is __underlined__ +This is ~~waved~~ +end note + +Alice -> Bob : A //well formatted// message +note right of Alice +This is displayed +__left of__ Alice. +end note +note left of Bob +This is displayed +**left of Alice Bob**. +end note +note over Alice, Bob +This is hosted by +end note + +" + " +participant Alice +participant \"The **Famous** Bob\" as Bob + +Alice -> Bob : hello --there-- +... Some ~~long delay~~ ... +Bob -> Alice : ok +note left + This is **bold** + This is //italics// + This is \"\"monospaced\"\" + This is --stroked-- + This is __underlined__ + This is ~~waved~~ +end note + +Alice -> Bob : A //well formatted// message +note right of Alice + This is displayed + __left of__ Alice. +end note +note left of Bob + This is displayed + **left of Alice Bob**. +end note +note over Alice, Bob + This is hosted by +end note + +" + )) + +;;; plantuml-indentation-notes-test.el ends here