>From c3056a453efb8bdd39e1dfd6fe4f75090cd1a584 Mon Sep 17 00:00:00 2001 From: thibault Date: Tue, 27 Sep 2016 22:36:57 -0500 Subject: [PATCH] ox-bibtex.el: Support multiple bib files in HTML export * contrib/lisp/ox-bibtex.el (org-bibtex-process-bib-files): Pass input bibliography files to asynchronous bibtex2html process. --- contrib/lisp/ox-bibtex.el | 69 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/contrib/lisp/ox-bibtex.el b/contrib/lisp/ox-bibtex.el index 56dec38..ca7839f 100644 --- a/contrib/lisp/ox-bibtex.el +++ b/contrib/lisp/ox-bibtex.el @@ -188,18 +188,26 @@ Return new parse tree." (lambda (keyword) (when (equal (org-element-property :key keyword) "BIBLIOGRAPHY") (let ((arguments (org-bibtex-get-arguments keyword)) - (file (org-bibtex-get-file keyword)) + (files (split-string (org-bibtex-get-file keyword) ",")) temp-file out-file) ;; Test if filename is given with .bib-extension and strip - ;; it off. Filenames with another extensions will be + ;; it off. Filenames with another extensions will be ;; untouched and will finally rise an error in bibtex2html. - (setq file (if (equal (file-name-extension file) "bib") - (file-name-sans-extension file) file)) - ;; Outpufiles of bibtex2html will be put into current working directory - ;; so define a variable for this. - (setq out-file (file-name-sans-extension - (file-name-nondirectory file))) + (setq files + (mapcar + (lambda (file) + (if (equal (file-name-extension file) "bib") + (file-name-sans-extension file) + file)) + files)) + ;; Output files of bibtex2html will be put into current + ;; working directory so define a variable for this. + (setq out-file + (if (> (length files) 1) + (concat (buffer-file-name) "-combined") + (file-name-sans-extension + (file-name-nondirectory (car files))))) ;; limit is set: collect citations throughout the document ;; in TEMP-FILE and pass it to "bibtex2html" as "-citefile" ;; argument. @@ -216,18 +224,39 @@ Return new parse tree." :options (append (plist-get arguments :options) (list "-citefile" temp-file)))))) - ;; Call "bibtex2html" on specified file. - (unless (eq 0 (apply - 'call-process - (append '("bibtex2html" nil nil nil) - '("-a" "-nodoc" "-noheader" "-nofooter") - (let ((style - (org-not-nil - (org-bibtex-get-style keyword)))) - (and style (list "--style" style))) - (plist-get arguments :options) - (list (concat file ".bib"))))) - (error "Executing bibtex2html failed")) + ;; Call "bibtex2html" on specified files. + (let ((process-complete nil) + (bibtex2html-proc + (or + (apply + 'start-process + (append '("bibtex2html" "*bibtex2html-proc*") + '("bibtex2html" "-a" "-nodoc" + "-noheader" "-nofooter") + (let ((style + (org-not-nil + (org-bibtex-get-style keyword)))) + (and style (list "--style" style))) + (plist-get arguments :options) + `("-o" ,out-file))) + (error "Unable to start bibtex2html process")))) + (when bibtex2html-proc + (set-process-sentinel + bibtex2html-proc + (lambda (process event) + (when (equal event "finished\n") + (setq process-complete t)))) + (dolist (file files) + (let ((file-content + (with-temp-buffer + (insert-file-contents (concat file ".bib")) + (buffer-string)))) + (process-send-string bibtex2html-proc file-content))) + (process-send-eof bibtex2html-proc)) + ;; FIXME: How to wait for process to finish? + (while (not process-complete) + (accept-process-output bibtex2html-proc) + (sit-for 1))) (and temp-file (delete-file temp-file)) ;; Open produced HTML file, and collect Bibtex key names (with-temp-buffer -- 2.9.3