95 lines
3.0 KiB
EmacsLisp
95 lines
3.0 KiB
EmacsLisp
;;; org-ref-compat.el --- Compatibility functions for org-cite -*- lexical-binding: t; -*-
|
|
|
|
;;; Commentary:
|
|
;;
|
|
;; The main function of this library is to provide compatibility functions for
|
|
;; converting between org-ref and org-cite.
|
|
|
|
(require 'org-ref-export)
|
|
|
|
|
|
(defcustom org-ref-to-org-cite-mapping
|
|
'(("cite" . "")
|
|
("citep" . "")
|
|
("Citep" . "//caps-full")
|
|
("citealp" . "//bare")
|
|
("Citealp" . "//bare-caps")
|
|
("Citealp*" . "//bare-caps-full")
|
|
("citep*" . "//full")
|
|
|
|
("citet" . "/text")
|
|
|
|
("citeyear" . "/noauthor/bare")
|
|
("citeyearpar" . "/noauthor")
|
|
|
|
("nocite" . "/nocite")
|
|
|
|
("citeauthor" . "/author")
|
|
("citeauthor*" . "/author/full")
|
|
("Citeauthor" . "/author/caps"))
|
|
|
|
"A-list of (org-ref-type . org-cite-style).
|
|
This builds from
|
|
https://blog.tecosaur.com/tmio/2021-07-31-citations.html#cite-syntax.
|
|
There is no way to get them all though, there are conflicting
|
|
translations with some biblatex and some natbib commands. This
|
|
list maps the natbib commands. I have also opted to use the full
|
|
names rather than the short names."
|
|
:group 'org-ref
|
|
:type '(list (cons string string)))
|
|
|
|
|
|
(defun org-ref-to-org-cite ()
|
|
(interactive)
|
|
(let ((ref-cites (reverse (org-ref-get-cite-links)))
|
|
type path
|
|
beg end)
|
|
;; This takes care of the cite links
|
|
(cl-loop for rc in ref-cites do
|
|
(setq
|
|
type (org-element-property :type rc)
|
|
path (org-element-property :path rc)
|
|
beg (org-element-property :begin rc)
|
|
end (org-element-property :end rc))
|
|
(cl--set-buffer-substring
|
|
beg end
|
|
(format "[cite%s:%s]"
|
|
(or (cdr (assoc type org-ref-to-org-cite-mapping)) "")
|
|
;; This is not 100% correct, if someone has put an extra &
|
|
;; anywhere in a note, this will be a little wrong. It
|
|
;; would be a little more correct if I also look for a
|
|
;; word next to it. The most correct would probably be to
|
|
;; build the data and then use org-element interpret I
|
|
;; think
|
|
(replace-regexp-in-string "&" "@" path))))
|
|
|
|
;; Next replace bibliography links. I assume the paths are ok, and we just
|
|
;; need to convert them to keywords.
|
|
(cl-loop for bib-link in
|
|
(reverse (org-element-map (org-element-parse-buffer) 'link
|
|
(lambda (bl)
|
|
(when (member (org-element-property :type bl)
|
|
'("bibliography" "nobibliography"))
|
|
bl))))
|
|
do
|
|
(cl--set-buffer-substring
|
|
(org-element-property :begin bib-link)
|
|
(org-element-property :end bib-link)
|
|
(format "#+bibliography: %s%s"
|
|
(org-element-property :path bib-link)
|
|
(if (string= "bibliography"
|
|
(org-element-property :type bib-link))
|
|
"\n#+print_bibliography:"
|
|
""))))
|
|
;; Note it is a bit ambiguous what do do about where the bibliography is to
|
|
;; be printed. This should be done via #+print_bibliography:. In org-ref the
|
|
;; bibliography normally goes where the bibliography link was, and I sue
|
|
;; that convention.
|
|
|
|
))
|
|
|
|
|
|
(provide 'org-ref-compat)
|
|
|
|
;;; org-ref-compat.el ends here
|