From ea45a13707abd2a70df183f1aec6447197fc9ccc Mon Sep 17 00:00:00 2001 From: Joost Diepenmaat Date: Sat, 2 Nov 2019 21:56:47 +0100 Subject: [PATCH] Indentation improvements (#117) * Allow easier customization of indentation level * correctly indent repeat construct * Indent forks and loops for activity syntax. Test notes --- bin/download-plantuml.sh | 4 +- plantuml-mode.el | 19 +- .../plantuml-indentation-activity-new-test.el | 389 ++++++++++++++++++ test/test-helper.el | 2 +- 4 files changed, 408 insertions(+), 6 deletions(-) create mode 100644 test/plantuml-indentation-activity-new-test.el diff --git a/bin/download-plantuml.sh b/bin/download-plantuml.sh index 3be3725..2c01e73 100755 --- a/bin/download-plantuml.sh +++ b/bin/download-plantuml.sh @@ -1,7 +1,7 @@ #!/bin/sh # Where the script is executed -CURRENT_PATH="$(dirname "$(readlink -f "$0")")" +CURRENT_PATH="$(dirname "$0")" # Where to download the file OUTPUT_PATH="${CURRENT_PATH}/plantuml.jar" @@ -10,7 +10,7 @@ OUTPUT_PATH="${CURRENT_PATH}/plantuml.jar" VERSIONS_URL='https://search.maven.org/solrsearch/select?q=g:net.sourceforge.plantuml+AND+a:plantuml&core=gav&start=0&rows=1&wt=xml' # Only match the contents of the version (name="v") XML tag -LATEST_VERSION="$(curl -s "${VERSIONS_URL}" | grep -oP '(?<=).*(?=)')" +LATEST_VERSION="$(curl -s "${VERSIONS_URL}" | grep ''| sed 's/.*//g'|sed 's/<\/str>.*//')" # Compose the download link DOWNLOAD_URL="https://search.maven.org/remotecontent?filepath=net/sourceforge/plantuml/plantuml/${LATEST_VERSION}/plantuml-${LATEST_VERSION}.jar" diff --git a/plantuml-mode.el b/plantuml-mode.el index d514751..e40ba0d 100644 --- a/plantuml-mode.el +++ b/plantuml-mode.el @@ -143,6 +143,9 @@ :type 'boolean :group 'plantuml) +(defcustom plantuml-indent-level 8 + "Indentation level of PlantUML lines") + (defun plantuml-jar-render-command (&rest arguments) "Create a command line to execute PlantUML with arguments (as ARGUMENTS)." (let* ((cmd-list (append plantuml-java-args (list (expand-file-name plantuml-jar-path)) plantuml-jar-args arguments)) @@ -583,6 +586,9 @@ or it is followed by line end.") (defvar plantuml-indent-regexp-footer-start "^\s*\\(?:\\(?:center\\|left\\|right\\)\s+footer\\|footer\\)\s*\\('.*\\)?$") (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\\)\\)\s*\\('.*\\)?$") (defvar plantuml-indent-regexp-oldif-start "^.*if\s+\".*\"\s+then\s*\\('.*\\)?$" "used in current activity diagram, sometimes already mentioned as deprecated") + (defvar plantuml-indent-regexp-newif-start "^\s*\\(?:else\\)?if\s+(.*)\s+then\s*.*$") + (defvar plantuml-indent-regexp-loop-start "^\s*\\(?:repeat\s*\\|while\s+(.*).*\\)$") + (defvar plantuml-indent-regexp-fork-start "^\s*\\(?:fork\\|split\\)\\(?:\s+again\\)?\s*$") (defvar plantuml-indent-regexp-macro-start "^\s*!definelong.*$") (defvar plantuml-indent-regexp-user-control-start "^.*'.*\s*PLANTUML_MODE_INDENT_INCREASE\s*.*$") (defvar plantuml-indent-regexp-start (list plantuml-indent-regexp-block-start @@ -592,7 +598,9 @@ or it is followed by line end.") plantuml-indent-regexp-ref-start plantuml-indent-regexp-legend-start plantuml-indent-regexp-note-start - plantuml-indent-regexp-oldif-start + plantuml-indent-regexp-newif-start + plantuml-indent-regexp-loop-start + plantuml-indent-regexp-fork-start plantuml-indent-regexp-title-start plantuml-indent-regexp-header-start plantuml-indent-regexp-footer-start @@ -610,6 +618,9 @@ or it is followed by line end.") (defvar plantuml-indent-regexp-footer-end "^\s*endfooter\s*\\('.*\\)?$") (defvar plantuml-indent-regexp-legend-end "^\s*endlegend\s*\\('.*\\)?$") (defvar plantuml-indent-regexp-oldif-end "^\s*\\(endif\\|else\\)\s*\\('.*\\)?$") + (defvar plantuml-indent-regexp-newif-end "^\s*\\(endif\\|elseif\\|else\\)\s*.*$") + (defvar plantuml-indent-regexp-loop-end "^\s*\\(repeat\s*while\\|endwhile\\)\s*.*$") + (defvar plantuml-indent-regexp-fork-end "^\s*\\(\\(fork\\|split\\)\s+again\\|end\s+\\(fork\\|split\\)\\)\s*$") (defvar plantuml-indent-regexp-macro-end "^\s*!enddefinelong\s*\\('.*\\)?$") (defvar plantuml-indent-regexp-user-control-end "^.*'.*\s*PLANTUML_MODE_INDENT_DECREASE\s*.*$") (defvar plantuml-indent-regexp-end (list plantuml-indent-regexp-block-end @@ -619,7 +630,9 @@ or it is followed by line end.") plantuml-indent-regexp-ref-end plantuml-indent-regexp-legend-end plantuml-indent-regexp-note-end - plantuml-indent-regexp-oldif-end + plantuml-indent-regexp-newif-end + plantuml-indent-regexp-loop-end + plantuml-indent-regexp-fork-end plantuml-indent-regexp-title-end plantuml-indent-regexp-header-end plantuml-indent-regexp-footer-end @@ -708,7 +721,7 @@ Restore point to same position in text of the line as before indentation." (let ((original-position-eol (- (line-end-position) (point)))) (save-excursion (beginning-of-line) - (indent-line-to (* tab-width (plantuml-current-block-depth)))) + (indent-line-to (* plantuml-indent-level (plantuml-current-block-depth)))) ;; restore position in text of line (goto-char (- (line-end-position) original-position-eol)))) diff --git a/test/plantuml-indentation-activity-new-test.el b/test/plantuml-indentation-activity-new-test.el new file mode 100644 index 0000000..98f6e2d --- /dev/null +++ b/test/plantuml-indentation-activity-new-test.el @@ -0,0 +1,389 @@ +;;; plantuml-indentation-activity-old-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 for activity (old version) diagrams. + +;;; Code: + + +(ert-deftest plantuml-test-indentation/activity-new/start-stop () + "Test correct indentation of plantuml activity-new diagram elements: start-stop. +These code examples are taken from www.plantuml.com" + (plantuml-test-indent-block +"@startuml +start +:Hello world; +:This is defined on +several **lines**; +end +@enduml" + +"@startuml +start +:Hello world; +:This is defined on +several **lines**; +end +@enduml")) + +(ert-deftest plantuml-test-indentation/activity-new/conditional () + "Test correct indentation of plantuml activity-new diagram conditionals. +These code examples are taken from www.plantuml.com" + (plantuml-test-indent-block +"@startuml +start +if (condition A) then (yes) +:Text 1; +elseif (condition B) then (yes) +:Text 2; +stop +elseif (condition C) then (yes) +:Text 3; +elseif (condition D) then (yes) +:Text 4; +else (nothing) +:Text else; +endif +stop +@enduml" + +"@startuml +start +if (condition A) then (yes) + :Text 1; +elseif (condition B) then (yes) + :Text 2; + stop +elseif (condition C) then (yes) + :Text 3; +elseif (condition D) then (yes) + :Text 4; +else (nothing) + :Text else; +endif +stop +@enduml")) + +(ert-deftest plantuml-test-indentation/activity-new/repeat-loop () + "Test correct indentation of plantuml activity-new repeat loop +These code examples are taken from www.plantuml.com" + (plantuml-test-indent-block +"@startuml + +start + +repeat +:read data; +:generate diagrams; +repeat while (more data?) is (yes) +->no; +stop + +@enduml" + +"@startuml + +start + +repeat + :read data; + :generate diagrams; +repeat while (more data?) is (yes) +->no; +stop + +@enduml")) + + +(ert-deftest plantuml-test-indentation/activity-new/while-loop () + "Test correct indentation of plantuml activity-new while loop +These code examples are taken from www.plantuml.com" + (plantuml-test-indent-block +"@startuml + +start + +while (data available?) +:read data; +:generate diagrams; +endwhile + +stop + +@enduml" + +"@startuml + +start + +while (data available?) + :read data; + :generate diagrams; +endwhile + +stop + +@enduml") + + (plantuml-test-indent-block +"@startuml +while (check filesize ?) is (not empty) +:read file; +endwhile (empty) +:close file; +@enduml" + +"@startuml +while (check filesize ?) is (not empty) + :read file; +endwhile (empty) +:close file; +@enduml")) + +(ert-deftest plantuml-test-indentation/activity-new/fork () + "Test correct indentation of plantuml activity-new forks +These code examples are taken from www.plantuml.com" + (plantuml-test-indent-block + "@startuml + +start + +if (multiprocessor?) then (yes) +fork +:Treatment 1; +fork again +:Treatment 2; +end fork +else (monoproc) +:Treatment 1; +:Treatment 2; +endif + +@enduml" + "@startuml + +start + +if (multiprocessor?) then (yes) + fork + :Treatment 1; + fork again + :Treatment 2; + end fork +else (monoproc) + :Treatment 1; + :Treatment 2; +endif + +@enduml")) + +(ert-deftest plantuml-test-indentation/activity-new/notes () + "Test correct indentation of plantuml activity-new notes +These code examples are taken from www.plantuml.com" + (plantuml-test-indent-block +"@startuml + +start +:foo1; +floating note left: This is a note +:foo2; +note right +This note is on several +//lines// and can +contain HTML +==== +* Calling the method \"foo()\" is prohibited +end note +stop + +@enduml" + +"@startuml + +start +:foo1; +floating note left: This is a note +:foo2; +note right + This note is on several + //lines// and can + contain HTML + ==== + * Calling the method \"foo()\" is prohibited +end note +stop + +@enduml")) + +(ert-deftest plantuml-test-indentation/activity-new/grouping () + "Test correct indentation of plantuml activity-new grouping +These code examples are taken from www.plantuml.com" + (plantuml-test-indent-block +"@startuml +start +partition Initialization { +:read config file; +:init internal variable; +} +partition Running { +:wait for user interaction; +:print information; +} + +stop +@enduml" + +"@startuml +start +partition Initialization { + :read config file; + :init internal variable; +} +partition Running { + :wait for user interaction; + :print information; +} + +stop +@enduml")) + +(ert-deftest plantuml-test-indentation/activity-new/sdl+splits () + "Test correct indentation of plantuml activity-new sdl rendering and splits +These code examples are taken from www.plantuml.com" + (plantuml-test-indent-block +"@startuml +:Ready; +:next(o)| +:Receiving; +split +:nak(i)< +:ack(o)> +split again +:ack(i)< +:next(o) +on several lines| +:i := i + 1] +:ack(o)> +split again +:err(i)< +:nak(o)> +split again +:foo/ +split again +:i > 5} +stop +end split +:finish; +@enduml" + +"@startuml +:Ready; +:next(o)| +:Receiving; +split + :nak(i)< + :ack(o)> +split again + :ack(i)< + :next(o) + on several lines| + :i := i + 1] + :ack(o)> +split again + :err(i)< + :nak(o)> +split again + :foo/ +split again + :i > 5} + stop +end split +:finish; +@enduml")) + +(ert-deftest plantuml-test-indentation/activity-new/complete () + "Test correct indentation of plantuml activity-new complete example +These code examples are taken from www.plantuml.com" + (plantuml-test-indent-block +"@startuml + +start +:ClickServlet.handleRequest(); +:new page; +if (Page.onSecurityCheck) then (true) +:Page.onInit(); +if (isForward?) then (no) +:Process controls; +if (continue processing?) then (no) +stop +endif + +if (isPost?) then (yes) +:Page.onPost(); +else (no) +:Page.onGet(); +endif +:Page.onRender(); +endif +else (false) +endif + +if (do redirect?) then (yes) +:redirect process; +else +if (do forward?) then (yes) +:Forward request; +else (no) +:Render page template; +endif +endif + +stop + +@enduml" + +"@startuml + +start +:ClickServlet.handleRequest(); +:new page; +if (Page.onSecurityCheck) then (true) + :Page.onInit(); + if (isForward?) then (no) + :Process controls; + if (continue processing?) then (no) + stop + endif + + if (isPost?) then (yes) + :Page.onPost(); + else (no) + :Page.onGet(); + endif + :Page.onRender(); + endif +else (false) +endif + +if (do redirect?) then (yes) + :redirect process; +else + if (do forward?) then (yes) + :Forward request; + else (no) + :Render page template; + endif +endif + +stop + +@enduml")) + +(provide 'plantuml-indentation-activity-new-test) + +;;; plantuml-indentation-activity-old-test.el ends here diff --git a/test/test-helper.el b/test/test-helper.el index 6c91e18..feb3950 100644 --- a/test/test-helper.el +++ b/test/test-helper.el @@ -61,7 +61,7 @@ Finally, the indented text in the buffer will be compared with AFTER." (plantuml-mode) ;; use 2 spaces instead of one tab for indentation (setq indent-tabs-mode nil) - (setq tab-width 2) + (setq plantuml-indent-level 2) (indent-region (point-min) (point-max)) (should (equal (buffer-string) after))))