;; -*- emacs-lisp -*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; $Id: gnus_article.el,v 1.26 2006-11-06 21:02:42 rscholz Exp $
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Einstellungen für den Article Buffer
;;
;; Die offizielle Quelle dieser Datei ist
;;   <http://www.zonix.de/projects/emacs/config>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; angezeigte Header             (Info-goto-node "(Gnus)Hiding Headers")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(setq gnus-visible-headers 
      '( "^From:"
         "^Newsgroups:"
         "^Subject:"
         "^Date:"
         "^Message-ID:"
         "^Followup-To:"
         "^Mail-Followup-To:"
         "^Reply-To:"
         "^Organization:"
         
         "^Summary:"
         "^Keywords:"
         "^Importance:"

         "^To:"
         "^[BGF]?Cc:"
         "^Mail-Copies-To:"
         
         "^Gnus-Warning:"
         "^X-Sent:"
         "^X-Face-Img:"

         "^User-Agent:"
         "^X-Mailer:"
         "^X-Mailreader:"
         "^X-Newsreader:"
         "^X-User-Agent:"

         "^X-Now-.*:"
         "^X-URL:"
         
         "^X-No-Archive:"
         "^X-PGP-Sig:"
         "^Supersedes:"

         "^X-Spam-Status:"
         "^X-Spam-Report:"
         "^X-GMX-Antispam:"

         "^X-Virii-Status:"
         ))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Format der Header       (Info-goto-node "(Gnus)Customizing Articles")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; immer lokale Zeit darstellen
(setq gnus-treat-date-local 'head)

;; relative Zeit darstellen
(setq gnus-treat-date-lapsed 'head)
(gnus-start-date-timer)
(setq gnus-article-date-lapsed-new-header t)

;; keine zusätzliche Zeile zwischen Header und Body
(setq gnus-treat-body-boundary nil)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; X-Faces & Picons             (Info-goto-node "(Gnus)Article Display")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; X-Faces automatisch anzeigen
(setq gnus-treat-display-xface 'head)

;; X-Face separat anzeigen
;(setq x-face-mule-highlight-x-face-position 'x-face)

;; X-Face-Cache speichern
(setq x-face-mule-force-save-cache-file t)

;; Ich weiß, wie ich aussehe
(setq gnus-article-x-face-too-ugly user-full-name)

;; xli zur Anzeige benutzen bei Emacs 20
(when (< emacs-major-version 21)
  (setq gnus-article-x-face-command 
        (concat "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm |"
                "xli -quiet -background '#ecebf0' /dev/stdin")))

;; keine Picons anzeigen
(setq gnus-treat-newsgroups-picon nil)
(setq gnus-treat-mail-picon nil)
(setq gnus-treat-from-picon nil)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Body, MIME-Parts etc.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Seitenumbruch interpretieren
(setq gnus-break-pages t)

;; Beim Blättern mit Space nicht weiterblättern, falls nur noch
;; zitierter Text oder Signatur folgt (ab Gnus 5.10)
;(setq gnus-article-skip-boring t)

;; keine automatische Anzeige für UU und Shell-Archive
(add-to-list 'mm-uu-configure-list '(uu . disabled))
(add-to-list 'mm-uu-configure-list '(shar . disabled))

;; zsh: "Gnus is not faulty but not fully implemented"...
(setq gnus-mime-display-multipart-related-as-mixed t)

;; unbekannte Charsets mit Default-Charset darstellen
;(setq gnus-newsgroup-ignored-charsets '(gnus-unknown))

;; `5 g' bzw. `8 g' aus dem Summary-Buffer zeigt den Artikel mit dem
;; entsprechenden Charset an.
(setq gnus-summary-show-article-charset-alist
      '((5 . big5)
        (8 . utf-8)
        (12 . windows-1252)))

;; Default-Zeichensatz, falls keiner deklariert wurde (ab Gnus 5.10)
(setq gnus-default-charset 'iso-8859-1)

;; kein Defaultzeichensatz -> Oktalcodes werden bei non-ASCII-Zeichen
;; angezeigt, vgl. Jesper Harder in <m3istpb46j.fsf@defun.localdomain>
;; (hey Jesper, deine Message-ID ist b0rked :-)
;(setq gnus-default-charset nil)

;; falls kein Mime-Version-Header vorhanden ist, trotzdem versuchen,
;; die Nachricht als MIME-Nachricht darzustellen (ab Gnus 5.10)
;(setq gnus-article-loose-mime t)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Bilder  (ab Gnus 5.10 / Emacs 21)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; auch Bilder in HTML-Artikeln anzeigen, aber nur wenn...
(setq mm-inline-text-html-with-images t)

;; ...sie nicht aus dem Web geholt werden, sondern lokal im Artikel
;; gespeichert vorliegen
(setq mm-w3m-safe-url-regexp "\\`cid:")

;; auch große Bilder inline anzeigem
(setq mm-inline-large-images t)

;; inline anzeigen, auch wenn als Attachment deklariert
(add-to-list 'mm-attachment-override-types "image/.*")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Washing                      (Info-goto-node "(Gnus)Article Washing")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Smileys nicht automatisch anzeigen lassen
(setq gnus-treat-display-smileys nil)

;; überflüssige Leerzeilen löschen
(setq gnus-treat-strip-trailing-blank-lines t)
(setq gnus-treat-strip-leading-blank-lines t)
(setq gnus-treat-strip-multiple-blank-lines t)

;; `W |' wäscht mit externem Kommando
(define-key 'gnus-summary-wash-map "|" 'gnus-summary-pipe-message)

;; Freenet-Banner
(add-to-list 'gnus-article-banner-alist
     '(freenet . "^-- \nImmer auf dem aktuellen Stand mit den Newsgroups von freenet.de:\nhttp://newsgroups.freenet.de"))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Quoting                 (Info-goto-node "(Gnus)Article Highlighting")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Quotings verstecken
;(setq gnus-treat-hide-citation t)

;; sehr lange Quotes verstecken
(setq gnus-cited-opened-text-button-line-format "%(%{[- %n lines]%}%)\n")
(setq gnus-cited-closed-text-button-line-format "%(%{[+ %n lines]%}%)\n")
(setq gnus-cited-lines-visible 3)
(setq gnus-cite-hide-percentage 90)
(setq gnus-cite-hide-absolute 20)

;; auch einzelne gequotete Zeilen einfärben
(setq gnus-cite-minimum-match-count 1)

;; Erkennen seltsamer Attribution Lines
(setq gnus-cite-attribution-suffix 
      (concat "\\(\\(wrote\\|writes\\|said\\|says\\|schreibt\\|schrieb\\|schrub\\|>\\)"
              "\\(:\\|\\.\\.\\.\\)\\|-----Original Message-----\\)\\s-*$"))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Faces
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(require 'gnus-art)
(set-face-foreground 'gnus-header-content-face "DarkGreen")   
(set-face-foreground 'gnus-header-name-face "Darkgreen")   
(set-face-bold-p 'gnus-header-name-face t)
(set-face-foreground 'gnus-header-newsgroups-face "Darkgreen")   
(set-face-bold-p 'gnus-header-newsgroups-face t)
(set-face-foreground 'gnus-header-subject-face "firebrick")   
(set-face-bold-p 'gnus-header-subject-face t)
(set-face-foreground 'gnus-header-from-face "MidnightBlue")   
(set-face-bold-p 'gnus-header-from-face t)
(when window-system
  (set-face-foreground 'gnus-signature-face "Grey40"))
  

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; TeX-Sequenzen umwandeln ("a -> ä)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Stefan Wiens <wk66icrg1l.fsf@helium.eswe.dyndns.org>
(defun my-gnus-summary-gtex2iso ()
  "Translate german TeX sequences in article to ISO 8859-1."
  (interactive)
  (require 'iso-cvt)
  (gnus-summary-select-article)
  (let ((mail-header-separator ""))
    (gnus-eval-in-buffer-window gnus-article-buffer
      (save-restriction
        (widen)
        (let ((start (window-start))
              buffer-read-only)
          (when (message-goto-body)
              (iso-gtex2iso (point) (point-max)))
          (set-window-start (get-buffer-window (current-buffer)) start))))))

(define-key gnus-summary-wash-map "x" 'my-gnus-summary-gtex2iso)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Highlighting von Lisp-Code in bestimmten Gruppen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Oliver Scholz in <m366152i3i.fsf@ID-87814.user.dfncis.de>,
;; Ergänzungen von Hans-Jürgen Ficker.
(defvar egoge-emacs-lisp-ngs-regexp
  (regexp-opt '("comp.emacs" "gnu.emacs.help" "virtual.emacs" "gnus.ding"
                "gnu.emacs.gnus" "de.comm.software.gnus"
                "de.comp.editoren")))

(add-to-list 'mm-uu-type-alist
             '(emacs-lisp
               "^("
               ")\\s-*\\(\n\n\\|\n?\\'\\)"
               mm-uu-emacs-sources-extract
               nil
               egoge-mm-uu-emacs-lisp-test))

;; das lässt sich sicher noch optimieren. Dieser Kommentar hier zum
;; Beispiel wird nicht erfasst. Aber andererseits: man kann nicht
;; alles haben. (Jedenfalls nicht mit so geringem Aufwand.)
(defun egoge-mm-uu-emacs-lisp-test ()
  (setq file-name (match-string 1))
  (and gnus-newsgroup-name
       (string-match egoge-emacs-lisp-ngs-regexp gnus-newsgroup-name)))

(mm-uu-configure) ;; notwendig, damit die Änderungen in Effekt treten.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Washing von UTF-7-Artikeln (kann Emacs 21 noch nicht)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Hans-Jürgen Ficker in <y19it358uzn.fsf@laptop.backmes.de>
(defun hjf-gnus-article-decode-utf7 ()
  "Translate UTF-7 into proper text"
  (interactive)
  (save-window-excursion
    (gnus-summary-select-article-buffer)
    (toggle-read-only -1)
    (article-goto-body)
    (while (re-search-forward "+\\([A-Za-z0-9+/]*\\)-?" nil t)
      (let* ((matched (match-string 1))
             (bytes (string-to-list 
                     (base64-decode-string 
                      (concat matched 
                              (make-string (% (- 1000 (length matched)) 4) 
                                           ?=)))))
             (decoded-string 
              (if (string= matched "")
                  "+"
                (with-temp-buffer
                  (while (and bytes
                              (cdr bytes))
                    (let ((this-char (decode-char 'ucs 
                                                  (+ (* 256 (car bytes)) 
                                                     (car (cdr bytes))))))
                      (insert (string (or this-char ??))))
                    (setq bytes (cdr (cdr bytes))))
                  (buffer-string)))))
        (replace-match decoded-string t t)))
    (toggle-read-only 1)))

(define-key gnus-summary-wash-map "7" 'hjf-gnus-article-decode-utf7)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Washing von nicht deklarierten format=flowed-Artikeln
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Karl Pflästerer in <m38yu9aw0c.fsf@hamster.pflaesterer.de>
(defun gnus-article-fill-flowed ()
  (interactive)
  (save-excursion
    (set-buffer gnus-article-buffer)
    (save-restriction
      (let ((buffer-read-only nil))
        (gnus-narrow-to-body)
        (fill-flowed)))))

(define-key gnus-summary-wash-map "F" 'gnus-article-fill-flowed)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Nicht deklarierte 8bit.Zeichen als Oktalsequenzen anzeigen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Oliver Scholz in <ur885rzc6.fsf@ID-87814.user.dfncis.de>
;; --------------------------------------------------------------------
;; Display characters from the charsets `eight-bit-control' and
;; `eight-bit-graphic' as octal numbers in `font-lock-warning-face'
(defun egoge-display-eight-bit-as-octal (&optional face)
  (let ((face-offset (if face
                         (* (face-id face)
                            (expt 2 19))
                       0))
        char)
    (dotimes (i 128)
      (setq char (+ i 128))
      (aset standard-display-table char
            (vconcat (mapcar (lambda (c)
                               (+ face-offset c))
                             (format "\\%o" char)))))))
;(eval-after-load "font-lock"
;  '(egoge-display-eight-bit-as-octal 'font-lock-warning-face))