aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorColin Walters <[email protected]>2002-05-21 21:14:03 +0000
committerColin Walters <[email protected]>2002-05-21 21:14:03 +0000
commitd9f6dfe6e70e5d344e5e786b43010c30a16737a3 (patch)
tree89a65662675d058ba20614f88306361952b55b02 /lisp
parent4531bb653ba0638f31bb04a6a17367a72f072f8a (diff)
(make-coding-system): Doc fixes.
(auto-coding-functions): New variable. (auto-coding-from-file-contents): Use it. (set-auto-coding): Update docs. (sgml-xml-auto-coding-function): New function.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/international/mule.el55
1 files changed, 49 insertions, 6 deletions
diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index fea506437a..b2ec27dc3b 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -725,9 +725,9 @@ in the following format:
TYPE is an integer value indicating the type of the coding system as follows:
0: Emacs internal format,
- 1: Shift-JIS (or MS-Kanji) used mainly on Japanese PC,
+ 1: Shift-JIS (or MS-Kanji) used mainly on Japanese PCs,
2: ISO-2022 including many variants,
- 3: Big5 used mainly on Chinese PC,
+ 3: Big5 used mainly on Chinese PCs,
4: private, CCL programs provide encoding/decoding algorithm,
5: Raw-text, which means that text contains random 8-bit codes.
@@ -822,7 +822,7 @@ following properties are recognized:
o mime-charset
- The value is a symbol of which name is `MIME-charset' parameter of
+ The value is a symbol whose name is the `MIME-charset' parameter of
the coding system.
o valid-codes (meaningful only for a coding system based on CCL)
@@ -1489,6 +1489,22 @@ and the contents of `file-coding-system-alist'."
:type '(repeat (cons (regexp :tag "Regexp")
(symbol :tag "Coding system"))))
+;; See the bottom of this file for built-in auto coding functions.
+(defcustom auto-coding-functions '(sgml-xml-auto-coding-function)
+ "A list of functions which attempt to determine a coding system.
+
+Each function in this list should be written to operate on the current
+buffer, but should not modify it in any way. It should take one
+argument SIZE, past which it should not search. If a function
+succeeds in determining a coding system, it should return that coding
+system. Otherwise, it should return nil.
+
+The functions in this list take priority over `coding:' tags in the
+file, just as for `auto-coding-regexp-alist'."
+ :group 'files
+ :group 'mule
+ :type '(repeat function))
+
(defvar set-auto-coding-for-load nil
"Non-nil means look for `load-coding' property instead of `coding'.
This is used for loading and byte-compiling Emacs Lisp files.")
@@ -1504,21 +1520,25 @@ This is used for loading and byte-compiling Emacs Lisp files.")
(setq alist (cdr alist))))
coding-system))
-
(defun auto-coding-from-file-contents (size)
"Determine a coding system from the contents of the current buffer.
The current buffer contains SIZE bytes starting at point.
Value is either a coding system or nil."
(save-excursion
(let ((alist auto-coding-regexp-alist)
+ (funcs auto-coding-functions)
coding-system)
(while (and alist (not coding-system))
(let ((regexp (car (car alist))))
(when (re-search-forward regexp (+ (point) size) t)
(setq coding-system (cdr (car alist)))))
(setq alist (cdr alist)))
+ (while (and funcs (not coding-system))
+ (setq coding-system (condition-case e
+ (save-excursion
+ (funcall (pop funcs) size))
+ (error nil))))
coding-system)))
-
(defun set-auto-coding (filename size)
"Return coding system for a file FILENAME of which SIZE bytes follow point.
@@ -1528,7 +1548,8 @@ and the last 3k of the file, but the middle may be omitted.
It checks FILENAME against the variable `auto-coding-alist'. If
FILENAME doesn't match any entries in the variable, it checks the
contents of the current buffer following point against
-`auto-coding-regexp-alist'. If no match is found, it checks for a
+`auto-coding-regexp-alist', and tries calling each function in
+`auto-coding-functions'. If no match is found, it checks for a
`coding:' tag in the first one or two lines following point. If no
`coding:' tag is found, it checks for local variables list in the last
3K bytes out of the SIZE bytes.
@@ -1898,6 +1919,28 @@ the table in `translation-table-vector'."
(setq ignore-relative-composition
(make-char-table 'ignore-relative-composition))
+
+;;; Built-in auto-coding-functions:
+
+(defun sgml-xml-auto-coding-function (size)
+ "Determine whether the buffer is XML, and if so, its encoding.
+This function is intended to be added to `auto-coding-functions'."
+ (when (re-search-forward "\\`[[:space:]\n]*<\\?xml")
+ (let ((end (save-excursion
+ ;; This is a hack.
+ (search-forward "\"\\s-*?>" size t))))
+ (when end
+ (if (re-search-forward "encoding=\"\\(.+?\\)\"" end t)
+ (let ((match (downcase (match-string 1))))
+ ;; FIXME: what other encodings are valid, and how can we
+ ;; translate them to the names of coding systems?
+ (cond ((string= match "utf-8")
+ 'utf-8)
+ ((string-match "iso-8859-[[:digit:]]+" match)
+ (intern match))
+ (t nil)))
+ 'utf-8)))))
+
;;;
(provide 'mule)