Compare commits

...

44 Commits

Author SHA1 Message Date
Carlo Sciolla 5889166b6c
Prepping for v1.4.1 2019-09-03 23:24:56 +02:00
Carlo Sciolla 7a1d7ab1ca
Merge branch 'fix-105' into develop 2019-09-03 23:13:06 +02:00
Carlo Sciolla bea66129a9
Fix note syntax in tests 2019-09-03 23:12:48 +02:00
Carlo Sciolla 4f899a4495
Ensure base64 encoding happens after coding the string with UTF8 (#111)
* Fixes #110

Ensure base64 encoding happens after coding the string with UTF8

* Avoid line breaks in base64 encoding
2019-09-03 23:06:47 +02:00
Carlo Sciolla 252e2c3ce8
Disabling master again 2019-09-03 23:06:47 +02:00
Carlo Sciolla 11b78ff62e
Trying to re-enable builds against Emacs master 2019-09-03 23:06:47 +02:00
Carlo Sciolla 4349011ed7
Aesthitics, just aesthetics 2019-09-03 23:06:46 +02:00
Carlo Sciolla 2954c15322
Fix emacs 26 build 2019-09-03 23:06:46 +02:00
Carlo Sciolla a6545435cd
Bumping java version for CI 2019-09-03 23:06:46 +02:00
Carlo Sciolla 1a11576f4a
Bump version after release 2019-09-03 23:06:45 +02:00
Carlo Sciolla df0d718981
Prepping for the new release 2019-09-03 23:06:45 +02:00
Carlo Sciolla 271f468edd
Bump version 2019-09-03 23:06:45 +02:00
Carlo Sciolla b0be4182fb
Fix tests 2019-09-03 23:06:44 +02:00
Carlo Sciolla 76b14086e8
Ignore java warnings 2019-09-03 23:06:44 +02:00
Carlo Sciolla f04480dcba
Use UTC timezone when setting dates, to align with MELPA 2019-09-03 23:06:44 +02:00
Carlo Sciolla 2bd72f7ae6
Use `car` instead of `first` 2019-09-03 23:06:43 +02:00
Carlo Sciolla 914e0526d9
Avoid zero-padding of hours to mimic MELPA 2019-09-03 23:06:43 +02:00
Carlo Sciolla 60e4d3ec6e
Better version management 2019-09-03 23:06:43 +02:00
Felix Weilbach 7eb6167eb8
Added run mode EXECUTABLE (#102) 2019-09-03 23:06:42 +02:00
Carlo Sciolla 19e268c0cb
Ensure base64 encoding happens after coding the string with UTF8 (#111)
* Fixes #110

Ensure base64 encoding happens after coding the string with UTF8

* Avoid line breaks in base64 encoding
2019-08-30 22:54:26 +02:00
Carlo Sciolla 2f8170b30b
Disabling master again 2019-08-25 11:03:29 +02:00
Carlo Sciolla 14daefbb2f
Trying to re-enable builds against Emacs master 2019-08-25 10:37:51 +02:00
Carlo Sciolla 47156fac58
Aesthitics, just aesthetics 2019-08-22 16:03:53 +02:00
Carlo Sciolla 95428d2e2e
Fix emacs 26 build 2019-08-22 11:31:36 +02:00
Carlo Sciolla b43249e1aa
Bumping java version for CI 2019-08-21 17:20:22 +02:00
Carlo Sciolla 39a109ffe6
Bump version after release 2019-08-21 16:47:52 +02:00
Carlo Sciolla b39c310e9c
Prepping for the new release 2019-08-21 16:42:54 +02:00
Carlo Sciolla f7e3af35e8
Merge branch 'develop' 2019-08-21 16:41:38 +02:00
Carlo Sciolla ae8593d662
Bump version 2019-08-21 14:34:02 +02:00
Carlo Sciolla 36e0abac58
Merge branch 'issue106' into develop 2019-08-21 14:31:52 +02:00
Carlo Sciolla beb4dfc726
Fix tests 2019-08-21 14:27:26 +02:00
Carlo Sciolla 7c1d6d3891
Merge branch 'issue107' into develop 2019-08-21 14:19:54 +02:00
Carlo Sciolla 08b783aee6
Ignore java warnings 2019-08-21 14:18:20 +02:00
Carlo Sciolla 04110d0110
Use UTC timezone when setting dates, to align with MELPA 2019-08-21 12:11:36 +02:00
Carlo Sciolla 5a6ed6c5a2
Use `car` instead of `first` 2019-08-21 11:29:20 +02:00
Carlo Sciolla 4a908c2279
Avoid zero-padding of hours to mimic MELPA 2019-08-21 11:19:37 +02:00
Carlo Sciolla a822c551b8
Better version management 2019-08-21 10:55:50 +02:00
Felix Weilbach 9cba6835fd Added run mode EXECUTABLE (#102) 2019-08-19 14:10:35 +02:00
Michael Steiner cbd7fa4c6b - give user some control to override in comments level of indentation
Signed-off-by: Michael Steiner <michael.steiner@intel.com>
2019-08-12 12:01:26 -07:00
Michael Steiner 80b554e871 - allow for white-space and comments after all begin/end indent regexps
- make end indent regexp symmetrical to being regexp allowing for selective
  change (e.g., disactivation via non-matching regexp) what is leads to
  indentation

Signed-off-by: Michael Steiner <michael.steiner@intel.com>
2019-08-12 12:01:12 -07:00
Michael Steiner c32493229d more robust matching of notes
Signed-off-by: Michael Steiner <michael.steiner@intel.com>
2019-08-12 10:17:50 -07:00
Carlo Sciolla 1e5f8beedd
Fix switching between modes (#104)
Giving a default value to `plantuml-exec-mode` local var at startup time
is wrong. This change keeps the local var to `nil` and resorts to the
customizable `plantuml-default-exec-mode`. The local var can be set by users
at will on a buffer local level, but without such an explicit opt-in then the
default value is always used
2019-08-12 17:40:00 +02:00
Carlo Sciolla d11bd57f31
Removed broken link 2019-08-12 17:14:45 +02:00
Carlo Sciolla 0ae3aed095
Avoid breaking long lines on base64 encoding
Spotted by @alexvs11 as a solution to #101
2019-08-03 16:03:25 +02:00
7 changed files with 192 additions and 43 deletions

View File

@ -3,18 +3,18 @@ version: 2.0
# Default actions to perform on each Emacs version # Default actions to perform on each Emacs version
default: &default-steps default: &default-steps
steps: steps:
- run:
name: Update APT packages
command: apt-get update
- run:
name: Install prerequisites
command: apt-get install -y openjdk-11-jre make python git
- checkout - checkout
- run: - run:
# Note: this makes it hard to reproduce builds but easier to spot incompatibilities with # Note: this makes it hard to reproduce builds but easier to spot incompatibilities with
# newer PlantUML releases. Current trade off seems acceptable. # newer PlantUML releases. Current trade off seems acceptable.
name: Download the latest PlantUML release name: Download the latest PlantUML release
command: sh ./bin/download-plantuml.sh command: sh ./bin/download-plantuml.sh
- run:
name: Update APT packages
command: apt-get update
- run:
name: Install prerequisites
command: apt-get install -y openjdk-8-jre make python git
- run: - run:
name: Install cask name: Install cask
command: curl -fsSL https://raw.githubusercontent.com/cask/cask/master/go | python command: curl -fsSL https://raw.githubusercontent.com/cask/cask/master/go | python
@ -35,7 +35,7 @@ jobs:
test-emacs-26: test-emacs-26:
docker: docker:
- image: silex/emacs:26.0 - image: silex/emacs:26
entrypoint: bash entrypoint: bash
<<: *default-steps <<: *default-steps
@ -53,4 +53,4 @@ workflows:
- test-emacs-25 - test-emacs-25
- test-emacs-26 - test-emacs-26
# Testing against master currently hangs on CircleCI # Testing against master currently hangs on CircleCI
#- test-emacs-master # - test-emacs-master

View File

@ -1,6 +1,5 @@
[![MELPA](http://melpa.org/packages/plantuml-mode-badge.svg)](http://melpa.org/#/plantuml-mode) [![MELPA Stable](http://stable.melpa.org/packages/plantuml-mode-badge.svg)](http://stable.melpa.org/#/plantuml-mode) [![CircleCI](https://circleci.com/gh/skuro/plantuml-mode.svg?style=svg)](https://circleci.com/gh/skuro/plantuml-mode) [![Coverage Status](https://coveralls.io/repos/github/skuro/plantuml-mode/badge.svg?branch=HEAD)](https://coveralls.io/github/skuro/plantuml-mode?branch=HEAD) [![MELPA](http://melpa.org/packages/plantuml-mode-badge.svg)](http://melpa.org/#/plantuml-mode) [![MELPA Stable](http://stable.melpa.org/packages/plantuml-mode-badge.svg)](http://stable.melpa.org/#/plantuml-mode) [![CircleCI](https://circleci.com/gh/skuro/plantuml-mode.svg?style=svg)](https://circleci.com/gh/skuro/plantuml-mode) [![Coverage Status](https://coveralls.io/repos/github/skuro/plantuml-mode/badge.svg?branch=HEAD)](https://coveralls.io/github/skuro/plantuml-mode?branch=HEAD)
# PlantUML mode for Emacs # PlantUML mode for Emacs
<img src="https://raw.githubusercontent.com/skuro/plantuml-mode/master/banner.png" <img src="https://raw.githubusercontent.com/skuro/plantuml-mode/master/banner.png"
@ -97,6 +96,7 @@ As of `v1.3.0` support is added for switching execution mode. The following two
- `jar` (default) to run PlantUML as a local JAR file. This is the traditional system used by `plantuml-mode` - `jar` (default) to run PlantUML as a local JAR file. This is the traditional system used by `plantuml-mode`
- `server` (experimental) to let an instance of [`plantuml-server`](https://github.com/plantuml/plantuml-server) render the preview - `server` (experimental) to let an instance of [`plantuml-server`](https://github.com/plantuml/plantuml-server) render the preview
- `executable` to run PlantUML as a local executable file. This is useful if your package manager provides a executable for PlantUML.
You can customize `plantuml-default-exec-mode` or run `plantuml-set-exec-mode` from a `plantuml-mode` buffer to switch modes. You can customize `plantuml-default-exec-mode` or run `plantuml-set-exec-mode` from a `plantuml-mode` buffer to switch modes.
@ -138,11 +138,20 @@ the textual mode and see if the output is valid SVG.
## Development ## Development
Development happens mostly on the `develop` branch, which is released on MELPA at every commit. The `master` branch is used to generate tags which are then released to [MELPA
stable](https://stable.melpa.org).
In order to contribute to `plantuml-mode` make sure to: In order to contribute to `plantuml-mode` make sure to:
- agree with the [GPLv3+ licencing terms](#License) as they are mandated by Emacs - agree with the [GPLv3+ licencing terms](#License) as they are mandated by Emacs
- install [`cask`](https://github.com/cask/cask) - install [`cask`](https://github.com/cask/cask)
- always test your code and run the full test suite with `cask exec ert-runner` (or just by `make`) - always test your code and run the full test suite with `cask exec ert-runner` (or just by `make`)
- ensure you always target `develop` in your pull requests
For collaborators who have merge access to the repo:
- make sure [`set-version.sh`](./blob/develop/bin/set-version.sh) is run as part of your [`pre-commit` git hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)
- always merge PRs on the command line
- when releasing a new stable version, add the proper entry in the changelog within `plantuml-mode.el` to ensure the right version is set for `plantuml-mode-version`
# Credits # Credits

33
bin/set-version.sh Executable file
View File

@ -0,0 +1,33 @@
#!/bin/bash
# Retrieves the version from the changelog in plantuml-mode.el
function grab_version(){
grep ';; version' plantuml-mode.el | \
head -n1 | \
cut -f3 -d' ' | \
tr -d ','
}
# Updates the version in-place
function update_version(){
NEW_VERSION="${1}"
sed -i -E "s/plantuml-mode-version \"[0-9\.]+\"/plantuml-mode-version \"${1}\"/" plantuml-mode.el
}
case "$(git rev-parse --abbrev-ref HEAD)" in
'master')
VERSION="$(grab_version)"
update_version "${VERSION}"
git add plantuml-mode.el
;;
'develop')
VERSION="$(TZ='UTC' date '+%Y%m%d.%-H%M')" # MELPA style
update_version "${VERSION}"
git add plantuml-mode.el
;;
*)
## do nothing
;;
esac

View File

@ -37,6 +37,8 @@
;;; Change log: ;;; Change log:
;; ;;
;; version 1.4.1, 2019-09-03 Better indentation; more bugfixing; actually adding `executable' mode
;; version 1.4.0, 2019-08-21 Added `executable' exec mode to use locally installed `plantuml' binaries, various bugfixes
;; version 1.3.1, 2019-08-02 Fixed interactive behavior of `plantuml-set-exec-mode' ;; version 1.3.1, 2019-08-02 Fixed interactive behavior of `plantuml-set-exec-mode'
;; version 1.3.0, 2019-05-31 Added experimental support for multiple rendering modes and, specifically, preview using a PlantUML server ;; version 1.3.0, 2019-05-31 Added experimental support for multiple rendering modes and, specifically, preview using a PlantUML server
;; version 1.2.11, 2019-04-09 Added `plantuml-download-jar' ;; version 1.2.11, 2019-04-09 Added `plantuml-download-jar'
@ -84,9 +86,15 @@
:type 'string :type 'string
:group 'plantuml) :group 'plantuml)
(defcustom plantuml-executable-path
"plantuml"
"The location of the PlantUML executable."
:type 'string
:group 'plantuml)
(defvar plantuml-mode-hook nil "Standard hook for plantuml-mode.") (defvar plantuml-mode-hook nil "Standard hook for plantuml-mode.")
(defconst plantuml-mode-version "1.3.1" "The plantuml-mode version string.") (defconst plantuml-mode-version "1.4.1" "The plantuml-mode version string.")
(defvar plantuml-mode-debug-enabled nil) (defvar plantuml-mode-debug-enabled nil)
@ -103,7 +111,7 @@
:type 'string :type 'string
:group 'plantuml) :group 'plantuml)
(defcustom plantuml-java-args (list "-Djava.awt.headless=true" "-jar") (defcustom plantuml-java-args (list "-Djava.awt.headless=true" "-jar" "--illegal-access=deny")
"The parameters passed to `plantuml-java-command' when executing PlantUML." "The parameters passed to `plantuml-java-command' when executing PlantUML."
:type '(repeat string) :type '(repeat string)
:group 'plantuml) :group 'plantuml)
@ -118,12 +126,17 @@
:type 'string :type 'string
:group 'plantuml) :group 'plantuml)
(defcustom plantuml-executable-args (list "-headless")
"The parameters passed to plantuml executable when executing PlantUML."
:type '(repeat string)
:group 'plantuml)
(defcustom plantuml-default-exec-mode 'server (defcustom plantuml-default-exec-mode 'server
"Default execution mode for PlantUML. Valid values are: "Default execution mode for PlantUML. Valid values are:
- `jar': run PlantUML as a JAR file (requires a local install of the PlantUML JAR file, see `plantuml-jar-path'" - `jar': run PlantUML as a JAR file (requires a local install of the PlantUML JAR file, see `plantuml-jar-path'"
:type 'symbol :type 'symbol
:group 'plantuml :group 'plantuml
:options '(jar server)) :options '(jar server executable))
(defcustom plantuml-suppress-deprecation-warning t (defcustom plantuml-suppress-deprecation-warning t
"To silence the deprecation warning when `puml-mode' is found upon loading." "To silence the deprecation warning when `puml-mode' is found upon loading."
@ -159,13 +172,13 @@
(defvar plantuml-kwdList nil "The plantuml keywords.") (defvar plantuml-kwdList nil "The plantuml keywords.")
;; PlantUML execution mode ;; PlantUML execution mode
(defvar-local plantuml-exec-mode plantuml-default-exec-mode (defvar-local plantuml-exec-mode nil
"The Plantuml execution mode. See `plantuml-default-exec-mode' for acceptable values.") "The Plantuml execution mode override. See `plantuml-default-exec-mode' for acceptable values.")
(defun plantuml-set-exec-mode (mode) (defun plantuml-set-exec-mode (mode)
"Set the execution mode MODE for PlantUML." "Set the execution mode MODE for PlantUML."
(interactive (let* ((completion-ignore-case t) (interactive (let* ((completion-ignore-case t)
(supported-modes '("jar" "server"))) (supported-modes '("jar" "server" "executable")))
(list (completing-read (format "Exec mode [%s]: " plantuml-exec-mode) (list (completing-read (format "Exec mode [%s]: " plantuml-exec-mode)
supported-modes supported-modes
nil nil
@ -173,10 +186,15 @@
nil nil
nil nil
plantuml-exec-mode)))) plantuml-exec-mode))))
(if (member mode '("jar" "server")) (if (member mode '("jar" "server" "executable"))
(setq plantuml-exec-mode (intern mode)) (setq plantuml-exec-mode (intern mode))
(error (concat "Unsupported mode:" mode)))) (error (concat "Unsupported mode:" mode))))
(defun plantuml-get-exec-mode ()
"Retrieves the currently active PlantUML exec mode."
(or plantuml-exec-mode
plantuml-default-exec-mode))
(defun plantuml-enable-debug () (defun plantuml-enable-debug ()
"Enables debug messages into the *PLANTUML Messages* buffer." "Enables debug messages into the *PLANTUML Messages* buffer."
(interactive) (interactive)
@ -214,9 +232,9 @@
(strs (xml-get-children doc 'str)) (strs (xml-get-children doc 'str))
(version (->> strs (version (->> strs
(--filter (string-equal "v" (xml-get-attribute it 'name))) (--filter (string-equal "v" (xml-get-attribute it 'name)))
(first) (car)
(xml-node-children) (xml-node-children)
(first)))) (car))))
(message (concat "Downloading PlantUML v" version " into " plantuml-jar-path)) (message (concat "Downloading PlantUML v" version " into " plantuml-jar-path))
(url-copy-file (format "https://search.maven.org/remotecontent?filepath=net/sourceforge/plantuml/plantuml/%s/plantuml-%s.jar" version version) plantuml-jar-path t) (url-copy-file (format "https://search.maven.org/remotecontent?filepath=net/sourceforge/plantuml/plantuml/%s/plantuml-%s.jar" version version) plantuml-jar-path t)
(kill-buffer))) (kill-buffer)))
@ -239,11 +257,19 @@
(with-current-buffer buf (with-current-buffer buf
(url-insert-file-contents lang-url)))) (url-insert-file-contents lang-url))))
(defun plantuml-executable-get-language (buf)
"Retrieve the language specification from the PlantUML executable and paste it into BUF."
(with-current-buffer buf
(let ((cmd-args (append (list plantuml-executable-path nil t nil) (list "-language"))))
(apply 'call-process cmd-args)
(goto-char (point-min)))))
(defun plantuml-get-language (mode buf) (defun plantuml-get-language (mode buf)
"Retrieve the language spec using the preferred PlantUML execution mode MODE. Paste the result into BUF." "Retrieve the language spec using the preferred PlantUML execution mode MODE. Paste the result into BUF."
(let ((get-fn (pcase mode (let ((get-fn (pcase mode
('jar #'plantuml-jar-get-language) ('jar #'plantuml-jar-get-language)
('server #'plantuml-server-get-language)))) ('server #'plantuml-server-get-language)
('executable #'plantuml-executable-get-language))))
(if get-fn (if get-fn
(funcall get-fn buf) (funcall get-fn buf)
(error "Unsupported execution mode %s" mode)))) (error "Unsupported execution mode %s" mode))))
@ -340,6 +366,14 @@ Note that output type `txt' is promoted to `utxt' for better rendering."
,@plantuml-jar-args ,@plantuml-jar-args
"-p"))) "-p")))
(defun plantuml-executable-start-process (buf)
"Run PlantUML as an Emacs process and puts the output into the given buffer (as BUF)."
(apply #'start-process
"PLANTUML" buf plantuml-executable-path
`(,@plantuml-executable-args
,(plantuml-jar-output-type-opt plantuml-output-type)
"-p")))
(defun plantuml-update-preview-buffer (prefix buf) (defun plantuml-update-preview-buffer (prefix buf)
"Show the preview in the preview buffer BUF. "Show the preview in the preview buffer BUF.
Window is selected according to PREFIX: Window is selected according to PREFIX:
@ -373,13 +407,20 @@ Put the result into buffer BUF. Window is selected according to PREFIX:
(error "PLANTUML Preview failed: %s" event)) (error "PLANTUML Preview failed: %s" event))
(plantuml-update-preview-buffer prefix buf))))) (plantuml-update-preview-buffer prefix buf)))))
(defun plantuml-server-encode-url (string)
"Encode the string STRING into a URL suitable for PlantUML server interactions."
(let* ((coding-system (or buffer-file-coding-system
"utf8"))
(encoded-string (base64-encode-string (encode-coding-string string coding-system) t)))
(concat plantuml-server-url "/" plantuml-output-type "/-base64-" encoded-string)))
(defun plantuml-server-preview-string (prefix string buf) (defun plantuml-server-preview-string (prefix string buf)
"Preview the diagram from STRING as rendered by the PlantUML server. "Preview the diagram from STRING as rendered by the PlantUML server.
Put the result into buffer BUF and place it according to PREFIX: Put the result into buffer BUF and place it according to PREFIX:
- 4 (when prefixing the command with C-u) -> new window - 4 (when prefixing the command with C-u) -> new window
- 16 (when prefixing the command with C-u C-u) -> new frame. - 16 (when prefixing the command with C-u C-u) -> new frame.
- else -> new buffer" - else -> new buffer"
(let* ((url-request-location (concat plantuml-server-url "/" plantuml-output-type "/-base64-" (base64-encode-string string)))) (let* ((url-request-location (plantuml-server-encode-url string)))
(save-current-buffer (save-current-buffer
(save-match-data (save-match-data
(url-retrieve url-request-location (url-retrieve url-request-location
@ -393,6 +434,22 @@ Put the result into buffer BUF and place it according to PREFIX:
(copy-to-buffer buf (point-min) (point-max)) (copy-to-buffer buf (point-min) (point-max))
(plantuml-update-preview-buffer prefix buf))))))) (plantuml-update-preview-buffer prefix buf)))))))
(defun plantuml-executable-preview-string (prefix string buf)
"Preview the diagram from STRING by running the PlantUML JAR.
Put the result into buffer BUF. Window is selected according to PREFIX:
- 4 (when prefixing the command with C-u) -> new window
- 16 (when prefixing the command with C-u C-u) -> new frame.
- else -> new buffer"
(let* ((process-connection-type nil)
(ps (plantuml-executable-start-process buf)))
(process-send-string ps string)
(process-send-eof ps)
(set-process-sentinel ps
(lambda (_ps event)
(unless (equal event "finished\n")
(error "PLANTUML Preview failed: %s" event))
(plantuml-update-preview-buffer prefix buf)))))
(defun plantuml-exec-mode-preview-string (prefix mode string buf) (defun plantuml-exec-mode-preview-string (prefix mode string buf)
"Preview the diagram from STRING using the execution mode MODE. "Preview the diagram from STRING using the execution mode MODE.
Put the result into buffer BUF, selecting the window according to PREFIX: Put the result into buffer BUF, selecting the window according to PREFIX:
@ -401,7 +458,8 @@ Put the result into buffer BUF, selecting the window according to PREFIX:
- else -> new buffer" - else -> new buffer"
(let ((preview-fn (pcase mode (let ((preview-fn (pcase mode
('jar #'plantuml-jar-preview-string) ('jar #'plantuml-jar-preview-string)
('server #'plantuml-server-preview-string)))) ('server #'plantuml-server-preview-string)
('executable #'plantuml-executable-preview-string))))
(if preview-fn (if preview-fn
(funcall preview-fn prefix string buf) (funcall preview-fn prefix string buf)
(error "Unsupported execution mode %s" mode)))) (error "Unsupported execution mode %s" mode))))
@ -418,7 +476,7 @@ to choose where to display it."
(buf (get-buffer-create plantuml-preview-buffer)) (buf (get-buffer-create plantuml-preview-buffer))
(coding-system-for-read (and imagep 'binary)) (coding-system-for-read (and imagep 'binary))
(coding-system-for-write (and imagep 'binary))) (coding-system-for-write (and imagep 'binary)))
(plantuml-exec-mode-preview-string prefix plantuml-exec-mode string buf))) (plantuml-exec-mode-preview-string prefix (plantuml-get-exec-mode) string buf)))
(defun plantuml-preview-buffer (prefix) (defun plantuml-preview-buffer (prefix)
"Preview diagram from the PlantUML sources in the current buffer. "Preview diagram from the PlantUML sources in the current buffer.
@ -467,8 +525,8 @@ Uses prefix (as PREFIX) to choose where to display it:
(plantuml-preview-buffer prefix))) (plantuml-preview-buffer prefix)))
(defun plantuml-init-once (&optional mode) (defun plantuml-init-once (&optional mode)
"Ensure initialization only happens once. Use exec mode MODE to load the language details, which defaults to `plantuml-exec-mode'." "Ensure initialization only happens once. Use exec mode MODE to load the language details or by first querying `plantuml-get-exec-mode'."
(let ((mode (or mode plantuml-exec-mode))) (let ((mode (or mode (plantuml-get-exec-mode))))
(unless plantuml-kwdList (unless plantuml-kwdList
(plantuml-init mode) (plantuml-init mode)
(defvar plantuml-types-regexp (concat "^\\s *\\(" (regexp-opt plantuml-types 'words) "\\|\\<\\(note\\s +over\\|note\\s +\\(left\\|right\\|bottom\\|top\\)\\s +\\(of\\)?\\)\\>\\|\\<\\(\\(left\\|center\\|right\\)\\s +\\(header\\|footer\\)\\)\\>\\)")) (defvar plantuml-types-regexp (concat "^\\s *\\(" (regexp-opt plantuml-types 'words) "\\|\\<\\(note\\s +over\\|note\\s +\\(left\\|right\\|bottom\\|top\\)\\s +\\(of\\)?\\)\\>\\|\\<\\(\\(left\\|center\\|right\\)\\s +\\(header\\|footer\\)\\)\\>\\)"))
@ -476,25 +534,45 @@ Uses prefix (as PREFIX) to choose where to display it:
(defvar plantuml-builtins-regexp (regexp-opt plantuml-builtins 'words)) (defvar plantuml-builtins-regexp (regexp-opt plantuml-builtins 'words))
(defvar plantuml-preprocessors-regexp (concat "^\\s *" (regexp-opt plantuml-preprocessors 'words))) (defvar plantuml-preprocessors-regexp (concat "^\\s *" (regexp-opt plantuml-preprocessors 'words)))
;; Below are the regexp's for indentation.
;; Notes:
;; - there is some control on what it is indented by overriding some of below
;; X-start and X-end regexp before plantuml-mode is loaded. E.g., to disable
;; indentation on activate, you might define in your .emacs something like
;; (setq plantuml-indent-regexp-activate-start
;; "NEVER MATCH THIS EXPRESSION"); define _before_ load plantuml-mode!
;; (setq plantuml-indent-regexp-activate-end
;; "NEVER MATCH THIS EXPRESSION"); define _before_ load plantuml-mode!
;; - due to the nature of using (context-insensitive) regexp, indentation have
;; following limitations
;; - commands commented out by /' ... '/ will _not_ be ignored
;; and potentially lead to miss-indentation
;; - you can though somewhat correct mis-indentation by adding in '-comment lines
;; PLANTUML_MODE_INDENT_INCREASE and/or PLANTUML_MODE_INDENT_DECREASE
;; to increase and/or decrease the level of indentation
;; (Note: the line with the comment should not contain any text matching other indent
;; regexp or this user-control instruction will be ignored; also at most will count
;; per line ...)
(defvar plantuml-indent-regexp-block-start "^.*{\s*$" (defvar plantuml-indent-regexp-block-start "^.*{\s*$"
"Indentation regex for all plantuml elements that might define a {} block. "Indentation regex for all plantuml elements that might define a {} block.
Plantuml elements like skinparam, rectangle, sprite, package, etc. Plantuml elements like skinparam, rectangle, sprite, package, etc.
The opening { has to be the last visible character in the line (whitespace The opening { has to be the last visible character in the line (whitespace
might follow).") might follow).")
(defvar plantuml-indent-regexp-note-start "^\s*\\(floating\s+\\)?[hr]?note[^:]*?$" "simplyfied regex; note syntax is especially inconsistent across diagrams") (defvar plantuml-indent-regexp-note-start "^\s*\\(floating\s+\\)?[hr]?note\s+\\(right\\|left\\|top\\|bottom\\|over\\)[^:]*?$" "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+.+\\|$\\)" (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. "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 Two variants for groups: keyword is either followed by whitespace and some text
or it is followed by line end.") or it is followed by line end.")
(defvar plantuml-indent-regexp-activate-start "^\s*activate\s+.+$") (defvar plantuml-indent-regexp-activate-start "^\s*activate\s+.+$")
(defvar plantuml-indent-regexp-box-start "^\s*box\s+.+$") (defvar plantuml-indent-regexp-box-start "^\s*box\s+.+$")
(defvar plantuml-indent-regexp-ref-start "^ref\s+over\s+[^:]+?$") (defvar plantuml-indent-regexp-ref-start "^\s*ref\s+over\s+[^:]+?$")
(defvar plantuml-indent-regexp-title-start "^\s*title$") (defvar plantuml-indent-regexp-title-start "^\s*title\s*\\('.*\\)?$")
(defvar plantuml-indent-regexp-header-start "^\s*\\(?:\\(?:center\\|left\\|right\\)\s+header\\|header\\)$") (defvar plantuml-indent-regexp-header-start "^\s*\\(?:\\(?:center\\|left\\|right\\)\s+header\\|header\\)\s*\\('.*\\)?$")
(defvar plantuml-indent-regexp-footer-start "^\s*\\(?:\\(?:center\\|left\\|right\\)\s+footer\\|footer\\)$") (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\\)\\)$") (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$" "used in current activity diagram, sometimes already mentioned as deprecated") (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-macro-start "^\s*!definelong.*$") (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 (defvar plantuml-indent-regexp-start (list plantuml-indent-regexp-block-start
plantuml-indent-regexp-group-start plantuml-indent-regexp-group-start
plantuml-indent-regexp-activate-start plantuml-indent-regexp-activate-start
@ -507,8 +585,35 @@ or it is followed by line end.")
plantuml-indent-regexp-header-start plantuml-indent-regexp-header-start
plantuml-indent-regexp-footer-start plantuml-indent-regexp-footer-start
plantuml-indent-regexp-macro-start plantuml-indent-regexp-macro-start
plantuml-indent-regexp-oldif-start)) plantuml-indent-regexp-oldif-start
(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\\|!enddefinelong\\)$") plantuml-indent-regexp-user-control-start))
(defvar plantuml-indent-regexp-block-end "^\s*\\(?:}\\|endif\\|else\s*.*\\|end\\)\s*\\('.*\\)?$")
(defvar plantuml-indent-regexp-note-end "^\s*\\(end\s+note\\|end[rh]note\\)\s*\\('.*\\)?$")
(defvar plantuml-indent-regexp-group-end "^\s*end\s*\\('.*\\)?$")
(defvar plantuml-indent-regexp-activate-end "^\s*deactivate\s+.+$")
(defvar plantuml-indent-regexp-box-end "^\s*end\s+box\s*\\('.*\\)?$")
(defvar plantuml-indent-regexp-ref-end "^\s*end\s+ref\s*\\('.*\\)?$")
(defvar plantuml-indent-regexp-title-end "^\s*end\s+title\s*\\('.*\\)?$")
(defvar plantuml-indent-regexp-header-end "^\s*endheader\s*\\('.*\\)?$")
(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-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
plantuml-indent-regexp-group-end
plantuml-indent-regexp-activate-end
plantuml-indent-regexp-box-end
plantuml-indent-regexp-ref-end
plantuml-indent-regexp-legend-end
plantuml-indent-regexp-note-end
plantuml-indent-regexp-oldif-end
plantuml-indent-regexp-title-end
plantuml-indent-regexp-header-end
plantuml-indent-regexp-footer-end
plantuml-indent-regexp-macro-end
plantuml-indent-regexp-oldif-end
plantuml-indent-regexp-user-control-end))
(setq plantuml-font-lock-keywords (setq plantuml-font-lock-keywords
`( `(
(,plantuml-types-regexp . font-lock-type-face) (,plantuml-types-regexp . font-lock-type-face)
@ -568,13 +673,13 @@ or it is followed by line end.")
(let ((relative-depth 0)) (let ((relative-depth 0))
;; current line ;; current line
(beginning-of-line) (beginning-of-line)
(if (looking-at plantuml-indent-regexp-end) (if (-any? 'looking-at plantuml-indent-regexp-end)
(setq relative-depth (1- relative-depth))) (setq relative-depth (1- relative-depth)))
;; from current line backwards to beginning of buffer ;; from current line backwards to beginning of buffer
(while (not (bobp)) (while (not (bobp))
(forward-line -1) (forward-line -1)
(if (looking-at plantuml-indent-regexp-end) (if (-any? 'looking-at plantuml-indent-regexp-end)
(setq relative-depth (1- relative-depth))) (setq relative-depth (1- relative-depth)))
(if (-any? 'looking-at plantuml-indent-regexp-start) (if (-any? 'looking-at plantuml-indent-regexp-start)
(setq relative-depth (1+ relative-depth)))) (setq relative-depth (1+ relative-depth))))
@ -621,8 +726,8 @@ Shortcuts Command Name
(if (and plantuml-suppress-deprecation-warning (if (and plantuml-suppress-deprecation-warning
(featurep 'puml-mode)) (featurep 'puml-mode))
(display-warning :warning (display-warning :warning
"`puml-mode' is now deprecated and no longer updated, but it's still present in your system.\ "`puml-mode' is now deprecated and no longer updated, but it's still present in your system. \
You should move your configuration to use `plantuml-mode'. See https://github.com/sytac/plantuml-mode. \ You should move your configuration to use `plantuml-mode'. \
See more at https://github.com/skuro/puml-mode/issues/26"))) See more at https://github.com/skuro/puml-mode/issues/26")))
(add-hook 'plantuml-mode-hook 'plantuml-deprecation-warning) (add-hook 'plantuml-mode-hook 'plantuml-deprecation-warning)

View File

@ -20,6 +20,8 @@
(should (equal 'server plantuml-exec-mode)) (should (equal 'server plantuml-exec-mode))
(plantuml-set-exec-mode "jar") (plantuml-set-exec-mode "jar")
(should (equal 'jar plantuml-exec-mode)) (should (equal 'jar plantuml-exec-mode))
(plantuml-set-exec-mode "executable")
(should (equal 'executable plantuml-exec-mode))
(setq plantuml-exec-mode orig-mode))) (setq plantuml-exec-mode orig-mode)))

View File

@ -16,16 +16,16 @@
"Test correct indentation of a simple note block." "Test correct indentation of a simple note block."
(plantuml-test-indent-block (plantuml-test-indent-block
" "
note: single line note note right: single line note
note note right
multi line note multi line note
end note end note
" "
" "
note: single line note note right: single line note
note note right
multi line note multi line note
end note end note
" "

View File

@ -10,13 +10,13 @@
(ert-deftest custom-jar-location () (ert-deftest custom-jar-location ()
(setq-local plantuml-jar-path "~/.plantuml/plantuml.jar") (setq-local plantuml-jar-path "~/.plantuml/plantuml.jar")
(should (equal `("-Djava.awt.headless=true" "-jar" (should (equal `("-Djava.awt.headless=true" "-jar" "--illegal-access=deny"
,(expand-file-name "~/.plantuml/plantuml.jar") ,(expand-file-name "~/.plantuml/plantuml.jar")
"-charset" "UTF-8") "-charset" "UTF-8")
(plantuml-jar-render-command))) (plantuml-jar-render-command)))
(setq-local plantuml-jar-path "/path/with spaces/plantuml.jar") (setq-local plantuml-jar-path "/path/with spaces/plantuml.jar")
(should (equal `("-Djava.awt.headless=true" "-jar" "/path/with spaces/plantuml.jar" "-charset" "UTF-8") (should (equal `("-Djava.awt.headless=true" "-jar" "--illegal-access=deny" "/path/with spaces/plantuml.jar" "-charset" "UTF-8")
(plantuml-jar-render-command)))) (plantuml-jar-render-command))))
(provide 'plantuml-mode-custom-jar-location-test) (provide 'plantuml-mode-custom-jar-location-test)