From c986de298d9ae631c5c70bc66aa4c327f38e6c88 Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Thu, 31 Dec 2020 13:20:36 +0530 Subject: Provide ksh-forms feature. * ksh-forms.el: Provide ksh-forms. * ksh-discharge.el, ksh-scan2.el, ksh-scan3.el: Require ksh-forms. --- ksh-forms.el | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 ksh-forms.el (limited to 'ksh-forms.el') diff --git a/ksh-forms.el b/ksh-forms.el new file mode 100644 index 0000000..da6d047 --- /dev/null +++ b/ksh-forms.el @@ -0,0 +1,89 @@ +;; -*- lexical-binding: t -*- + +(require 'org) +(require 'subr-x) +(require 'cl-lib) + +;; General settings +(setq doc-view-continuous t) +(setq lpr-switches (list "-o sides=two-sided-long-edge" + "-o fit-to-page")) +(setq export-properties + (list :section-numbers nil + :with-toc nil)) + +;; Printing +(defun print-report () + (interactive) + (shell-command + (format "lpr -o sides=two-sided-long-edge -o fit-to-page %s" (buffer-file-name)))) +(defalias 'print-buffer 'print-report) + +;; Utilities +(defun set-values (record values) + "Set record RECORD to values in alist VALUES" + (seq-do (pcase-lambda (`(,field . ,value)) + (aset record field value)) + values)) + +;; Entry creation functions for form display +(defun form-entry (label-field) + (pcase label-field + (`(,label . ,field) + (list (format "%s\n" label) + field"\n\n")))) + +(defun new-record-filter (record) + (set-values record default-field-values) + record) +(setq forms-new-record-filter 'new-record-filter) + +;; Entry creation functions for org export +(defun ksh-forms-org-entry-function (format-string label-field) + (pcase label-field + (`(,label . ,field-no) + (let ((value (get-field field-no))) + (if value + (princ (format format-string label + (replace-regexp-in-string "\n" "\n\n" value))) + (user-error "Field \"%s\" should not be blank" label)))))) + +(defun get-field (field) + "Parse form and return field FIELD from form" + (cond ((integerp field) (nth (1- field) (forms--parse-form))) + ((stringp field) field))) + +(defun single-line-org-entry (label-field) + (ksh-forms-org-entry-function "*%s:* %s\n\n" label-field)) + +(defun multi-line-org-entry (label-field) + (ksh-forms-org-entry-function "\n* %s\n%s\n\n" label-field)) + +(defun text-if-non-blank (text) + (if (and text (not (string-blank-p text))) + (princ (format "%s\n\n" text)))) + +(defun ksh-forms-org-keyword (keyword-value) + (pcase keyword-value + (`(,keyword . ,value) + (princ (format "#+%s: %s\n" keyword value))))) + +(defun ksh-forms-org-latex-header (header) + (ksh-forms-org-keyword (cons "LATEX_HEADER" header))) + +(defun forms-print () + (interactive) + (find-file (org-to-pdf (funcall form-to-org)))) + +(setq org-latex-compiler "xelatex") + +(defun org-to-pdf (org-source) + (let ((tex-file-path (format "%s.tex" (make-temp-file "report")))) + (with-temp-buffer + (insert org-source) + (org-export-to-file 'latex tex-file-path + nil nil nil nil export-properties 'org-latex-compile)))) + +(make-variable-buffer-local 'form-to-org) + +(provide 'ksh-forms) -- cgit v1.2.3