Files
emacs/lisp/org-roam-bibtex/orb-section.el
Daniel Weschke 82f05baffe pkg update and first config fix
org-brain not working, add org-roam
2022-12-19 23:02:34 +01:00

174 lines
6.8 KiB
EmacsLisp
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;; orb-section.el --- Org Roam BibTeX: Sections for org-roam-mode -*- lexical-binding: t -*-
;; Copyright © 2022 Samuel W. Flint
;; Author: Samuel W. Flint <swflint@flintfam.org>
;; URL: https://github.com/org-roam/org-roam-bibtex
;; This file is NOT part of GNU Emacs.
;; This program 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, or (at your option)
;; any later version.
;;
;; This program 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
;; this program; see the file LICENSE. If not, visit
;; <https://www.gnu.org/licenses/>.
;;; Commentary:
;;
;; This file provides org-roam-bibtex' dependencies and thus should
;; normally be required by org-roam-bibtex feature libraries. It
;; defines customize groups and provides general utility functions
;; that depend on extra features provided through org-roam,
;; bibtex-completion and their dependencies.
;;; Code:
;; ============================================================================
;;; Dependencies
;; ============================================================================
(require 'org-roam-node)
(require 'org-roam-utils)
(require 's)
(require 'magit-section)
(require 'bibtex-completion)
(require 'orb-utils)
(defvar orb-abbreviate-file-name)
;; ============================================================================
;;; Configuration Variables
;; ============================================================================
(defgroup orb-section nil
"Org-roam buffer sections for BibTeX."
:group 'org-roam-bibtex
:prefix "orb-section-")
(defcustom orb-section-reference-format-method
'bibtex-completion-apa-format-reference
"How to format the ORB citation.
Either a function taking a bibtex key and returning a string, or
an alist from type to format string. For formatting information,
see `bibtex-completion-display-formats'."
:type '(choice (const :tag "Use BibTeX-Completion APA Format"
'bibtex-completion-apa-format-reference)
(symbol :tag "Use a function")
(alist :key-type (choice (string :tag "Type Name :")
(const :tag "Default" t))
:value-type (string :tag "Format String:"))))
(defcustom orb-section-abstract-format-method :org-format
"How to format ORB abstract.
A function taking a key and returning a string, or one of:
- `:org-format' Assume that the content is org-formatted, and
format accordingly.
- `:pandoc-from-tex' Assume that the content is tex/latex
formatted and use `pandoc' to format accordingly."
:type '(choice (const :tag "Format as Org Text" :org-format)
(const :tag "Format from LaTeX" :pandoc-from-tex)
(symbol :tag "Use function.")))
;; ============================================================================
;;; Utility functions
;; ============================================================================
(defun orb-section-reference-format (key)
"Format reference for KEY according to `orb-section-reference-format-method'."
(if (functionp orb-section-reference-format-method)
(funcall orb-section-reference-format-method key)
(when-let ((entry (bibtex-completion-get-entry key))
(format-string (cdr (or (assoc-string (bibtex-completion-get-value "=type=" entry) orb-section-reference-format-method)
(assoc t orb-section-reference-format-method))))
(formatted-reference (s-format format-string 'bibtex-completion-apa-get-value entry)))
(replace-regexp-in-string "\\([.?!]\\)\\." "\\1" formatted-reference))))
(defun orb-section-unfill-region (beg end)
"Unfill the region from BEG to END.
Joining text paragraphs into a single logical line.
Taken from https://www.emacswiki.org/emacs/UnfillRegion"
(interactive "*r")
(let ((fill-column (point-max)))
(fill-region beg end)))
(defun orb-section-abstract-format (key)
"Format abstract for KEY per `orb-section-abstract-format-method'."
(if (functionp orb-section-abstract-format-method)
(funcall orb-section-abstract-format-method key)
(when-let ((entry (bibtex-completion-get-entry key))
(abstract (bibtex-completion-get-value "abstract" entry)))
(pcase orb-section-abstract-format-method
(:org-format
(org-roam-fontify-like-in-org-mode
(with-temp-buffer
(insert abstract)
(org-mode)
(orb-section-unfill-region (point-min) (point-max))
(save-match-data "\n\n" "\n" (string-trim (buffer-string))))))
(:pandoc-from-tex
(org-roam-fontify-like-in-org-mode
(with-temp-buffer
(insert abstract)
(shell-command-on-region (point-min) (point-max)
"pandoc -f latex -t org" (current-buffer) t)
(org-mode)
(orb-section-unfill-region (point-min) (point-max))
(save-match-data "\n\n" "\n" (string-trim (buffer-string))))))))))
;; ============================================================================
;;; Section Implementation
;; ============================================================================
;;;###autoload
(defun orb-section-reference (node)
"Show BibTeX reference for NODE if it exists."
(when-let ((cite-key (orb-get-node-citekey node))
(formatted-reference (orb-section-reference-format cite-key)))
(magit-insert-section (orb-section-reference)
(magit-insert-heading "Reference:")
(insert formatted-reference)
(insert "\n\n"))))
;;;###autoload
(defun orb-section-abstract (node)
"Show BibTeX entry abstract for NODE if it exists."
(when-let ((cite-key (orb-get-node-citekey node))
(formatted-abstract (orb-section-abstract-format cite-key)))
(magit-insert-section (orb-section-abstract)
(magit-insert-heading "Abstract:")
(insert formatted-abstract)
(insert "\n\n"))))
;;;###autoload
(defun orb-section-file (node)
"Show a link to entry file for NODE if it exists."
(when-let ((cite-key (orb-get-node-citekey node))
(file-name (let ((orb-abbreviate-file-name nil))
(orb-get-attached-file cite-key))))
(magit-insert-section (orb-section-file)
(magit-insert-heading "File:")
(insert-text-button (file-name-nondirectory file-name)
'action (lambda (_button) (orb-open-attached-file cite-key)))
(insert "\n\n"))))
(provide 'orb-section)
;;; orb-section.el ends here
;;
;; Local Variables:
;; coding: utf-8
;; fill-column: 79
;; End: