From: Steven vanZyl <rushsteve1@rushsteve1.us>
To: emacs-orgmode@gnu.org
Cc: tec@tecosaur.com
Subject: [PATCH] ob-svgbob: New babel backend for SVGBob
Date: Sun, 26 Sep 2021 11:03:32 -0400 [thread overview]
Message-ID: <CAGZeQ8J6MbyP9Ma=th=6iJc++wiwWBeUVff3g3xTbG7B89mc4Q@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 866 bytes --]
Hello everyone,
Attached is a patch adding Babel support for SVGBob [1] to Org-Mode.
SVGBob is a popular CLI tool for transforming freeform ASCII art
(like what you can make with artist-mode) into SVG vector images. Unlike dot it
does not have a text syntax and is not specifically intended for creating
graph diagrams. Examples can be seen here [1].
I consider it suitable for inclusion in Org-mode since it's a fairly small
patch which provides support for a fairly popular tool, and is in a niche
that's currently not covered by anything else, like ob-dot.
This patch was co-developed by Timothy/TEC (as reflected in the commit)
and he has volunteered to maintain it. I have also filled out the
FSF paperwork for copyright assignment.
Feedback and comments are greatly appreciated!
Thank you,
Steven vanZyl
[1]: https://ivanceras.github.io/svgbob-editor/
[-- Attachment #2: 0001-ob-svgbob-Babel-support-for-SVGBob.patch --]
[-- Type: application/octet-stream, Size: 4669 bytes --]
From 95a98c571bf365f8a83d04f61f265ca04ad851d1 Mon Sep 17 00:00:00 2001
From: Steven vanZyl <rushsteve1@rushsteve1.us>
Date: Sun, 26 Sep 2021 10:35:24 -0400
Subject: [PATCH] ob-svgbob: New babel backend for SVGBob
* lisp/ob-svgbob.el: A new babel backend for the SVGBob tool,
which can convert ASCII art approximations into much nicer
SVG drawings.
Co-authored-by: Author: TEC <tec@tecosaur.com>
---
lisp/ob-svgbob.el | 110 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 110 insertions(+)
create mode 100644 lisp/ob-svgbob.el
diff --git a/lisp/ob-svgbob.el b/lisp/ob-svgbob.el
new file mode 100644
index 000000000..75284156a
--- /dev/null
+++ b/lisp/ob-svgbob.el
@@ -0,0 +1,110 @@
+;;; ob-svgbob.el --- Babel Functions for SVGBob -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; Author: Steven vanZyl <rushsteve1@rushsteve1.us>
+;; TEC <tec@tecosaur.com>
+;; Maintainer: Timothy <tec@tecosaur.com>
+;; Keywords: literate programming, reproducible research
+;; Homepage: https://orgmode.org
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Org-Babel support for evaluating and SVGBob diagrams.
+;; https://github.com/ivanceras/svgbob
+
+;; This is very similar to ob-dot.el with a similar list of caveats:
+
+;; * There are no sessions
+;; * We are generally only going to return results of type "file graphics"
+;; * The "file" header argument is required
+;; * SVGBob has no definite syntax
+
+;; This file also includes some additional utility functions and a simple
+;; derived major-mode for SVGBob
+
+;;; Code:
+(require 'ob)
+
+(defcustom svgbob-executable "svgbob"
+ "The path to the SVGBob binary.
+This can be installed from source using `cargo install svgbob_cli'"
+ :group 'svgbob
+ :type 'file)
+
+(defcustom svgbob-buffer-name "*svgbob-output*"
+ "The name of the buffer that SVGBob will output to"
+ :group 'svgbob
+ :type 'string)
+
+(defcustom org-babel-svgbob-options
+ '((background . "transparent"))
+ "Options passed to the SVGBob executable"
+ :group 'svgbob
+ :type '(alist :value-type (symbol string)))
+
+;; So `org-edit-special' works.
+;; Since SVGBob is based on simple ASCII diagrams without a definite, this mode
+;; is derived from `artist-mode'.
+(unless (fboundp 'svgbob-mode)
+ (define-derived-mode svgbob-mode artist-mode "svgbob"))
+
+(defun ob-svgbob-string-to-svg (str)
+ "Converts a string to SVG text and returns a string of that"
+ (org-babel-eval
+ (concat svgbob-executable " "
+ (mapconcat (lambda (opt) (format "--%s %s " (symbol-name (car opt)) (cdr opt)))
+ org-babel-svgbob-options
+ " "))
+ str))
+
+(defun ob-svgbob-region-to-svg (start end)
+ "Converts a region to SVG text in a new buffer"
+ (interactive "r")
+ (let ((str (ob-svgbob-string-to-svg (buffer-substring-no-properties start end))))
+ (with-current-buffer (get-buffer-create svgbob-buffer-name)
+ (read-only-mode 0) ; Disable read-only
+ (fundamental-mode) ; Required to erase the buffer
+ (erase-buffer)
+ (insert str)
+ (image-mode)
+ (read-only-mode)
+ (display-buffer-in-side-window (current-buffer) '((side . right))))))
+
+(defun ob-svgbob-buffer-to-svg ()
+ "Converts a buffer to SVG text in a new buffer.
+See `svgbob-region-to-svg' for more"
+ (interactive)
+ (ob-svgbob-region-to-svg (point-min) (point-max)))
+
+(defvar org-babel-default-header-args:svgbob
+ '((:results . "file graphics") (:exports . "results"))
+ "Default arguments to use when evaluating a dot source block.")
+
+(defun org-babel-execute:svgbob (body params)
+ (if (alist-get :file params)
+ (ob-svgbob-string-to-svg body)
+ (user-error "You need to specify a :file parameter")))
+
+(defun org-babel-prep-session:svgbob (_session _params)
+ "Return an error because SVGBob does not support sessions."
+ (user-error "SVGBob does not support sessions"))
+
+(provide 'ob-svgbob)
+
+;;; ob-svgbob.el ends here
--
2.33.0
next reply other threads:[~2021-09-26 15:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-26 15:03 Steven vanZyl [this message]
2021-09-26 20:33 ` [PATCH] ob-svgbob: New babel backend for SVGBob Bastien
2021-09-26 20:35 ` Timothy
2021-09-26 22:56 ` Bastien
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAGZeQ8J6MbyP9Ma=th=6iJc++wiwWBeUVff3g3xTbG7B89mc4Q@mail.gmail.com' \
--to=rushsteve1@rushsteve1.us \
--cc=emacs-orgmode@gnu.org \
--cc=tec@tecosaur.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).