Merge remote branch 'origin/no-gnus'
[gnus] / lisp / shr.el
index 954e974..5021eab 100644 (file)
@@ -375,8 +375,8 @@ size, and full-buffer size."
          (when (eq (preceding-char) ? )
            (delete-char -1))
          (insert "\n")
+         (put-text-property (1- (point)) (point) 'shr-break t)
          (unless found
-           (put-text-property (1- (point)) (point) 'shr-break t)
            ;; No space is needed at the beginning of a line.
            (when (eq (following-char) ? )
              (delete-char 1)))
@@ -1257,21 +1257,26 @@ ones, in case fg and bg are nil."
          (aset natural-widths i (max (aref natural-widths i)
                                      (cadr column)))
          (setq i (1+ i)))))
-    (let ((extra (- (apply '+ (append suggested-widths nil))
-                   (apply '+ (append widths nil))))
-         (expanded-columns 0))
+    (let* ((total-suggested (apply '+ (append suggested-widths nil)))
+          (total-actual (apply '+ (append widths nil)))
+          (extra (- total-suggested
+                    total-actual
+                    ;; TD separators.
+                    (length widths)
+                    ;; Table separators + fence.
+                    3
+                    (* 2 shr-table-depth)))
+          (expanded-columns 0))
+      ;; We have extra, unused space, so divide this space amongst the
+      ;; columns.
       (when (> extra 0)
+       ;; If the natural width is wider than the rendered width, we
+       ;; want to allow the column to expand.
        (dotimes (i length)
-         ;; If the natural width is wider than the rendered width, we
-         ;; want to allow the column to expand.
-         (when (> (aref natural-widths i) (aref widths i))
-           (setq expanded-columns (1+ expanded-columns))))
-       (dotimes (i length)
-         (when (> (aref natural-widths i) (aref widths i))
-           (aset widths i (min
-                           (1+ (aref natural-widths i))
-                           (+ (/ extra expanded-columns)
-                              (aref widths i))))))))
+         (when (> (aref natural-widths i) 0)
+           (aset widths i (+ (truncate (* (/ extra (* 1.0 total-actual))
+                                          (aref widths i)))
+                             (aref widths i)))))))
     widths))
 
 (defun shr-make-table (cont widths &optional fill)
@@ -1324,10 +1329,13 @@ ones, in case fg and bg are nil."
          (let ((shr-width width)
                (shr-indentation 0))
            (shr-descend (cons 'td cont)))
+         ;; Delete padding at the bottom of the TDs.
          (delete-region
           (point)
-          (+ (point)
-             (skip-chars-backward " \t\n")))
+          (progn
+            (skip-chars-backward " \t\n")
+            (end-of-line)
+            (point)))
          (push (list (cons width cont) (buffer-string)
                      (shr-overlays-in-region (point-min) (point-max)))
                shr-content-cache)))
@@ -1371,7 +1379,8 @@ ones, in case fg and bg are nil."
     (while (not (eobp))
       (end-of-line)
       (setq current (+ current (current-column)))
-      (unless (get-text-property (point) 'shr-break)
+      (if (get-text-property (point) 'shr-break)
+         (incf current)
        (setq max (max max current)
              current 0))
       (forward-line 1))
@@ -1423,10 +1432,10 @@ ones, in case fg and bg are nil."
            (when (memq (car column) '(td th))
              (let ((width (cdr (assq :width (cdr column)))))
                (when (and width
-                          (string-match "\\([0-9]+\\)%" width))
-                 (aset columns i
-                       (/ (string-to-number (match-string 1 width))
-                          100.0))))
+                          (string-match "\\([0-9]+\\)%" width)
+                          (not (zerop (setq width (string-to-number
+                                                   (match-string 1 width))))))
+                 (aset columns i (/ width 100.0))))
              (setq i (1+ i)))))))
     columns))