Merge branch 'master' of https://git.gnus.org/gnus
authorLars Magne Ingebrigtsen <larsi@quimbies.gnus.org>
Fri, 15 Oct 2010 09:50:44 +0000 (11:50 +0200)
committerLars Magne Ingebrigtsen <larsi@quimbies.gnus.org>
Fri, 15 Oct 2010 09:50:44 +0000 (11:50 +0200)
1  2 
lisp/shr.el

diff --combined lisp/shr.el
@@@ -218,20 -218,35 +218,35 @@@ redirects somewhere else.
        ;; starts.
        (unless shr-start
          (setq shr-start (point)))
+       ;; No space is needed before or after a breakable character or
+       ;; at the beginning of a line.
+       (when (and (eq (preceding-char) ? )
+                  (or (= (line-beginning-position) (1- (point)))
+                      (aref fill-find-break-point-function-table
+                            (char-after (- (point) 2)))
+                      (aref fill-find-break-point-function-table
+                            (aref elem 0))))
+         (delete-char -1))
        (insert elem)
        (while (> (current-column) shr-width)
-         (if (not (shr-find-fill-point))
-             (insert "\n")
-           (delete-char 1)
-           (insert "\n")
+         (unless (prog1
+                     (shr-find-fill-point)
+                   (when (eq (preceding-char) ? )
+                     (delete-char -1))
+                   (insert "\n"))
            (put-text-property (1- (point)) (point) 'shr-break t)
-           (when (> shr-indentation 0)
-             (shr-indent))
-           (end-of-line)))
+           ;; No space is needed at the beginning of a line.
+           (if (eq (following-char) ? )
+               (delete-char 1)))
+         (when (> shr-indentation 0)
+           (shr-indent))
+         (end-of-line))
        (insert " "))
        (unless (string-match "[ \t\n]\\'" text)
        (delete-char -1))))))
  
+ (eval-and-compile (autoload 'kinsoku-longer "kinsoku"))
  (defun shr-find-fill-point ()
    (let ((found nil))
      (while (and (not found)
                     (aref fill-find-break-point-function-table
                           (preceding-char)))
                 (<= (current-column) shr-width))
-       (setq found (point)))
-       (backward-char 1))
-     (or found
-       (end-of-line))))
+       (setq found t))
+       (backward-char 1)
+       (when (bolp)
+       ;; There's no breakable point, so we give it up.
+       (end-of-line)
+       (while (aref fill-find-break-point-function-table
+                    (preceding-char))
+         (backward-char 1))
+       (setq found 'failed)))
+     (cond ((eq found t)
+          ;; Don't put kinsoku-bol characters at the beginning of a line.
+          (or (eobp)
+              (kinsoku-longer)
+              (not (aref fill-find-break-point-function-table
+                         (following-char)))
+              (forward-char 1)))
+         (found t)
+         (t
+          (end-of-line)
+          nil))))
  
  (defun shr-ensure-newline ()
    (unless (zerop (current-column))
@@@ -390,65 -421,64 +421,65 @@@ Return a string with image data.
    (browse-url-url-encode-chars url "[)$ ]"))
  
  (defun shr-tag-img (cont)
 -  (when (and (> (current-column) 0)
 -           (not (eq shr-state 'image)))
 -    (insert "\n"))
 -  (let ((alt (cdr (assq :alt cont)))
 -        (url (cdr (assq :src cont)))
 -        (width (cdr (assq :width cont))))
 -    ;; Only respect align if width specified.
 -    (when width
 -      ;; Check that width is not larger than max width, otherwise ignore
 -      ;; align
 -      (let ((max-width (* shr-width (frame-char-width)))
 -            (width (string-to-number width)))
 -        (when (< width max-width)
 -          (let ((align (cdr (assq :align cont))))
 -            (cond
 -           ((string= align "right")
 -            (insert (propertize
 -                     " " 'display
 -                     `(space . (:align-to
 -                                ,(list (- max-width width)))))))
 -           ((string= align "center")
 -            (insert (propertize
 -                     " " 'display
 -                     `(space . (:balign-to
 -                                ,(list (- (/ max-width 2) width))))))))))))
 -    (let ((start (point-marker)))
 -      (when (zerop (length alt))
 -        (setq alt "[img]"))
 -      (cond
 -       ((and (not shr-inhibit-images)
 -             (string-match "\\`cid:" url))
 -        (let ((url (substring url (match-end 0)))
 -            image)
 -        (if (or (not shr-content-function)
 -                (not (setq image (funcall shr-content-function url))))
 -            (insert alt)
 -          (shr-put-image image (point) alt))))
 -       ((or shr-inhibit-images
 -          (and shr-blocked-images
 -               (string-match shr-blocked-images url)))
 -      (setq shr-start (point))
 -      (let ((shr-state 'space))
 -        (if (> (length alt) 8)
 -            (shr-insert (substring alt 0 8))
 -          (shr-insert alt))))
 -       ((url-is-cached (shr-encode-url url))
 -      (shr-put-image (shr-get-image-data url) (point) alt))
 -       (t
 -      (insert alt)
 -      (ignore-errors
 -        (url-retrieve (shr-encode-url url) 'shr-image-fetched
 -                      (list (current-buffer) start (point-marker))
 -                      t))))
 -      (insert " ")
 -      (put-text-property start (point) 'keymap shr-map)
 -      (put-text-property start (point) 'shr-alt alt)
 -      (put-text-property start (point) 'shr-image url)
 -      (setq shr-state 'image))))
 +  (when cont
 +    (when (and (> (current-column) 0)
 +             (not (eq shr-state 'image)))
 +      (insert "\n"))
 +    (let ((alt (cdr (assq :alt cont)))
 +        (url (cdr (assq :src cont)))
 +        (width (cdr (assq :width cont))))
 +      ;; Only respect align if width specified.
 +      (when width
 +      ;; Check that width is not larger than max width, otherwise ignore
 +      ;; align
 +      (let ((max-width (* shr-width (frame-char-width)))
 +            (width (string-to-number width)))
 +        (when (< width max-width)
 +          (let ((align (cdr (assq :align cont))))
 +            (cond
 +             ((string= align "right")
 +              (insert (propertize
 +                       " " 'display
 +                       `(space . (:align-to
 +                                  ,(list (- max-width width)))))))
 +             ((string= align "center")
 +              (insert (propertize
 +                       " " 'display
 +                       `(space . (:balign-to
 +                                  ,(list (- (/ max-width 2) width))))))))))))
 +      (let ((start (point-marker)))
 +      (when (zerop (length alt))
 +        (setq alt "[img]"))
 +      (cond
 +       ((and (not shr-inhibit-images)
 +             (string-match "\\`cid:" url))
 +        (let ((url (substring url (match-end 0)))
 +              image)
 +          (if (or (not shr-content-function)
 +                  (not (setq image (funcall shr-content-function url))))
 +              (insert alt)
 +            (shr-put-image image (point) alt))))
 +       ((or shr-inhibit-images
 +            (and shr-blocked-images
 +                 (string-match shr-blocked-images url)))
 +        (setq shr-start (point))
 +        (let ((shr-state 'space))
 +          (if (> (length alt) 8)
 +              (shr-insert (substring alt 0 8))
 +            (shr-insert alt))))
 +       ((url-is-cached (shr-encode-url url))
 +        (shr-put-image (shr-get-image-data url) (point) alt))
 +       (t
 +        (insert alt)
 +        (ignore-errors
 +          (url-retrieve (shr-encode-url url) 'shr-image-fetched
 +                        (list (current-buffer) start (point-marker))
 +                        t))))
 +      (insert " ")
 +      (put-text-property start (point) 'keymap shr-map)
 +      (put-text-property start (point) 'shr-alt alt)
 +      (put-text-property start (point) 'shr-image url)
 +      (setq shr-state 'image)))))
  
  (defun shr-tag-pre (cont)
    (let ((shr-folding-mode 'none))