changeset 110778:5a595f515d1c

shr.el (shr-render-td): Allow blank/missing <TD>s. shr.el: Document the table-rendering algorithm.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Tue, 05 Oct 2010 23:42:01 +0000
parents 895607aec71e
children 9d935b7bf464
files lisp/gnus/ChangeLog lisp/gnus/shr.el
diffstat 2 files changed, 39 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/gnus/ChangeLog	Tue Oct 05 22:43:06 2010 +0000
+++ b/lisp/gnus/ChangeLog	Tue Oct 05 23:42:01 2010 +0000
@@ -1,5 +1,9 @@
 2010-10-05  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
+	* shr.el (shr-render-td): Allow blank/missing <TD>s.
+
+	* shr.el: Document the table-rendering algorithm.
+
 	* gnus-html.el (gnus-html-schedule-image-fetching): Protect against
 	invalid URLs.
 
--- a/lisp/gnus/shr.el	Tue Oct 05 22:43:06 2010 +0000
+++ b/lisp/gnus/shr.el	Tue Oct 05 23:42:01 2010 +0000
@@ -427,16 +427,33 @@
   (apply #'shr-fontize-cont cont types)
   (shr-ensure-paragraph))
 
+;; Table rendering is the only complicated thing here.  We do this by
+;; first counting how many TDs there are in each TR, and registering
+;; how wide they think they should be ("width=45%", etc).  Then we
+;; render each TD separately (this is done in temporary buffers, so
+;; that we can use all the rendering machinery as if we were in the
+;; main buffer).  Now we know how much space each TD really takes, so
+;; we then render everything again with the new widths, and finally
+;; insert all these boxes into the main buffer.
 (defun shr-tag-table (cont)
   (shr-ensure-paragraph)
   (setq cont (or (cdr (assq 'tbody cont))
 		 cont))
   (let* ((shr-inhibit-images t)
+	 ;; Find all suggested widths.
 	 (columns (shr-column-specs cont))
+	 ;; Compute how many characters wide each TD should be.
 	 (suggested-widths (shr-pro-rate-columns columns))
+	 ;; Do a "test rendering" to see how big each TD is (this can
+	 ;; be smaller (if there's little text) or bigger (if there's
+	 ;; unbreakable text).
 	 (sketch (shr-make-table cont suggested-widths))
 	 (sketch-widths (shr-table-widths sketch (length suggested-widths))))
+    ;; Then render the table again with these new "hard" widths.
     (shr-insert-table (shr-make-table cont sketch-widths t) sketch-widths))
+  ;; Finally, insert all the images after the table.  The Emacs buffer
+  ;; model isn't strong enough to allow us to put the images actually
+  ;; into the tables.
   (dolist (elem (shr-find-elements cont 'img))
     (shr-tag-img (cdr elem))))
 
@@ -506,10 +523,14 @@
   (let ((trs nil))
     (dolist (row cont)
       (when (eq (car row) 'tr)
-	(let ((i 0)
-	      (tds nil))
-	  (dolist (column (cdr row))
-	    (when (memq (car column) '(td th))
+	(let ((tds nil)
+	      (columns (cdr row))
+	      (i 0)
+	      column)
+	  (while (< i (length widths))
+	    (setq column (pop columns))
+	    (when (or (memq (car column) '(td th))
+		      (null column))
 	      (push (shr-render-td (cdr column) (aref widths i) fill)
 		    tds)
 	      (setq i (1+ i))))
@@ -531,11 +552,16 @@
 	(forward-line 1))
       (when fill
 	(goto-char (point-min))
-	(while (not (eobp))
-	  (end-of-line)
-	  (when (> (- width (current-column)) 0)
-	    (insert (make-string (- width (current-column)) ? )))
-	  (forward-line 1)))
+	;; If the buffer is totally empty, then put a single blank
+	;; line here.
+	(if (zerop (buffer-size))
+	    (insert (make-string width ? ))
+	  ;; Otherwise, fill the buffer.
+	  (while (not (eobp))
+	    (end-of-line)
+	    (when (> (- width (current-column)) 0)
+	      (insert (make-string (- width (current-column)) ? )))
+	    (forward-line 1))))
       (list max
 	    (count-lines (point-min) (point-max))
 	    (buffer-string)