Mercurial > hg > dotemacs
changeset 44:7404690856ba
Add erc-highlight-nicknames.el
author | Jordi Gutiérrez Hermoso <jordigh@gmail.com> |
---|---|
date | Thu, 04 Aug 2011 21:59:21 -0500 |
parents | 502a9f3c0d91 |
children | a340e236959a |
files | plugins/erc-highlight-nicknames.el |
diffstat | 1 files changed, 149 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/plugins/erc-highlight-nicknames.el @@ -0,0 +1,149 @@ +;;; erc-highlight-nicknames.el --- Highlights nicknames + +;; Copyright (C) 2007 André Riemann +;; Copyright (C) 2008 Andy Stewart + +;; Author: André Riemann <andre.riemann@web.de> +;; Maintainer: André Riemann <andre.riemann@web.de> +;; Created: 2007-09-25 +;; Keywords: comm, faces + +;; URL: http://www.emacswiki.org/cgi-bin/wiki/ErcHighlightNicknames +;; Compatibility: tested with +;; * GNU Emacs 23.0 (Erc 5.2, 5.3) +;; * XEmacs 21.4 (Erc 5.1) (briefly) +;; Version: 0.4.1 +;; Last-Updated: 2008-12-07 +;; By: Andy Stewart + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; This file is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the Free +;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +;; MA 02110-1301, USA. + +;;; Commentary: +;; To activate this module, put this in your init file +;; (require 'erc-highlight-nicknames) +;; and add highlight-nicknames to `erc-modules' by customizing it. + +;; Or put this in your init file +;; (and +;; (load-library "erc-highlight-nicknames") +;; (add-to-list 'erc-modules 'highlight-nicknames) +;; (erc-update-modules)) + +;; Press +;; M-x customize-face RET erc-highlight-nick-base-face RET +;; to customize the face that will be added before the color, if you want +;; for example all the nicks underlined. + +;;; Change Log: +;; 2008-12-07 Andy Stewart +;; * There was a bug that function `erc-highlight-nicknames' created +;; many faces for the same nickname. It would create a new one when +;; erc inserts text, and didn't care whether a face already existed +;; for this nickname. +;; Now I added a hash table `erc-highlight-face-table' to save the +;; face for a nickname. Faces are now only created, if the nickname +;; doesn't occur in the hash table. +;; 2007-12-24 andre-r +;; * bug fixed in invert-color where color code contained spaces instead +;; of leading zeros +;; 2007-12-12 andre-r +;; * erc-highlight-nick-base-face is by default empty now, +;; not inherited from `default' +;; * erc-button-add-face instead of put-text-property +;; * using `x-color-values' instead of `color-values' since XEmacs +;; seams to only know the former +;; 2007-12-12 andre-r +;; * built in XEmacs-compatible code for text properties by Dave Marquardt +;; (works both in Emacs and XEmacs) +;; * changed it a bit so that the face for the text property is derived +;; from another face (hopefully it still works with XEmacs) +;; * for that purpose created a new, customizable face +;; 2007-09-25 andre-r +;; * inital release + +;; This file is *NOT* part of GNU Emacs. + +;;; Code: + +(require 'erc) +(require 'erc-button) + +(defface erc-highlight-nick-base-face + '((t nil)) + "Base face used for highlighting nicks in erc. (Before the nick +color is added)" + :group 'erc-faces) + +(defvar erc-highlight-face-table + (make-hash-table :test 'equal) + "The hash table that contains unique erc nickname faces.") + +(defun hexcolor-luminance (color) + "Returns the luminance of color COLOR. COLOR is a string \(e.g. +\"#ffaa00\", \"blue\"\) `color-values' accepts. Luminance is a +value of 0.299 red + 0.587 green + 0.114 blue and is always +between 0 and 255." + (let* ((values (x-color-values color)) + (r (car values)) + (g (car (cdr values))) + (b (car (cdr (cdr values))))) + (floor (+ (* 0.299 r) (* 0.587 g) (* 0.114 b)) 256))) + +(defun invert-color (color) + "Returns the inverted color of COLOR." + (let* ((values (x-color-values color)) + (r (car values)) + (g (car (cdr values))) + (b (car (cdr (cdr values))))) + (format "#%04x%04x%04x" + (- 65535 r) (- 65535 g) (- 65535 b)))) + +(defun erc-highlight-nicknames () + "Searches for nicknames and highlights them. Uses the first +twelve digits of the MD5 message digest of the nickname as +color (#rrrrggggbbbb)." + (with-syntax-table erc-button-syntax-table + (let (bounds word color new-nick-face) + (goto-char (point-min)) + (while (re-search-forward "\\w+" nil t) + (setq bounds (bounds-of-thing-at-point 'word)) + (setq word (buffer-substring-no-properties + (car bounds) (cdr bounds))) + (when (erc-get-server-user word) + (setq new-nick-face (gethash word erc-highlight-face-table)) + (unless new-nick-face + (setq color (concat "#" (substring (md5 (downcase word)) 0 12))) + (if (equal (cdr (assoc 'background-mode (frame-parameters))) 'dark) + ;; if too dark for background + (when (< (hexcolor-luminance color) 85) + (setq color (invert-color color))) + ;; if to bright for background + (when (> (hexcolor-luminance color) 170) + (setq color (invert-color color)))) + (setq new-nick-face (make-symbol (concat "erc-highlight-nick-" word "-face"))) + (copy-face 'erc-highlight-nick-base-face new-nick-face) + (set-face-foreground new-nick-face color) + (puthash word new-nick-face erc-highlight-face-table)) + (erc-button-add-face (car bounds) (cdr bounds) new-nick-face)))))) + +(define-erc-module highlight-nicknames nil + "Search through the buffer for nicknames, and highlight." + ((add-hook 'erc-insert-modify-hook 'erc-highlight-nicknames t)) + ((remove-hook 'erc-insert-modify-hook 'erc-highlight-nicknames))) + +(provide 'erc-highlight-nicknames) + +;;; erc-highlight-nicknames.el ends here \ No newline at end of file