Function: newsticker--buffer-do-insert-text
newsticker--buffer-do-insert-text is a byte-compiled function defined
in newst-plainview.el.gz.
Signature
(newsticker--buffer-do-insert-text ITEM TYPE FEED-NAME-SYMBOL)
Documentation
Actually insert contents of news item, format it, render it and all that.
ITEM is a news item, TYPE tells which part of the item shall be inserted, FEED-NAME-SYMBOL tells to which feed this item belongs.
Source Code
;; Defined in /usr/src/emacs/lisp/net/newst-plainview.el.gz
(defun newsticker--buffer-do-insert-text (item type feed-name-symbol)
"Actually insert contents of news item, format it, render it and all that.
ITEM is a news item, TYPE tells which part of the item shall be inserted,
FEED-NAME-SYMBOL tells to which feed this item belongs."
(let* ((pos (point))
(format newsticker-desc-format)
(pos-date-start nil)
(pos-date-end nil)
(pos-stat-start nil)
(pos-stat-end nil)
(pos-text-start nil)
(pos-text-end nil)
(pos-extra-start nil)
(pos-extra-end nil)
(pos-enclosure-start nil)
(pos-enclosure-end nil)
(age (newsticker--age item))
(preformatted-contents (newsticker--preformatted-contents item))
(preformatted-title (newsticker--preformatted-title item)))
(cond ((and preformatted-contents
(not (eq (aref preformatted-contents 0) ?\n));; we must
;; NOT have a line
;; break!
(eq type 'desc))
(insert preformatted-contents))
((and preformatted-title
(not (eq (aref preformatted-title 0) ?\n));; we must NOT have a
;; line break!
(eq type 'item))
(insert preformatted-title))
(t
;; item was not formatted before.
;; Let's go.
(if (eq type 'item)
(setq format newsticker-item-format)
(if (eq type 'feed)
(setq format newsticker-heading-format)))
(while (> (length format) 0)
(let ((prefix (if (> (length format) 1)
(substring format 0 2)
"")))
(cond ((string= "%c" prefix)
;; contents
(when (newsticker--desc item)
(setq pos-text-start (point-marker))
(insert (newsticker--desc item))
(setq pos-text-end (point-marker)))
(setq format (substring format 2)))
((string= "%d" prefix)
;; date
(setq pos-date-start (point-marker))
(if (newsticker--time item)
(insert (format-time-string newsticker-date-format
(newsticker--time item))))
(setq pos-date-end (point-marker))
(setq format (substring format 2)))
((string= "%l" prefix)
;; logo
(let ((disabled (cond ((eq (newsticker--age item) 'feed)
(= (newsticker--stat-num-items
feed-name-symbol 'new) 0))
(t
(not (eq (newsticker--age item)
'new))))))
(let ((img (newsticker--image-read feed-name-symbol
disabled)))
(when img
(newsticker--insert-image img (car item)))))
(setq format (substring format 2)))
((string= "%L" prefix)
;; logo or title
(let ((disabled (cond ((eq (newsticker--age item) 'feed)
(= (newsticker--stat-num-items
feed-name-symbol 'new) 0))
(t
(not (eq (newsticker--age item)
'new))))))
(let ((img (newsticker--image-read feed-name-symbol
disabled)))
(if img
(newsticker--insert-image img (car item))
(when (car item)
(setq pos-text-start (point-marker))
(if (eq (newsticker--age item) 'feed)
(insert (newsticker--title item))
;; FIXME: This is not the "real" title!
(insert (format "%s"
(car (newsticker--cache-get-feed
feed-name-symbol)))))
(setq pos-text-end (point-marker))))))
(setq format (substring format 2)))
((string= "%s" prefix)
;; statistics
(setq pos-stat-start (point-marker))
(if (eq (newsticker--age item) 'feed)
(insert (newsticker--buffer-statistics
feed-name-symbol)))
(setq pos-stat-end (point-marker))
(setq format (substring format 2)))
((string= "%t" prefix)
;; title
(when (car item)
(setq pos-text-start (point-marker))
(insert (car item))
(setq pos-text-end (point-marker)))
(setq format (substring format 2)))
((string-match "%." prefix)
;; unknown specifier!
(insert prefix)
(setq format (substring format 2)))
((string-match "^\\([^%]*\\)\\(.*\\)" format) ;; FIXME!
;; everything else
(let ((p (point)))
(insert (substring format
(match-beginning 1) (match-end 1)))
;; in case that the format string contained newlines
(put-text-property p (point) 'hard t))
(setq format (substring format (match-beginning 2)))))))
;; decode HTML if possible...
(let ((is-rendered-HTML nil))
(when (and newsticker-html-renderer pos-text-start pos-text-end)
(condition-case error-data
(save-excursion
;; check whether it is necessary to call html renderer
;; (regexp inspired by htmlr.el)
(goto-char pos-text-start)
(when (re-search-forward
"</?[A-Za-z1-6]*\\|&#?[A-Za-z0-9]+;" pos-text-end t)
;; (message "%s" (newsticker--title item))
(let ((w3m-fill-column (if newsticker-use-full-width
-1 fill-column))
(w3-maximum-line-length
(if newsticker-use-full-width nil fill-column)))
(save-excursion
(funcall newsticker-html-renderer pos-text-start
pos-text-end)))
(cond ((eq newsticker-html-renderer 'w3m-region)
(add-text-properties pos (point-max)
(list 'keymap
w3m-minor-mode-map)))
((eq newsticker-html-renderer 'w3-region)
(add-text-properties pos (point-max)
(list 'keymap w3-mode-map))))
(setq is-rendered-HTML t)))
(error
(message "Error: HTML rendering failed: %s, %s"
(car error-data) (cdr error-data)))))
;; After html rendering there might be chunks of blank
;; characters between rendered text and date, statistics or
;; whatever. Remove it
(when (and (eq type 'item) is-rendered-HTML)
(goto-char pos)
(while (re-search-forward "[ \t]*\n[ \t]*" nil t)
(replace-match " " nil nil))
(goto-char (point-max)))
(when (and newsticker-justification
(memq type '(item desc))
(not is-rendered-HTML))
(condition-case nil
(let ((use-hard-newlines t))
(fill-region pos (point-max) newsticker-justification))
(error nil))))
;; remove leading and trailing newlines
(goto-char pos)
(unless (= 0 (skip-chars-forward " \t\r\n"))
(delete-region pos (point)))
(goto-char (point-max))
(let ((end (point)))
(unless (= 0 (skip-chars-backward " \t\r\n" (1+ pos)))
(delete-region (point) end)))
(goto-char (point-max))
;; closing newline
(unless nil ;;(eq pos (point))
(insert "\n")
(put-text-property (1- (point)) (point) 'hard t))
;; insert enclosure element
(when (eq type 'desc)
(setq pos-enclosure-start (point))
(newsticker--insert-enclosure item newsticker--url-keymap)
(setq pos-enclosure-end (point)))
;; show extra elements
(when (eq type 'desc)
(goto-char (point-max))
(setq pos-extra-start (point))
(newsticker--print-extra-elements item newsticker--url-keymap)
(setq pos-extra-end (point)))
;; text properties
(when (memq type '(feed item))
(add-text-properties pos (1- (point))
(list 'mouse-face 'highlight
'nt-link (newsticker--link item)
'help-echo
(format "mouse-2: visit item (%s)"
(newsticker--link item))
'keymap newsticker--url-keymap))
(add-text-properties pos (point)
(list 'nt-title (newsticker--title item)
'nt-desc (newsticker--desc item))))
(add-text-properties pos (point)
(list 'nt-type type
'nt-face type
'nt-age age
'nt-guid (newsticker--guid item)))
(when (and pos-date-start pos-date-end)
(put-text-property pos-date-start pos-date-end 'nt-face 'date))
(when (and pos-stat-start pos-stat-end)
(put-text-property pos-stat-start pos-stat-end 'nt-face 'stat))
(when (and pos-extra-start pos-extra-end)
(put-text-property pos-extra-start pos-extra-end
'nt-face 'extra)
(put-text-property pos-extra-start pos-extra-end
'nt-type 'extra))
(when (and pos-enclosure-start pos-enclosure-end
(> pos-enclosure-end pos-enclosure-start))
(put-text-property pos-enclosure-start (1- pos-enclosure-end)
'nt-face 'enclosure))
;; left margin
;;(unless (memq type '(feed item))
;;(set-left-margin pos (1- (point)) 1))
;; save rendered stuff
(cond ((eq type 'desc)
;; preformatted contents
(newsticker--cache-set-preformatted-contents
item (buffer-substring pos (point))))
((eq type 'item)
;; preformatted title
(newsticker--cache-set-preformatted-title
item (buffer-substring pos (point)))))))))