Function: shr-fill-line

shr-fill-line is a byte-compiled function defined in shr.el.gz.

Signature

(shr-fill-line)

Documentation

Indent and fill the current line.

When shr-fill-text(var)/shr-fill-text(fun) is nil, only indent.

Source Code

;; Defined in /usr/src/emacs/lisp/net/shr.el.gz
(defun shr-fill-line ()
  "Indent and fill the current line.
When `shr-fill-text' is nil, only indent."
  (let ((shr-indentation (or (get-text-property (point) 'shr-indentation)
                             shr-indentation))
	(continuation (get-text-property
		       (point) 'shr-continuation-indentation))
	start)
    (put-text-property (point) (1+ (point)) 'shr-indentation nil)
    (let ((face (get-text-property (point) 'face))
	  (background-start (point)))
      (shr-indent)
      (when face
	(put-text-property background-start (point) 'face
			   `,(shr-face-background face))))
    (setq start (point))
    (setq shr-indentation (or continuation shr-indentation))
    ;; Fill the current line, unless `shr-fill-text' is unset, or we
    ;; have an indentation that's wider than the width we're trying to
    ;; fill to.
    (when (and shr-fill-text
               (< shr-indentation shr-internal-width))
      (shr-vertical-motion shr-internal-width)
      (when (looking-at " $")
        (delete-region (point) (line-end-position)))
      (while (not (eolp))
        ;; We have to do some folding.  First find the first
        ;; previous point suitable for folding.
        (if (or (not (pixel-fill-find-fill-point (line-beginning-position)))
                (= (point) start))
	    ;; We had unbreakable text (for this width), so just go to
	    ;; the first space and carry on.
	    (progn
	      (beginning-of-line)
	      (skip-chars-forward " ")
	      (search-forward " " (line-end-position) 'move)))
        ;; Success; continue.
        (when (= (preceding-char) ?\s)
	  (delete-char -1))
        (let ((gap-start (point))
              (face (get-text-property (point) 'face)))
          ;; Extend the background to the end of the line.
          (insert ?\n)
	  (shr-indent)
          (when face
            (put-text-property gap-start (point)
                               'face (shr-face-background face)))
          (when (and (> (1- gap-start) (point-min))
                     (get-text-property (point) 'shr-url)
                     ;; The link on both sides of the newline are the
                     ;; same...
                     (equal (get-text-property (point) 'shr-url)
                            (get-text-property (1- gap-start) 'shr-url)))
            ;; ... so we join the two bits into one link logically, but
            ;; not visually.  This makes navigation between links work
            ;; well, but avoids underscores before the link on the next
            ;; line when indented.
            (let* ((props (copy-sequence (text-properties-at (point))))
                   (face (plist-get props 'face)))
              ;; We don't want to use the faces on the indentation, because
              ;; that's ugly, but we do want to use the background color.
              (when face
                (setq props (plist-put props 'face (shr-face-background face))))
	      (add-text-properties gap-start (point) props))))
        (setq start (point))
        (shr-vertical-motion shr-internal-width)
        (when (looking-at " $")
	  (delete-region (point) (line-end-position)))))))