# HG changeset patch # User Eli Zaretskii # Date 1003743848 0 # Node ID 744190a4880c6d848fb8d46cc8e6d94910b7092f # Parent ba769a5fb85598954c62f86d1af478564002123e (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. diff -r ba769a5fb855 -r 744190a4880c lisp/textmodes/sgml-mode.el --- 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")))