X-Git-Url: https://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Fsmiley.el;h=37a69b55dcd5492116031371a3c5f16abee90b46;hb=b28454eed83f245c4160228b076134ce930b320a;hp=583ce9b2aede3eee88b4510f9850d05428b46d97;hpb=d12901e0b4585ca9b0a270fbd71c82bb73011712;p=gnus diff --git a/lisp/smiley.el b/lisp/smiley.el index 583ce9b2a..37a69b55d 100644 --- a/lisp/smiley.el +++ b/lisp/smiley.el @@ -1,5 +1,5 @@ ;;; smiley.el --- displaying smiley faces -;; Copyright (C) 1996 Free Software Foundation, Inc. +;; Copyright (C) 1996,97 Free Software Foundation, Inc. ;; Author: Wes Hardaker ;; Keywords: fun @@ -33,47 +33,128 @@ ;; (require 'smiley) ;; (add-hook 'gnus-article-display-hook 'gnus-smiley-display t) +;; The smilies were drawn by Joe Reiss . + (require 'annotations) -(eval-when-compile (require 'cl)) +(require 'messagexmas) +(require 'cl) +(require 'custom) + +(defgroup smiley nil + "Turn :-)'s into real images (XEmacs)." + :group 'gnus-visual) + +(defcustom smiley-data-directory (message-xmas-find-glyph-directory "smilies") + "Location of the smiley faces files." + :type 'directory + :group 'smiley) + +;; Notice the subtle differences in the regular expressions in the +;; two alists below. + +(defcustom smiley-deformed-regexp-alist + '(("\\(:-*[<«]+\\)\\W" 1 "FaceAngry.xpm") + ("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm") + ("\\(:-*D\\)\\W" 1 "FaceGrinning.xpm") + ("\\(:-*[)>}»]+\\)\\W" 1 "FaceHappy.xpm") + ("\\(:-*[/\\\"]\\)[^/]\\W" 1 "FaceIronic.xpm") + ("\\([8|]-*[|Oo%]\\)\\W" 1 "FaceKOed.xpm") + ("\\([:|]-*#+\\)\\W" 1 "FaceNyah.xpm") + ("\\(:-*[({]+\\)\\W" 1 "FaceSad.xpm") + ("\\(:-*[Oo\*]\\)\\W" 1 "FaceStartled.xpm") + ("\\(:-*|\\)\\W" 1 "FaceStraight.xpm") + ("\\(:-*p\\)\\W" 1 "FaceTalking.xpm") + ("\\(:-*d\\)\\W" 1 "FaceTasty.xpm") + ("\\(;-*[>)}»]+\\)\\W" 1 "FaceWinking.xpm") + ("\\(:-*[Vvµ]\\)\\W" 1 "FaceWry.xpm") + ("\\([:|]-*P\\)\\W" 1 "FaceYukky.xpm")) + "Normal and deformed faces for smilies." + :type '(repeat (list regexp + (integer :tag "Match") + (string :tag "Image"))) + :group 'smiley) + +(defcustom smiley-nosey-regexp-alist + '(("\\(:-+[<«]+\\)\\W" 1 "FaceAngry.xpm") + ("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm") + ("\\(:-+D\\)\\W" 1 "FaceGrinning.xpm") + ("\\(:-+[}»]+\\)\\W" 1 "FaceHappy.xpm") + ("\\(:-*)+\\)\\W" 1 "FaceHappy.xpm") + ("\\(:-+[/\\\"]+\\)\\W" 1 "FaceIronic.xpm") + ("\\([8|]-+[|Oo%]\\)\\W" 1 "FaceKOed.xpm") + ("\\([:|]-+#+\\)\\W" 1 "FaceNyah.xpm") + ("\\(:-+[({]+\\)\\W" 1 "FaceSad.xpm") + ("\\(:-+[Oo\*]\\)\\W" 1 "FaceStartled.xpm") + ("\\(:-+|\\)\\W" 1 "FaceStraight.xpm") + ("\\(:-+p\\)\\W" 1 "FaceTalking.xpm") + ("\\(:-+d\\)\\W" 1 "FaceTasty.xpm") + ("\\(;-+[>)}»]+\\)\\W" 1 "FaceWinking.xpm") + ("\\(:-+[Vvµ]\\)\\W" 1 "FaceWry.xpm") + ("\\(][:8B]-[)>]\\)\\W" 1 "FaceDevilish.xpm") + ("\\([:|]-+P\\)\\W" 1 "FaceYukky.xpm")) + "Smileys with noses. These get less false matches." + :type '(repeat (list regexp + (integer :tag "Match") + (string :tag "Image"))) + :group 'smiley) -(defvar smiley-data-directory (message-xmas-find-glyph-directory "smilies") - "Location of the smiley faces files.") +(defcustom smiley-regexp-alist smiley-deformed-regexp-alist + "A list of regexps to map smilies to real images. +Defaults to the contents of `smiley-deformed-regexp-alist'. +An alternative is `smiley-nosey-regexp-alist' that matches less +aggressively. +If this is a symbol, take its value." + :type '(radio (variable-item smiley-deformed-regexp-alist) + (variable-item smiley-nosey-regexp-alist) + symbol + (repeat (list regexp + (integer :tag "Match") + (string :tag "Image")))) + :group 'smiley) -(defvar smiley-regexp-alist - '(("\\s-\\(:-*\\]\\)" 1 "FaceGrinning.xpm") - ("\\s-\\(:-*[oO]\\)" 1 "FaceStartled.xpm") - ("\\s-\\(:-*[)>]\\)" 1 "FaceHappy.xpm") - ("\\s-\\(;-*[>)]\\)" 1 "FaceWinking.xpm") - ("\\s-\\(:-[/\\]\\)" 1 "FaceIronic.xpm") - ("\\s-\\(:-*|\\)" 1 "FaceStraight.xpm") - ("\\s-\\(:-*<\\)" 1 "FaceAngry.xpm") - ("\\s-\\(:-*d\\)" 1 "FaceTasty.xpm") - ("\\s-\\(:-*[pP]\\)" 1 "FaceYukky.xpm") - ("\\s-\\(8-*|\\)" 1 "FaceKOed.xpm") - ("\\s-\\(:-*(\\)" 1 "FaceAngry.xpm")) - "A list of regexps to map smilies to real images.") +(defcustom smiley-flesh-color "yellow" + "Flesh color." + :type 'string + :group 'smiley) -(defvar smiley-flesh-color "yellow" - "Flesh color.") +(defcustom smiley-features-color "black" + "Features color." + :type 'string + :group 'smiley) -(defvar smiley-features-color "black" - "Features color.") +(defcustom smiley-tongue-color "red" + "Tongue color." + :type 'string + :group 'smiley) -(defvar smiley-tongue-color "red" - "Tongue color.") +(defcustom smiley-circle-color "black" + "Circle color." + :type 'string + :group 'smiley) + +(defcustom smiley-mouse-face 'highlight + "Face used for mouse highlighting in the smiley buffer. + +Smiley buttons will be displayed in this face when the cursor is +above them." + :type 'face + :group 'smiley) -(defvar smiley-circle-color "black" - "Tongue color.") (defvar smiley-glyph-cache nil) (defvar smiley-running-xemacs (string-match "XEmacs" emacs-version)) +(defvar smiley-map (make-sparse-keymap "smiley-keys") + "Keymap to toggle smiley states.") + +(define-key smiley-map [(button2)] 'smiley-toggle-extent) + (defun smiley-create-glyph (smiley pixmap) (and smiley-running-xemacs (or (cdr-safe (assoc pixmap smiley-glyph-cache)) - (let* ((xpm-color-symbols + (let* ((xpm-color-symbols (and (featurep 'xpm) (append `(("flesh" ,smiley-flesh-color) ("features" ,smiley-features-color) @@ -87,43 +168,74 @@ (set-glyph-face glyph 'default) glyph)))) -;;;###interactive +;;;###autoload (defun smiley-region (beg end) "Smilify the region between point and mark." (interactive "r") (smiley-buffer (current-buffer) beg end)) -;;;###interactive +(defun smiley-toggle-extent (event) + "Toggle smiley at given point" + (interactive "e") + (let* ((ant (event-glyph-extent event)) + (pt (event-closest-point event)) + ext) + (if (annotationp ant) + (when (extentp (setq ext (extent-property ant 'smiley-extent))) + (set-extent-property ext 'invisible nil) + (hide-annotation ant)) + (when pt + (while (setq ext (extent-at pt (event-buffer event) nil ext 'at)) + (when (annotationp (setq ant + (extent-property ext 'smiley-annotation))) + (reveal-annotation ant) + (set-extent-property ext 'invisible t))))))) + +;;;###autoload (defun smiley-buffer (&optional buffer st nd) (interactive) - (save-excursion - (and buffer (set-buffer buffer)) - (let ((buffer-read-only nil) - (alist smiley-regexp-alist) - entry regexp beg group file) - (goto-char (or st (point-min))) - (setq beg (point)) - ;; loop through alist - (while (setq entry (pop alist)) - (setq regexp (car entry) - group (cadr entry) - file (caddr entry)) - (goto-char beg) - (while (re-search-forward regexp nd t) - (let* ((start (match-beginning group)) - (end (match-end group)) - (glyph (smiley-create-glyph (buffer-substring start end) - file))) - (when glyph - (mapcar 'delete-annotation (annotations-at end)) - (let ((ext (make-extent start end))) - (set-extent-property ext 'invisible t) - (set-extent-property ext 'end-open t) - (set-extent-property ext 'intangible t)) - (make-annotation glyph end 'text) - (when (smiley-end-paren-p start end) - (make-annotation ")" end 'text)) - (goto-char end)))))))) + (when (featurep 'x) + (save-excursion + (when buffer + (set-buffer buffer)) + (let ((buffer-read-only nil) + (alist (if (symbolp smiley-regexp-alist) + (symbol-value smiley-regexp-alist) + smiley-regexp-alist)) + entry regexp beg group file) + (goto-char (or st (point-min))) + (setq beg (point)) + ;; loop through alist + (while (setq entry (pop alist)) + (setq regexp (car entry) + group (cadr entry) + file (caddr entry)) + (goto-char beg) + (while (re-search-forward regexp nd t) + (let* ((start (match-beginning group)) + (end (match-end group)) + (glyph (smiley-create-glyph (buffer-substring start end) + file))) + (when glyph + (mapcar 'delete-annotation (annotations-at end)) + (let ((ext (make-extent start end)) + (ant (make-annotation glyph end 'text))) + ;; set text extent params + (set-extent-property ext 'end-open t) + (set-extent-property ext 'start-open t) + (set-extent-property ext 'invisible t) + (set-extent-property ext 'keymap smiley-map) + (set-extent-property ext 'mouse-face smiley-mouse-face) + (set-extent-property ext 'intangible t) + ;; set annotation params + (set-extent-property ant 'mouse-face smiley-mouse-face) + (set-extent-property ant 'keymap smiley-map) + ;; remember each other + (set-extent-property ant 'smiley-extent ext) + (set-extent-property ext 'smiley-annotation ant)) + (when (smiley-end-paren-p start end) + (make-annotation ")" end 'text)) + (goto-char end))))))))) (defun smiley-end-paren-p (start end) "Try to guess whether the current smiley is an end-paren smiley." @@ -136,7 +248,8 @@ (= (char-after (1- (point))) ?\())) t))) -;;;###autoload +(defvar gnus-article-buffer) +;;;###autoload (defun gnus-smiley-display () (interactive) (save-excursion