Initial commit
This commit is contained in:
commit
8bf6048b29
|
@ -0,0 +1,114 @@
|
|||
;;; ob-svgbob.el --- Babel Functions for SVGBob -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2021 Free Software Foundation, Inc.
|
||||
|
||||
;; Authors: Steven vanZyl <rushsteve1@rushsteve1.us>
|
||||
;; TEC <tec@tecosaur.net>
|
||||
;; Maintainer: Timothy <tec@tecosaur.net>
|
||||
;; Keywords: literate programming, reproducible research
|
||||
;; Homepage: https://git.tecosaur.net/tec/ob-svgbob
|
||||
|
||||
;; This file is not part of GNU Emacs.
|
||||
|
||||
;; ob-svgbob 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.
|
||||
|
||||
;; ob-svgbob 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 ob-svgbob. 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 org-svgbob-executable "svgbob"
|
||||
"The path to the SVGBob binary.
|
||||
This can be installed from source using `cargo install svgbob_cli'"
|
||||
:group 'org-babel
|
||||
:type 'file)
|
||||
|
||||
(defcustom org-svgbob-buffer-name "*svgbob-output*"
|
||||
"The name of the buffer that SVGBob will output to."
|
||||
:group 'org-babel
|
||||
:type 'string)
|
||||
|
||||
(defcustom org-babel-svgbob-options
|
||||
'((background . "transparent"))
|
||||
"Options passed to the SVGBob executable."
|
||||
:group 'org-babel
|
||||
: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)
|
||||
"Convert STR to SVG text and return 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)
|
||||
"Convert a region to SVG text in a new buffer.
|
||||
The region is given by the range START to END."
|
||||
(interactive "r")
|
||||
(let ((str (ob-svgbob-string-to-svg (buffer-substring-no-properties start end))))
|
||||
(with-current-buffer (get-buffer-create org-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 ()
|
||||
"Convert 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)
|
||||
"Execute a block of svgbob with org-babel.
|
||||
Specifically, svgbob is called on BODY with 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
|
Loading…
Reference in New Issue