From f0f93716ce9de71dc904887c066e03644c795545 Mon Sep 17 00:00:00 2001 From: Vaidheeswaran C Date: Wed, 24 Jul 2013 19:25:02 +0530 Subject: [PATCH] ox-odt.el: Add support for JabRef * contrib/lisp/ox-jabref.el: New file. * lisp/org.el (org-modules): Add ox-jabref. * etc/styles/OrgOdtStyles.xml (Bibliography_20_Heading) (Bibliography, OrgBibliographyList, OrgCite): New styles. * lisp/ox-odt.el (org-export-define-backend): New non-standard element `citation-reference'. Register `org-odt--translate-cite-fragments'. (org-odt--translate-cite-fragments): New filter. (org-odt-citation-transcoders): New user option. (org-odt-citation-reference, org-odt-citation-reference/numbered): Stock transcoders for `citation-reference' elements. (org-odt-keyword): Handle BIBLIOGRAPHY. (org-odt--export-wrap): Make the condition case debuggable. Import JabRef Chicago filters * JabRef: New directory. * JabRef/Chicago_export_filters.pdf: New file. * JabRef/net.sf.jabref.export.Chicago.ODF(English)-1.2.jar: Chicago filters modified for use with OpenDocument export. (ox-odt, ox-jabref): Recognize \citep{} etc as cite fragments * lisp/ox-odt.el (org-odt-cite-regexp): New user option. (org-odt-citation-reference/numbered) (org-odt--translate-cite-fragments): Use `org-odt-cite-regexp'. * contrib/lisp/ox-jabref.el (org-jabref-odt-citation-transcoders): Fix custom group. (org-jabref-odt-citation-reference/text): Use `org-odt-cite-regexp'. Recognize \citep{}, \citet{} etc as cite fragments. See http://lists.gnu.org/archive/html/emacs-orgmode/2014-01/msg00581.html ox-jabref.el: Expand "~" etc. in bib file name * contrib/lisp/ox-jabref.el (org-jabref--read-bibliography-attribute): Expand file name. Add check for existence. ox-odt.el, ox-jabref.el: Trim cite key * lisp/ox-odt.el (org-odt-citation-reference/numbered): (org-odt--translate-cite-fragments): Trim cite key. * contrib/lisp/ox-jabref.el (org-jabref-odt-citation-reference/text): Trim cite key. ox-jabref.el: Match exactly against the citekey * contrib/lisp/ox-jabref.el (org-jabref-export-cite-key): Match exactly against the citekey. ox-jabref.el: Use cache to speed up export of citations and bibliography * contrib/lisp/ox-jabref.el (org-jabref-temporary-file-directory): New. (org-jabref-use-cache, org-jabref-cache-directory): New user variables. (org-jabref-export--with-cache): New. Wrap `org-jabref-export-bib-file' and `org-jabref-export-cite-key' with a cache lookup. (org-jabref-load-citation-cache): New. Around advice for `org-export-collect-tree-properties'. Push :citation-cache in to info. (org-jabref-write-citation-cache): New. (org-jabref--enhanced-odt-backend): Install `org-jabref-write-citation-cache' as a final filter. (ox-jabref-unload-function): Deactivate advice for `org-export-collect-tree-properties'. (org-jabref-export-cite-key): Throw `user-error' if the JabRef command fails. Use a cache to speed up second and subsequent export of citations. This circumvents slow-down experienced with the JabRef command line processing. See 1. http://lists.gnu.org/archive/html/emacs-orgmode/2013-07/msg01099.html 2. http://lists.gnu.org/archive/html/emacs-orgmode/2014-04/msg01094.html ox-jabref.el: Cleanup whitespace that precede citation numbers * contrib/lisp/ox-jabref.el (org-jabref-odt-cleanup-citation-references): New. (org-jabref--enhanced-odt-backend): Install the above final filter. Preserve spaces after citation-reference objects * lisp/ox-odt.el (org-odt--translate-cite-fragments): Copy over :post-blank prop of cite fragments. * contrib/lisp/ox-jabref.el (org-jabref-odt-citation-reference): Honor :post-blank property. ox-jabref.el (org-jabref-clear-cache): New command * contrib/lisp/ox-jabref.el (org-jabref-clear-cache): New command. (org-jabref-cache-directory): Update docstring. OrgOdtContentTemplate.xml (OrgIndexSection): Editable and no background color * etc/styles/OrgOdtContentTemplate.xml (OrgIndexSection): Remove background color. This makes the exported document printer-friendly. Make the section editable. OrgOdtStyles.xml (Bibliography): Use hanging indent * etc/styles/OrgOdtStyles.xml (Bibliography): Use hanging indent. (ox-jabref.el): Speed-up export & Support more citation styles * contrib/lisp/ox-jabref.el (org-jabref-citation-styles): (org-jabref-citation-formatters): New user variables. * lisp/ox-odt.el (org-odt-cite-regexp): Relax it. Allow match for the word "cite" anywhere withing the latex command. (org-odt--format-footnote-definition): Factored out from `org-odt-footnote-reference'. (org-odt-footnote-reference): Use it. (org-odt-citation-reference/numbered): Remove it. Don't use hanging indent for numbered bibliography * contrib/lisp/ox-jabref.el (org-jabref--strip-and-add-pre/post-notes): Trivial fix. (org-jabref-odt-format-bibliography): Removed. (org-jabref-odt-format-bibliography--no-hanging-indent) (org-jabref-odt-format-bibliography--use-hanging-indent): New. (org-jabref-citation-formatters): Use above functions. ox-odt.el, ox-jabref.el: Integrate with new citation syntax * lisp/ox-odt.el: (org-odt-citation): New. (org-odt--collect-cite-keys): Add (org-odt-cite-regexp): Remove it. (org-odt-citation-reference): Remove it (org-odt--translate-cite-fragments): Remove it. * contrib/lisp/ox-jabref.el: Integrate with new citation syntax. ox-odt.el: Update copyright years --- JabRef/Chicago_export_filters.pdf | Bin 0 -> 59660 bytes ...t.sf.jabref.export.Chicago.ODF(English)-1.2.jar | Bin 0 -> 28786 bytes contrib/lisp/ox-jabref.el | 895 +++++++++++++++++++++ etc/styles/OrgOdtContentTemplate.xml | 2 +- etc/styles/OrgOdtStyles.xml | 47 ++ lisp/org.el | 1 + lisp/ox-odt.el | 80 +- 7 files changed, 1004 insertions(+), 21 deletions(-) create mode 100644 JabRef/Chicago_export_filters.pdf create mode 100644 JabRef/net.sf.jabref.export.Chicago.ODF(English)-1.2.jar create mode 100644 contrib/lisp/ox-jabref.el diff --git a/JabRef/Chicago_export_filters.pdf b/JabRef/Chicago_export_filters.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dd816cdb7c40e5fff0e100d1b4317a7fdf295eaa GIT binary patch literal 59660 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 *gEp)=nh4i^vXm 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 literal 0 HcwPel00001 diff --git a/JabRef/net.sf.jabref.export.Chicago.ODF(English)-1.2.jar b/JabRef/net.sf.jabref.export.Chicago.ODF(English)-1.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..adb197681f3b2ea84881dccf87a19d07fcd50ba1 GIT binary patch literal 28786 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 Wyc8_l`M;|H{?h}zPRGjUfBSzxuPn>} literal 0 HcwPel00001 diff --git a/contrib/lisp/ox-jabref.el b/contrib/lisp/ox-jabref.el new file mode 100644 index 000000000..fec3e709d --- /dev/null +++ b/contrib/lisp/ox-jabref.el @@ -0,0 +1,895 @@ +;;; ox-jabref.el --- JabRef Citation Processor for Orgmode + +;; Copyright (C) 2015 Vaidheeswaran C + +;; Author: Vaidheeswaran C +;; Keywords: outlines, hypermedia, calendar, wp +;; Homepage: http://orgmode.org +;; Version: 8.3.6 + +;;; Commentary: + +;; JabRef Homepage: http://jabref.sourceforge.net/ +;; +;; Basic References: +;; +;; 1. [[http://jabref.sourceforge.net/help/CommandLine.php][JabRef command line syntax]] +;; 2. [[http://jabref.sourceforge.net/help/SearchHelp.php][Syntax for search query]] +;; 3. [[http://jabref.sourceforge.net/help/CustomExports.php][Custom export filters]] + +;; * Introduction + +;; This modules supports multiple cite keys and use of Pre/Post notes. + +;; The table below illustrates the typical output when using "Chicago +;; (author-date)" as the style. (See below for more information on +;; available Citation styles and how they may be specified on a per-file +;; basis.) + + +;; | Org Input | ODT Output | +;; |--------------------------------------------+---------------------------| +;; | \cite{suzuki_studies_1998, watts_way_1999} | (Suzuki 1998; Watts 1999) | +;; | \cite[See][Pg. 10]{watts_way_1999} | (See Watts 1999, Pg. 10) | + + +;; * Quick start guide +;; +;; 1. Install [[http://jabref.sourceforge.net/][JabRef]] +;; +;; This module is tested with version JabRef-2.9.2.jar. +;; +;; 2. Install the JabRef plugin [[http://repo.or.cz/w/JabRefChicagoForOrgmode.git/blob_plain/HEAD:/net.sf.jabref.export.Chicago.ODF(English)-1.2.jar][Chicago Export filters for Org-mode]]. +;; +;; 3. Enable JabRef support +;; +;; #+BEGIN_EXAMPLE +;; M-x customize-variable RET org-modules RET +;; #+END_EXAMPLE +;; +;; Enable the tick mark against JabRef. +;; +;; Alternatively, you can add the following to your .emacs +;; +;; #+BEGIN_EXAMPLE +;; (require 'ox-jabref) +;; #+END_EXAMPLE +;; +;; Now when you invoke the Org exporter with C-c C-e, you will see +;; the following in the dispatcher menu. +;; +;; "Export to ODT (With Jabref Processing)" +;; +;; 4. Add the following line to your Org file and export. +;; +;; #+BEGIN_SRC org +;; ,#+ATTR_ODT: :style "Chicago (author-date)" +;; ,#+BIBLIOGRAPHY: MyLibrary chicago option:-d +;; #+END_SRC +;; +;; Remember to replace the value of `:style' property to a style of +;; your choosing. The JabRef modules ships with following citation +;; styles +;; +;; - "Numeric" +;; - "Chicago (full-note)" +;; - "Chicago (author-date)" +;; +;; * Advanced configuration +;; +;; You can see a comprehensisve list of the user options with +;; +;; #+BEGIN_EXAMPLE +;; M-x customize-group RET org-jabref RET +;; #+END_EXAMPLE +;; +;; Here is a quick overview of what you can achieve with above user +;; options. +;; +;; 1. `org-jabref-citation-styles' +;; +;; To create annnotated bibliographies, replace "chicago.ODF.biblio" +;; with "chicago.ODF.abstract" or "chicago.ODF.note". +;; +;; To order bibliography entry by the order in which they are cited, +;; set `:order-by-jabref' to t. +;; +;; To include all bibliographic entries (whether or not they are +;; cited) set `:dont-filter' to t. +;; +;; 2. `org-jabref-citation-formatters' +;; +;; Modify the braces (round or square etc.), separators (semi-colon or +;; comma etc.) to your taste. + +;;; Code: + +(require 'ox) +(require 'ox-odt) +(eval-when-compile + (require 'cl)) + +;;; Internal Variables + +(defvar org-jabref-formats + '("Numeric" + "chicago.ODF.biblio" "chicago.ODF.abstract" "chicago.ODF.note" + "chicago.ODF.text" "chicago.ODF.footend" "chicago.ODF.footend.short" + "chicago.ODF.reference") + "Export formats avaiable from JabRef and used by this module. +Use + + \"java -jar ~/Downloads/JabRef-2.9.2.jar -n true -h\" + +to see all available export formats.") + +(defvar org-jabref-formats--type + `(,@(mapcar (lambda (export-format) + `(const ,export-format)) + org-jabref-formats) + (string :tag "Other" )) + "Same as `org-jabref-formats', but for use with Emacs customizer.") + +;;; User Configuration Options. + +(defgroup org-jabref nil + "Options for processing citations via JabRef." + :tag "Org Jabref" + :group 'org-export) + +(defcustom org-jabref-command '("java" "-jar" "JabRef-2.9.2.jar" "-n" "true") + "Jabref program." + :type '(choice + (const :tag "Not configured" nil) + (repeat string)) + :group 'org-jabref + :version "25.1" + :package-version '(Org . "8.3")) + +(defvar org-jabref-citation-formatter--params-type + `((:substring (choice + (const :tag "Don't clip" nil) + (const :tag "Don't clip" (0 . nil)) + (const :tag "Strip surrounding braces" (1 . -1)) + (const :tag "Strip full-stop" (0 . -1)) + (cons (integer :tag "From index") + (integer :tag "To index")))) + (:braces (repeat :tag "List of braces" + (choice (const :tag "None" nil) + (const :tag "Round" ("(" . ")")) + (const :tag "Square" ("[" . "]")) + (const :tag "Add full-stop" (nil . ".")) + (const :tag "ODT Text span" + ("" . + "")) + (const :tag "ODT Bibliography" + (" + +References" . " + +")) + (const :tag "ODT Bibliography (Numbered)" + (" + +References +" . " + + +")) + (const :tag "ODT List item" + (" +" . " +")) + (cons (choice (const :tag "None" nil) + (string :tag "Opening brace")) + (choice (const :tag "None" nil) + (string :tag "Closing brace")))) + )) + (:between-citations (choice (const :tag "None" nil) + (const :tag "Comma" ", ") + (const :tag "Semi-colon" "; ") + (string :tag "Separator"))) + (:text-after-pre-note (choice (const :tag "None" nil) + (const :tag "Space" " ") + string)) + (:text-before-post-note (choice (const :tag "None" nil) + (const :tag "Space" " ") + (const :tag "Comma" ", ") + string)))) + +(defvar org-jabref-citation-formatters--value-type + `(cons (function :tag "Multicite formatter") + (plist :options + (,@org-jabref-citation-formatter--params-type + (:formatter + (choice + (function :tag "Key formatter") + (cons :tag "Key formatter with params" + (function :tag "Key formatter") + (plist :options ,org-jabref-citation-formatter--params-type)))))))) + +(defcustom org-jabref-citation-formatters + `(("odt" + ("Simple" . + (org-jabref--multicite + :braces (("" . "") + ("[" . "]")) + :between-citations ", " + :text-after-pre-note " " + :text-before-post-note ", " + :formatter org-jabref-odt-format-citation-as-link)) + ("Simple (but strip braces)" . + (org-jabref--multicite + :braces (("(" . ")")) + :between-citations "; " + :text-after-pre-note " " + :text-before-post-note ", " + :formatter (org-jabref-odt-format-citation-as-link + :substring (1 . -1)))) + ("Footnote" . + (org-jabref--multicite + :between-citations + ,(format "%s" + "OrgSuperscript" ", ") + :formatter (org-jabref-odt-format-citation-as-footnote-definition + :substring (0 . -1) + :braces ((nil . ".")) + :text-after-pre-note " " + :text-before-post-note ", "))) + ("Bibliography" . + (org-jabref--multicite + :braces + ((" + +References +" . " + +")) + :formatter org-jabref-odt-format-bibliography--use-hanging-indent)) + ("Bibliography (Numbered)" . + (org-jabref--multicite + :braces + ((" + +References +" . " + + +")) + :formatter (org-jabref-odt-format-bibliography--no-hanging-indent + :braces + ((" +" . " +"))))))) + "Citation formatters for various backends." + :group 'org-jabref + :version "25.1" + :package-version '(Org . "8.3") + :type `(alist :key-type (string :tag "Export backend") + :options ("odt" "html") + :value-type + (alist :key-type (string :tag "Formatter style") + :value-type + ,org-jabref-citation-formatters--value-type))) + +(defvar org-jabref-citation-formatters--default + (let ((formatter-names (mapcar 'car (assoc-default "odt" org-jabref-citation-formatters)))) + `(choice :tag "Formatter name" + ,@(loop for formatter-name in formatter-names + collect `(const ,formatter-name)) + (string :tag "Other" ,(car formatter-names))))) + +(defcustom org-jabref-citation-styles + `(("odt" + ("Numeric" + :in-text + (:jabref-format "Numeric" :formatter "Simple") + :bibliography + (:jabref-format "chicago.ODF.reference" :formatter "Bibliography (Numbered)")) + ("Chicago (full-note)" + :in-text + (:jabref-format ("chicago.ODF.footend" . + "chicago.ODF.footend.short") :formatter "Footnote") + :bibliography + (:jabref-format "chicago.ODF.biblio" :formatter "Bibliography")) + ("Chicago (author-date)" + :in-text + (:jabref-format "chicago.ODF.text" :formatter "Simple (but strip braces)") + :bibliography + (:jabref-format "chicago.ODF.reference" :formatter "Bibliography")))) + "Citation styles for various backends. +Each element in this list is of the form: + + \(EXPORT-BACKEND-NAME . BACKEND-STYLE-FITLERS\) + +BACKEND-STYLE-FILTERS is of the form: + + \(CITATION-STYLE . EXPORT-FORMATS-PLIST\) + +EXPORT-FORMATS-PLIST is property list with two well-known +properties - `:in-text' and `:bibliography'. The values +of these properties are the export formats registered with +JabRef. + +A typical value for this variable could be: + + '((\"odt\" + (\"default\" :in-text \"chicago.ODF.text\" + :bibliography \"chicago.ODF.reference\")) + (\"html\" + (\"default\" :bibliography \"html\") + (\"simple\" :bibliography \"simplehtml\"))) + +For a list of export formats registered with JabRef use: + + java -jar JabRef-2.9.2.jar -n true -h." + :group 'org-jabref + :version "25.1" + :package-version '(Org . "8.3") + :type `(alist :key-type (string :tag "Export backend") + :options ("odt" "html") + :value-type + (alist :key-type (string :tag "Citation style") + :options ("Chicago (author-date)" + "Chicago (full-note)") + :value-type + (plist + :tag "Citation style configuration" + :options + ((:in-text + (plist + :tag "In text format" + :options ((:jabref-format + (choice :tag "JabRef format" + ,@org-jabref-formats--type + (cons :tag "Long, short formatters" + (choice :tag "JabRef format (Long)" + ,@org-jabref-formats--type) + (choice :tag "JabRef format (Short)" + ,@org-jabref-formats--type)))) + (:formatter ,org-jabref-citation-formatters--default)))) + (:bibliography + (plist + :tag "Bibliogrpahy format" + :options ((:jabref-format + (choice :tag "JabRef export format" + ,@org-jabref-formats--type)) + (:order-by-jabref + (choice + (const :tag "Order by reference" nil) + (const :tag "Order by JabRef settings" t))) + (:dont-filter + (choice + (const :tag "Filter entries" nil) + (const :tag "Do not filter" t))) + (:formatter ,org-jabref-citation-formatters--default))))))))) + + +;;; Loading and Unloaing + +(defvar org-jabref-org-export-backends '(odt)) + +(defvar org-jabref--stock-backends + (mapcar + (lambda (backend) + (cons backend (org-export-get-backend backend))) + org-jabref-org-export-backends) + "Backend definition of stock ODT exporter.") + +(defvar org-jabref--enhanced-backends + (mapcar + (lambda (backend) + (cons backend + (let* ((stock-backend (assoc-default backend org-jabref--stock-backends)) + ;; Copy over the stock backend. + (enhanced-backend (copy-tree stock-backend t))) + ;; Override default citation transcoders with our own. + (setf (org-export-backend-transcoders enhanced-backend) + (append + '((keyword . org-jabref-keyword) + (citation . org-jabref-citation)) + (org-export-backend-transcoders stock-backend))) + ;; Modify the menu description. + (let ((menu (org-export-backend-menu enhanced-backend))) + (setf (cadr menu) (concat (cadr menu) " (With Jabref Processing)"))) + ;; Replace the existing ODT backend. + (org-export-register-backend enhanced-backend) + ;; Return the enhanced backend. + enhanced-backend))) + org-jabref-org-export-backends) + "Backend definition of ODT exporter with JabRef processing.") + +(defun ox-jabref-unload-function () + "Restore the stock ODT backend." + (prog1 nil + (ad-deactivate 'org-export-collect-tree-properties) + (dolist (backend org-jabref-org-export-backends) + (org-export-register-backend + (assoc-default backend org-jabref--stock-backends))) + (message "ox-jabref: Unloaded"))) + + +;;; Internal functions + +(defun org-jabref--read-bibliography-attribute (info property) + "Return value of PROPERTY of #+BIBLIOGRAPHY keyword. +INFO is a plist holding contextual information for purposes of +export. PROPERTY is one of `:bib-file' or `:citation-style'. If +it is neither, treat is as one of the properties in +#+ATTR_BACKEND attribute of #+BIBLIOGRAPHY keyword, where BACKEND +is the current export backend." + (let* ((data (plist-get info :parse-tree)) + (bibliography (org-element-map data 'keyword + (lambda (keyword) + (let ((key (org-element-property :key keyword))) + (and (string= (upcase key) "BIBLIOGRAPHY") + keyword))) + info 'first-match))) + (when bibliography + (cond + ((memq property '(:bib-file :citation-style)) + (let* ((value (org-element-property :value bibliography)) + (values (split-string value)) + (attributes (list :bib-file + (let* ((bib-file (nth 0 values))) + (unless bib-file + (user-error + "(ox-jabref): #+BIBLIOGRAPHY specifies no bib file.")) + ;; Add a ".bib" extension, if it is missing. + (unless (file-name-extension bib-file) + (setq bib-file (format "%s.bib" bib-file))) + ;; Does the bib file exist? + (unless (and (file-regular-p bib-file) + (file-readable-p bib-file)) + (user-error + "(ox-jabref): Bibliography file %s not readable" + bib-file)) + (expand-file-name bib-file)) + :citation-style (nth 1 values)))) + (plist-get attributes property))) + (t + (let ((attribute (intern (format ":attr_%s" (org-export-backend-name + (plist-get info :back-end)))))) + (org-odt--read-attribute bibliography property))))))) + +(defun org-jabref--get-citation-style (info) + "Return Citation style." + (let* ((backend (plist-get info :back-end)) + (backend-name (symbol-name (org-export-backend-name backend))) + (styles-alist (assoc-default backend-name org-jabref-citation-styles)) + ;; FIXME: Ignore the "style" entry in "#+BIBLIOGRAPHY" line. Just + ;; go with the first registered style for this backend in + ;; `org-jabref-citation-styles'. + (citation-style (org-jabref--read-bibliography-attribute info :style))) + (if (and (stringp citation-style) (assoc-string citation-style styles-alist t)) + (car (assoc-string citation-style styles-alist t)) + (message "Unknown Citation style \"%s\"" citation-style) + (caar styles-alist)))) + +(defun org-jabref--get-export-format (info op prop) + "Return the EXPORT-FORMAT configured for operation OP. +INFO is a plist holding contextual information. OP can be one of +`:in-text' or `:bibliography'. Return EXPORT-FORMAT is +that is registered for the current export backend. See +`org-jabref-citation-styles'." + (let* ((backend (plist-get info :back-end)) + (backend-name (symbol-name (org-export-backend-name backend))) + (styles-alist (assoc-default backend-name org-jabref-citation-styles)) + ;; FIXME: Ignore the "style" entry in "#+BIBLIOGRAPHY" line. + ;; Just go with the first registered style for this backend + ;; in `org-jabref-citation-styles'. + (citation-style (org-jabref--get-citation-style info)) + ;; Get JabRef export format that match this backend and + ;; citation-style. + (export-formats-plist (assoc-default citation-style styles-alist))) + (cond + ((null op) export-formats-plist) + ((null prop) (plist-get export-formats-plist op)) + (t (plist-get (plist-get export-formats-plist op) prop))))) + +(defun org-jabref--get-citation-formatter (info formatter-name) + "Return the EXPORT-FORMAT configured for operation OP. +INFO is a plist holding contextual information. OP can be one of +`:in-text' or `:bibliography'. Return EXPORT-FORMAT is +that is registered for the current export backend. See +`org-jabref-citation-styles'." + (let* ((backend (plist-get info :back-end)) + (backend-name (symbol-name (org-export-backend-name backend))) + (formatters-alist (assoc-default backend-name org-jabref-citation-formatters))) + (or (assoc-default formatter-name formatters-alist) + (user-error "Unknown Citation formatter \"%s\"" formatter-name) + (cdar formatters-alist)))) + +(defun org-jabref--run-cmd (&rest args) + "Run JabRef command with ARGS. +Append ARGS to `org-jabref-command' and use `call-process'." + (let ((cmd (append org-jabref-command args))) + (let (exitcode err-string) + (message "Running %s" (mapconcat 'identity cmd " ")) + (setq err-string + (with-output-to-string + (setq exitcode + (apply 'call-process (car cmd) + nil standard-output nil (cdr cmd))))) + (or (zerop exitcode) + (error (format "JabRef command failed with error (%s)" + err-string)))))) + +(defun org-jabref--create-filtered-bibfile (bib-file cite-keys) + "Truncate BIB-FILE so that it contains only CITE-KEYS. +Return name of the newly created bib file. + +Specifically, + + - Create a temporary auxiliary file FILTERED.AUX file which + contains just the CITE-KEYS + + - Run the following command (for example) + + jabref -n true -a FILTERED.AUX,FILTERED.BIB BIB-FILE + + - Return FILTERED.BIB." + + (let* ((aux-file (make-temp-file "jabref" nil ".aux")) + (filtered-bib-file (concat (file-name-sans-extension aux-file) ".bib"))) + ;; Create an .aux file out of CITE-KEYS. + (with-current-buffer (find-file-noselect aux-file) + (insert (mapconcat (lambda (cite-key) + (format "\\citation{%s}" cite-key)) + cite-keys "\n")) + (save-buffer 0)) + ;; Create a filtered bib file out of the aux file. + (org-jabref--run-cmd "-a" (concat aux-file "," filtered-bib-file) bib-file) + ;; Delete aux file. + (delete-file aux-file) + ;; Return filtered bib file. + filtered-bib-file)) + +;;;; Export a BIB file, enbloc + +(defun org-jabref-export-bib-file (bib-file export-format) + "Export BIB-FILE to EXPORT-FORMAT. +CITE-KEYS is a list of cite keys that must occur in BIB-FILE. +Return an alist of (CITE-KEY . XML-STRING). When CITE-KEYS is +non-nil, restrict CITE-KEYs to those that occur in CITE-KEYS. +Throw an error if a key in CITE-KEYS does not occur in BIB-FILE." + (let ((xml (org-jabref-do-export-bib-file bib-file export-format))) + (when xml + (with-temp-buffer + (insert xml) + (let (result-alist) + (goto-char (point-min)) + (condition-case nil + (while (and (not (eobp)) + (re-search-forward "[ \n]*[ \n]*")) + (let ((cite-key (substring-no-properties (match-string 1))) + (begin (point)) + (end (progn (re-search-forward "[ \n]*[ \n]*") + (match-beginning 0)))) + (push (cons cite-key (buffer-substring-no-properties begin end)) + result-alist))) + (error (user-error "Pls. upgrade your chicago.ODF plugin"))) + (setq result-alist (nreverse result-alist))))))) + +(defun org-jabref-do-export-bib-file (bib-file export-format &optional dummy) + "Export BIB-FILE to EXPORT-FORMAT. +Return the resulting XML as string. Specifically, + + - Run the following command (for example) + + jabref -n true -o OUT.XML,EXPORT-FORMAT BIB-FILE + + - Return contents of OUT.XML as a string." + (when (and bib-file (file-readable-p bib-file) export-format) + (with-demoted-errors + (let* ((xml-file (make-temp-file "jabref-" nil ".xml"))) + ;; Export the Citation to it's XML representation. + (org-jabref--run-cmd "-o" (concat xml-file "," export-format) bib-file) + ;; Return the XML string. + (prog1 (with-temp-buffer + (insert-file-contents xml-file) + (buffer-string)) + ;; Delete temporary xml file. + (delete-file xml-file)))))) + +(defun org-jabref-do-export-bib-file-with-filtering (bib-file export-format + cite-keys) + "Export BIB-FILE to EXPORT-FORMAT, but limit output to just the CITE-KEYS. +Use `org-jabref--create-filtered-bibfile' and `org-jabref-do-export-bib-file'." + (when (and bib-file (file-readable-p bib-file) cite-keys export-format) + (let ((filtered-bib-file (org-jabref--create-filtered-bibfile bib-file + cite-keys))) + (prog1 (org-jabref-do-export-bib-file filtered-bib-file export-format) + (delete-file filtered-bib-file))))) + +;;;; Export a CITE-KEY + +(defun org-jabref-export-cite-key (bib-file export-format cite-key) + "Export CITE-KEY from BIB-FILE to EXPORT-FORMAT. +Return the XML representation as a string. Specifically, + + - Run the following command (for example) + + jabref -n true -m bibtexkey==CITE-KEY,OUT.XML,EXPORT-FORMAT BIB-FILE + + - Return contents of OUT.XML as a string." + (when (and bib-file (file-readable-p bib-file) cite-key export-format) + (condition-case nil + (let* ((xml-file (file-name-nondirectory (make-temp-file "jabref-" nil + ".xml")))) + ;; Export the Citation to it's XML representation. + (org-jabref--run-cmd "-m" (format "bibtexkey==%s,%s,%s" cite-key xml-file + export-format) bib-file) + ;; Return the XML string. + (prog1 (with-temp-buffer + (insert-file-contents xml-file) + (buffer-string)) + ;; Delete temporary xml file. + (delete-file xml-file))) + (error (user-error "Export of cite key \"%s\" failed" cite-key))))) + + +;;; Citation Cache + +;;;; Export Filters :: Read-in and Write-out of caches + +(defadvice org-export-collect-tree-properties + (around org-jabref-load-citation-cache activate) + "Add `:citation-cache' property to INFO." + (let* ((info ad-do-it) + (bib-file (org-jabref--read-bibliography-attribute info :bib-file))) + (message "Bib file is %s" bib-file) + (if (not bib-file) info + ;; A #+BIBLIOGRAPHY file is specified. + (let* ((in-text-jabref-format + (org-jabref--get-export-format info :in-text :jabref-format)) + (bibliography-jabref-format + (org-jabref--get-export-format info :bibliography :jabref-format)) + (citation-style (org-jabref--get-citation-style info)) + ;; Collect the list of JabRef export formats that will be + ;; used for the specified citation style. + (jabref-formats (nconc + (list bibliography-jabref-format) + (cond + ((consp in-text-jabref-format) + (list (car in-text-jabref-format) + (cdr in-text-jabref-format))) + ((string= in-text-jabref-format "Numeric") nil) + (t (list in-text-jabref-format))))) + (cite-keys-used (mapcar 'car (plist-get info :citations-alist))) + citation-cache) + (message "Citation style is %s" citation-style) + ;; When export formats are encountered for the first time, + ;; create empty entry for those. + (dolist (jabref-format jabref-formats) + (unless (assoc-default jabref-format citation-cache) + (push (cons jabref-format (org-jabref-export-bib-file + bib-file jabref-format)) + citation-cache))) + + ;; Filter and Re-order the bibliographic entries. + (let* ((dont-filter (org-jabref--get-export-format info :bibliography + :dont-filter)) + (order-by-jabref (org-jabref--get-export-format info :bibliography + :order-by-jabref)) + (bibliography-cache (assoc bibliography-jabref-format citation-cache)) + (bib-alist (cdr bibliography-cache)) + (citation-alist (plist-get info :citations-alist))) + (message "Bibliography is %sfiltered" (if dont-filter "not " "")) + (unless dont-filter + (setq bib-alist + (cond + (order-by-jabref + (loop for bib-entry in bib-alist + if (assoc-default (car bib-entry) citation-alist) + collect bib-entry)) + (t + (reverse + (loop for citation-entry in citation-alist + if (assoc (car citation-entry) bib-alist) + collect it)))))) + (setcdr bibliography-cache bib-alist)) + + ;; Calculate numeric citations. + (when (and (atom in-text-jabref-format) + (string= in-text-jabref-format "Numeric")) + (let* ((bib-alist (assoc-default bibliography-jabref-format citation-cache )) + (cite-key-text-alist (loop for (cite-key . text) in bib-alist + with n = 0 collect + (cons cite-key (number-to-string (incf n)))))) + (push (cons "Numeric" cite-key-text-alist) + citation-cache))) + + ;; (pp-display-expression citation-cache "*citation-cache*") + + ;; Stash the cache in to INFO for later use by the + ;; transcoders. + (setq ad-return-value (nconc info (list :citation-cache citation-cache))))))) + + +;;; Transcoders + +;;;; Internal functions + +(defun org-jabref--strip-and-add-pre/post-notes (text pre-note post-note + formatter-info) + (let* ((substring (plist-get formatter-info :substring)) + (text-after-pre-note (plist-get formatter-info :text-after-pre-note)) + (text-before-post-note (plist-get formatter-info :text-before-post-note)) + ;; The first brace in the list is the outermost brace. i.e., + ;; it gets applied while building the citation text. + (braces-list (reverse (plist-get formatter-info :braces))) + (allow-pre/post-notes-p (or text-after-pre-note text-before-post-note)) + ;; Strip the text and apply pre/post-notes. + (text + (concat + ;; Add Pre-note and Text-after-pre-note, if needed. + (when allow-pre/post-notes-p + (if (org-string-nw-p pre-note) (concat pre-note text-after-pre-note) "" )) + ;; Add the Text (with stripping), if needed. + (if (not substring) text + (substring text (car substring) (cdr substring))) + ;; Add Post-note and Text-after-post-note, if needed. + (when allow-pre/post-notes-p + (if (org-string-nw-p post-note) (concat text-before-post-note post-note) ""))))) + (dolist (braces braces-list text) + (setq text (concat + ;; Add Opening brace, if needed. + (or (car braces) "") + text + ;; Add Closing brace, if needed. + (or (cdr braces) "")))))) + + +(defun org-jabref--multicite (cite-key-text-alist pre-note post-note + formatter-info) + (let* ((formatter (plist-get formatter-info :formatter)) + (between-citations (plist-get formatter-info :between-citations))) + (org-jabref--strip-and-add-pre/post-notes + (mapconcat + (lambda (cite-key-text) + (let* ((cite-key (org-trim (car cite-key-text))) + (text (org-trim (cdr cite-key-text)))) + (when (atom formatter) (setq formatter (list formatter))) + (funcall (car formatter) cite-key text pre-note post-note (cdr formatter)))) + cite-key-text-alist between-citations) + pre-note post-note formatter-info))) + +;;;; Bibliography + +(defun org-jabref-bibliography (bibliography contents info) + "Transcode a CITATION element from Org to ODT. +CONTENTS is nil. INFO is a plist holding contextual information. + +Pass each CITE-KEY from CITATION in to `:in-text' +EXPORT-FORMAT. Return the concatenated result, after adding some +separators." + (let* ((bib-file (org-jabref--read-bibliography-attribute info :bib-file)) + (export-format (org-jabref--get-export-format info :bibliography :jabref-format)) + (formatter-name (org-jabref--get-export-format info :bibliography :formatter)) + (formatter (org-jabref--get-citation-formatter info formatter-name)) + (citation-cache (plist-get info :citation-cache)) + (bib-alist (assoc-default export-format citation-cache)) + (citation-alist (plist-get info :citations-alist)) + (pre-note nil) + (post-note nil)) + (funcall (car formatter) bib-alist pre-note post-note (cdr formatter)))) + + +;;;; Citation Reference + +(defun org-jabref-citation (citation contents info) + "Transcode a CITATION element from Org to ODT. +CONTENTS is nil. INFO is a plist holding contextual information. + +Pass each CITE-KEY from CITATION in to `:in-text' +EXPORT-FORMAT. Return the concatenated result, after adding some +separators." + (let* ((pre-note (org-export-data (org-element-property :prefix citation) info)) + (post-note (org-export-data (org-element-property :suffix citation) info)) + (cite-keys (list (org-element-property :key citation))) + (bib-file (org-jabref--read-bibliography-attribute info :bib-file)) + (export-formats (org-jabref--get-export-format info :in-text :jabref-format)) + (formatter-name (org-jabref--get-export-format info :in-text :formatter)) + (formatter (org-jabref--get-citation-formatter info formatter-name)) + (citation-cache (plist-get info :citation-cache)) + (cite-key-text-alist + (mapcar + (lambda (cite-key) + (let* ((export-format + (cond + ;; IN-TEXT uses only one export format. Use it. + ((not (consp export-formats)) export-formats) + ;; IN-TEXT uses two export formats. If the + ;; CITE-KEY is seen here for the first time, use + ;; the first of the export formats. + ((eq citation + (assoc-default cite-key + (plist-get info :citations-alist))) + (car export-formats)) + ;; Otherwise, use the second of the export formats. + (t (cdr export-formats))))) + (cons cite-key + (assoc-default cite-key + (assoc-default export-format citation-cache))))) + cite-keys))) + (funcall (car formatter) cite-key-text-alist pre-note post-note (cdr formatter)))) + +;;;; Keyword + +(defun org-jabref-keyword (keyword contents info) + "Transcode a KEYWORD element from Org to ODT. +CONTENTS is nil. INFO is a plist holding contextual information. + +If KEYWORD is a BIBLIOGRAPHY element, use +`org-jabref-bibliography'. Otherwise, call the standard +transcoder for KEYWORD element." + (let ((key (org-element-property :key keyword)) + (value (org-element-property :value keyword))) + (cond + ;; Handle BIBLIOGRAPHY code. + ((string= key "BIBLIOGRAPHY") + (org-jabref-bibliography keyword contents info)) + ;; Keyword is other than BIBLIOGRAPHY. Use the stock transcoder. + (t (let* ((backend (org-export-backend-name (plist-get info :back-end))) + (stock-backend (assoc-default backend org-jabref--stock-backends)) + (transcoder (assoc-default 'keyword (org-export-backend-transcoders + stock-backend)))) + (funcall transcoder keyword contents info)))))) + +;;; Jabref Citation Formatters (for ODT) + +;;;; Bibliography + +(defun org-jabref-odt-format-bibliography--no-hanging-indent + (cite-key text pre-note post-note formatter-info) + (org-jabref--strip-and-add-pre/post-notes + (format + " + + +%s + +" + "Bibliography_20_1" cite-key text cite-key) + pre-note post-note formatter-info)) + + +(defun org-jabref-odt-format-bibliography--use-hanging-indent + (cite-key text pre-note post-note formatter-info) + (org-jabref--strip-and-add-pre/post-notes + (format + " + + +%s + +" + "Bibliography" cite-key text cite-key) + pre-note post-note formatter-info)) + +;;;; Citation reference :: Plain Text (for use with Chicago::Author-Date etc.) + +(defun org-jabref-odt-format-citation-as-link + (cite-key text pre-note post-note formatter-info) + (format "%s" + cite-key + ;; Strip the surrounding braces. + (org-jabref--strip-and-add-pre/post-notes + text pre-note post-note formatter-info))) + +;;;; Citation reference: Footnote (for use with Chicago::Full note etc)) + +(defun org-jabref-odt-format-citation-as-footnote-definition + (cite-key text pre-note post-note formatter-info) + (org-odt--format-footnote-definition + nil (format "\n%s" + "Footnote" + (org-jabref--strip-and-add-pre/post-notes + text pre-note post-note formatter-info)))) + +;;; Interactive function + +(provide 'ox-jabref) + +;;; ox-jabref.el ends here diff --git a/etc/styles/OrgOdtContentTemplate.xml b/etc/styles/OrgOdtContentTemplate.xml index aa8e2db8e..c45fedd95 100644 --- a/etc/styles/OrgOdtContentTemplate.xml +++ b/etc/styles/OrgOdtContentTemplate.xml @@ -51,7 +51,7 @@ - + diff --git a/etc/styles/OrgOdtStyles.xml b/etc/styles/OrgOdtStyles.xml index 41cdfd40c..8d22d5301 100644 --- a/etc/styles/OrgOdtStyles.xml +++ b/etc/styles/OrgOdtStyles.xml @@ -796,6 +796,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lisp/org.el b/lisp/org.el index d05a7b8d5..b643d2840 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -705,6 +705,7 @@ For export specific modules, see also `org-export-backends'." (const :tag " info: Links to Info nodes" org-info) (const :tag " inlinetask: Tasks independent of outline hierarchy" org-inlinetask) (const :tag " irc: Links to IRC/ERC chat sessions" org-irc) + (const :tag " JabRef: Export citations with JabRef" ox-jabref) (const :tag " mhe: Links to MHE folders/messages" org-mhe) (const :tag " mouse: Additional mouse support" org-mouse) (const :tag " protocol: Intercept calls from emacsclient" org-protocol) diff --git a/lisp/ox-odt.el b/lisp/ox-odt.el index 800b13f5a..326e8b7e5 100644 --- a/lisp/ox-odt.el +++ b/lisp/ox-odt.el @@ -27,6 +27,7 @@ (eval-when-compile (require 'cl) + (require 'rx) (require 'table nil 'noerror)) (require 'format-spec) (require 'ox) @@ -82,10 +83,12 @@ (timestamp . org-odt-timestamp) (underline . org-odt-underline) (verbatim . org-odt-verbatim) - (verse-block . org-odt-verse-block)) + (verse-block . org-odt-verse-block) + (citation . org-odt-citation)) :export-block "ODT" :filters-alist '((:filter-parse-tree - . (org-odt--translate-latex-fragments + . (org-odt--collect-cite-keys + org-odt--translate-latex-fragments org-odt--translate-description-lists ; Dummy symbol org-odt--translate-list-tables))) :menu-entry @@ -1869,23 +1872,21 @@ CONTENTS is nil. INFO is a plist holding contextual information." ;;;; Footnote Reference +(defun org-odt--format-footnote-definition (n def) + (let ((note-class "footnote") + (par-style "Footnote") + (id (if n (format "text:id=\"fn%d\"" n) ""))) + (format + "%s" + id note-class + (concat + (format "%d" (or n 0)) + (format "%s" def))))) + (defun org-odt-footnote-reference (footnote-reference contents info) "Transcode a FOOTNOTE-REFERENCE element from Org to ODT. CONTENTS is nil. INFO is a plist holding contextual information." - (let ((--format-footnote-definition - (function - (lambda (n def) - (setq n (format "%d" n)) - (let ((id (concat "fn" n)) - (note-class "footnote") - (par-style "Footnote")) - (format - "%s" - id note-class - (concat - (format "%s" n) - (format "%s" def))))))) - (--format-footnote-reference + (let ((--format-footnote-reference (function (lambda (n) (setq n (format "%d" n)) @@ -1919,9 +1920,19 @@ CONTENTS is nil. INFO is a plist holding contextual information." (if (eq (org-element-type raw) 'org-data) def (format "\n%s" "Footnote" def))))) - (funcall --format-footnote-definition n def)))))))) + (org-odt--format-footnote-definition n def)))))))) +;;;; Citation Reference + +(defun org-odt-citation (citation contents info) + "Transcode a CITATION element from Org to ODT. +CONTENTS is nil. INFO is a plist holding contextual information." + ;; Just interpret the citation object. + ;; Citation processors (like ox-jabref.el) may handle citation + ;; by registering their own transcoders. + (org-element-interpret-data citation)) + ;;;; Headline (defun org-odt-format-headline-default-function @@ -2189,6 +2200,11 @@ CONTENTS is nil. INFO is a plist holding contextual information." ((member value '("tables" "figures" "listings")) ;; FIXME (ignore))))) + ;; Handle BIBLIOGRAPHY. Ignore it. + ((string= key "BIBLIOGRAPHY") + ;; Citation Processors (see ox-jabref.el) may handle this by + ;; registering their own transcoders. + (ignore)) ((string= key "PAGEBREAK") ;; Pagebreaks created this way are a mere expedience. These @@ -2254,8 +2270,7 @@ CONTENTS is nil. INFO is a plist holding contextual information." (defun org-odt-latex-fragment (latex-fragment contents info) "Transcode a LATEX-FRAGMENT object from Org to ODT. CONTENTS is nil. INFO is a plist holding contextual information." - (let* ((latex-frag (org-element-property :value latex-fragment)) - (processing-type (plist-get info :with-latex))) + (let* ((latex-frag (org-element-property :value latex-fragment))) (format "%s" "OrgCode" (org-odt--encode-plain-text latex-frag t)))) @@ -4132,6 +4147,30 @@ contextual information." ;;; Filters +(defun org-odt--collect-cite-keys (tree backend info) + "Collect cite keys (in reverse order) in to INFO. + +Modify INFO plist by appending a `:citations-alist' property. +The value of this property is a list where each element is of the +form (CITE-KEY . CITATION), with CITATION +being the first element that references CITE-KEY. The list is +sorted in reverse order of appearance of CITE-KEYs in the +exported file." + (let ((citations-alist nil)) + (org-element-map tree 'citation + (lambda (citation) + (let* ((value (org-element-property :key citation))) + (let ((cite-keys (split-string value ","))) + (mapc (lambda (cite-key) + (setq cite-key (org-trim cite-key)) + (unless (assoc cite-key citations-alist) + (push (cons cite-key citation) citations-alist))) + cite-keys)))) + info) + ;; Modify INFO by side-effects. + (nconc info (list :citations-alist citations-alist))) + tree) + ;;;; LaTeX fragments (defun org-odt--translate-latex-fragments (tree backend info) @@ -4494,6 +4533,7 @@ contextual information." info) tree) + ;;; Interactive functions @@ -4631,7 +4671,7 @@ contextual information." ;; Case 2: No further conversion. Return exported ;; OpenDocument file. (t target)))) - (error + ((debug error) ;; Cleanup work directory and work files. (funcall --cleanup-xml-buffers) (message "OpenDocument export failed: %s" -- 2.11.4.GIT