;; -*- emacs-lisp -*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; $Id: gnus_html.el,v 1.4 2006-11-06 21:02:42 rscholz Exp $
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Einstellungen für die Darstellung von HTML in Gnus
;;
;; Die offizielle Quelle dieser Datei ist
;;   <http://www.zonix.de/projects/emacs/config>
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Auswahl bei Alternativen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; bei vorhandenen Alternativen vermeiden
(setq mm-discouraged-alternatives
      '("text/html" "text/richtext" "multipart/related"))

;; HTML nicht interpretieren sondern als Source anzeigen
;(setq mm-automatic-display (remove "text/html" mm-automatic-display))

;; Katsumi Yamaoka in <yosusn7ohc5l.fsf@jpl.org>
;; Washing auch auf gerenderte HTML-Mails anwenden
(eval-after-load "gnus-art"
  '(setq gnus-article-treat-types
         (cons "text/html" gnus-article-treat-types)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Aufruf externer Programme (ab Gnus 5.10)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; emacs-w3m nutzen
(setq mm-text-html-renderer 'w3m)

;; keine w3m-Tastenbelegungen 
(setq mm-inline-text-html-with-w3m-keymap nil)

;; keine Bilder
(setq mm-inline-text-html-with-images nil)

;; emacs-w3m auch beim Washing `W H' von falsch deklarierten
;; HTML-Mails verwenden
(setq gnus-article-wash-function 'gnus-article-wash-html-with-w3m)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; HTML extern rendern lassen (mit w3m oder lynx) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; ab Gnus 5.10 obsolet -> s.o.

;; Marc Thomas in g.e.g. <wf11yowmovt.fsf@svelte.home>
; (let ((old-text-html-test (assoc "text/html" mm-inline-media-tests))
;       (new-text-html-test '("text/html"
;                           my:gnus-html2text
;                           (lambda (handle)
;                             (fboundp 'my:gnus-html2text)))))
;   (if old-text-html-test
;       (setcdr old-text-html-test (cdr new-text-html-test))
;     (setq mm-inline-media-tests (cons new-text-html-test
;                                     mm-inline-media-tests))))

;; function to call to handle text/html attachments
(defun my:gnus-html2text (handle)
  (let (text)
    (with-temp-buffer
      (mm-insert-part handle)
      (save-window-excursion
        (my:html2text-region (point-min) (point-max))
        (setq text (buffer-string))))
    (mm-insert-inline handle text)))

(defun my:html2text-region-lynx (min max)
  "Replace the region with the result of running lynx -dump on it."
  (interactive "r")
  ;; lynx requires the html to be in a file
  (let ((file (expand-file-name (concat (make-temp-name "/tmp/") ".html"))))
    (unwind-protect
        (progn
          (write-region min max file nil 'silent)
          (delete-region min max)
          (call-process "lynx" nil t t "-dump" "-force_html" "-nopause" file))
      (delete-file file))))

(defun my:html2text-region-w3m (min max)
  "Replace the region with the result of running w3m -dump on it."
  (interactive "r")
  ;; w3m accepts html on stdin
  (call-process-region min max "w3m" t t t "-dump" "-T" "text/html"))

(defalias 'my:html2text-region 'my:html2text-region-w3m)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; HTML "intern" rendern lassen (mit emacs-w3m)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; ab Gnus 5.10 obsolet -> s.o.

;; John Wiegley in <m3wv5732q8.fsf@gnu.org>
; (defadvice mm-inline-text (around use-w3m-instead (handle) activate)
;   (let ((type (mm-handle-media-subtype handle)))
;     (if (not (equal type "html"))
;       ad-do-it
;       (let ((text (mm-get-part handle))
;           (b (point)))
;       (save-excursion
;         (insert text)
;         (save-restriction
;           (narrow-to-region b (point))
;           (goto-char (point-min))
;           (w3m-region (point-min) (point-max)))
;         (mm-handle-set-undisplayer
;          handle
;          `(lambda ()
;             (let (buffer-read-only)
;               (if (functionp 'remove-specifier)
;                   (mapcar (lambda (prop)
;                             (remove-specifier
;                              (face-property 'default prop)
;                              (current-buffer)))
;                           '(background background-pixmap foreground)))
;               (delete-region ,(point-min-marker)
;                              ,(point-max-marker))))))))))

;; Greg in <2fasnftcpt4.fsf@broadcom.com> on gnu.emacs.help

;; (defvar gnus-w3m-minor-mode nil)

;; (make-variable-buffer-local 'gnus-w3m-minor-mode)
;; (add-to-list 'minor-mode-alist '(gnus-w3m-minor-mode " w3m"))
;; (add-to-list 'minor-mode-map-alist (cons 'gnus-w3m-minor-mode w3m-mode-map))

;; (defadvice mm-inline-text (around use-w3m-instead (handle) activate)
;;   (let ((type (mm-handle-media-subtype handle)))
;;     (if (not (equal type "html"))
;;      ad-do-it
;;       (let ((text (mm-get-part handle))
;;          (b (point)))
;;      (save-excursion
;;        (insert text)
;;        (save-restriction
;;          (narrow-to-region b (point))
;;          (goto-char (point-min))
;;          (setq w3m-display-inline-image nil)
;;          (w3m-region (point-min) (point-max))
;;          (setq gnus-w3m-minor-mode t))
;;        (mm-handle-set-undisplayer
;;         handle
;;         `(lambda ()
;;            (let (buffer-read-only)
;;              (setq gnus-w3m-minor-mode nil)
;;              (if (functionp 'remove-specifier)
;;                  (mapcar (lambda (prop)
;;                            (remove-specifier
;;                             (face-property 'default prop)
;;                             (current-buffer)))
;;                          '(background background-pixmap foreground)))
;;              (delete-region ,(point-min-marker)
;;                             ,(point-max-marker))))))))))





;; Dischi's Zusatzfunktionen
(defun browse-w3m-anchor-external ()
  (interactive)
  (if (w3m-anchor)
      (browse-url (w3m-anchor))))

(defun dischi/gnus-article-mode-hook ()
  (progn
    (local-set-key "v" 'browse-w3m-anchor-external) 
    (local-set-key [(backtab)] 'w3m-next-anchor) 
    (local-set-key [(control tab)] 'w3m-next-anchor)))

(add-hook 'gnus-article-mode-hook 'dischi/gnus-article-mode-hook)