emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Thibault Marin <thibault.marin@gmx.com>
To: "Clément Pit--Claudel" <clement.pit@gmail.com>
Cc: emacs-orgmode@gnu.org
Subject: Re: Multiple bibliography files with ox-bibtex and html export
Date: Tue, 27 Sep 2016 22:50:16 -0500	[thread overview]
Message-ID: <878tucznrb.fsf@dell-desktop.WORKGROUP> (raw)
In-Reply-To: <49a92389-9eeb-84b9-fc5f-054aa6d7b2c2@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 1083 bytes --]


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


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ox-bibtex.el-Support-multiple-bib-files-in-HTML-expo.patch --]
[-- Type: text/x-diff, Size: 4023 bytes --]

From 66edb29f79ddcdf90a47cd8626fb9f04167f5997 Mon Sep 17 00:00:00 2001
From: thibault <thibault.marin@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	other threads:[~2016-09-28  3:50 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-24  4:14 Multiple bibliography files with ox-bibtex and html export Thibault Marin
2016-09-06  9:09 ` Nicolas Goaziou
2016-09-07  3:46   ` Thibault Marin
2016-09-07  4:11     ` Clément Pit--Claudel
2016-09-09  3:55       ` Thibault Marin
2016-09-10  6:07       ` Thibault Marin
2016-09-10 16:31         ` Clément Pit--Claudel
2016-09-28  3:50           ` Thibault Marin [this message]
2016-11-16  5:31             ` Thibault Marin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=878tucznrb.fsf@dell-desktop.WORKGROUP \
    --to=thibault.marin@gmx.com \
    --cc=clement.pit@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).