Subject: Running htmlfontify in batch mode

From: Masatake YAMATO <[email-masked]>
Date: Fri, 21 May 2010 23:30:28 +0900 (JST)

This is a bug report with a patch which fixes the bug. 
Please, include the patch to the official emacs tree if appreciated.

I'm trying to convert a source code to a html file with
htmlfontify.el. I'd like to do it in a batch job.

With the following script(CONVERTER) and command line I expect
I can convert a source code file into html format:

---------------------------------------------------------------
#!/home/yamato/var/emacs/src/emacs --script
; CONVERTER
(defun print-to-stderr (str)
  (mapcar 'external-debugging-output str))

(let ((input (car argv))
      (output (cadr argv)))
  (unless input
    (print-to-stderr "*** No INPUT is given\n")
    (kill-emacs 1)
    )
  (unless output
    (print-to-stderr "*** No OUTPUT is given\n")
    (kill-emacs 1)
    )
  (unless (file-readable-p input)
    (print-to-stderr (format "*** Cannot read %s\n" 
			     input))
    (kill-exit 1)
    )
  (unless (file-writable-p output)
    (print-to-stderr (format "*** Cannot write %s\n" 
			     output))
    (kill-emacs 1)
    )
  (let ((srcdir (or (file-name-directory input) "./"))
	(dstdir output)
	(file (file-name-nondirectory input)))
    (require 'htmlfontify)

    (htmlfontify-load-rgb-file)
    (let ((hfy-display-class '((type . x-toolkit)
			       (class . color)
			       (background . light))))
      (hfy-copy-and-fontify-file srcdir dstdir file))))
---------------------------------------------------------------

$ ./CONVERTER  emacs/src/epaths.h /tmp/

But, the command line is failed because htmlfontify.el tries to
modify data in pure storage.

With following patch it works as I expected.

2010-05-21  Masatake YAMATO  <[email-masked]>

	* htmlfontify.el (hfy-face-attr-for-class): Use `append'
	instead of  `nconc'.

=== modified file 'lisp/htmlfontify.el'
*** lisp/htmlfontify.el	2010-04-24 02:36:43 +0000
--- lisp/htmlfontify.el	2010-05-21 14:18:31 +0000
***************
*** 926,932 ****
                 new-spec)))))
      (if (or (memq :inherit face-spec) (eq 'default face))
          face-spec
!       (nconc face-spec (list :inherit 'default))) ))
  
  ;; construct an assoc of (css-tag-name . css-tag-value) pairs
  ;; from a face or assoc of face attributes:
--- 926,936 ----
                 new-spec)))))
      (if (or (memq :inherit face-spec) (eq 'default face))
          face-spec
!       ;; We cannot use `nconc' here.
!       ;; As far as I inspected, (get face 'face-defface-spec) in
!       ;; `hfy-combined-face-spec' returns data at pure storage
!       ;; if noninteractive.
!       (append face-spec (list :inherit 'default))) ))
  
  ;; construct an assoc of (css-tag-name . css-tag-value) pairs
  ;; from a face or assoc of face attributes: