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))))