Initial commit

This commit is contained in:
TEC 2022-09-25 13:02:44 +08:00
commit 8bf6048b29
Signed by: tec
SSH Key Fingerprint: SHA256:eobz41Mnm0/iYWBvWThftS0ElEs1ftBr6jamutnXc/A
1 changed files with 114 additions and 0 deletions

114
ob-svgbob.el Normal file
View File

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