changeset 40176:744190a4880c

(sgml-mode-map): Bind 8-bit codes above 127 to sgml-maybe-name-self. (sgml-name-8bit-mode): Doc fix. (sgml-char-names-table): New variable. (sgml-name-char): Support non-ASCII and mule-unicode-* characters. Doc fix. (sgml-maybe-name-self): Convert unibyte characters to multibyte.
author Eli Zaretskii <eliz@gnu.org>
date Mon, 22 Oct 2001 09:44:08 +0000
parents ba769a5fb855
children e139b00b4f06
files lisp/textmodes/sgml-mode.el
diffstat 1 files changed, 43 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/textmodes/sgml-mode.el	Mon Oct 22 09:33:59 2001 +0000
+++ b/lisp/textmodes/sgml-mode.el	Mon Oct 22 09:44:08 2001 +0000
@@ -106,6 +106,10 @@
         (define-key map "'" 'sgml-name-self)))
     (define-key map (vector (make-char 'latin-iso8859-1))
       'sgml-maybe-name-self)
+    (let ((c 127)
+	  (map (nth 1 map)))
+      (while (< (setq c (1+ c)) 256)
+	(aset map c 'sgml-maybe-name-self)))
     (define-key map [menu-bar sgml] (cons "SGML" menu-map))
     (define-key menu-map [sgml-validate] '("Validate" . sgml-validate))
     (define-key menu-map [sgml-name-8bit-mode]
@@ -142,7 +146,7 @@
 
 
 (defcustom sgml-name-8bit-mode nil
-  "*When non-nil, insert 8 bit characters with their names."
+  "*When non-nil, insert non-ASCII characters as named entities."
   :type 'boolean
   :group 'sgml)
 
@@ -181,6 +185,20 @@
    "oslash" "ugrave" "uacute" "ucirc" "uuml" "yacute" "thorn" "yuml"]
   "Vector of symbolic character names without `&' and `;'.")
 
+(put 'sgml-table 'char-table-extra-slots 0)
+
+(defvar sgml-char-names-table
+  (let ((table (make-char-table 'sgml-table))
+	(i 32)
+	elt)
+    (while (< i 256)
+      (setq elt (aref sgml-char-names i))
+      (if elt (aset table (make-char 'latin-iso8859-1 i) elt))
+      (setq i (1+ i)))
+    table)
+  "A table for mapping non-ASCII characters into SGML entity names.
+Currently, only Latin-1 characters are supported.")
+
 
 ;; nsgmls is a free SGML parser in the SP suite available from
 ;; ftp.jclark.com and otherwise packaged for GNU systems.
@@ -448,8 +466,9 @@
 
 (defun sgml-name-char (&optional char)
   "Insert a symbolic character name according to `sgml-char-names'.
-8 bit chars may be inserted with the meta key as in M-SPC for no break space,
-or M-- for a soft hyphen."
+Non-ASCII chars may be inserted either with the meta key, as in M-SPC for
+no-break space or M-- for a soft hyphen; or via an input method or
+encoded keyboard operation."
   (interactive "*")
   (insert ?&)
   (or char
@@ -458,34 +477,42 @@
   (insert char)
   (undo-boundary)
   (delete-backward-char 1)
-  (insert ?&
-	  (or (aref sgml-char-names char)
-	      (format "#%d" char))
-	  ?\;))
-
+  (cond
+   ((< char 256)
+    (insert ?&
+	    (or (aref sgml-char-names char)
+		(format "#%d" char))
+	    ?\;))
+   ((aref sgml-char-names-table char)
+    (insert ?& (aref sgml-char-names-table char) ?\;))
+   ((memq (char-charset char) '(mule-unicode-0100-24ff
+				mule-unicode-2500-33ff
+				mule-unicode-e000-ffff))
+    (insert (format "&#%d;" (encode-char char 'ucs))))
+   (t
+    (insert char))))
 
 (defun sgml-name-self ()
   "Insert a symbolic character name according to `sgml-char-names'."
   (interactive "*")
   (sgml-name-char last-command-char))
 
-
 (defun sgml-maybe-name-self ()
   "Insert a symbolic character name according to `sgml-char-names'."
   (interactive "*")
   (if sgml-name-8bit-mode
-      (sgml-name-char
-       (if (eq (char-charset last-command-char) 'latin-iso8859-1)
-	   (+ 128 (- last-command-char (make-char 'latin-iso8859-1)))
-	 last-command-char))
+      (let ((mc last-command-char))
+	(if (< mc 256)
+	    (setq mc (unibyte-char-to-multibyte mc)))
+	(or mc (setq mc last-command-char))
+	(sgml-name-char mc))
     (self-insert-command 1)))
 
-
 (defun sgml-name-8bit-mode ()
-  "Toggle insertion of 8 bit characters."
+  "Toggle whether to insert named entities instead of non-ASCII characters."
   (interactive)
   (setq sgml-name-8bit-mode (not sgml-name-8bit-mode))
-  (message "sgml name 8 bit mode  is now %s"
+  (message "sgml name entity mode is now %s"
 	   (if sgml-name-8bit-mode "ON" "OFF")))