Hi, sorry for the delay, I was away for a while.

> I'd suggest 2 :) But not that I don't use this feature.
>
> It should be easy to unify the code: something along the lines of starting 
> the process, and then looping over bibtex files and sending them one by one 
> to bibtex2html's standard input.
>
> Cheers,
> Clément.

Please find attached a tentative patch using `process-send-string'.  It seems to
work on my test cases, but I don't know how to wait for the bibtex2html process
to finish before processing the output.  I am currently using a while loop (see
l. 96 of the patch or l. 256 of the patched ox-bibtex.el) combined with a
sentinel changing the while condition upon completion.  This seems suboptimal
but I don't know how to achieve that more elegantly.

I still have a few questions:
1. How can I wait on the subprocess to complete after all the bib files have
   been passed via stdin?
2. Why is this approach preferred over concatenating bib files and delegating
   processing to the bibtex2html executable?

Thanks for the help,
thibault

>From 66edb29f79ddcdf90a47cd8626fb9f04167f5997 Mon Sep 17 00:00:00 2001
From: thibault <thibault.ma...@gmx.com>
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

Reply via email to