76ff4a4b35e3bd6fa223f39e85072e3ba9015e76
[riece] / lisp / riece-highlight.el
1 ;;; riece-highlight.el --- coloring IRC buffers
2 ;; Copyright (C) 1998-2003 Daiki Ueno
3
4 ;; Author: Daiki Ueno <ueno@unixuser.org>
5 ;; Created: 1998-09-28
6 ;; Keywords: IRC, riece
7
8 ;; This file is part of Riece.
9
10 ;; This program is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
13 ;; any later version.
14
15 ;; This program is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;; GNU General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
24
25 ;;; Code:
26
27 (require 'riece-globals)
28 (require 'font-lock)
29
30 (defgroup riece-highlight nil
31   "Highlight your IRC buffer"
32   :tag "Highlight"
33   :prefix "riece-"
34   :group 'riece)
35
36 (defgroup riece-highlight-faces nil
37   "Faces for highlight your IRC buffer"
38   :tag "Faces"
39   :prefix "riece-highlight-"
40   :group 'riece-highlight)
41
42 (defcustom riece-change-face 'riece-change-face
43   "Face used for displaying \"*** Change:\" line."
44   :type 'face
45   :group 'riece-highlight-faces)
46
47 (defcustom riece-notice-face 'riece-notice-face
48   "Face used for displaying \"*** Notice:\" line."
49   :type 'face
50   :group 'riece-highlight-faces)
51
52 (defcustom riece-wallops-face 'riece-wallops-face
53   "Face used for displaying \"*** Wallops:\" line."
54   :type 'face
55   :group 'riece-highlight-faces)
56   
57 (defcustom riece-error-face 'riece-error-face
58   "Face used for displaying \"*** Error:\" line."
59   :type 'face
60   :group 'riece-highlight-faces)
61
62 (defcustom riece-info-face 'riece-info-face
63   "Face used for displaying \"*** Info:\" line."
64   :type 'face
65   :group 'riece-highlight-faces)
66
67 (defcustom riece-server-face 'riece-server-face
68   "Face used for displaying \"(from server)\" extent."
69   :type 'face
70   :group 'riece-highlight-faces)
71
72 (defcustom riece-prefix-face 'riece-prefix-face
73   "Face used for displaying \"<nick>\" extent."
74   :type 'face
75   :group 'riece-highlight-faces)
76
77 (defface riece-change-face
78   '((((class color)
79       (background dark))
80      (:foreground "cyan" :bold t))
81     (((class color)
82       (background light))
83      (:foreground "RoyalBlue" :bold t))
84     (t
85      (:bold t)))
86   "Face used for displaying \"*** Change:\" line"
87   :group 'riece-highlight-faces)
88
89 (defface riece-notice-face
90   '((((class color)
91       (background dark))
92      (:foreground "green2" :bold t))
93     (((class color)
94       (background light))
95      (:foreground "MidnightBlue" :bold t))
96     (t
97      (:bold t)))
98   "Face used for displaying \"*** Notice:\" line"
99   :group 'riece-highlight-faces)
100
101 (defface riece-wallops-face
102   '((((class color)
103       (background dark))
104      (:foreground "yellow" :bold t))
105     (((class color)
106       (background light))
107      (:foreground "blue4" :bold t))
108     (t
109      (:bold t)))
110   "Face used for displaying \"*** Wallops:\" line"
111   :group 'riece-highlight-faces)
112
113 (defface riece-error-face
114   '((((class color)
115       (background dark))
116      (:foreground "cornflower blue" :bold t))
117     (((class color)
118       (background light))
119      (:foreground "DarkGreen"))
120     (t
121      (:bold t)))
122   "Face used for displaying \"*** Error:\" line"
123   :group 'riece-highlight-faces)
124
125 (defface riece-info-face
126   '((((class color)
127       (background dark))
128      (:foreground "PaleTurquoise" :bold t))
129     (((class color)
130       (background light))
131      (:foreground "RoyalBlue"))
132     (t
133      (:bold t)))
134   "Face used for displaying \"*** Info:\" line"
135   :group 'riece-highlight-faces)
136
137 (defface riece-server-face
138   '((((class color)
139       (background dark))
140      (:foreground "Gray70"))
141     (((class color)
142       (background light))
143      (:foreground "DimGray"))
144     (t
145      (:bold t)))
146   "Face used for displaying \"(from server)\" extent."
147   :group 'riece-highlight-faces)
148
149 (defface riece-prefix-face
150   '((((class color)
151       (background dark))
152      (:foreground "moccasin"))
153     (((class color)
154       (background light))
155      (:foreground "firebrick"))
156     (t
157      (:bold nil)))
158   "Face used for displaying \"<nick>\" extent"
159   :group 'riece-highlight-faces)
160
161 (defcustom riece-highlight-font-lock-keywords
162   (append
163    (list (list (concat "^" riece-time-prefix-regexp
164                        "\\(<[^>]+>\\|>[^<]+<\\|([^)]+)\\|{[^}]+}\\|=[^=]+=\\)")
165                '(1 riece-prefix-face append t)))
166    ;; set property to the whole line
167    (mapcar
168     (lambda (line)
169       (cons
170        (concat
171         "^" riece-time-prefix-regexp "\\("
172         (regexp-quote
173          (symbol-value (intern (format "riece-%s-prefix" line))))
174         ".*\\)$")
175        (list 1 (intern (format "riece-%s-face" line)) t t)))
176     '(change notice wallops error info))
177    (list (list "(from [^)]+)$" 0 riece-server-face t)))
178   "Normal and deformed faces for IRC normal line."
179   :type '(repeat (list string))
180   :group 'riece-highlight)
181
182 (defun riece-highlight-schedule-turn-on-font-lock ()
183   (add-hook 'riece-channel-mode-hook
184             'riece-highlight-turn-on-font-lock)
185   (add-hook 'riece-others-mode-hook
186             'riece-highlight-turn-on-font-lock)
187   (add-hook 'riece-dialogue-mode-hook
188             'riece-highlight-turn-on-font-lock))
189
190 (defvar font-lock-support-mode)
191 (defun riece-highlight-turn-on-font-lock ()
192   (make-local-variable 'font-lock-defaults)
193   (setq font-lock-defaults '(riece-highlight-font-lock-keywords t))
194   (make-local-variable 'font-lock-verbose)
195   (setq font-lock-verbose nil)
196   (when (boundp 'font-lock-support-mode)
197     (make-local-variable 'font-lock-support-mode)
198     (setq font-lock-support-mode nil))
199   (make-local-hook 'font-lock-mode-hook)
200   (setq font-lock-mode-hook nil)
201   (turn-on-font-lock)
202   (make-local-hook 'after-change-functions)
203   (add-hook 'after-change-functions
204             'riece-highlight-hide-prefix nil 'local))
205
206 (defun riece-highlight-hide-prefix (start end length)
207   (save-excursion
208     (goto-char start)
209     (if (looking-at riece-prefix-regexp)
210         (put-text-property (match-beginning 1) (match-end 1) 'invisible t))))
211
212 (defun riece-highlight-insinuate ()
213   (put 'riece-channel-mode 'font-lock-defaults
214        '(riece-highlight-font-lock-keywords t))
215   (put 'riece-others-mode 'font-lock-defaults
216        '(riece-highlight-font-lock-keywords t))
217   (put 'riece-dialogue-mode 'font-lock-defaults
218        '(riece-highlight-font-lock-keywords t))
219   (add-hook 'riece-after-load-startup-hook
220             'riece-highlight-schedule-turn-on-font-lock))
221
222 (provide 'riece-highlight)
223
224 ;;; riece-highlight.el ends here