shr.el: (shr-tag-table): Support caption, thead, and tfoot.
authorKatsumi Yamaoka <yamaoka@jpl.org>
Wed, 20 Oct 2010 07:28:50 +0000 (07:28 +0000)
committerKatsumi Yamaoka <yamaoka@jpl.org>
Wed, 20 Oct 2010 07:28:50 +0000 (07:28 +0000)
lisp/ChangeLog
lisp/shr.el

index da01401..5a798ce 100644 (file)
@@ -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>
 
index d7a5fb3..9183e98 100644 (file)
@@ -593,8 +593,7 @@ Return a string with image data."
 ;; 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 @@ Return a string with image data."
   (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)