]> code.delx.au - gnu-emacs/blobdiff - lisp/enriched.el
(diacritic-composition-pattern): New constant.
[gnu-emacs] / lisp / enriched.el
index 187bacc826e0457bec628ee7aa2554a5c4a24b00..6cb7dd782d2db32299c7bf207b76bf5b658b9e83 100644 (file)
@@ -2,7 +2,7 @@
 
 ;; Copyright (c) 1994, 1995, 1996 Free Software Foundation, Inc.
 
-;; Author: Boris Goldowsky <boris@gnu.ai.mit.edu>
+;; Author: Boris Goldowsky <boris@gnu.org>
 ;; Keywords: wp, faces
 
 ;; This file is part of GNU Emacs.
@@ -73,7 +73,7 @@ in text/enriched files."
 (defface excerpt
   '((t (:italic t)))
   "Face used for text that is an excerpt from another document.
-This is used in enriched-mode for text explicitly marked as an excerpt."
+This is used in Enriched mode for text explicitly marked as an excerpt."
   :group 'enriched)
 
 (defconst enriched-display-table (or (copy-sequence standard-display-table)
@@ -99,7 +99,7 @@ expression, which is evaluated to get the string to insert.")
 (defconst enriched-annotation-format "<%s%s>"
   "General format of enriched-text annotations.")
 
-(defconst enriched-annotation-regexp "<\\(/\\)?\\([-A-za-z0-9]+\\)>"
+(defconst enriched-annotation-regexp "<\\(/\\)?\\([-A-Za-z0-9]+\\)>"
   "Regular expression matching enriched-text annotations.")
 
 (defconst enriched-translations
@@ -141,18 +141,9 @@ Any property that is neither on this list nor dealt with by
 
 ;;; Internal variables
 
-(defvar enriched-mode nil
-  "True if Enriched mode is in use.")
-(make-variable-buffer-local 'enriched-mode)
-(put 'enriched-mode 'permanent-local t)
-
-(if (not (assq 'enriched-mode minor-mode-alist))
-    (setq minor-mode-alist
-         (cons '(enriched-mode " Enriched")
-               minor-mode-alist)))
 
 (defcustom enriched-mode-hook nil
-  "Functions to run when entering Enriched mode.
+  "Hook run after entering/leaving Enriched mode.
 If you set variables in this hook, you should arrange for them to be restored
 to their old values if you leave Enriched mode.  One way to do this is to add
 them and their old values to `enriched-old-bindings'."
@@ -168,59 +159,53 @@ The value is a list of \(VAR VALUE VAR VALUE...).")
 ;;; Define the mode
 ;;;
 
+(put 'enriched-mode 'permanent-local t)
 ;;;###autoload
-(defun enriched-mode (&optional arg)
+(define-minor-mode enriched-mode
   "Minor mode for editing text/enriched files.
 These are files with embedded formatting information in the MIME standard
 text/enriched format.
 Turning the mode on runs `enriched-mode-hook'.
 
 More information about Enriched mode is available in the file 
-etc/enriched.doc  in the Emacs distribution directory.
+etc/enriched.doc in the Emacs distribution directory.
 
 Commands:
 
 \\<enriched-mode-map>\\{enriched-mode-map}"
-  (interactive "P")
-  (let ((mod (buffer-modified-p)))
-    (cond ((or (<= (prefix-numeric-value arg) 0)
-              (and enriched-mode (null arg)))
-          ;; Turn mode off
-          (setq enriched-mode nil)
-          (setq buffer-file-format (delq 'text/enriched buffer-file-format))
-          ;; restore old variable values
-          (while enriched-old-bindings
-            (funcall 'set (car enriched-old-bindings)
-                     (car (cdr enriched-old-bindings)))
-            (setq enriched-old-bindings (cdr (cdr enriched-old-bindings)))))
-
-         (enriched-mode nil)           ; Mode already on; do nothing.
-
-         (t (setq enriched-mode t)     ; Turn mode on
-            (add-to-list 'buffer-file-format 'text/enriched)
-            ;; Save old variable values before we change them.
-            ;; These will be restored if we exit Enriched mode.
-            (setq enriched-old-bindings
-                  (list 'buffer-display-table buffer-display-table
-                        'indent-line-function indent-line-function
-                        'default-text-properties default-text-properties))
-            (make-local-variable 'indent-line-function)
-            (make-local-variable 'default-text-properties)
-            (setq indent-line-function 'indent-to-left-margin
-                  buffer-display-table  enriched-display-table)
-            (use-hard-newlines 1 nil)
-            (let ((sticky (plist-get default-text-properties 'front-sticky))
-                  (p enriched-par-props))
-              (while p
-                (add-to-list 'sticky (car p))
-                (setq p (cdr p)))
-              (if sticky
-                  (setq default-text-properties
-                        (plist-put default-text-properties
-                                   'front-sticky sticky))))
-            (run-hooks 'enriched-mode-hook)))
-    (set-buffer-modified-p mod)
-    (force-mode-line-update)))
+  nil " Enriched" nil
+  (cond ((null enriched-mode)
+        ;; Turn mode off
+        (setq buffer-file-format (delq 'text/enriched buffer-file-format))
+        ;; restore old variable values
+        (while enriched-old-bindings
+          (set (pop enriched-old-bindings) (pop enriched-old-bindings))))
+         
+       ((memq 'text/enriched buffer-file-format)
+        ;; Mode already on; do nothing.
+        nil)
+
+       (t                              ; Turn mode on
+        (push 'text/enriched buffer-file-format)
+        ;; Save old variable values before we change them.
+        ;; These will be restored if we exit Enriched mode.
+        (setq enriched-old-bindings
+              (list 'buffer-display-table buffer-display-table
+                    'indent-line-function indent-line-function
+                    'default-text-properties default-text-properties))
+        (make-local-variable 'indent-line-function)
+        (make-local-variable 'default-text-properties)
+        (setq indent-line-function 'indent-to-left-margin ;WHY??  -sm
+              buffer-display-table  enriched-display-table)
+        (use-hard-newlines 1 nil)
+        (let ((sticky (plist-get default-text-properties 'front-sticky))
+              (p enriched-par-props))
+          (dolist (x p)
+            (add-to-list 'sticky x))
+          (if sticky
+              (setq default-text-properties
+                    (plist-put default-text-properties
+                               'front-sticky sticky)))))))
 
 ;;;
 ;;; Keybindings
@@ -347,18 +332,29 @@ One annotation each for foreground color, background color, italic, etc."
        (and new (enriched-face-ans new))))
            
 (defun enriched-face-ans (face)
-  "Return annotations specifying FACE."
-  (cond ((string-match "^fg:" (symbol-name face))
+  "Return annotations specifying FACE.
+FACE may be a list of faces instead of a single face;
+it can also be anything allowed as an element of a list
+which can be the value of the `face' text property."
+  (cond ((and (consp face) (eq (car face) 'foreground-color))
+        (list (list "x-color" (cdr face))))
+       ((and (consp face) (eq (car face) 'background-color))
+        (list (list "x-bg-color" (cdr face))))
+       ((listp face)
+        (apply 'append (mapcar 'enriched-face-ans face)))
+       ((string-match "^fg:" (symbol-name face))
         (list (list "x-color" (substring (symbol-name face) 3))))
        ((string-match "^bg:" (symbol-name face))
         (list (list "x-bg-color" (substring (symbol-name face) 3))))
-       ((let* ((fg (face-foreground face))
-               (bg (face-background face))
+       ((let* ((fg (face-attribute face :foreground))
+               (bg (face-attribute face :background))
                (props (face-font face t))
                (ans (cdr (format-annotate-single-property-change
                           'face nil props enriched-translations))))
-          (if fg (setq ans (cons (list "x-color" fg) ans)))
-          (if bg (setq ans (cons (list "x-bg-color" bg) ans)))
+          (unless (eq fg 'unspecified)
+            (setq ans (cons (list "x-color" fg) ans)))
+          (unless (eq bg 'unspecified)
+            (setq ans (cons (list "x-bg-color" bg) ans)))
           ans))))
 
 ;;;
@@ -438,8 +434,8 @@ Return value is \(begin end name positive-p), or nil if none was found."
   (let ((face (intern (concat "fg:" color))))
     (cond ((null color)
           (message "Warning: no color specified for <x-color>"))
-         ((internal-find-face face))
-         ((and window-system (facemenu-get-face face)))
+         ((facep face))
+         ((and (display-color-p) (facemenu-get-face face)))
          ((make-face face)
           (message "Warning: color `%s' can't be displayed" color)))
     (list from to 'face face)))
@@ -448,8 +444,8 @@ Return value is \(begin end name positive-p), or nil if none was found."
   (let ((face (intern (concat "bg:" color))))
     (cond ((null color)
           (message "Warning: no color specified for <x-bg-color>"))
-         ((internal-find-face face))
-         ((and window-system (facemenu-get-face face)))
+         ((facep face))
+         ((and (display-color-p) (facemenu-get-face face)))
          ((make-face face)
           (message "Warning: color `%s' can't be displayed" color)))
     (list from to 'face face)))