A small tool to various files to .svg files or download image files, and insert it to orgmode or markdown on-the-fly.
插 chā 图 tú: insert a diagram.
Before using chatu
, you may need to install some external programs and
set them in your PATH:
- draw.io and pdf2svg for drawio file conversion
- plantuml.jar, java for plantuml
- babashka for .bb script
- curl for downloading file from web
From melpa with use-package:
(use-package chatu
:hook ((org-mode markdown-mode) . chatu-mode)
:commands (chatu-add
chatu-open)
:custom ((chatu-input-dir "./draws")
(chatu-output-dir "./draws_out")))
Or git submodule and use-package
(use-package chatu
:load-path "~/.emacs.d/site-lisp/chatu"
:hook ((org-mode markdown-mode) . chatu-mode)
:commands (chatu-add
chatu-open)
:custom ((chatu-input-dir "./draws")
(chatu-output-dir "./draws_out")))
You may need to add draw.io to your PATH. If you installed draw.io
with homebrew, draw.io
executable is located in following path:
export PATH=/opt/homebrew/Caskroom/drawio/24.2.5/draw.io.app/Contents/MacOS:$PATH
Add chatu
line with chatu-new
command:
#+chatu: :drawio "diagram.drawio" :page 0 :input-dir "./draws" :output-dir "./draws_out" :output "diagram.svg" :crop :nopdf
<!-- #+chatu: :drawio "diagram.drawio" :page 0 :input-dir "./draws" :output-dir "./draws_out" :output "diagram.svg" :crop :nopdf -->
Options/Settings:
:drawio
specifies the backend, they can be:planuml
,:babashka
,:curl
or others added in the future by you.- file name after backend keyword is the input file name.
:page
species which page you want to import to buffer.:input-dir
and:output-dir
are the folders for input or output file.:output
is the output file name.:crop
if you want to crop the empty white in page.:nopdf
if you do not want intermediate pdf file for drawio backend.
Move cursor to chatu
line,
C-c C-c
will invokechatu-add
to add image in orgmode.C-c C-c C-c
will invokechatu-add
to add image in markdown-mode.C-c C-o
will invokechatu-open
to open original .drawio or .puml file.
chatu
line means different in orgmode and markdown:
#+chatu: :drawio
or#+chatu: :plantuml
in orgmode<-- #+chatu: :drawio -->
or<-- #+chatu: :plantuml -->
in markdown
Remind!
- the input files should be the first parameter, for example, .drawio or .puml file.
- in order to support whitespace in file and dir name, please "quote all of them".
You can easily extend this package by adding new chatu-<tool>.el
. For
example, when <tool> = drawio
, you need to define chatu-drawio-open
and chatu-drawio-script
in chatu-drawio.el
.
chatu-drawio-open
is invoked to open the drawio input file at the line.chatu-drawio-script
is used to generate the shell script for conversion.
Both method use a keyword-plist
parameter, which contains the
chatu
settings from chatu
line.
#+chatu: :drawio "diagram.drawio" :page 0 :input-dir "./draws" :output-dir "./draws_out" :output "diagram.svg" :crop :nopdf :output-ext svg
For example, we can get following keyword-plist
from above chatu
line:
(:chatu t :type "drawio"
:input "diagram.drawio" :output "diagram.svg" :page "0"
:input-dir "./draws" :output-dir "./draws_out"
:input-path "./draws/diagram.drawio"
:output-path "./draws_out/diagram.svg"
:output-ext "svg"
:crop t
:nopdf t)
See example chatu.org in orgmode and chatu.md in markdown-mode.
org-mode:
#+chatu: :drawio "diagram.drawio"
#+chatu: :plantuml "diagram.puml"
#+chatu: :curl "http://example.org/image.svg"
#+chatu: :babashka "babashka.bb"
markdown-mode:
<!-- #+chatu: :drawio "diagram.drawio" -->
<!-- #+chatu: :plantuml "diagram.puml" -->
<!-- #+chatu: :curl "http://example.org/image.svg" -->
<!-- #+chatu: :babashka "babashka.bb" -->
org-mode:
#+chatu: :drawio "diagram"
#+chatu: :plantuml "diagram"
markdown-mode:
<!-- #+chatu: :drawio "diagram" -->
<!-- #+chatu: :plantuml "diagram" -->
org-mode:
#+chatu: :drawio "diagram"
#+name: workflow
#+caption: chatu workflow
org-mode:
#+chatu: :drawio "diagram.drawio" :page 1
#+chatu: :plantuml "diagram.puml" :page 1
markdown-mode:
<!-- #+chatu: :drawio "diagram.drawio" :page 1 -->
<!-- #+chatu: :plantuml "diagram.puml" :page 1 -->
Add input-dir, output-dir and output file name
org-mode:
#+chatu: :drawio "diagram.drawio" :page 0 :input-dir "./draws" :output-dir "./draws_out" :output "diagram.svg"
markdown-mode:
<!-- #+chatu: :drawio "diagram.drawio" :page 0 :input-dir "./draws" :output-dir "./draws_out" :output "diagram.svg" -->