changeset 111063:4430b518c7c5

shr.el: (shr-tag-table): Support caption, thead, and tfoot.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Wed, 20 Oct 2010 07:31:25 +0000
parents 387ef32f980b
children c9f6036480c9
files lisp/gnus/ChangeLog lisp/gnus/shr.el
diffstat 2 files changed, 53 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/gnus/ChangeLog	Tue Oct 19 20:55:30 2010 -0700
+++ b/lisp/gnus/ChangeLog	Wed Oct 20 07:31:25 2010 +0000
@@ -2,6 +2,8 @@
 
 	* shr.el (shr-find-fill-point): Shorten line if the preceding char is
 	kinsoku-eol regardless of shr-kinsoku-shorten.
+	(shr-tag-table-1): Rename from shr-tag-table; make it a subroutine.
+	(shr-tag-table): Support caption, thead, and tfoot.
 
 2010-10-19  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
--- a/lisp/gnus/shr.el	Tue Oct 19 20:55:30 2010 -0700
+++ b/lisp/gnus/shr.el	Wed Oct 20 07:31:25 2010 +0000
@@ -593,8 +593,7 @@
 ;; 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)
+(defun shr-tag-table-1 (cont)
   (setq cont (or (cdr (assq 'tbody cont))
 		 cont))
   (let* ((shr-inhibit-images t)
@@ -622,6 +621,56 @@
   (dolist (elem (shr-find-elements cont 'img))
     (shr-tag-img (cdr elem))))
 
+(defun shr-tag-table (cont)
+  (shr-ensure-paragraph)
+  (let* ((caption (cdr (assq 'caption cont)))
+	 (header (cdr (assq 'thead cont)))
+	 (body (or (cdr (assq 'tbody cont)) cont))
+	 (footer (cdr (assq 'tfoot cont)))
+	 (nheader (if header (shr-max-columns header)))
+	 (nbody (if body (shr-max-columns body)))
+	 (nfooter (if footer (shr-max-columns footer))))
+    (shr-tag-table-1
+     (nconc
+      (if caption `((tr (td ,@caption))))
+      (if header
+	  (if footer
+	      ;; header + body + footer
+	      (if (= nheader nbody)
+		  (if (= nbody nfooter)
+		      `((tr (td (table (tbody ,@header ,@body ,@footer)))))
+		    (if (= nfooter 1)
+			`((tr (td (table (tbody ,@header ,@body))))
+			  ,@footer)
+		      `((tr (td (table (tbody ,@header ,@body))))
+			(tr (td (table (tbody ,@footer)))))))
+		(if (= nbody nfooter)
+		    `((tr (td (table (tbody ,@header))))
+		      (tr (td (table (tbody ,@body ,@footer)))))
+		  (if (= nfooter 1)
+		      `((tr (td (table (tbody ,@header))))
+			(tr (td (table (tbody ,@body))))
+			,@footer)
+		    `((tr (td (table (tbody ,@header))))
+		      (tr (td (table (tbody ,@body))))
+		      (tr (td (table (tbody ,@footer))))))))
+	    ;; header + body
+	    (if (= nheader nbody)
+		`((tr (td (table (tbody ,@header ,@body)))))
+	      (if (= nheader 1)
+		  `(,@header (tr (td (table (tbody ,@body)))))
+		`((tr (td (table (tbody ,@header))))
+		  (tr (td (table (tbody ,@body))))))))
+	(if footer
+	    ;; body + footer
+	    (if (= nbody nfooter)
+		`((tr (td (table (tbody ,@body ,@footer)))))
+	      (if (= nfooter 1)
+		  `((tr (td (table (tbody ,@body)))) ,@footer)
+		`((tr (td (table (tbody ,@body))))
+		  (tr (td (table (tbody ,@footer)))))))
+	  body))))))
+
 (defun shr-find-elements (cont type)
   (let (result)
     (dolist (elem cont)