diff options
| author | Miles Bader | 2004-07-11 22:08:06 +0000 |
|---|---|---|
| committer | Miles Bader | 2004-07-11 22:08:06 +0000 |
| commit | 89f3c0c9fda25756ee311a6d0467a97bac203eb5 (patch) | |
| tree | be9d2244f2ba1e7ecd4d680e92e5fdffca58ab03 /lisp | |
| parent | 094194de121c8b93c7b183182cb0853ec54fe1aa (diff) | |
| parent | da38045d0a9949d46814683391e094a3612b6b41 (diff) | |
| download | emacs-89f3c0c9fda25756ee311a6d0467a97bac203eb5.tar.gz emacs-89f3c0c9fda25756ee311a6d0467a97bac203eb5.zip | |
Revision: miles@gnu.org--gnu-2004/emacs--unicode--0--patch-23
Merge from emacs--cvs-trunk--0
Patches applied:
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-442
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-444
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-445
Tweak permissions
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-446
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-450
Update from CVS
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/ChangeLog | 76 | ||||
| -rw-r--r-- | lisp/ediff-mult.el | 2 | ||||
| -rw-r--r-- | lisp/emacs-lisp/re-builder.el | 3 | ||||
| -rw-r--r-- | lisp/files.el | 7 | ||||
| -rw-r--r-- | lisp/mouse.el | 3 | ||||
| -rw-r--r-- | lisp/printing.el | 218 | ||||
| -rw-r--r-- | lisp/progmodes/cperl-mode.el | 2 | ||||
| -rw-r--r-- | lisp/replace.el | 3 | ||||
| -rw-r--r-- | lisp/simple.el | 3 | ||||
| -rw-r--r-- | lisp/term/mac-win.el | 13 | ||||
| -rw-r--r-- | lisp/wid-edit.el | 2 | ||||
| -rw-r--r-- | lisp/window.el | 41 | ||||
| -rw-r--r-- | lisp/xml.el | 400 |
13 files changed, 541 insertions, 232 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 92552debee2..68fe5246458 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,79 @@ | |||
| 1 | 2004-07-10 Luc Teirlinck <teirllm@auburn.edu> | ||
| 2 | |||
| 3 | * files.el (switch-to-buffer-other-window): Doc fix. | ||
| 4 | |||
| 5 | * window.el (save-selected-window, one-window-p) | ||
| 6 | (split-window-keep-point, split-window-vertically) | ||
| 7 | (split-window-horizontally): Doc fixes. | ||
| 8 | |||
| 9 | 2004-07-10 Vinicius Jose Latorre <viniciusjl@ig.com.br> | ||
| 10 | |||
| 11 | * printing.el: Doc fix. Now it uses call-process instead of | ||
| 12 | shell-command for low command execution. | ||
| 13 | (pr-version): New version number (6.8). | ||
| 14 | (pr-shell-file-name): Option removed. | ||
| 15 | (pr-shell-command): Fun removed. | ||
| 16 | (pr-call-process): New fun. Replace pr-shell-command. | ||
| 17 | (pr-standard-path, pr-remove-nil-from-list): New funs. | ||
| 18 | (zmacs-region-stays, current-mouse-event, current-menubar): New var. | ||
| 19 | (pr-ps-file-preview, pr-ps-file-using-ghostscript, pr-ps-file-print) | ||
| 20 | (pr-setup, pr-ps-set-printer, pr-txt-set-printer) | ||
| 21 | (pr-ps-utility-process, pr-txt-print): Code fix. | ||
| 22 | |||
| 23 | 2004-07-10 Stephan Stahl <stahl@eos.franken.de> (tiny change) | ||
| 24 | |||
| 25 | * ediff-mult.el (ediff-meta-truncate-filenames): Change type to | ||
| 26 | boolean. | ||
| 27 | |||
| 28 | 2004-07-09 Lars Hansen <larsh@math.ku.dk> | ||
| 29 | |||
| 30 | * wid-edit.el (widget-field-buffer): Doc fix. | ||
| 31 | |||
| 32 | 2004-07-09 John Paul Wallington <jpw@gnu.org> | ||
| 33 | |||
| 34 | * emacs-lisp/re-builder.el (reb-update-overlays): Distinguish | ||
| 35 | between one and several matches in message. | ||
| 36 | |||
| 37 | 2004-07-09 Richard M. Stallman <rms@gnu.org> | ||
| 38 | |||
| 39 | * mouse.el (mouse-set-region-1): If transient-mark-mode | ||
| 40 | is `identity', change it to `only'. | ||
| 41 | |||
| 42 | * simple.el (current-word): Doc fix. | ||
| 43 | |||
| 44 | 2004-07-09 Mark A. Hershberger <mah@everybody.org> | ||
| 45 | |||
| 46 | * progmodes/cperl-mode.el (cperl-mode): Adapt defun-prompt-regexp | ||
| 47 | so that it is more understanding of whitespace. | ||
| 48 | |||
| 49 | * xml.el (xml-maybe-do-ns, xml-parse-tag): Produce elements in the | ||
| 50 | form | ||
| 51 | (("ns" . "element") (attr-list) children) instead of | ||
| 52 | ((:ns . "element") (attr-list) children) in order to reduce the | ||
| 53 | number of symbols used. | ||
| 54 | (xml-skip-dtd): Change to use xml-parse-dtd but set | ||
| 55 | xml-validating-parsing to nil. | ||
| 56 | (xml-parse-dtd): Parse entity deleclarations in DOCTYPEs. | ||
| 57 | (xml-substitute-entity): Remove in favor of new entity substitution. | ||
| 58 | (xml-substitute-special): Rewrite in to substitute complex | ||
| 59 | entities from DOCTYPE declarations. | ||
| 60 | (xml-parse-fragment): Parse fragments from entity deleclarations. | ||
| 61 | (xml-parse-region, xml-parse-tag, xml-parse-attlist) | ||
| 62 | (xml-parse-dtd, xml-substitute-special): Make validity checks | ||
| 63 | conditioned on xml-validating-parser. Add "Not Well Formed" to | ||
| 64 | error messages about well-formedness. | ||
| 65 | |||
| 66 | 2004-07-08 Steven Tamm <steventamm@mac.com> | ||
| 67 | |||
| 68 | * term/mac-win.el (mac-scroll-ignore-events, mac-scroll-down) | ||
| 69 | (mac-scroll-down-line, mac-scroll-up, mac-scroll-up-line): | ||
| 70 | Do not treat double clicks and triple clicks specially in the | ||
| 71 | scroll bar (preventing strange repositioning problems) | ||
| 72 | |||
| 73 | 2004-07-06 Stefan <monnier@iro.umontreal.ca> | ||
| 74 | |||
| 75 | * replace.el (query-replace-regexp-eval): Fix last change. | ||
| 76 | |||
| 1 | 2004-07-05 Stefan <monnier@iro.umontreal.ca> | 77 | 2004-07-05 Stefan <monnier@iro.umontreal.ca> |
| 2 | 78 | ||
| 3 | * replace.el (query-replace-descr): New fun. | 79 | * replace.el (query-replace-descr): New fun. |
diff --git a/lisp/ediff-mult.el b/lisp/ediff-mult.el index f5eff1eb49d..cf6edc2d129 100644 --- a/lisp/ediff-mult.el +++ b/lisp/ediff-mult.el | |||
| @@ -200,7 +200,7 @@ Should be a sexp. For instance (car ediff-filtering-regexp-history) or nil." | |||
| 200 | (defcustom ediff-meta-truncate-filenames t | 200 | (defcustom ediff-meta-truncate-filenames t |
| 201 | "*If non-nil, truncate long file names in the session group buffers. | 201 | "*If non-nil, truncate long file names in the session group buffers. |
| 202 | This can be toggled with `ediff-toggle-filename-truncation'." | 202 | This can be toggled with `ediff-toggle-filename-truncation'." |
| 203 | :type 'hook | 203 | :type 'boolean |
| 204 | :group 'ediff-mult) | 204 | :group 'ediff-mult) |
| 205 | (defcustom ediff-registry-setup-hook nil | 205 | (defcustom ediff-registry-setup-hook nil |
| 206 | "*Hooks run just after the registry control panel is set up." | 206 | "*Hooks run just after the registry control panel is set up." |
diff --git a/lisp/emacs-lisp/re-builder.el b/lisp/emacs-lisp/re-builder.el index 83d3649006e..c6112c4a105 100644 --- a/lisp/emacs-lisp/re-builder.el +++ b/lisp/emacs-lisp/re-builder.el | |||
| @@ -670,9 +670,10 @@ If SUBEXP is non-nil mark only the corresponding sub-expressions." | |||
| 670 | (overlay-put overlay 'priority i))) | 670 | (overlay-put overlay 'priority i))) |
| 671 | (setq i (1+ i)))))) | 671 | (setq i (1+ i)))))) |
| 672 | (let ((count (if subexp submatches matches))) | 672 | (let ((count (if subexp submatches matches))) |
| 673 | (message"%s %smatch(es)%s" | 673 | (message"%s %smatch%s%s" |
| 674 | (if (= 0 count) "No" (int-to-string count)) | 674 | (if (= 0 count) "No" (int-to-string count)) |
| 675 | (if subexp "subexpression " "") | 675 | (if subexp "subexpression " "") |
| 676 | (if (= 1 count) "" "es") | ||
| 676 | (if (and reb-auto-match-limit | 677 | (if (and reb-auto-match-limit |
| 677 | (= reb-auto-match-limit count)) | 678 | (= reb-auto-match-limit count)) |
| 678 | " (limit reached)" ""))) | 679 | " (limit reached)" ""))) |
diff --git a/lisp/files.el b/lisp/files.el index 1d500379925..30f318fbf69 100644 --- a/lisp/files.el +++ b/lisp/files.el | |||
| @@ -869,8 +869,15 @@ use with M-x." | |||
| 869 | 869 | ||
| 870 | (defun switch-to-buffer-other-window (buffer &optional norecord) | 870 | (defun switch-to-buffer-other-window (buffer &optional norecord) |
| 871 | "Select buffer BUFFER in another window. | 871 | "Select buffer BUFFER in another window. |
| 872 | If BUFFER does not identify an existing buffer, then this function | ||
| 873 | creates a buffer with that name. | ||
| 874 | |||
| 875 | When called from Lisp, BUFFER can be a buffer, a string \(a buffer name), | ||
| 876 | or nil. If BUFFER is nil, then this function chooses a buffer | ||
| 877 | using `other-buffer'. | ||
| 872 | Optional second arg NORECORD non-nil means | 878 | Optional second arg NORECORD non-nil means |
| 873 | do not put this buffer at the front of the list of recently selected ones. | 879 | do not put this buffer at the front of the list of recently selected ones. |
| 880 | This function returns the buffer it switched to. | ||
| 874 | 881 | ||
| 875 | This uses the function `display-buffer' as a subroutine; see its | 882 | This uses the function `display-buffer' as a subroutine; see its |
| 876 | documentation for additional customization information." | 883 | documentation for additional customization information." |
diff --git a/lisp/mouse.el b/lisp/mouse.el index 7f9d080478a..b73967b99dc 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el | |||
| @@ -625,7 +625,8 @@ This should be bound to a mouse drag event." | |||
| 625 | 625 | ||
| 626 | (defun mouse-set-region-1 () | 626 | (defun mouse-set-region-1 () |
| 627 | ;; Set transient-mark-mode for a little while. | 627 | ;; Set transient-mark-mode for a little while. |
| 628 | (setq transient-mark-mode (or transient-mark-mode 'only)) | 628 | (if (memq transient-mark-mode '(nil identity)) |
| 629 | (setq transient-mark-mode 'only)) | ||
| 629 | (setq mouse-last-region-beg (region-beginning)) | 630 | (setq mouse-last-region-beg (region-beginning)) |
| 630 | (setq mouse-last-region-end (region-end)) | 631 | (setq mouse-last-region-end (region-end)) |
| 631 | (setq mouse-last-region-tick (buffer-modified-tick))) | 632 | (setq mouse-last-region-tick (buffer-modified-tick))) |
diff --git a/lisp/printing.el b/lisp/printing.el index 57dd0691f99..351d6b64e85 100644 --- a/lisp/printing.el +++ b/lisp/printing.el | |||
| @@ -3,18 +3,18 @@ | |||
| 3 | ;; Copyright (C) 2000, 2001, 2002, 2003, 2004 | 3 | ;; Copyright (C) 2000, 2001, 2002, 2003, 2004 |
| 4 | ;; Free Software Foundation, Inc. | 4 | ;; Free Software Foundation, Inc. |
| 5 | 5 | ||
| 6 | ;; Author: Vinicius Jose Latorre <vinicius@cpqd.com.br> | 6 | ;; Author: Vinicius Jose Latorre <viniciusjl@ig.com.br> |
| 7 | ;; Maintainer: Vinicius Jose Latorre <vinicius@cpqd.com.br> | 7 | ;; Maintainer: Vinicius Jose Latorre <viniciusjl@ig.com.br> |
| 8 | ;; Time-stamp: <2004/04/05 23:41:49 vinicius> | 8 | ;; Time-stamp: <2004/07/10 18:48:24 vinicius> |
| 9 | ;; Keywords: wp, print, PostScript | 9 | ;; Keywords: wp, print, PostScript |
| 10 | ;; Version: 6.7.4 | 10 | ;; Version: 6.8 |
| 11 | ;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/ | 11 | ;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/ |
| 12 | 12 | ||
| 13 | (defconst pr-version "6.7.4" | 13 | (defconst pr-version "6.8" |
| 14 | "printing.el, v 6.7.4 <2004/03/31 vinicius> | 14 | "printing.el, v 6.8 <2004/07/10 vinicius> |
| 15 | 15 | ||
| 16 | Please send all bug fixes and enhancements to | 16 | Please send all bug fixes and enhancements to |
| 17 | Vinicius Jose Latorre <vinicius@cpqd.com.br> | 17 | Vinicius Jose Latorre <viniciusjl@ig.com.br> |
| 18 | ") | 18 | ") |
| 19 | 19 | ||
| 20 | ;; This file is part of GNU Emacs. | 20 | ;; This file is part of GNU Emacs. |
| @@ -40,10 +40,23 @@ Please send all bug fixes and enhancements to | |||
| 40 | ;; Introduction | 40 | ;; Introduction |
| 41 | ;; ------------ | 41 | ;; ------------ |
| 42 | ;; | 42 | ;; |
| 43 | ;; This package provides some printing utilities that includes | 43 | ;; This package provides an user interface to some printing utilities that |
| 44 | ;; previewing/printing a PostScript file, printing a text file and | 44 | ;; includes previewing/printing a PostScript file, printing a text file and |
| 45 | ;; previewing/printing some major modes (like mh-folder-mode, | 45 | ;; previewing/printing some major modes (like mh-folder-mode, |
| 46 | ;; rmail-summary-mode, gnus-summary-mode, etc). | 46 | ;; rmail-summary-mode, gnus-summary-mode, etc). It also includes a |
| 47 | ;; PostScript/text printer database. | ||
| 48 | ;; | ||
| 49 | ;; Indeed, there are two user interfaces: | ||
| 50 | ;; | ||
| 51 | ;; * one is via menubar: | ||
| 52 | ;; When `printing' is loaded, the menubar is modified to use `printing' | ||
| 53 | ;; menu instead of the print options in menubar. | ||
| 54 | ;; This is the default user interface. | ||
| 55 | ;; | ||
| 56 | ;; * other is via buffer interface: | ||
| 57 | ;; It is an option of `printing' menu, but it can be binded into another | ||
| 58 | ;; key, so user can activate the buffer interface directly without using | ||
| 59 | ;; a menu. See `pr-interface' command. | ||
| 47 | ;; | 60 | ;; |
| 48 | ;; `printing' was inspired on: | 61 | ;; `printing' was inspired on: |
| 49 | ;; | 62 | ;; |
| @@ -172,7 +185,7 @@ Please send all bug fixes and enhancements to | |||
| 172 | ;; Tips | 185 | ;; Tips |
| 173 | ;; ---- | 186 | ;; ---- |
| 174 | ;; | 187 | ;; |
| 175 | ;; 1. If your have a local printer, that is, a printer which is connected | 188 | ;; 1. If you have a local printer, that is, a printer which is connected |
| 176 | ;; directly to your computer, don't forget to connect the printer to your | 189 | ;; directly to your computer, don't forget to connect the printer to your |
| 177 | ;; computer before printing. | 190 | ;; computer before printing. |
| 178 | ;; | 191 | ;; |
| @@ -187,16 +200,26 @@ Please send all bug fixes and enhancements to | |||
| 187 | ;; another buffer and, then, print the file or the new static buffer. | 200 | ;; another buffer and, then, print the file or the new static buffer. |
| 188 | ;; An example of dynamic buffer is the *Messages* buffer. | 201 | ;; An example of dynamic buffer is the *Messages* buffer. |
| 189 | ;; | 202 | ;; |
| 190 | ;; 4. When running Emacs on Windows with cygwin, check if the | 203 | ;; 4. When running Emacs on Windows (with or without cygwin), check if your |
| 191 | ;; `pr-shell-file-name' variable is set to the proper shell. This shell | 204 | ;; printer is a text printer or not by typing in a DOS window: |
| 192 | ;; will execute the commands to preview/print the buffer, file or directory. | 205 | ;; |
| 193 | ;; Also check the setting of `pr-path-style' variable. | 206 | ;; print /D:\\host\printer somefile.txt |
| 194 | ;; Probably, you should use: | 207 | ;; |
| 208 | ;; Where, `host' is the machine where your printer is directly connected, | ||
| 209 | ;; `printer' is the printer name and `somefile.txt' is a text file. | ||
| 195 | ;; | 210 | ;; |
| 196 | ;; (setq pr-shell-file-name "bash") | 211 | ;; If the printer `\\host\printer' doesn't print the content of |
| 197 | ;; (setq pr-path-style 'unix) | 212 | ;; `somefile.txt' or, instead, it returns the following message: |
| 198 | ;; | 213 | ;; |
| 199 | ;; And use / instead of \ when specifying a directory. | 214 | ;; PostScript Error Handler |
| 215 | ;; Offending Command = CCC | ||
| 216 | ;; Stack = | ||
| 217 | ;; | ||
| 218 | ;; Where `CCC' is whatever is at the beginning of the text to be printed. | ||
| 219 | ;; | ||
| 220 | ;; Therefore, the printer `\\host\printer' is not a text printer, but a | ||
| 221 | ;; PostScript printer. So, please, don't include this printer in | ||
| 222 | ;; `pr-txt-printer-alist' (which see). | ||
| 200 | ;; | 223 | ;; |
| 201 | ;; | 224 | ;; |
| 202 | ;; Using `printing' | 225 | ;; Using `printing' |
| @@ -479,9 +502,6 @@ Please send all bug fixes and enhancements to | |||
| 479 | ;; `pr-buffer-verbose' Non-nil means to be verbose when editing a | 502 | ;; `pr-buffer-verbose' Non-nil means to be verbose when editing a |
| 480 | ;; field in interface buffer. | 503 | ;; field in interface buffer. |
| 481 | ;; | 504 | ;; |
| 482 | ;; `pr-shell-file-name' Specify file name to load inferior shells | ||
| 483 | ;; from. | ||
| 484 | ;; | ||
| 485 | ;; To set the above options you may: | 505 | ;; To set the above options you may: |
| 486 | ;; | 506 | ;; |
| 487 | ;; a) insert the code in your ~/.emacs, like: | 507 | ;; a) insert the code in your ~/.emacs, like: |
| @@ -912,8 +932,8 @@ Please send all bug fixes and enhancements to | |||
| 912 | (require 'ps-print) | 932 | (require 'ps-print) |
| 913 | 933 | ||
| 914 | 934 | ||
| 915 | (and (string< ps-print-version "6.5.7") | 935 | (and (string< ps-print-version "6.6.4") |
| 916 | (error "`printing' requires `ps-print' package version 6.5.7 or later.")) | 936 | (error "`printing' requires `ps-print' package version 6.6.4 or later.")) |
| 917 | 937 | ||
| 918 | 938 | ||
| 919 | (eval-and-compile | 939 | (eval-and-compile |
| @@ -1064,6 +1084,15 @@ Valid values are: | |||
| 1064 | path)) | 1084 | path)) |
| 1065 | 1085 | ||
| 1066 | 1086 | ||
| 1087 | (defun pr-standard-path (path) | ||
| 1088 | "Ensure the proper directory separator depending on the OS. | ||
| 1089 | That is, if Emacs is running on DOS/Windows, ensure dos/windows-style directory | ||
| 1090 | separator; otherwise, ensure unix-style directory separator." | ||
| 1091 | (if (or pr-cygwin-system ps-windows-system) | ||
| 1092 | (subst-char-in-string ?/ ?\\ path) | ||
| 1093 | (subst-char-in-string ?\\ ?/ path))) | ||
| 1094 | |||
| 1095 | |||
| 1067 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 1096 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 1068 | ;; User Interface (II) | 1097 | ;; User Interface (II) |
| 1069 | 1098 | ||
| @@ -2314,16 +2343,6 @@ It's used by `pr-interface'." | |||
| 2314 | :group 'printing) | 2343 | :group 'printing) |
| 2315 | 2344 | ||
| 2316 | 2345 | ||
| 2317 | (defcustom pr-shell-file-name | ||
| 2318 | (if (and (not pr-cygwin-system) | ||
| 2319 | ps-windows-system) | ||
| 2320 | "cmdproxy.exe" | ||
| 2321 | shell-file-name) | ||
| 2322 | "*Specify file name to load inferior shells from." | ||
| 2323 | :type 'string | ||
| 2324 | :group 'printing) | ||
| 2325 | |||
| 2326 | |||
| 2327 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 2346 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 2328 | ;; Internal Variables | 2347 | ;; Internal Variables |
| 2329 | 2348 | ||
| @@ -2410,6 +2429,7 @@ See `pr-ps-printer-alist'.") | |||
| 2410 | (and pr-auto-region transient-mark-mode mark-active))) | 2429 | (and pr-auto-region transient-mark-mode mark-active))) |
| 2411 | 2430 | ||
| 2412 | ((eq ps-print-emacs-type 'xemacs) ; XEmacs | 2431 | ((eq ps-print-emacs-type 'xemacs) ; XEmacs |
| 2432 | (defvar zmacs-region-stays nil) ; to avoid compilation gripes | ||
| 2413 | (defsubst pr-region-active-p () | 2433 | (defsubst pr-region-active-p () |
| 2414 | (and pr-auto-region (not zmacs-region-stays) (ps-mark-active-p))))) | 2434 | (and pr-auto-region (not zmacs-region-stays) (ps-mark-active-p))))) |
| 2415 | 2435 | ||
| @@ -3792,9 +3812,7 @@ image in a file with that name." | |||
| 3792 | "Preview PostScript file FILENAME." | 3812 | "Preview PostScript file FILENAME." |
| 3793 | (interactive (list (pr-ps-infile-preprint "Preview "))) | 3813 | (interactive (list (pr-ps-infile-preprint "Preview "))) |
| 3794 | (and (stringp filename) (file-exists-p filename) | 3814 | (and (stringp filename) (file-exists-p filename) |
| 3795 | (let ((shell-file-name pr-shell-file-name)) | 3815 | (pr-call-process pr-gv-command filename))) |
| 3796 | (start-process-shell-command "PREVIEW" "*Messages*" | ||
| 3797 | (pr-command pr-gv-command) filename)))) | ||
| 3798 | 3816 | ||
| 3799 | 3817 | ||
| 3800 | ;;;###autoload | 3818 | ;;;###autoload |
| @@ -3815,12 +3833,13 @@ image in a file with that name." | |||
| 3815 | (let* ((file (pr-expand-file-name filename)) | 3833 | (let* ((file (pr-expand-file-name filename)) |
| 3816 | (tempfile (pr-dosify-path (make-temp-name file)))) | 3834 | (tempfile (pr-dosify-path (make-temp-name file)))) |
| 3817 | ;; gs use | 3835 | ;; gs use |
| 3818 | (pr-shell-command | 3836 | (pr-call-process pr-gs-command |
| 3819 | (concat (pr-command pr-gs-command) | 3837 | (format "-sDEVICE=%s" pr-gs-device) |
| 3820 | " -sDEVICE=" pr-gs-device | 3838 | (format "-r%d" pr-gs-resolution) |
| 3821 | " -r" (int-to-string pr-gs-resolution) | 3839 | (pr-switches-string pr-gs-switches "pr-gs-switches") |
| 3822 | " " (pr-switches-string pr-gs-switches "pr-gs-switches") | 3840 | (format "-sOutputFile=\"%s\"" tempfile) |
| 3823 | " -sOutputFile=" tempfile " " file " -c quit")) | 3841 | file |
| 3842 | "-c quit") | ||
| 3824 | ;; printing | 3843 | ;; printing |
| 3825 | (pr-ps-file-print tempfile) | 3844 | (pr-ps-file-print tempfile) |
| 3826 | ;; deleting | 3845 | ;; deleting |
| @@ -3841,16 +3860,16 @@ image in a file with that name." | |||
| 3841 | (erase-buffer) | 3860 | (erase-buffer) |
| 3842 | (insert-file-contents-literally file)) | 3861 | (insert-file-contents-literally file)) |
| 3843 | (pr-despool-print)) | 3862 | (pr-despool-print)) |
| 3844 | (pr-shell-command | 3863 | (apply 'pr-call-process |
| 3845 | (concat (pr-command pr-ps-command) " " | 3864 | pr-ps-command |
| 3846 | (pr-switches-string pr-ps-switches "pr-gs-switches") " " | 3865 | (pr-switches-string pr-ps-switches "pr-gs-switches") |
| 3847 | (if (string-match "cp" pr-ps-command) | 3866 | (if (string-match "cp" pr-ps-command) |
| 3848 | ;; for "cp" (cmd in out) | 3867 | ;; for "cp" (cmd in out) |
| 3849 | (concat "\"" file "\" " | 3868 | (list file |
| 3850 | pr-ps-printer-switch pr-ps-printer) | 3869 | (concat pr-ps-printer-switch pr-ps-printer)) |
| 3851 | ;; else, for others (cmd out in) | 3870 | ;; else, for others (cmd out in) |
| 3852 | (concat pr-ps-printer-switch pr-ps-printer | 3871 | (list (concat pr-ps-printer-switch pr-ps-printer) |
| 3853 | " \"" file "\"")))))))) | 3872 | file))))))) |
| 3854 | 3873 | ||
| 3855 | 3874 | ||
| 3856 | ;;;###autoload | 3875 | ;;;###autoload |
| @@ -4252,9 +4271,22 @@ Or choose the menu option Printing/Show Settings/printing." | |||
| 4252 | #'ps-print-quote | 4271 | #'ps-print-quote |
| 4253 | (list | 4272 | (list |
| 4254 | (concat "\n;;; printing.el version " pr-version "\n") | 4273 | (concat "\n;;; printing.el version " pr-version "\n") |
| 4255 | '(19 . pr-shell-file-name) | 4274 | ";; internal vars" |
| 4256 | '(19 . pr-path-style) | 4275 | (ps-comment-string "pr-txt-command " pr-txt-command) |
| 4257 | '(19 . pr-path-alist) | 4276 | (ps-comment-string "pr-txt-switches " |
| 4277 | (pr-switches-string pr-txt-switches "pr-txt-switches")) | ||
| 4278 | (ps-comment-string "pr-txt-printer " pr-txt-printer) | ||
| 4279 | (ps-comment-string "pr-ps-command " pr-ps-command) | ||
| 4280 | (ps-comment-string "pr-ps-switches " | ||
| 4281 | (pr-switches-string pr-ps-switches "pr-ps-switches")) | ||
| 4282 | (ps-comment-string "pr-ps-printer-switch" pr-ps-printer-switch) | ||
| 4283 | (ps-comment-string "pr-ps-printer " pr-ps-printer) | ||
| 4284 | (ps-comment-string "pr-cygwin-system " pr-cygwin-system) | ||
| 4285 | (ps-comment-string "ps-windows-system " ps-windows-system) | ||
| 4286 | (ps-comment-string "ps-lp-system " ps-lp-system) | ||
| 4287 | nil | ||
| 4288 | '(14 . pr-path-style) | ||
| 4289 | '(14 . pr-path-alist) | ||
| 4258 | nil | 4290 | nil |
| 4259 | '(21 . pr-txt-name) | 4291 | '(21 . pr-txt-name) |
| 4260 | '(21 . pr-txt-printer-alist) | 4292 | '(21 . pr-txt-printer-alist) |
| @@ -4570,6 +4602,7 @@ See `pr-visible-entry-alist'.") | |||
| 4570 | (cond | 4602 | (cond |
| 4571 | ((eq ps-print-emacs-type 'xemacs) | 4603 | ((eq ps-print-emacs-type 'xemacs) |
| 4572 | ;; XEmacs | 4604 | ;; XEmacs |
| 4605 | (defvar current-mouse-event nil) ; to avoid compilation gripes | ||
| 4573 | (defun pr-menu-position (entry index horizontal) | 4606 | (defun pr-menu-position (entry index horizontal) |
| 4574 | (pr-x-make-event | 4607 | (pr-x-make-event |
| 4575 | 'button-release | 4608 | 'button-release |
| @@ -4633,6 +4666,7 @@ See `pr-visible-entry-alist'.") | |||
| 4633 | 4666 | ||
| 4634 | ((eq ps-print-emacs-type 'xemacs) | 4667 | ((eq ps-print-emacs-type 'xemacs) |
| 4635 | ;; XEmacs | 4668 | ;; XEmacs |
| 4669 | (defvar current-menubar nil) ; to avoid compilation gripes | ||
| 4636 | (defun pr-menu-lookup (path) | 4670 | (defun pr-menu-lookup (path) |
| 4637 | (car (pr-x-find-menu-item current-menubar (cons "Printing" path)))) | 4671 | (car (pr-x-find-menu-item current-menubar (cons "Printing" path)))) |
| 4638 | 4672 | ||
| @@ -4973,7 +5007,7 @@ non-nil." | |||
| 4973 | pr-ps-command (pr-dosify-path (nth 0 ps)) | 5007 | pr-ps-command (pr-dosify-path (nth 0 ps)) |
| 4974 | pr-ps-switches (nth 1 ps) | 5008 | pr-ps-switches (nth 1 ps) |
| 4975 | pr-ps-printer-switch (nth 2 ps) | 5009 | pr-ps-printer-switch (nth 2 ps) |
| 4976 | pr-ps-printer (pr-dosify-path (nth 3 ps))) | 5010 | pr-ps-printer (nth 3 ps)) |
| 4977 | (or (stringp pr-ps-command) | 5011 | (or (stringp pr-ps-command) |
| 4978 | (setq pr-ps-command | 5012 | (setq pr-ps-command |
| 4979 | (cond (ps-windows-system "print") | 5013 | (cond (ps-windows-system "print") |
| @@ -4998,7 +5032,7 @@ non-nil." | |||
| 4998 | (setq pr-txt-name value | 5032 | (setq pr-txt-name value |
| 4999 | pr-txt-command (pr-dosify-path (nth 0 txt)) | 5033 | pr-txt-command (pr-dosify-path (nth 0 txt)) |
| 5000 | pr-txt-switches (nth 1 txt) | 5034 | pr-txt-switches (nth 1 txt) |
| 5001 | pr-txt-printer (pr-dosify-path (nth 2 txt)))) | 5035 | pr-txt-printer (nth 2 txt))) |
| 5002 | (or (stringp pr-txt-command) | 5036 | (or (stringp pr-txt-command) |
| 5003 | (setq pr-txt-command | 5037 | (setq pr-txt-command |
| 5004 | (cond (ps-windows-system "print") | 5038 | (cond (ps-windows-system "print") |
| @@ -5211,32 +5245,54 @@ non-nil." | |||
| 5211 | (let (item) | 5245 | (let (item) |
| 5212 | (and (stringp infile) (file-exists-p infile) | 5246 | (and (stringp infile) (file-exists-p infile) |
| 5213 | (setq item (cdr (assq pr-ps-utility pr-ps-utility-alist))) | 5247 | (setq item (cdr (assq pr-ps-utility pr-ps-utility-alist))) |
| 5214 | (pr-shell-command | 5248 | (pr-call-process (nth 0 item) |
| 5215 | (concat (pr-command (nth 0 item)) " " | 5249 | (pr-switches-string (nth 1 item) |
| 5216 | (pr-switches-string (nth 1 item) | 5250 | "pr-ps-utility-alist entry") |
| 5217 | "pr-ps-utility-alist entry") | 5251 | (pr-switches-string (nth 8 item) |
| 5218 | " " | 5252 | "pr-ps-utility-alist entry") |
| 5219 | (pr-switches-string (nth 8 item) | 5253 | (and (nth 2 item) |
| 5220 | "pr-ps-utility-alist entry") | 5254 | (format (nth 2 item) ps-paper-type)) |
| 5221 | " " | 5255 | (format (nth 3 item) n-up) |
| 5222 | (and (nth 2 item) | 5256 | (and pr-file-landscape (nth 4 item)) |
| 5223 | (format (nth 2 item) ps-paper-type)) | 5257 | (and pr-file-duplex (nth 5 item)) |
| 5224 | " " (format (nth 3 item) n-up) " " | 5258 | (and pr-file-tumble (nth 6 item)) |
| 5225 | (and pr-file-landscape (nth 4 item)) " " | 5259 | (pr-expand-file-name infile) |
| 5226 | (and pr-file-duplex (nth 5 item)) " " | 5260 | (nth 7 item) |
| 5227 | (and pr-file-tumble (nth 6 item)) | 5261 | (pr-expand-file-name outfile))))) |
| 5228 | " \"" (pr-expand-file-name infile) "\" " | 5262 | |
| 5229 | (nth 7 item) | 5263 | |
| 5230 | " \"" (pr-expand-file-name outfile) "\""))))) | 5264 | (defun pr-remove-nil-from-list (lst) |
| 5231 | 5265 | (while (and lst (null (car lst))) | |
| 5232 | 5266 | (setq lst (cdr lst))) | |
| 5233 | (defun pr-shell-command (command) | 5267 | (let ((b lst) |
| 5234 | (let ((shell-file-name pr-shell-file-name)) | 5268 | (l (cdr lst))) |
| 5235 | (shell-command command))) | 5269 | (while l |
| 5270 | (if (car l) | ||
| 5271 | (setq b l | ||
| 5272 | l (cdr l)) | ||
| 5273 | (setq l (cdr l)) | ||
| 5274 | (setcdr b l)))) | ||
| 5275 | lst) | ||
| 5276 | |||
| 5277 | |||
| 5278 | (defun pr-call-process (command &rest args) | ||
| 5279 | (let ((buffer (get-buffer-create "*Printing Command Output*")) | ||
| 5280 | (cmd (pr-command command)) | ||
| 5281 | status) | ||
| 5282 | (setq args (pr-remove-nil-from-list args)) | ||
| 5283 | (save-excursion | ||
| 5284 | (set-buffer buffer) | ||
| 5285 | (goto-char (point-max)) | ||
| 5286 | (insert (format "%s %S\n" cmd args))) | ||
| 5287 | (setq status (apply 'call-process cmd nil buffer nil args)) | ||
| 5288 | (save-excursion | ||
| 5289 | (set-buffer buffer) | ||
| 5290 | (goto-char (point-max)) | ||
| 5291 | (insert (format "Exit status: %s\n" status))))) | ||
| 5236 | 5292 | ||
| 5237 | 5293 | ||
| 5238 | (defun pr-txt-print (from to) | 5294 | (defun pr-txt-print (from to) |
| 5239 | (let ((lpr-command (pr-command pr-txt-command)) | 5295 | (let ((lpr-command (pr-standard-path (pr-command pr-txt-command))) |
| 5240 | (lpr-switches (pr-switches pr-txt-switches "pr-txt-switches")) | 5296 | (lpr-switches (pr-switches pr-txt-switches "pr-txt-switches")) |
| 5241 | (printer-name pr-txt-printer)) | 5297 | (printer-name pr-txt-printer)) |
| 5242 | (lpr-region from to))) | 5298 | (lpr-region from to))) |
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index c651e06b899..e679a48d642 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el | |||
| @@ -1472,7 +1472,7 @@ or as help on variables `cperl-tips', `cperl-problems', | |||
| 1472 | (make-local-variable 'comment-start-skip) | 1472 | (make-local-variable 'comment-start-skip) |
| 1473 | (setq comment-start-skip "#+ *") | 1473 | (setq comment-start-skip "#+ *") |
| 1474 | (make-local-variable 'defun-prompt-regexp) | 1474 | (make-local-variable 'defun-prompt-regexp) |
| 1475 | (setq defun-prompt-regexp "^[ \t]*sub[ \t]+\\([^ \t\n{(;]+\\)\\([ \t]*([^()]*)[ \t]*\\)?[ \t]*") | 1475 | (setq defun-prompt-regexp "^[ \t]*sub[ \t\n]+\\([^ \t\n{(;]+\\)\\([ \t\n]*([^()]*)[ \t\n]*\\)?[ \t\n]*)") |
| 1476 | (make-local-variable 'comment-indent-function) | 1476 | (make-local-variable 'comment-indent-function) |
| 1477 | (setq comment-indent-function 'cperl-comment-indent) | 1477 | (setq comment-indent-function 'cperl-comment-indent) |
| 1478 | (make-local-variable 'parse-sexp-ignore-comments) | 1478 | (make-local-variable 'parse-sexp-ignore-comments) |
diff --git a/lisp/replace.el b/lisp/replace.el index a7c8b859402..60c28d6c48a 100644 --- a/lisp/replace.el +++ b/lisp/replace.el | |||
| @@ -287,6 +287,7 @@ Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace | |||
| 287 | only matches that are surrounded by word boundaries. | 287 | only matches that are surrounded by word boundaries. |
| 288 | Fourth and fifth arg START and END specify the region to operate on." | 288 | Fourth and fifth arg START and END specify the region to operate on." |
| 289 | (interactive | 289 | (interactive |
| 290 | (progn | ||
| 290 | (barf-if-buffer-read-only) | 291 | (barf-if-buffer-read-only) |
| 291 | (let* ((from | 292 | (let* ((from |
| 292 | ;; Let-bind the history var to disable the "foo -> bar" default. | 293 | ;; Let-bind the history var to disable the "foo -> bar" default. |
| @@ -305,7 +306,7 @@ Fourth and fifth arg START and END specify the region to operate on." | |||
| 305 | (if (and transient-mark-mode mark-active) | 306 | (if (and transient-mark-mode mark-active) |
| 306 | (region-beginning)) | 307 | (region-beginning)) |
| 307 | (if (and transient-mark-mode mark-active) | 308 | (if (and transient-mark-mode mark-active) |
| 308 | (region-end))))) | 309 | (region-end)))))) |
| 309 | (perform-replace regexp (cons 'replace-eval-replacement to-expr) | 310 | (perform-replace regexp (cons 'replace-eval-replacement to-expr) |
| 310 | t 'literal delimited nil nil start end)) | 311 | t 'literal delimited nil nil start end)) |
| 311 | 312 | ||
diff --git a/lisp/simple.el b/lisp/simple.el index 8da9e8028f0..c45437fb123 100644 --- a/lisp/simple.el +++ b/lisp/simple.el | |||
| @@ -3364,7 +3364,8 @@ With argument, do this that many times." | |||
| 3364 | "Return the symbol or word that point is on (or a nearby one) as a string. | 3364 | "Return the symbol or word that point is on (or a nearby one) as a string. |
| 3365 | The return value includes no text properties. | 3365 | The return value includes no text properties. |
| 3366 | If optional arg STRICT is non-nil, return nil unless point is within | 3366 | If optional arg STRICT is non-nil, return nil unless point is within |
| 3367 | or adjacent to a symbol or word. | 3367 | or adjacent to a symbol or word. In all cases the value can be nil |
| 3368 | if there is no word nearby. | ||
| 3368 | The function, belying its name, normally finds a symbol. | 3369 | The function, belying its name, normally finds a symbol. |
| 3369 | If optional arg REALLY-WORD is non-nil, it finds just a word." | 3370 | If optional arg REALLY-WORD is non-nil, it finds just a word." |
| 3370 | (save-excursion | 3371 | (save-excursion |
diff --git a/lisp/term/mac-win.el b/lisp/term/mac-win.el index 1220c046cb7..15e813c53d3 100644 --- a/lisp/term/mac-win.el +++ b/lisp/term/mac-win.el | |||
| @@ -68,24 +68,29 @@ | |||
| 68 | (goto-char (window-start window)) | 68 | (goto-char (window-start window)) |
| 69 | (mac-scroll-up-line))))) | 69 | (mac-scroll-up-line))))) |
| 70 | 70 | ||
| 71 | (defun mac-scroll-ignore-events () | ||
| 72 | ;; Ignore confusing non-mouse events | ||
| 73 | (while (not (memq (car-safe (read-event)) | ||
| 74 | '(mouse-1 double-mouse-1 triple-mouse-1))) nil)) | ||
| 75 | |||
| 71 | (defun mac-scroll-down () | 76 | (defun mac-scroll-down () |
| 72 | (track-mouse | 77 | (track-mouse |
| 73 | (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) | 78 | (mac-scroll-ignore-events) |
| 74 | (scroll-down))) | 79 | (scroll-down))) |
| 75 | 80 | ||
| 76 | (defun mac-scroll-down-line () | 81 | (defun mac-scroll-down-line () |
| 77 | (track-mouse | 82 | (track-mouse |
| 78 | (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) | 83 | (mac-scroll-ignore-events) |
| 79 | (scroll-down 1))) | 84 | (scroll-down 1))) |
| 80 | 85 | ||
| 81 | (defun mac-scroll-up () | 86 | (defun mac-scroll-up () |
| 82 | (track-mouse | 87 | (track-mouse |
| 83 | (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) | 88 | (mac-scroll-ignore-events) |
| 84 | (scroll-up))) | 89 | (scroll-up))) |
| 85 | 90 | ||
| 86 | (defun mac-scroll-up-line () | 91 | (defun mac-scroll-up-line () |
| 87 | (track-mouse | 92 | (track-mouse |
| 88 | (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) | 93 | (mac-scroll-ignore-events) |
| 89 | (scroll-up 1))) | 94 | (scroll-up 1))) |
| 90 | 95 | ||
| 91 | (defun xw-defined-colors (&optional frame) | 96 | (defun xw-defined-colors (&optional frame) |
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el index e6ce5ae71db..bdbe607317d 100644 --- a/lisp/wid-edit.el +++ b/lisp/wid-edit.el | |||
| @@ -1144,7 +1144,7 @@ When not inside a field, move to the previous button or field." | |||
| 1144 | field))) | 1144 | field))) |
| 1145 | 1145 | ||
| 1146 | (defun widget-field-buffer (widget) | 1146 | (defun widget-field-buffer (widget) |
| 1147 | "Return the start of WIDGET's editing field." | 1147 | "Return the buffer of WIDGET's editing field." |
| 1148 | (let ((overlay (widget-get widget :field-overlay))) | 1148 | (let ((overlay (widget-get widget :field-overlay))) |
| 1149 | (cond ((overlayp overlay) | 1149 | (cond ((overlayp overlay) |
| 1150 | (overlay-buffer overlay)) | 1150 | (overlay-buffer overlay)) |
diff --git a/lisp/window.el b/lisp/window.el index 188b3acf311..96bfc8b5581 100644 --- a/lisp/window.el +++ b/lisp/window.el | |||
| @@ -34,7 +34,8 @@ | |||
| 34 | Also restore the selected window of each frame as it was at the start | 34 | Also restore the selected window of each frame as it was at the start |
| 35 | of this construct. | 35 | of this construct. |
| 36 | However, if a window has become dead, don't get an error, | 36 | However, if a window has become dead, don't get an error, |
| 37 | just refrain from reselecting it." | 37 | just refrain from reselecting it. |
| 38 | Return the value of the last form in BODY." | ||
| 38 | `(let ((save-selected-window-window (selected-window)) | 39 | `(let ((save-selected-window-window (selected-window)) |
| 39 | ;; It is necessary to save all of these, because calling | 40 | ;; It is necessary to save all of these, because calling |
| 40 | ;; select-window changes frame-selected-window for whatever | 41 | ;; select-window changes frame-selected-window for whatever |
| @@ -63,15 +64,17 @@ This does not include the mode line (if any) or the header line (if any)." | |||
| 63 | (if header-line-format 1 0)))))) | 64 | (if header-line-format 1 0)))))) |
| 64 | 65 | ||
| 65 | (defun one-window-p (&optional nomini all-frames) | 66 | (defun one-window-p (&optional nomini all-frames) |
| 66 | "Return non-nil if the selected window is the only window (in its frame). | 67 | "Return non-nil if the selected window is the only window. |
| 67 | Optional arg NOMINI non-nil means don't count the minibuffer | 68 | Optional arg NOMINI non-nil means don't count the minibuffer |
| 68 | even if it is active. | 69 | even if it is active. Otherwise, the minibuffer is counted |
| 70 | when it is active. | ||
| 69 | 71 | ||
| 70 | The optional arg ALL-FRAMES t means count windows on all frames. | 72 | The optional arg ALL-FRAMES t means count windows on all frames. |
| 71 | If it is `visible', count windows on all visible frames. | 73 | If it is `visible', count windows on all visible frames. |
| 72 | ALL-FRAMES nil or omitted means count only the selected frame, | 74 | ALL-FRAMES nil or omitted means count only the selected frame, |
| 73 | plus the minibuffer it uses (which may be on another frame). | 75 | plus the minibuffer it uses (which may be on another frame). |
| 74 | If ALL-FRAMES is neither nil nor t, count only the selected frame." | 76 | ALL-FRAMES 0 means count all windows in all visible or iconified frames. |
| 77 | If ALL-FRAMES is anything else, count only the selected frame." | ||
| 75 | (let ((base-window (selected-window))) | 78 | (let ((base-window (selected-window))) |
| 76 | (if (and nomini (eq base-window (minibuffer-window))) | 79 | (if (and nomini (eq base-window (minibuffer-window))) |
| 77 | (setq base-window (next-window base-window))) | 80 | (setq base-window (next-window base-window))) |
| @@ -87,7 +90,7 @@ bars (top, bottom, or nil)." | |||
| 87 | (let ((vert (nth 2 (window-scroll-bars window))) | 90 | (let ((vert (nth 2 (window-scroll-bars window))) |
| 88 | (hor nil)) | 91 | (hor nil)) |
| 89 | (when (or (eq vert t) (eq hor t)) | 92 | (when (or (eq vert t) (eq hor t)) |
| 90 | (let ((fcsb (frame-current-scroll-bars | 93 | (let ((fcsb (frame-current-scroll-bars |
| 91 | (window-frame (or window (selected-window)))))) | 94 | (window-frame (or window (selected-window)))))) |
| 92 | (if (eq vert t) | 95 | (if (eq vert t) |
| 93 | (setq vert (car fcsb))) | 96 | (setq vert (car fcsb))) |
| @@ -268,29 +271,38 @@ If WINDOW is nil or omitted, it defaults to the currently selected window." | |||
| 268 | 271 | ||
| 269 | ;; I think this should be the default; I think people will prefer it--rms. | 272 | ;; I think this should be the default; I think people will prefer it--rms. |
| 270 | (defcustom split-window-keep-point t | 273 | (defcustom split-window-keep-point t |
| 271 | "*If non-nil, split windows keeps the original point in both children. | 274 | "*If non-nil, \\[split-window-vertically] keeps the original point \ |
| 275 | in both children. | ||
| 272 | This is often more convenient for editing. | 276 | This is often more convenient for editing. |
| 273 | If nil, adjust point in each of the two windows to minimize redisplay. | 277 | If nil, adjust point in each of the two windows to minimize redisplay. |
| 274 | This is convenient on slow terminals, but point can move strangely." | 278 | This is convenient on slow terminals, but point can move strangely. |
| 279 | |||
| 280 | This option applies only to `split-window-vertically' and | ||
| 281 | functions that call it. `split-window' always keeps the original | ||
| 282 | point in both children," | ||
| 275 | :type 'boolean | 283 | :type 'boolean |
| 276 | :group 'windows) | 284 | :group 'windows) |
| 277 | 285 | ||
| 278 | (defun split-window-vertically (&optional arg) | 286 | (defun split-window-vertically (&optional arg) |
| 279 | "Split current window into two windows, one above the other. | 287 | "Split current window into two windows, one above the other. |
| 280 | The uppermost window gets ARG lines and the other gets the rest. | 288 | The uppermost window gets ARG lines and the other gets the rest. |
| 281 | Negative arg means select the size of the lowermost window instead. | 289 | Negative ARG means select the size of the lowermost window instead. |
| 282 | With no argument, split equally or close to it. | 290 | With no argument, split equally or close to it. |
| 283 | Both windows display the same buffer now current. | 291 | Both windows display the same buffer now current. |
| 284 | 292 | ||
| 285 | If the variable `split-window-keep-point' is non-nil, both new windows | 293 | If the variable `split-window-keep-point' is non-nil, both new windows |
| 286 | will get the same value of point as the current window. This is often | 294 | will get the same value of point as the current window. This is often |
| 287 | more convenient for editing. | 295 | more convenient for editing. The upper window is the selected window. |
| 288 | 296 | ||
| 289 | Otherwise, we chose window starts so as to minimize the amount of | 297 | Otherwise, we choose window starts so as to minimize the amount of |
| 290 | redisplay; this is convenient on slow terminals. The new selected | 298 | redisplay; this is convenient on slow terminals. The new selected |
| 291 | window is the one that the current value of point appears in. The | 299 | window is the one that the current value of point appears in. The |
| 292 | value of point can change if the text around point is hidden by the | 300 | value of point can change if the text around point is hidden by the |
| 293 | new mode line." | 301 | new mode line. |
| 302 | |||
| 303 | Regardless of the value of `split-window-keep-point', the upper | ||
| 304 | window is the original one and the return value is the new, lower | ||
| 305 | window." | ||
| 294 | (interactive "P") | 306 | (interactive "P") |
| 295 | (let ((old-w (selected-window)) | 307 | (let ((old-w (selected-window)) |
| 296 | (old-point (point)) | 308 | (old-point (point)) |
| @@ -338,10 +350,13 @@ new mode line." | |||
| 338 | (defun split-window-horizontally (&optional arg) | 350 | (defun split-window-horizontally (&optional arg) |
| 339 | "Split current window into two windows side by side. | 351 | "Split current window into two windows side by side. |
| 340 | This window becomes the leftmost of the two, and gets ARG columns. | 352 | This window becomes the leftmost of the two, and gets ARG columns. |
| 341 | Negative arg means select the size of the rightmost window instead. | 353 | Negative ARG means select the size of the rightmost window instead. |
| 342 | The argument includes the width of the window's scroll bar; if there | 354 | The argument includes the width of the window's scroll bar; if there |
| 343 | are no scroll bars, it includes the width of the divider column | 355 | are no scroll bars, it includes the width of the divider column |
| 344 | to the window's right, if any. No arg means split equally." | 356 | to the window's right, if any. No ARG means split equally. |
| 357 | |||
| 358 | The original, leftmost window remains selected. | ||
| 359 | The return value is the new, rightmost window." | ||
| 345 | (interactive "P") | 360 | (interactive "P") |
| 346 | (let ((old-w (selected-window)) | 361 | (let ((old-w (selected-window)) |
| 347 | (size (and arg (prefix-numeric-value arg)))) | 362 | (size (and arg (prefix-numeric-value arg)))) |
diff --git a/lisp/xml.el b/lisp/xml.el index 03ef6346c70..993ef59b276 100644 --- a/lisp/xml.el +++ b/lisp/xml.el | |||
| @@ -84,6 +84,20 @@ | |||
| 84 | ;;** | 84 | ;;** |
| 85 | ;;******************************************************************* | 85 | ;;******************************************************************* |
| 86 | 86 | ||
| 87 | (defvar xml-entity-alist | ||
| 88 | '(("lt" . "<") | ||
| 89 | ("gt" . ">") | ||
| 90 | ("apos" . "'") | ||
| 91 | ("quot" . "\"") | ||
| 92 | ("amp" . "&")) | ||
| 93 | "The defined entities. Entities are added to this when the DTD is parsed.") | ||
| 94 | |||
| 95 | (defvar xml-sub-parser nil | ||
| 96 | "Dynamically set this to a non-nil value if you want to parse an XML fragment.") | ||
| 97 | |||
| 98 | (defvar xml-validating-parser nil | ||
| 99 | "Set to non-nil to get validity checking.") | ||
| 100 | |||
| 87 | (defsubst xml-node-name (node) | 101 | (defsubst xml-node-name (node) |
| 88 | "Return the tag associated with NODE. | 102 | "Return the tag associated with NODE. |
| 89 | Without namespace-aware parsing, the tag is a symbol. | 103 | Without namespace-aware parsing, the tag is a symbol. |
| @@ -164,6 +178,48 @@ If PARSE-NS is non-nil, then QNAMES are expanded." | |||
| 164 | (kill-buffer (current-buffer))) | 178 | (kill-buffer (current-buffer))) |
| 165 | xml))) | 179 | xml))) |
| 166 | 180 | ||
| 181 | |||
| 182 | (let* ((start-chars (concat ":[:alpha:]_")) | ||
| 183 | (name-chars (concat "-[:digit:]." start-chars)) | ||
| 184 | ;;[3] S ::= (#x20 | #x9 | #xD | #xA)+ | ||
| 185 | (whitespace "[ \t\n\r]")) | ||
| 186 | ;;[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | ||
| 187 | ;; | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | ||
| 188 | ;; | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | ||
| 189 | ;; | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] | ||
| 190 | (defvar xml-name-start-char-re (concat "[" start-chars "]")) | ||
| 191 | ;;[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] | ||
| 192 | (defvar xml-name-char-re (concat "[" name-chars "]")) | ||
| 193 | ;;[5] Name ::= NameStartChar (NameChar)* | ||
| 194 | (defvar xml-name-re (concat xml-name-start-char-re xml-name-char-re "*")) | ||
| 195 | ;;[6] Names ::= Name (#x20 Name)* | ||
| 196 | (defvar xml-names-re (concat xml-name-re "\\(?: " xml-name-re "\\)*")) | ||
| 197 | ;;[7] Nmtoken ::= (NameChar)+ | ||
| 198 | (defvar xml-nmtoken-re (concat xml-name-char-re "+")) | ||
| 199 | ;;[8] Nmtokens ::= Nmtoken (#x20 Nmtoken)* | ||
| 200 | (defvar xml-nmtokens-re (concat xml-nmtoken-re "\\(?: " xml-name-re "\\)*")) | ||
| 201 | ;;[66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' | ||
| 202 | (defvar xml-char-ref-re "\\(?:&#[0-9]+;\\|&#x[0-9a-fA-F]+;\\)") | ||
| 203 | ;;[68] EntityRef ::= '&' Name ';' | ||
| 204 | (defvar xml-entity-ref (concat "&" xml-name-re ";")) | ||
| 205 | ;;[69] PEReference ::= '%' Name ';' | ||
| 206 | (defvar xml-pe-reference-re (concat "%" xml-name-re ";")) | ||
| 207 | ;;[67] Reference ::= EntityRef | CharRef | ||
| 208 | (defvar xml-reference-re (concat "\\(?:" xml-entity-ref "\\|" xml-char-ref-re "\\)")) | ||
| 209 | ;;[9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' | ||
| 210 | ;; | "'" ([^%&'] | PEReference | Reference)* "'" | ||
| 211 | (defvar xml-entity-value-re (concat "\\(?:\"\\(?:[^%&\"]\\|" xml-pe-reference-re | ||
| 212 | "\\|" xml-reference-re "\\)*\"\\|'\\(?:[^%&']\\|" | ||
| 213 | xml-pe-reference-re "\\|" xml-reference-re "\\)*'\\)"))) | ||
| 214 | ;;[75] ExternalID ::= 'SYSTEM' S SystemLiteral | ||
| 215 | ;; | 'PUBLIC' S PubidLiteral S SystemLiteral | ||
| 216 | ;;[76] NDataDecl ::= S 'NDATA' S | ||
| 217 | ;;[73] EntityDef ::= EntityValue| (ExternalID NDataDecl?) | ||
| 218 | ;;[71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>' | ||
| 219 | ;;[74] PEDef ::= EntityValue | ExternalID | ||
| 220 | ;;[72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>' | ||
| 221 | ;;[70] EntityDecl ::= GEDecl | PEDecl | ||
| 222 | |||
| 167 | ;; Note that this is setup so that we can do whitespace-skipping with | 223 | ;; Note that this is setup so that we can do whitespace-skipping with |
| 168 | ;; `(skip-syntax-forward " ")', inter alia. Previously this was slow | 224 | ;; `(skip-syntax-forward " ")', inter alia. Previously this was slow |
| 169 | ;; compared with `re-search-forward', but that has been fixed. Also | 225 | ;; compared with `re-search-forward', but that has been fixed. Also |
| @@ -229,9 +285,9 @@ If PARSE-NS is non-nil, then QNAMES are expanded." | |||
| 229 | (progn | 285 | (progn |
| 230 | (forward-char -1) | 286 | (forward-char -1) |
| 231 | (setq result (xml-parse-tag parse-dtd parse-ns)) | 287 | (setq result (xml-parse-tag parse-dtd parse-ns)) |
| 232 | (if (and xml result) | 288 | (if (and xml result (not xml-sub-parser)) |
| 233 | ;; translation of rule [1] of XML specifications | 289 | ;; translation of rule [1] of XML specifications |
| 234 | (error "XML files can have only one toplevel tag") | 290 | (error "XML: (Not Well-Formed) Only one root tag allowed") |
| 235 | (cond | 291 | (cond |
| 236 | ((null result)) | 292 | ((null result)) |
| 237 | ((and (listp (car result)) | 293 | ((and (listp (car result)) |
| @@ -265,10 +321,24 @@ specify that the name shouldn't be given a namespace." | |||
| 265 | ;; matching cons in xml-ns. In which case we | 321 | ;; matching cons in xml-ns. In which case we |
| 266 | (ns (or (cdr (assoc (if special "xmlns" prefix) | 322 | (ns (or (cdr (assoc (if special "xmlns" prefix) |
| 267 | xml-ns)) | 323 | xml-ns)) |
| 268 | :))) | 324 | ""))) |
| 269 | (cons ns (if special "" lname))) | 325 | (cons ns (if special "" lname))) |
| 270 | (intern name))) | 326 | (intern name))) |
| 271 | 327 | ||
| 328 | (defun xml-parse-fragment (&optional parse-dtd parse-ns) | ||
| 329 | "Parse xml-like fragments." | ||
| 330 | (let ((xml-sub-parser t) | ||
| 331 | children) | ||
| 332 | (while (not (eobp)) | ||
| 333 | (let ((bit (xml-parse-tag | ||
| 334 | parse-dtd parse-ns))) | ||
| 335 | (if children | ||
| 336 | (setq children (append (list bit) children)) | ||
| 337 | (if (stringp bit) | ||
| 338 | (setq children (list bit)) | ||
| 339 | (setq children bit))))) | ||
| 340 | (reverse children))) | ||
| 341 | |||
| 272 | (defun xml-parse-tag (&optional parse-dtd parse-ns) | 342 | (defun xml-parse-tag (&optional parse-dtd parse-ns) |
| 273 | "Parse the tag at point. | 343 | "Parse the tag at point. |
| 274 | If PARSE-DTD is non-nil, the DTD of the document, if any, is parsed and | 344 | If PARSE-DTD is non-nil, the DTD of the document, if any, is parsed and |
| @@ -278,16 +348,17 @@ Returns one of: | |||
| 278 | - a list : the matching node | 348 | - a list : the matching node |
| 279 | - nil : the point is not looking at a tag. | 349 | - nil : the point is not looking at a tag. |
| 280 | - a pair : the first element is the DTD, the second is the node." | 350 | - a pair : the first element is the DTD, the second is the node." |
| 281 | (let ((xml-ns (if (consp parse-ns) | 351 | (let ((xml-validating-parser (or parse-dtd xml-validating-parser)) |
| 352 | (xml-ns (if (consp parse-ns) | ||
| 282 | parse-ns | 353 | parse-ns |
| 283 | (if parse-ns | 354 | (if parse-ns |
| 284 | (list | 355 | (list |
| 285 | ;; Default for empty prefix is no namespace | 356 | ;; Default for empty prefix is no namespace |
| 286 | (cons "" :) | 357 | (cons "" "") |
| 287 | ;; "xml" namespace | 358 | ;; "xml" namespace |
| 288 | (cons "xml" :http://www.w3.org/XML/1998/namespace) | 359 | (cons "xml" "http://www.w3.org/XML/1998/namespace") |
| 289 | ;; We need to seed the xmlns namespace | 360 | ;; We need to seed the xmlns namespace |
| 290 | (cons "xmlns" :http://www.w3.org/2000/xmlns/)))))) | 361 | (cons "xmlns" "http://www.w3.org/2000/xmlns/")))))) |
| 291 | (cond | 362 | (cond |
| 292 | ;; Processing instructions (like the <?xml version="1.0"?> tag at the | 363 | ;; Processing instructions (like the <?xml version="1.0"?> tag at the |
| 293 | ;; beginning of a document). | 364 | ;; beginning of a document). |
| @@ -299,18 +370,15 @@ Returns one of: | |||
| 299 | ((looking-at "<!\\[CDATA\\[") | 370 | ((looking-at "<!\\[CDATA\\[") |
| 300 | (let ((pos (match-end 0))) | 371 | (let ((pos (match-end 0))) |
| 301 | (unless (search-forward "]]>" nil t) | 372 | (unless (search-forward "]]>" nil t) |
| 302 | (error "CDATA section does not end anywhere in the document")) | 373 | (error "XML: (Not Well Formed) CDATA section does not end anywhere in the document")) |
| 303 | (buffer-substring pos (match-beginning 0)))) | 374 | (buffer-substring pos (match-beginning 0)))) |
| 304 | ;; DTD for the document | 375 | ;; DTD for the document |
| 305 | ((looking-at "<!DOCTYPE") | 376 | ((looking-at "<!DOCTYPE") |
| 306 | (let (dtd) | 377 | (let ((dtd (xml-parse-dtd parse-ns))) |
| 307 | (if parse-dtd | 378 | (skip-syntax-forward " ") |
| 308 | (setq dtd (xml-parse-dtd)) | 379 | (if xml-validating-parser |
| 309 | (xml-skip-dtd)) | 380 | (cons dtd (xml-parse-tag nil xml-ns)) |
| 310 | (skip-syntax-forward " ") | 381 | (xml-parse-tag nil xml-ns)))) |
| 311 | (if dtd | ||
| 312 | (cons dtd (xml-parse-tag nil xml-ns)) | ||
| 313 | (xml-parse-tag nil xml-ns)))) | ||
| 314 | ;; skip comments | 382 | ;; skip comments |
| 315 | ((looking-at "<!--") | 383 | ((looking-at "<!--") |
| 316 | (search-forward "-->") | 384 | (search-forward "-->") |
| @@ -332,65 +400,76 @@ Returns one of: | |||
| 332 | (when (consp xml-ns) | 400 | (when (consp xml-ns) |
| 333 | (dolist (attr attrs) | 401 | (dolist (attr attrs) |
| 334 | (when (and (consp (car attr)) | 402 | (when (and (consp (car attr)) |
| 335 | (eq :http://www.w3.org/2000/xmlns/ | 403 | (equal "http://www.w3.org/2000/xmlns/" |
| 336 | (caar attr))) | 404 | (caar attr))) |
| 337 | (push (cons (cdar attr) (intern (concat ":" (cdr attr)))) | 405 | (push (cons (cdar attr) (cdr attr)) |
| 338 | xml-ns)))) | 406 | xml-ns)))) |
| 339 | 407 | ||
| 340 | (setq children (list attrs (xml-maybe-do-ns node-name "" xml-ns))) | 408 | (setq children (list attrs (xml-maybe-do-ns node-name "" xml-ns))) |
| 341 | 409 | ||
| 342 | ;; is this an empty element ? | 410 | ;; is this an empty element ? |
| 343 | (if (looking-at "/>") | 411 | (if (looking-at "/>") |
| 344 | (progn | ||
| 345 | (forward-char 2) | ||
| 346 | (nreverse children)) | ||
| 347 | |||
| 348 | ;; is this a valid start tag ? | ||
| 349 | (if (eq (char-after) ?>) | ||
| 350 | (progn | 412 | (progn |
| 351 | (forward-char 1) | 413 | (forward-char 2) |
| 352 | ;; Now check that we have the right end-tag. Note that this | ||
| 353 | ;; one might contain spaces after the tag name | ||
| 354 | (let ((end (concat "</" node-name "\\s-*>"))) | ||
| 355 | (while (not (looking-at end)) | ||
| 356 | (cond | ||
| 357 | ((looking-at "</") | ||
| 358 | (error "XML: Invalid end tag (expecting %s) at pos %d" | ||
| 359 | node-name (point))) | ||
| 360 | ((= (char-after) ?<) | ||
| 361 | (let ((tag (xml-parse-tag nil xml-ns))) | ||
| 362 | (when tag | ||
| 363 | (push tag children)))) | ||
| 364 | (t | ||
| 365 | (setq pos (point)) | ||
| 366 | (search-forward "<") | ||
| 367 | (forward-char -1) | ||
| 368 | (let ((string (buffer-substring pos (point))) | ||
| 369 | (pos 0)) | ||
| 370 | |||
| 371 | ;; Clean up the string. As per XML | ||
| 372 | ;; specifications, the XML processor should | ||
| 373 | ;; always pass the whole string to the | ||
| 374 | ;; application. But \r's should be replaced: | ||
| 375 | ;; http://www.w3.org/TR/2000/REC-xml-20001006#sec-line-ends | ||
| 376 | (while (string-match "\r\n?" string pos) | ||
| 377 | (setq string (replace-match "\n" t t string)) | ||
| 378 | (setq pos (1+ (match-beginning 0)))) | ||
| 379 | |||
| 380 | (setq string (xml-substitute-special string)) | ||
| 381 | (setq children | ||
| 382 | (if (stringp (car children)) | ||
| 383 | ;; The two strings were separated by a comment. | ||
| 384 | (cons (concat (car children) string) | ||
| 385 | (cdr children)) | ||
| 386 | (cons string children)))))))) | ||
| 387 | |||
| 388 | (goto-char (match-end 0)) | ||
| 389 | (nreverse children)) | 414 | (nreverse children)) |
| 390 | ;; This was an invalid start tag | 415 | |
| 391 | (error "XML: Invalid attribute list"))))) | 416 | ;; is this a valid start tag ? |
| 392 | (t ;; This is not a tag. | 417 | (if (eq (char-after) ?>) |
| 393 | (error "XML: Invalid character"))))) | 418 | (progn |
| 419 | (forward-char 1) | ||
| 420 | ;; Now check that we have the right end-tag. Note that this | ||
| 421 | ;; one might contain spaces after the tag name | ||
| 422 | (let ((end (concat "</" node-name "\\s-*>"))) | ||
| 423 | (while (not (looking-at end)) | ||
| 424 | (cond | ||
| 425 | ((looking-at "</") | ||
| 426 | (error "XML: (Not Well-Formed) Invalid end tag (expecting %s) at pos %d" | ||
| 427 | node-name (point))) | ||
| 428 | ((= (char-after) ?<) | ||
| 429 | (let ((tag (xml-parse-tag nil xml-ns))) | ||
| 430 | (when tag | ||
| 431 | (push tag children)))) | ||
| 432 | (t | ||
| 433 | (let ((expansion (xml-parse-string))) | ||
| 434 | (setq children | ||
| 435 | (if (stringp expansion) | ||
| 436 | (if (stringp (car children)) | ||
| 437 | ;; The two strings were separated by a comment. | ||
| 438 | (setq children (append (concat (car children) expansion) | ||
| 439 | (cdr children))) | ||
| 440 | (setq children (append (list expansion) children))) | ||
| 441 | (setq children (append expansion children)))))))) | ||
| 442 | |||
| 443 | (goto-char (match-end 0)) | ||
| 444 | (nreverse children))) | ||
| 445 | ;; This was an invalid start tag (Expected ">", but didn't see it.) | ||
| 446 | (error "XML: (Well-Formed) Couldn't parse tag: %s" | ||
| 447 | (buffer-substring (- (point) 10) (+ (point) 1))))))) | ||
| 448 | (t ;; (Not one of PI, CDATA, Comment, End tag, or Start tag) | ||
| 449 | (unless xml-sub-parser ; Usually, we error out. | ||
| 450 | (error "XML: (Well-Formed) Invalid character")) | ||
| 451 | |||
| 452 | ;; However, if we're parsing incrementally, then we need to deal | ||
| 453 | ;; with stray CDATA. | ||
| 454 | (xml-parse-string))))) | ||
| 455 | |||
| 456 | (defun xml-parse-string () | ||
| 457 | "Parse the next whatever. Could be a string, or an element." | ||
| 458 | (let* ((pos (point)) | ||
| 459 | (string (progn (if (search-forward "<" nil t) | ||
| 460 | (forward-char -1) | ||
| 461 | (goto-char (point-max))) | ||
| 462 | (buffer-substring pos (point))))) | ||
| 463 | ;; Clean up the string. As per XML specifications, the XML | ||
| 464 | ;; processor should always pass the whole string to the | ||
| 465 | ;; application. But \r's should be replaced: | ||
| 466 | ;; http://www.w3.org/TR/2000/REC-xml-20001006#sec-line-ends | ||
| 467 | (setq pos 0) | ||
| 468 | (while (string-match "\r\n?" string pos) | ||
| 469 | (setq string (replace-match "\n" t t string)) | ||
| 470 | (setq pos (1+ (match-beginning 0)))) | ||
| 471 | |||
| 472 | (xml-substitute-special string))) | ||
| 394 | 473 | ||
| 395 | (defun xml-parse-attlist (&optional xml-ns) | 474 | (defun xml-parse-attlist (&optional xml-ns) |
| 396 | "Return the attribute-list after point. | 475 | "Return the attribute-list after point. |
| @@ -412,18 +491,23 @@ Leave point at the first non-blank character after the tag." | |||
| 412 | (setq end-pos (match-end 0)) | 491 | (setq end-pos (match-end 0)) |
| 413 | (if (looking-at "'\\([^']*\\)'") | 492 | (if (looking-at "'\\([^']*\\)'") |
| 414 | (setq end-pos (match-end 0)) | 493 | (setq end-pos (match-end 0)) |
| 415 | (error "XML: Attribute values must be given between quotes"))) | 494 | (error "XML: (Not Well-Formed) Attribute values must be given between quotes"))) |
| 416 | 495 | ||
| 417 | ;; Each attribute must be unique within a given element | 496 | ;; Each attribute must be unique within a given element |
| 418 | (if (assoc name attlist) | 497 | (if (assoc name attlist) |
| 419 | (error "XML: each attribute must be unique within an element")) | 498 | (error "XML: (Not Well-Formed) Each attribute must be unique within an element")) |
| 420 | 499 | ||
| 421 | ;; Multiple whitespace characters should be replaced with a single one | 500 | ;; Multiple whitespace characters should be replaced with a single one |
| 422 | ;; in the attributes | 501 | ;; in the attributes |
| 423 | (let ((string (match-string 1)) | 502 | (let ((string (match-string 1)) |
| 424 | (pos 0)) | 503 | (pos 0)) |
| 425 | (replace-regexp-in-string "\\s-\\{2,\\}" " " string) | 504 | (replace-regexp-in-string "\\s-\\{2,\\}" " " string) |
| 426 | (push (cons name (xml-substitute-special string)) attlist)) | 505 | (let ((expansion (xml-substitute-special string))) |
| 506 | (unless (stringp expansion) | ||
| 507 | ; We say this is the constraint. It is acctually that | ||
| 508 | ; external entities nor "<" can be in an attribute value. | ||
| 509 | (error "XML: (Not Well-Formed) Entities in attributes cannot expand into elements")) | ||
| 510 | (push (cons name expansion) attlist))) | ||
| 427 | 511 | ||
| 428 | (goto-char end-pos) | 512 | (goto-char end-pos) |
| 429 | (skip-syntax-forward " ")) | 513 | (skip-syntax-forward " ")) |
| @@ -442,24 +526,16 @@ Leave point at the first non-blank character after the tag." | |||
| 442 | (defun xml-skip-dtd () | 526 | (defun xml-skip-dtd () |
| 443 | "Skip the DTD at point. | 527 | "Skip the DTD at point. |
| 444 | This follows the rule [28] in the XML specifications." | 528 | This follows the rule [28] in the XML specifications." |
| 445 | (forward-char (length "<!DOCTYPE")) | 529 | (let ((xml-validating-parser nil)) |
| 446 | (if (looking-at "\\s-*>") | 530 | (xml-parse-dtd))) |
| 447 | (error "XML: invalid DTD (excepting name of the document)")) | ||
| 448 | (condition-case nil | ||
| 449 | (progn | ||
| 450 | (forward-sexp) | ||
| 451 | (skip-syntax-forward " ") | ||
| 452 | (if (looking-at "\\[") | ||
| 453 | (re-search-forward "]\\s-*>") | ||
| 454 | (search-forward ">"))) | ||
| 455 | (error (error "XML: No end to the DTD")))) | ||
| 456 | 531 | ||
| 457 | (defun xml-parse-dtd () | 532 | (defun xml-parse-dtd (&optional parse-ns) |
| 458 | "Parse the DTD at point." | 533 | "Parse the DTD at point." |
| 459 | (forward-char (eval-when-compile (length "<!DOCTYPE"))) | 534 | (forward-char (eval-when-compile (length "<!DOCTYPE"))) |
| 460 | (skip-syntax-forward " ") | 535 | (skip-syntax-forward " ") |
| 461 | (if (looking-at ">") | 536 | (if (and (looking-at ">") |
| 462 | (error "XML: invalid DTD (excepting name of the document)")) | 537 | xml-validating-parser) |
| 538 | (error "XML: (Validity) Invalid DTD (expecting name of the document)")) | ||
| 463 | 539 | ||
| 464 | ;; Get the name of the document | 540 | ;; Get the name of the document |
| 465 | (looking-at xml-name-regexp) | 541 | (looking-at xml-name-regexp) |
| @@ -477,27 +553,27 @@ This follows the rule [28] in the XML specifications." | |||
| 477 | (re-search-forward | 553 | (re-search-forward |
| 478 | "\\='\\([[:space:][:alnum:]-()+,./:=?;!*#@$_%]*\\)'" | 554 | "\\='\\([[:space:][:alnum:]-()+,./:=?;!*#@$_%]*\\)'" |
| 479 | nil t)) | 555 | nil t)) |
| 480 | (error "XML: missing public id")) | 556 | (error "XML: Missing Public ID")) |
| 481 | (let ((pubid (match-string 1))) | 557 | (let ((pubid (match-string 1))) |
| 558 | (skip-syntax-forward " ") | ||
| 482 | (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t) | 559 | (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t) |
| 483 | (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t)) | 560 | (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t)) |
| 484 | (error "XML: missing system id")) | 561 | (error "XML: Missing System ID")) |
| 485 | (push (list pubid (match-string 1) 'public) dtd))) | 562 | (push (list pubid (match-string 1) 'public) dtd))) |
| 486 | ((looking-at "SYSTEM\\s-+") | 563 | ((looking-at "SYSTEM\\s-+") |
| 487 | (goto-char (match-end 0)) | 564 | (goto-char (match-end 0)) |
| 488 | (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t) | 565 | (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t) |
| 489 | (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t)) | 566 | (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t)) |
| 490 | (error "XML: missing system id")) | 567 | (error "XML: Missing System ID")) |
| 491 | (push (list (match-string 1) 'system) dtd))) | 568 | (push (list (match-string 1) 'system) dtd))) |
| 492 | (skip-syntax-forward " ") | 569 | (skip-syntax-forward " ") |
| 493 | (if (eq ?> (char-after)) | 570 | (if (eq ?> (char-after)) |
| 494 | (forward-char) | 571 | (forward-char) |
| 495 | (skip-syntax-forward " ") | ||
| 496 | (if (not (eq (char-after) ?\[)) | 572 | (if (not (eq (char-after) ?\[)) |
| 497 | (error "XML: bad DTD") | 573 | (error "XML: Bad DTD") |
| 498 | (forward-char) | 574 | (forward-char) |
| 499 | ;; Parse the rest of the DTD | 575 | ;; Parse the rest of the DTD |
| 500 | ;; Fixme: Deal with ENTITY, ATTLIST, NOTATION, PIs. | 576 | ;; Fixme: Deal with ATTLIST, NOTATION, PIs. |
| 501 | (while (not (looking-at "\\s-*\\]")) | 577 | (while (not (looking-at "\\s-*\\]")) |
| 502 | (skip-syntax-forward " ") | 578 | (skip-syntax-forward " ") |
| 503 | (cond | 579 | (cond |
| @@ -521,11 +597,13 @@ This follows the rule [28] in the XML specifications." | |||
| 521 | ((string-match "^%[^;]+;[ \t\n\r]*$" type) ;; substitution | 597 | ((string-match "^%[^;]+;[ \t\n\r]*$" type) ;; substitution |
| 522 | nil) | 598 | nil) |
| 523 | (t | 599 | (t |
| 524 | (error "XML: Invalid element type in the DTD"))) | 600 | (if xml-validating-parser |
| 601 | error "XML: (Validity) Invalid element type in the DTD"))) | ||
| 525 | 602 | ||
| 526 | ;; rule [45]: the element declaration must be unique | 603 | ;; rule [45]: the element declaration must be unique |
| 527 | (if (assoc element dtd) | 604 | (if (and (assoc element dtd) |
| 528 | (error "XML: element declarations must be unique in a DTD (<%s>)" | 605 | xml-validating-parser) |
| 606 | (error "XML: (Validity) Element declarations must be unique in a DTD (<%s>)" | ||
| 529 | element)) | 607 | element)) |
| 530 | 608 | ||
| 531 | ;; Store the element in the DTD | 609 | ;; Store the element in the DTD |
| @@ -533,12 +611,49 @@ This follows the rule [28] in the XML specifications." | |||
| 533 | (goto-char end-pos)) | 611 | (goto-char end-pos)) |
| 534 | ((looking-at "<!--") | 612 | ((looking-at "<!--") |
| 535 | (search-forward "-->")) | 613 | (search-forward "-->")) |
| 536 | 614 | ((looking-at (concat "<!ENTITY[ \t\n\r]*\\(" xml-name-re | |
| 615 | "\\)[ \t\n\r]*\\(" xml-entity-value-re | ||
| 616 | "\\)[ \t\n\r]*>")) | ||
| 617 | (let ((name (buffer-substring (nth 2 (match-data)) | ||
| 618 | (nth 3 (match-data)))) | ||
| 619 | (value (buffer-substring (+ (nth 4 (match-data)) 1) | ||
| 620 | (- (nth 5 (match-data)) 1)))) | ||
| 621 | (goto-char (nth 1 (match-data))) | ||
| 622 | (setq xml-entity-alist | ||
| 623 | (append xml-entity-alist | ||
| 624 | (list (cons name | ||
| 625 | (with-temp-buffer | ||
| 626 | (insert value) | ||
| 627 | (goto-char (point-min)) | ||
| 628 | (xml-parse-fragment | ||
| 629 | xml-validating-parser | ||
| 630 | parse-ns)))))))) | ||
| 631 | ((or (looking-at (concat "<!ENTITY[ \t\n\r]+\\(" xml-name-re | ||
| 632 | "\\)[ \t\n\r]+SYSTEM[ \t\n\r]+" | ||
| 633 | "\\(\"[^\"]*\"\\|'[^']*'\\)[ \t\n\r]*>")) | ||
| 634 | (looking-at (concat "<!ENTITY[ \t\n\r]+\\(" xml-name-re | ||
| 635 | "\\)[ \t\n\r]+PUBLIC[ \t\n\r]+" | ||
| 636 | "\"[- \r\na-zA-Z0-9'()+,./:=?;!*#@$_%]*\"" | ||
| 637 | "\\|'[- \r\na-zA-Z0-9()+,./:=?;!*#@$_%]*'" | ||
| 638 | "[ \t\n\r]+\\(\"[^\"]*\"\\|'[^']*'\\)" | ||
| 639 | "[ \t\n\r]*>"))) | ||
| 640 | (let ((name (buffer-substring (nth 2 (match-data)) | ||
| 641 | (nth 3 (match-data)))) | ||
| 642 | (file (buffer-substring (+ (nth 4 (match-data)) 1) | ||
| 643 | (- (nth 5 (match-data)) 1)))) | ||
| 644 | (goto-char (nth 1 (match-data))) | ||
| 645 | (setq xml-entity-alist | ||
| 646 | (append xml-entity-alist | ||
| 647 | (list (cons name (with-temp-buffer | ||
| 648 | (insert-file-contents file) | ||
| 649 | (goto-char (point-min)) | ||
| 650 | (xml-parse-fragment | ||
| 651 | xml-validating-parser | ||
| 652 | parse-ns)))))))) | ||
| 537 | (t | 653 | (t |
| 538 | (error "XML: Invalid DTD item"))) | 654 | (error "XML: (Validity) Invalid DTD item"))))) |
| 539 | 655 | (if (looking-at "\\s-*]>") | |
| 540 | ;; Skip the end of the DTD | 656 | (goto-char (nth 1 (match-data))))) |
| 541 | (search-forward ">")))) | ||
| 542 | (nreverse dtd))) | 657 | (nreverse dtd))) |
| 543 | 658 | ||
| 544 | (defun xml-parse-elem-type (string) | 659 | (defun xml-parse-elem-type (string) |
| @@ -580,41 +695,72 @@ This follows the rule [28] in the XML specifications." | |||
| 580 | ;;** | 695 | ;;** |
| 581 | ;;******************************************************************* | 696 | ;;******************************************************************* |
| 582 | 697 | ||
| 583 | (eval-when-compile | ||
| 584 | (defvar str)) ; dynamic from replace-regexp-in-string | ||
| 585 | |||
| 586 | ;; Fixme: Take declared entities from the DTD when they're available. | ||
| 587 | (defun xml-substitute-entity (match) | ||
| 588 | "Subroutine of `xml-substitute-special'." | ||
| 589 | (save-match-data | ||
| 590 | (let ((match1 (match-string 1 str))) | ||
| 591 | (cond ((string= match1 "lt") "<") | ||
| 592 | ((string= match1 "gt") ">") | ||
| 593 | ((string= match1 "apos") "'") | ||
| 594 | ((string= match1 "quot") "\"") | ||
| 595 | ((string= match1 "amp") "&") | ||
| 596 | ((and (string-match "#\\([0-9]+\\)" match1) | ||
| 597 | (let ((c (decode-char | ||
| 598 | 'ucs | ||
| 599 | (string-to-number (match-string 1 match1))))) | ||
| 600 | (if c (string c))))) ; else unrepresentable | ||
| 601 | ((and (string-match "#x\\([[:xdigit:]]+\\)" match1) | ||
| 602 | (let ((c (decode-char | ||
| 603 | 'ucs | ||
| 604 | (string-to-number (match-string 1 match1) 16)))) | ||
| 605 | (if c (string c))))) | ||
| 606 | ;; Default to asis. Arguably, unrepresentable code points | ||
| 607 | ;; might be best replaced with U+FFFD. | ||
| 608 | (t match))))) | ||
| 609 | |||
| 610 | (defun xml-substitute-special (string) | 698 | (defun xml-substitute-special (string) |
| 611 | "Return STRING, after subsituting entity references." | 699 | "Return STRING, after subsituting entity references." |
| 612 | ;; This originally made repeated passes through the string from the | 700 | ;; This originally made repeated passes through the string from the |
| 613 | ;; beginning, which isn't correct, since then either "&amp;" or | 701 | ;; beginning, which isn't correct, since then either "&amp;" or |
| 614 | ;; "&amp;" won't DTRT. | 702 | ;; "&amp;" won't DTRT. |
| 615 | (replace-regexp-in-string "&\\([^;]+\\);" | ||
| 616 | #'xml-substitute-entity string t t)) | ||
| 617 | 703 | ||
| 704 | (let ((point 0) | ||
| 705 | children end-point) | ||
| 706 | (while (string-match "&\\([^;]+\\);" string point) | ||
| 707 | (setq end-point (match-end 0)) | ||
| 708 | (let* ((this-part (match-string 1 string)) | ||
| 709 | (prev-part (substring string point (match-beginning 0))) | ||
| 710 | (entity (assoc this-part xml-entity-alist)) | ||
| 711 | (expansion | ||
| 712 | (cond ((string-match "#\\([0-9]+\\)" this-part) | ||
| 713 | (let ((c (decode-char | ||
| 714 | 'ucs | ||
| 715 | (string-to-number (match-string 1 this-part))))) | ||
| 716 | (if c (string c)))) | ||
| 717 | ((string-match "#x\\([[:xdigit:]]+\\)" this-part) | ||
| 718 | (let ((c (decode-char | ||
| 719 | 'ucs | ||
| 720 | (string-to-number (match-string 1 this-part) 16)))) | ||
| 721 | (if c (string c)))) | ||
| 722 | (entity | ||
| 723 | (cdr entity)) | ||
| 724 | (t | ||
| 725 | (if xml-validating-parser | ||
| 726 | (error "XML: (Validity) Undefined entity `%s'" | ||
| 727 | (match-string 1 this-part))))))) | ||
| 728 | |||
| 729 | (cond ((null children) | ||
| 730 | (if (stringp expansion) | ||
| 731 | (setq children (concat prev-part expansion)) | ||
| 732 | (if (stringp (car (last expansion))) | ||
| 733 | (progn | ||
| 734 | (setq children | ||
| 735 | (list (concat prev-part (car expansion)) | ||
| 736 | (cdr expansion)))) | ||
| 737 | (setq children (append expansion prev-part))))) | ||
| 738 | ((stringp children) | ||
| 739 | (if (stringp expansion) | ||
| 740 | (setq children (concat children prev-part expansion)) | ||
| 741 | (setq children (list expansion (concat prev-part children))))) | ||
| 742 | ((and (stringp expansion) | ||
| 743 | (stringp (car children))) | ||
| 744 | (setcar children (concat prev-part expansion (car children)))) | ||
| 745 | ((stringp expansion) | ||
| 746 | (setq children (append (concat prev-part expansion) | ||
| 747 | children))) | ||
| 748 | ((stringp (car children)) | ||
| 749 | (setcar children (concat (car children) prev-part)) | ||
| 750 | (setq children (append expansion children))) | ||
| 751 | (t | ||
| 752 | (setq children (list expansion | ||
| 753 | prev-part | ||
| 754 | children)))) | ||
| 755 | (setq point end-point))) | ||
| 756 | (cond ((stringp children) | ||
| 757 | (concat children (substring string point))) | ||
| 758 | ((stringp (car (last children))) | ||
| 759 | (concat (car children) (substring string point))) | ||
| 760 | ((null children) | ||
| 761 | string) | ||
| 762 | (t | ||
| 763 | (nreverse children))))) | ||
| 618 | ;;******************************************************************* | 764 | ;;******************************************************************* |
| 619 | ;;** | 765 | ;;** |
| 620 | ;;** Printing a tree. | 766 | ;;** Printing a tree. |