summaryrefslogtreecommitdiff
path: root/lisp/gnus/shr.el
diff options
context:
space:
mode:
authorGnus developers <ding@gnus.org>2010-10-07 11:46:01 +0000
committerKatsumi Yamaoka <yamaoka@jpl.org>2010-10-07 11:46:01 +0000
commita7dcc87b1b2ce2c4d8c4d26a95cbdb3df1b67a20 (patch)
treeac84596aa1e9ebec399c021664f3d0fb3b8413f4 /lisp/gnus/shr.el
parentb0e0b216e540ffcde8a0ec8f0c572bb90c464eb9 (diff)
downloademacs-a7dcc87b1b2ce2c4d8c4d26a95cbdb3df1b67a20.tar.gz
Merge changes made in Gnus trunk.
nnimap.el (nnimap-request-rename-group): Add this method. shr.el: Keep track of the natural width of TD elements, so we know which ones to expand. shr.el: Expand TD elements to fill available space.
Diffstat (limited to 'lisp/gnus/shr.el')
-rw-r--r--lisp/gnus/shr.el61
1 files changed, 48 insertions, 13 deletions
diff --git a/lisp/gnus/shr.el b/lisp/gnus/shr.el
index 1c496ced543..ffbb4302924 100644
--- a/lisp/gnus/shr.el
+++ b/lisp/gnus/shr.el
@@ -184,7 +184,8 @@ redirects somewhere else."
((and (or (not first)
(eq shr-state 'space))
(> (+ column (length elem) 1) shr-width))
- (insert "\n"))
+ (insert "\n")
+ (put-text-property (1- (point)) (point) 'shr-break t))
((not first)
(insert " "))))
(setq first nil)
@@ -459,7 +460,7 @@ Return a string with image data."
;; 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))))
+ (sketch-widths (shr-table-widths sketch 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
@@ -490,7 +491,7 @@ Return a string with image data."
(insert "|\n"))
(dolist (column row)
(goto-char start)
- (let ((lines (split-string (nth 2 column) "\n"))
+ (let ((lines (nth 2 column))
(overlay-lines (nth 3 column))
overlay overlay-line)
(dolist (line lines)
@@ -520,14 +521,33 @@ Return a string with image data."
(insert (make-string (aref widths i) ?-) ?+))
(insert "\n"))
-(defun shr-table-widths (table length)
- (let ((widths (make-vector length 0)))
+(defun shr-table-widths (table suggested-widths)
+ (let* ((length (length suggested-widths))
+ (widths (make-vector length 0))
+ (natural-widths (make-vector length 0)))
(dolist (row table)
(let ((i 0))
(dolist (column row)
(aset widths i (max (aref widths i)
(car column)))
- (incf i))))
+ (aset natural-widths i (max (aref natural-widths i)
+ (cadr column)))
+ (setq i (1+ i)))))
+ (let ((extra (- (reduce '+ suggested-widths)
+ (reduce '+ widths)))
+ (expanded-columns 0))
+ (when (> extra 0)
+ (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))))))))
widths))
(defun shr-make-table (cont widths &optional fill)
@@ -575,11 +595,26 @@ Return a string with image data."
(when (> (- width (current-column)) 0)
(insert (make-string (- width (current-column)) ? )))
(forward-line 1))))
- (list max
- (count-lines (point-min) (point-max))
- (buffer-string)
- (and fill
- (shr-collect-overlays))))))
+ (if fill
+ (list max
+ (count-lines (point-min) (point-max))
+ (split-string (buffer-string) "\n")
+ (shr-collect-overlays))
+ (list max
+ (shr-natural-width))))))
+
+(defun shr-natural-width ()
+ (goto-char (point-min))
+ (let ((current 0)
+ (max 0))
+ (while (not (eobp))
+ (end-of-line)
+ (setq current (+ current (current-column)))
+ (unless (get-text-property (point) 'shr-break)
+ (setq max (max max current)
+ current 0))
+ (forward-line 1))
+ max))
(defun shr-collect-overlays ()
(save-excursion
@@ -608,12 +643,12 @@ Return a string with image data."
(let ((total-percentage 0)
(widths (make-vector (length columns) 0)))
(dotimes (i (length columns))
- (incf total-percentage (aref columns i)))
+ (setq total-percentage (+ total-percentage (aref columns i))))
(setq total-percentage (/ 1.0 total-percentage))
(dotimes (i (length columns))
(aset widths i (max (truncate (* (aref columns i)
total-percentage
- shr-width))
+ (- shr-width (1+ (length columns)))))
10)))
widths))