((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)
;; 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
(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)
(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)
(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
(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))