From 8bf6048b29c213640a546eba783683d7e75b7b47 Mon Sep 17 00:00:00 2001 From: TEC Date: Sun, 25 Sep 2022 13:02:44 +0800 Subject: [PATCH] Initial commit --- ob-svgbob.el | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 ob-svgbob.el diff --git a/ob-svgbob.el b/ob-svgbob.el new file mode 100644 index 0000000..f88a433 --- /dev/null +++ b/ob-svgbob.el @@ -0,0 +1,114 @@ +;;; ob-svgbob.el --- Babel Functions for SVGBob -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 Free Software Foundation, Inc. + +;; Authors: Steven vanZyl +;; TEC +;; Maintainer: Timothy +;; 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 . + +;;; 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