Mercurial > emacs
annotate lisp/xml.el @ 110410:f2e111723c3a
Merge changes made in Gnus trunk.
Reimplement nnimap, and do tweaks to the rest of the code to support that.
* gnus-int.el (gnus-finish-retrieve-group-infos)
(gnus-retrieve-group-data-early): New functions.
* gnus-range.el (gnus-range-nconcat): New function.
* gnus-start.el (gnus-get-unread-articles): Support early retrieval of
data.
(gnus-read-active-for-groups): Support finishing the early retrieval of
data.
* gnus-sum.el (gnus-summary-move-article): Pass the move-to group name
if the move is internal, so that nnimap can do fast internal moves.
* gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for
nnimap usage.
* nnimap.el: Rewritten.
* nnmail.el (nnmail-inhibit-default-split-group): New internal variable
to allow the mail splitting to not return a default group. This is
useful for nnimap, which will leave unmatched mail in the inbox.
* utf7.el (utf7-encode): Autoload.
Implement shell connection.
* nnimap.el (nnimap-open-shell-stream): New function.
(nnimap-open-connection): Use it.
Get the number of lines by using BODYSTRUCTURE.
(nnimap-transform-headers): Get the number of lines in each message.
(nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the
number of lines.
Not all servers return UIDNEXT. Work past this problem.
Remove junk from end of file.
Fix typo in "bogus" section.
Make capabilties be case-insensitive.
Require cl when compiling.
Don't bug out if the LIST command doesn't have any parameters.
2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change)
* nnimap.el (nnimap-get-groups): Don't bug out if the LIST command
doesn't have any parameters.
(mm-text-html-renderer): Document gnus-article-html.
2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix)
* mm-decode.el (mm-text-html-renderer): Document gnus-article-html.
* dgnushack.el: Define netrc-credentials.
If the user doesn't have a /etc/services, supply some sensible port defaults.
Have `unseen-or-unread' select an unread unseen article first.
(nntp-open-server): Return whether the open was successful or not.
Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ).
Save result so that it doesn't say "failed" all the time.
Add ~/.authinfo to the default, since that's probably most useful for users.
Don't use the "finish" method when we're reading from the agent.
Add some more nnimap-relevant agent stuff to nnagent.el.
* nnimap.el (nnimap-with-process-buffer): Removed.
Revert one line that was changed by mistake in the last checkin.
(nnimap-open-connection): Don't error out when we can't make a connection
nnimap-related changes to avoid bugging out if we can't contact a server.
* gnus-start.el (gnus-get-unread-articles): Don't try to scan groups
from methods that are denied.
* nnimap.el (nnimap-possibly-change-group): Return nil if we can't log
in.
(nnimap-finish-retrieve-group-infos): Make sure we're not waiting for
nothing.
* gnus-sum.el (gnus-select-newsgroup): Indent.
author | Katsumi Yamaoka <yamaoka@jpl.org> |
---|---|
date | Sat, 18 Sep 2010 10:02:19 +0000 |
parents | e24d55cee016 |
children | 376148b31b5e |
rev | line source |
---|---|
38409
153f1b1f2efd
Emacs lisp coding convention fixes.
Pavel Janík <Pavel@Janik.cz>
parents:
37958
diff
changeset
|
1 ;;; xml.el --- XML parser |
30329 | 2 |
64762
41bb365f41c4
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64091
diff
changeset
|
3 ;; Copyright (C) 2000, 2001, 2002, 2003, 2004, |
106815 | 4 ;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
30329 | 5 |
6 ;; Author: Emmanuel Briot <briot@gnat.com> | |
51697 | 7 ;; Maintainer: Mark A. Hershberger <mah@everybody.org> |
51102 | 8 ;; Keywords: xml, data |
30329 | 9 |
10 ;; This file is part of GNU Emacs. | |
11 | |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
91342
diff
changeset
|
12 ;; GNU Emacs is free software: you can redistribute it and/or modify |
30329 | 13 ;; it under the terms of the GNU General Public License as published by |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
91342
diff
changeset
|
14 ;; the Free Software Foundation, either version 3 of the License, or |
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
91342
diff
changeset
|
15 ;; (at your option) any later version. |
30329 | 16 |
17 ;; GNU Emacs is distributed in the hope that it will be useful, | |
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 ;; GNU General Public License for more details. | |
21 | |
22 ;; You should have received a copy of the GNU General Public License | |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
91342
diff
changeset
|
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
30329 | 24 |
25 ;;; Commentary: | |
26 | |
51102 | 27 ;; This file contains a somewhat incomplete non-validating XML parser. It |
28 ;; parses a file, and returns a list that can be used internally by | |
54937 | 29 ;; any other Lisp libraries. |
30329 | 30 |
31 ;;; FILE FORMAT | |
32 | |
51102 | 33 ;; The document type declaration may either be ignored or (optionally) |
34 ;; parsed, but currently the parsing will only accept element | |
54937 | 35 ;; declarations. The XML file is assumed to be well-formed. In case |
51102 | 36 ;; of error, the parsing stops and the XML file is shown where the |
37 ;; parsing stopped. | |
30329 | 38 ;; |
51102 | 39 ;; It also knows how to ignore comments and processing instructions. |
30329 | 40 ;; |
41 ;; The XML file should have the following format: | |
34825
2cad4cde52bd
(top level comment): Updated to reflect the fact that
Gerd Moellmann <gerd@gnu.org>
parents:
33977
diff
changeset
|
42 ;; <node1 attr1="name1" attr2="name2" ...>value |
2cad4cde52bd
(top level comment): Updated to reflect the fact that
Gerd Moellmann <gerd@gnu.org>
parents:
33977
diff
changeset
|
43 ;; <node2 attr3="name3" attr4="name4">value2</node2> |
2cad4cde52bd
(top level comment): Updated to reflect the fact that
Gerd Moellmann <gerd@gnu.org>
parents:
33977
diff
changeset
|
44 ;; <node3 attr5="name5" attr6="name6">value3</node3> |
30329 | 45 ;; </node1> |
54937 | 46 ;; Of course, the name of the nodes and attributes can be anything. There can |
30329 | 47 ;; be any number of attributes (or none), as well as any number of children |
48 ;; below the nodes. | |
49 ;; | |
50 ;; There can be only top level node, but with any number of children below. | |
51 | |
52 ;;; LIST FORMAT | |
53 | |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
54 ;; The functions `xml-parse-file', `xml-parse-region' and |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
55 ;; `xml-parse-tag' return a list with the following format: |
30329 | 56 ;; |
57 ;; xml-list ::= (node node ...) | |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
58 ;; node ::= (qname attribute-list . child_node_list) |
30329 | 59 ;; child_node_list ::= child_node child_node ... |
60 ;; child_node ::= node | string | |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
61 ;; qname ::= (:namespace-uri . "name") | "name" |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
62 ;; attribute_list ::= ((qname . "value") (qname . "value") ...) |
30329 | 63 ;; | nil |
64 ;; string ::= "..." | |
65 ;; | |
51102 | 66 ;; Some macros are provided to ease the parsing of this list. |
67 ;; Whitespace is preserved. Fixme: There should be a tree-walker that | |
68 ;; can remove it. | |
30329 | 69 |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
70 ;; TODO: |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
71 ;; * xml:base, xml:space support |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
72 ;; * more complete DOCTYPE parsing |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
73 ;; * pi support |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
74 |
30329 | 75 ;;; Code: |
76 | |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
77 ;; Note that buffer-substring and match-string were formerly used in |
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
78 ;; several places, because the -no-properties variants remove |
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
79 ;; composition info. However, after some discussion on emacs-devel, |
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
80 ;; the consensus was that the speed of the -no-properties variants was |
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
81 ;; a worthwhile tradeoff especially since we're usually parsing files |
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
82 ;; instead of hand-crafted XML. |
51102 | 83 |
30329 | 84 ;;******************************************************************* |
85 ;;** | |
86 ;;** Macros to parse the list | |
87 ;;** | |
88 ;;******************************************************************* | |
89 | |
62752
d0f8033496b1
2005-05-26 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
58939
diff
changeset
|
90 (defconst xml-undefined-entity "?" |
d0f8033496b1
2005-05-26 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
58939
diff
changeset
|
91 "What to substitute for undefined entities") |
d0f8033496b1
2005-05-26 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
58939
diff
changeset
|
92 |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
93 (defvar xml-entity-alist |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
94 '(("lt" . "<") |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
95 ("gt" . ">") |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
96 ("apos" . "'") |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
97 ("quot" . "\"") |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
98 ("amp" . "&")) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
99 "The defined entities. Entities are added to this when the DTD is parsed.") |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
100 |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
101 (defvar xml-sub-parser nil |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
102 "Dynamically set this to a non-nil value if you want to parse an XML fragment.") |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
103 |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
104 (defvar xml-validating-parser nil |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
105 "Set to non-nil to get validity checking.") |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
106 |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
107 (defsubst xml-node-name (node) |
30329 | 108 "Return the tag associated with NODE. |
54937 | 109 Without namespace-aware parsing, the tag is a symbol. |
110 | |
111 With namespace-aware parsing, the tag is a cons of a string | |
112 representing the uri of the namespace with the local name of the | |
113 tag. For example, | |
114 | |
115 <foo> | |
116 | |
117 would be represented by | |
118 | |
119 '(\"\" . \"foo\")." | |
120 | |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
121 (car node)) |
30329 | 122 |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
123 (defsubst xml-node-attributes (node) |
30329 | 124 "Return the list of attributes of NODE. |
125 The list can be nil." | |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
126 (nth 1 node)) |
30329 | 127 |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
128 (defsubst xml-node-children (node) |
30329 | 129 "Return the list of children of NODE. |
130 This is a list of nodes, and it can be nil." | |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
131 (cddr node)) |
30329 | 132 |
133 (defun xml-get-children (node child-name) | |
134 "Return the children of NODE whose tag is CHILD-NAME. | |
54937 | 135 CHILD-NAME should match the value returned by `xml-node-name'." |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
136 (let ((match ())) |
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
137 (dolist (child (xml-node-children node)) |
54937 | 138 (if (and (listp child) |
139 (equal (xml-node-name child) child-name)) | |
140 (push child match))) | |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
141 (nreverse match))) |
30329 | 142 |
53375
e085973399ee
(xml-get-attribute-or-nil): New function, like
Eli Zaretskii <eliz@is.elta.co.il>
parents:
53011
diff
changeset
|
143 (defun xml-get-attribute-or-nil (node attribute) |
30329 | 144 "Get from NODE the value of ATTRIBUTE. |
54937 | 145 Return nil if the attribute was not found. |
53375
e085973399ee
(xml-get-attribute-or-nil): New function, like
Eli Zaretskii <eliz@is.elta.co.il>
parents:
53011
diff
changeset
|
146 |
e085973399ee
(xml-get-attribute-or-nil): New function, like
Eli Zaretskii <eliz@is.elta.co.il>
parents:
53011
diff
changeset
|
147 See also `xml-get-attribute'." |
54243
586ffda6e9f9
(xml-get-attribute-or-nil): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53384
diff
changeset
|
148 (cdr (assoc attribute (xml-node-attributes node)))) |
53375
e085973399ee
(xml-get-attribute-or-nil): New function, like
Eli Zaretskii <eliz@is.elta.co.il>
parents:
53011
diff
changeset
|
149 |
e085973399ee
(xml-get-attribute-or-nil): New function, like
Eli Zaretskii <eliz@is.elta.co.il>
parents:
53011
diff
changeset
|
150 (defsubst xml-get-attribute (node attribute) |
e085973399ee
(xml-get-attribute-or-nil): New function, like
Eli Zaretskii <eliz@is.elta.co.il>
parents:
53011
diff
changeset
|
151 "Get from NODE the value of ATTRIBUTE. |
e085973399ee
(xml-get-attribute-or-nil): New function, like
Eli Zaretskii <eliz@is.elta.co.il>
parents:
53011
diff
changeset
|
152 An empty string is returned if the attribute was not found. |
e085973399ee
(xml-get-attribute-or-nil): New function, like
Eli Zaretskii <eliz@is.elta.co.il>
parents:
53011
diff
changeset
|
153 |
e085973399ee
(xml-get-attribute-or-nil): New function, like
Eli Zaretskii <eliz@is.elta.co.il>
parents:
53011
diff
changeset
|
154 See also `xml-get-attribute-or-nil'." |
e085973399ee
(xml-get-attribute-or-nil): New function, like
Eli Zaretskii <eliz@is.elta.co.il>
parents:
53011
diff
changeset
|
155 (or (xml-get-attribute-or-nil node attribute) "")) |
30329 | 156 |
157 ;;******************************************************************* | |
158 ;;** | |
159 ;;** Creating the list | |
160 ;;** | |
161 ;;******************************************************************* | |
162 | |
51102 | 163 ;;;###autoload |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
164 (defun xml-parse-file (file &optional parse-dtd parse-ns) |
51102 | 165 "Parse the well-formed XML file FILE. |
166 If FILE is already visited, use its buffer and don't kill it. | |
30329 | 167 Returns the top node with all its children. |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
168 If PARSE-DTD is non-nil, the DTD is parsed rather than skipped. |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
169 If PARSE-NS is non-nil, then QNAMES are expanded." |
72108
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
170 (if (get-file-buffer file) |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
171 (with-current-buffer (get-file-buffer file) |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
172 (save-excursion |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
173 (xml-parse-region (point-min) |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
174 (point-max) |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
175 (current-buffer) |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
176 parse-dtd parse-ns))) |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
177 (with-temp-buffer |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
178 (insert-file-contents file) |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
179 (xml-parse-region (point-min) |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
180 (point-max) |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
181 (current-buffer) |
ee72501a64b4
(xml-parse-file): Clean up, and use with-temp-buffer.
Richard M. Stallman <rms@gnu.org>
parents:
68651
diff
changeset
|
182 parse-dtd parse-ns)))) |
30329 | 183 |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
184 |
58939
e696b8c143a0
(xml-name-re, xml-entity-value-re): Add defvars.
Richard M. Stallman <rms@gnu.org>
parents:
58724
diff
changeset
|
185 (defvar xml-name-re) |
e696b8c143a0
(xml-name-re, xml-entity-value-re): Add defvars.
Richard M. Stallman <rms@gnu.org>
parents:
58724
diff
changeset
|
186 (defvar xml-entity-value-re) |
64794
950e3342b9d7
(xml-att-def-re): Add defvar.
Richard M. Stallman <rms@gnu.org>
parents:
64762
diff
changeset
|
187 (defvar xml-att-def-re) |
58724
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
188 (let* ((start-chars (concat "[:alpha:]:_")) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
189 (name-chars (concat "-[:digit:]." start-chars)) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
190 ;;[3] S ::= (#x20 | #x9 | #xD | #xA)+ |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
191 (whitespace "[ \t\n\r]")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
192 ;;[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
193 ;; | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
194 ;; | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
195 ;; | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
196 (defvar xml-name-start-char-re (concat "[" start-chars "]")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
197 ;;[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
198 (defvar xml-name-char-re (concat "[" name-chars "]")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
199 ;;[5] Name ::= NameStartChar (NameChar)* |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
200 (defvar xml-name-re (concat xml-name-start-char-re xml-name-char-re "*")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
201 ;;[6] Names ::= Name (#x20 Name)* |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
202 (defvar xml-names-re (concat xml-name-re "\\(?: " xml-name-re "\\)*")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
203 ;;[7] Nmtoken ::= (NameChar)+ |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
204 (defvar xml-nmtoken-re (concat xml-name-char-re "+")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
205 ;;[8] Nmtokens ::= Nmtoken (#x20 Nmtoken)* |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
206 (defvar xml-nmtokens-re (concat xml-nmtoken-re "\\(?: " xml-name-re "\\)*")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
207 ;;[66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
208 (defvar xml-char-ref-re "\\(?:&#[0-9]+;\\|&#x[0-9a-fA-F]+;\\)") |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
209 ;;[68] EntityRef ::= '&' Name ';' |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
210 (defvar xml-entity-ref (concat "&" xml-name-re ";")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
211 ;;[69] PEReference ::= '%' Name ';' |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
212 (defvar xml-pe-reference-re (concat "%" xml-name-re ";")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
213 ;;[67] Reference ::= EntityRef | CharRef |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
214 (defvar xml-reference-re (concat "\\(?:" xml-entity-ref "\\|" xml-char-ref-re "\\)")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
215 ;;[10] AttValue ::= '"' ([^<&"] | Reference)* '"' | "'" ([^<&'] | Reference)* "'" |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
216 (defvar xml-att-value-re (concat "\\(?:\"\\(?:[^&\"]\\|" xml-reference-re "\\)*\"\\|" |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
217 "'\\(?:[^&']\\|" xml-reference-re "\\)*'\\)")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
218 ;;[56] TokenizedType ::= 'ID' [VC: ID] [VC: One ID per Element Type] [VC: ID Attribute Default] |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
219 ;; | 'IDREF' [VC: IDREF] |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
220 ;; | 'IDREFS' [VC: IDREF] |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
221 ;; | 'ENTITY' [VC: Entity Name] |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
222 ;; | 'ENTITIES' [VC: Entity Name] |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
223 ;; | 'NMTOKEN' [VC: Name Token] |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
224 ;; | 'NMTOKENS' [VC: Name Token] |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
225 (defvar xml-tokenized-type-re "\\(?:ID\\|IDREF\\|IDREFS\\|ENTITY\\|ENTITIES\\|NMTOKEN\\|NMTOKENS\\)") |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
226 ;;[58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
227 (defvar xml-notation-type-re (concat "\\(?:NOTATION" whitespace "(" whitespace "*" xml-name-re |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
228 "\\(?:" whitespace "*|" whitespace "*" xml-name-re "\\)*" whitespace "*)\\)")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
229 ;;[59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [VC: Enumeration] [VC: No Duplicate Tokens] |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
230 (defvar xml-enumeration-re (concat "\\(?:(" whitespace "*" xml-nmtoken-re |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
231 "\\(?:" whitespace "*|" whitespace "*" xml-nmtoken-re "\\)*" |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
232 whitespace ")\\)")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
233 ;;[57] EnumeratedType ::= NotationType | Enumeration |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
234 (defvar xml-enumerated-type-re (concat "\\(?:" xml-notation-type-re "\\|" xml-enumeration-re "\\)")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
235 ;;[54] AttType ::= StringType | TokenizedType | EnumeratedType |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
236 ;;[55] StringType ::= 'CDATA' |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
237 (defvar xml-att-type-re (concat "\\(?:CDATA\\|" xml-tokenized-type-re "\\|" xml-notation-type-re"\\|" xml-enumerated-type-re "\\)")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
238 ;;[60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue) |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
239 (defvar xml-default-decl-re (concat "\\(?:#REQUIRED\\|#IMPLIED\\|\\(?:#FIXED" whitespace "\\)*" xml-att-value-re "\\)")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
240 ;;[53] AttDef ::= S Name S AttType S DefaultDecl |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
241 (defvar xml-att-def-re (concat "\\(?:" whitespace "*" xml-name-re |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
242 whitespace "*" xml-att-type-re |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
243 whitespace "*" xml-default-decl-re "\\)")) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
244 ;;[9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
245 ;; | "'" ([^%&'] | PEReference | Reference)* "'" |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
246 (defvar xml-entity-value-re (concat "\\(?:\"\\(?:[^%&\"]\\|" xml-pe-reference-re |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
247 "\\|" xml-reference-re "\\)*\"\\|'\\(?:[^%&']\\|" |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
248 xml-pe-reference-re "\\|" xml-reference-re "\\)*'\\)"))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
249 ;;[75] ExternalID ::= 'SYSTEM' S SystemLiteral |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
250 ;; | 'PUBLIC' S PubidLiteral S SystemLiteral |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
251 ;;[76] NDataDecl ::= S 'NDATA' S |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
252 ;;[73] EntityDef ::= EntityValue| (ExternalID NDataDecl?) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
253 ;;[71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>' |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
254 ;;[74] PEDef ::= EntityValue | ExternalID |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
255 ;;[72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>' |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
256 ;;[70] EntityDecl ::= GEDecl | PEDecl |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
257 |
51102 | 258 ;; Note that this is setup so that we can do whitespace-skipping with |
259 ;; `(skip-syntax-forward " ")', inter alia. Previously this was slow | |
260 ;; compared with `re-search-forward', but that has been fixed. Also | |
261 ;; note that the standard syntax table contains other characters with | |
262 ;; whitespace syntax, like NBSP, but they are invalid in contexts in | |
263 ;; which we might skip whitespace -- specifically, they're not | |
264 ;; NameChars [XML 4]. | |
265 | |
266 (defvar xml-syntax-table | |
267 (let ((table (make-syntax-table))) | |
268 ;; Get space syntax correct per XML [3]. | |
269 (dotimes (c 31) | |
270 (modify-syntax-entry c "." table)) ; all are space in standard table | |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
271 (dolist (c '(?\t ?\n ?\r)) ; these should be space |
51102 | 272 (modify-syntax-entry c " " table)) |
273 ;; For skipping attributes. | |
274 (modify-syntax-entry ?\" "\"" table) | |
275 (modify-syntax-entry ?' "\"" table) | |
276 ;; Non-alnum name chars should be symbol constituents (`-' and `_' | |
277 ;; are OK by default). | |
278 (modify-syntax-entry ?. "_" table) | |
279 (modify-syntax-entry ?: "_" table) | |
280 ;; XML [89] | |
66646 | 281 (unless (featurep 'xemacs) |
282 (dolist (c '(#x00B7 #x02D0 #x02D1 #x0387 #x0640 #x0E46 #x0EC6 #x3005 | |
283 #x3031 #x3032 #x3033 #x3034 #x3035 #x309D #x309E #x30FC | |
284 #x30FD #x30FE)) | |
285 (modify-syntax-entry (decode-char 'ucs c) "w" table))) | |
51102 | 286 ;; Fixme: rest of [4] |
287 table) | |
288 "Syntax table used by `xml-parse-region'.") | |
289 | |
290 ;; XML [5] | |
291 ;; Note that [:alpha:] matches all multibyte chars with word syntax. | |
51105
aac5eaf1454e
(xml-name-regexp): Wrap in `eval-and-compile'.
John Paul Wallington <jpw@pobox.com>
parents:
51102
diff
changeset
|
292 (eval-and-compile |
aac5eaf1454e
(xml-name-regexp): Wrap in `eval-and-compile'.
John Paul Wallington <jpw@pobox.com>
parents:
51102
diff
changeset
|
293 (defconst xml-name-regexp "[[:alpha:]_:][[:alnum:]._:-]*")) |
51102 | 294 |
295 ;; Fixme: This needs re-writing to deal with the XML grammar properly, i.e. | |
296 ;; document ::= prolog element Misc* | |
297 ;; prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? | |
298 | |
299 ;;;###autoload | |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
300 (defun xml-parse-region (beg end &optional buffer parse-dtd parse-ns) |
30329 | 301 "Parse the region from BEG to END in BUFFER. |
302 If BUFFER is nil, it defaults to the current buffer. | |
303 Returns the XML list for the region, or raises an error if the region | |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
304 is not well-formed XML. |
30329 | 305 If PARSE-DTD is non-nil, the DTD is parsed rather than skipped, |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
306 and returned as the first element of the list. |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
307 If PARSE-NS is non-nil, then QNAMES are expanded." |
68535
6fef36718f37
use provided patch
Mark A. Hershberger <mah@everybody.org>
parents:
68534
diff
changeset
|
308 ;; Use fixed syntax table to ensure regexp char classes and syntax |
6fef36718f37
use provided patch
Mark A. Hershberger <mah@everybody.org>
parents:
68534
diff
changeset
|
309 ;; specs DTRT. |
6fef36718f37
use provided patch
Mark A. Hershberger <mah@everybody.org>
parents:
68534
diff
changeset
|
310 (with-syntax-table (standard-syntax-table) |
6fef36718f37
use provided patch
Mark A. Hershberger <mah@everybody.org>
parents:
68534
diff
changeset
|
311 (let ((case-fold-search nil) ; XML is case-sensitive. |
6fef36718f37
use provided patch
Mark A. Hershberger <mah@everybody.org>
parents:
68534
diff
changeset
|
312 xml result dtd) |
6fef36718f37
use provided patch
Mark A. Hershberger <mah@everybody.org>
parents:
68534
diff
changeset
|
313 (save-excursion |
6fef36718f37
use provided patch
Mark A. Hershberger <mah@everybody.org>
parents:
68534
diff
changeset
|
314 (if buffer |
6fef36718f37
use provided patch
Mark A. Hershberger <mah@everybody.org>
parents:
68534
diff
changeset
|
315 (set-buffer buffer)) |
6fef36718f37
use provided patch
Mark A. Hershberger <mah@everybody.org>
parents:
68534
diff
changeset
|
316 (save-restriction |
6fef36718f37
use provided patch
Mark A. Hershberger <mah@everybody.org>
parents:
68534
diff
changeset
|
317 (narrow-to-region beg end) |
51102 | 318 (goto-char (point-min)) |
319 (while (not (eobp)) | |
320 (if (search-forward "<" nil t) | |
321 (progn | |
322 (forward-char -1) | |
52975
6958c2be0aa9
Allow comments following the top-level element.
Eli Zaretskii <eliz@gnu.org>
parents:
52401
diff
changeset
|
323 (setq result (xml-parse-tag parse-dtd parse-ns)) |
109288
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
324 (cond |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
325 ((null result) |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
326 ;; Not looking at an xml start tag. |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
327 (forward-char 1)) |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
328 ((and xml (not xml-sub-parser)) |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
329 ;; Translation of rule [1] of XML specifications |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
330 (error "XML: (Not Well-Formed) Only one root tag allowed")) |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
331 ((and (listp (car result)) |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
332 parse-dtd) |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
333 (setq dtd (car result)) |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
334 (if (cdr result) ; possible leading comment |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
335 (add-to-list 'xml (cdr result)))) |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
336 (t |
e24d55cee016
* xml.el (xml-parse-region): Avoid infloop (Bug#5281).
Chong Yidong <cyd@stupidchicken.com>
parents:
106815
diff
changeset
|
337 (add-to-list 'xml result)))) |
51102 | 338 (goto-char (point-max)))) |
339 (if parse-dtd | |
340 (cons dtd (nreverse xml)) | |
341 (nreverse xml))))))) | |
30329 | 342 |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
343 (defun xml-maybe-do-ns (name default xml-ns) |
54937 | 344 "Perform any namespace expansion. |
345 NAME is the name to perform the expansion on. | |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
346 DEFAULT is the default namespace. XML-NS is a cons of namespace |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
347 names to uris. When namespace-aware parsing is off, then XML-NS |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
348 is nil. |
52975
6958c2be0aa9
Allow comments following the top-level element.
Eli Zaretskii <eliz@gnu.org>
parents:
52401
diff
changeset
|
349 |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
350 During namespace-aware parsing, any name without a namespace is |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
351 put into the namespace identified by DEFAULT. nil is used to |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
352 specify that the name shouldn't be given a namespace." |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
353 (if (consp xml-ns) |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
354 (let* ((nsp (string-match ":" name)) |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
355 (lname (if nsp (substring name (match-end 0)) name)) |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
356 (prefix (if nsp (substring name 0 (match-beginning 0)) default)) |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
357 (special (and (string-equal lname "xmlns") (not prefix))) |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
358 ;; Setting default to nil will insure that there is not |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
359 ;; matching cons in xml-ns. In which case we |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
360 (ns (or (cdr (assoc (if special "xmlns" prefix) |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
361 xml-ns)) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
362 ""))) |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
363 (cons ns (if special "" lname))) |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
364 (intern name))) |
30329 | 365 |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
366 (defun xml-parse-fragment (&optional parse-dtd parse-ns) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
367 "Parse xml-like fragments." |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
368 (let ((xml-sub-parser t) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
369 children) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
370 (while (not (eobp)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
371 (let ((bit (xml-parse-tag |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
372 parse-dtd parse-ns))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
373 (if children |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
374 (setq children (append (list bit) children)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
375 (if (stringp bit) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
376 (setq children (list bit)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
377 (setq children bit))))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
378 (reverse children))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
379 |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
380 (defun xml-parse-tag (&optional parse-dtd parse-ns) |
51102 | 381 "Parse the tag at point. |
30329 | 382 If PARSE-DTD is non-nil, the DTD of the document, if any, is parsed and |
383 returned as the first element in the list. | |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
384 If PARSE-NS is non-nil, then QNAMES are expanded. |
30329 | 385 Returns one of: |
51102 | 386 - a list : the matching node |
387 - nil : the point is not looking at a tag. | |
388 - a pair : the first element is the DTD, the second is the node." | |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
389 (let ((xml-validating-parser (or parse-dtd xml-validating-parser)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
390 (xml-ns (if (consp parse-ns) |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
391 parse-ns |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
392 (if parse-ns |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
393 (list |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
394 ;; Default for empty prefix is no namespace |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
395 (cons "" "") |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
396 ;; "xml" namespace |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
397 (cons "xml" "http://www.w3.org/XML/1998/namespace") |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
398 ;; We need to seed the xmlns namespace |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
399 (cons "xmlns" "http://www.w3.org/2000/xmlns/")))))) |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
400 (cond |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
401 ;; Processing instructions (like the <?xml version="1.0"?> tag at the |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
402 ;; beginning of a document). |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
403 ((looking-at "<\\?") |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
404 (search-forward "?>") |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
405 (skip-syntax-forward " ") |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
406 (xml-parse-tag parse-dtd xml-ns)) |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
407 ;; Character data (CDATA) sections, in which no tag should be interpreted |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
408 ((looking-at "<!\\[CDATA\\[") |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
409 (let ((pos (match-end 0))) |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
410 (unless (search-forward "]]>" nil t) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
411 (error "XML: (Not Well Formed) CDATA section does not end anywhere in the document")) |
58698
10ecc7ffdc5a
2004-11-30 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
57367
diff
changeset
|
412 (concat |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
413 (buffer-substring-no-properties pos (match-beginning 0)) |
58698
10ecc7ffdc5a
2004-11-30 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
57367
diff
changeset
|
414 (xml-parse-string)))) |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
415 ;; DTD for the document |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
416 ((looking-at "<!DOCTYPE") |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
417 (let ((dtd (xml-parse-dtd parse-ns))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
418 (skip-syntax-forward " ") |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
419 (if xml-validating-parser |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
420 (cons dtd (xml-parse-tag nil xml-ns)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
421 (xml-parse-tag nil xml-ns)))) |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
422 ;; skip comments |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
423 ((looking-at "<!--") |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
424 (search-forward "-->") |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
425 nil) |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
426 ;; end tag |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
427 ((looking-at "</") |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
428 '()) |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
429 ;; opening tag |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
430 ((looking-at "<\\([^/>[:space:]]+\\)") |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
431 (goto-char (match-end 1)) |
52975
6958c2be0aa9
Allow comments following the top-level element.
Eli Zaretskii <eliz@gnu.org>
parents:
52401
diff
changeset
|
432 |
6958c2be0aa9
Allow comments following the top-level element.
Eli Zaretskii <eliz@gnu.org>
parents:
52401
diff
changeset
|
433 ;; Parse this node |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
434 (let* ((node-name (match-string-no-properties 1)) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
435 ;; Parse the attribute list. |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
436 (attrs (xml-parse-attlist xml-ns)) |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
437 children pos) |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
438 |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
439 ;; add the xmlns:* attrs to our cache |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
440 (when (consp xml-ns) |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
441 (dolist (attr attrs) |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
442 (when (and (consp (car attr)) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
443 (equal "http://www.w3.org/2000/xmlns/" |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
444 (caar attr))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
445 (push (cons (cdar attr) (cdr attr)) |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
446 xml-ns)))) |
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
447 |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
448 (setq children (list attrs (xml-maybe-do-ns node-name "" xml-ns))) |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
449 |
51930
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
450 ;; is this an empty element ? |
608552c82ffc
(xml-parse-tag): Namespace support.
Juanma Barranquero <lekktu@gmail.com>
parents:
51697
diff
changeset
|
451 (if (looking-at "/>") |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
452 (progn |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
453 (forward-char 2) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
454 (nreverse children)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
455 |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
456 ;; is this a valid start tag ? |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
457 (if (eq (char-after) ?>) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
458 (progn |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
459 (forward-char 1) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
460 ;; Now check that we have the right end-tag. Note that this |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
461 ;; one might contain spaces after the tag name |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
462 (let ((end (concat "</" node-name "\\s-*>"))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
463 (while (not (looking-at end)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
464 (cond |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
465 ((looking-at "</") |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
466 (error "XML: (Not Well-Formed) Invalid end tag (expecting %s) at pos %d" |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
467 node-name (point))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
468 ((= (char-after) ?<) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
469 (let ((tag (xml-parse-tag nil xml-ns))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
470 (when tag |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
471 (push tag children)))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
472 (t |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
473 (let ((expansion (xml-parse-string))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
474 (setq children |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
475 (if (stringp expansion) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
476 (if (stringp (car children)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
477 ;; The two strings were separated by a comment. |
66646 | 478 (setq children (append (list (concat (car children) expansion)) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
479 (cdr children))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
480 (setq children (append (list expansion) children))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
481 (setq children (append expansion children)))))))) |
30329 | 482 |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
483 (goto-char (match-end 0)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
484 (nreverse children))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
485 ;; This was an invalid start tag (Expected ">", but didn't see it.) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
486 (error "XML: (Well-Formed) Couldn't parse tag: %s" |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
487 (buffer-substring-no-properties (- (point) 10) (+ (point) 1))))))) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
488 (t ;; (Not one of PI, CDATA, Comment, End tag, or Start tag) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
489 (unless xml-sub-parser ; Usually, we error out. |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
490 (error "XML: (Well-Formed) Invalid character")) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
491 |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
492 ;; However, if we're parsing incrementally, then we need to deal |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
493 ;; with stray CDATA. |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
494 (xml-parse-string))))) |
49036
466922eb2b8d
(xml-substitute-special): Move "&" -> "&" last.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
48869
diff
changeset
|
495 |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
496 (defun xml-parse-string () |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
497 "Parse the next whatever. Could be a string, or an element." |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
498 (let* ((pos (point)) |
98529
2a05b2390d45
(xml-parse-string): Use skip-chars-forward.
Chong Yidong <cyd@stupidchicken.com>
parents:
94678
diff
changeset
|
499 (string (progn (skip-chars-forward "^<") |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
500 (buffer-substring-no-properties pos (point))))) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
501 ;; Clean up the string. As per XML specifications, the XML |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
502 ;; processor should always pass the whole string to the |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
503 ;; application. But \r's should be replaced: |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
504 ;; http://www.w3.org/TR/2000/REC-xml-20001006#sec-line-ends |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
505 (setq pos 0) |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
506 (while (string-match "\r\n?" string pos) |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
507 (setq string (replace-match "\n" t t string)) |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
508 (setq pos (1+ (match-beginning 0)))) |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
509 |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
510 (xml-substitute-special string))) |
30329 | 511 |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
512 (defun xml-parse-attlist (&optional xml-ns) |
54937 | 513 "Return the attribute-list after point. |
514 Leave point at the first non-blank character after the tag." | |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
515 (let ((attlist ()) |
52975
6958c2be0aa9
Allow comments following the top-level element.
Eli Zaretskii <eliz@gnu.org>
parents:
52401
diff
changeset
|
516 end-pos name) |
51102 | 517 (skip-syntax-forward " ") |
518 (while (looking-at (eval-when-compile | |
519 (concat "\\(" xml-name-regexp "\\)\\s-*=\\s-*"))) | |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
520 (setq end-pos (match-end 0)) |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
521 (setq name (xml-maybe-do-ns (match-string-no-properties 1) nil xml-ns)) |
54877
1bf7ef48f54f
(xml-maybe-do-ns): New function to handle namespace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54243
diff
changeset
|
522 (goto-char end-pos) |
30329 | 523 |
50144
ff1b1d15e1f2
(xml-ucs-to-string): New function to convert Unicode codepoints to strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
50081
diff
changeset
|
524 ;; See also: http://www.w3.org/TR/2000/REC-xml-20001006#AVNormalize |
ff1b1d15e1f2
(xml-ucs-to-string): New function to convert Unicode codepoints to strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
50081
diff
changeset
|
525 |
30329 | 526 ;; Do we have a string between quotes (or double-quotes), |
527 ;; or a simple word ? | |
50144
ff1b1d15e1f2
(xml-ucs-to-string): New function to convert Unicode codepoints to strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
50081
diff
changeset
|
528 (if (looking-at "\"\\([^\"]*\\)\"") |
52975
6958c2be0aa9
Allow comments following the top-level element.
Eli Zaretskii <eliz@gnu.org>
parents:
52401
diff
changeset
|
529 (setq end-pos (match-end 0)) |
50210
575aa6820adc
(xml-parse-attlist): typo in attribute parsing.
Juanma Barranquero <lekktu@gmail.com>
parents:
50144
diff
changeset
|
530 (if (looking-at "'\\([^']*\\)'") |
52975
6958c2be0aa9
Allow comments following the top-level element.
Eli Zaretskii <eliz@gnu.org>
parents:
52401
diff
changeset
|
531 (setq end-pos (match-end 0)) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
532 (error "XML: (Not Well-Formed) Attribute values must be given between quotes"))) |
30329 | 533 |
534 ;; Each attribute must be unique within a given element | |
535 (if (assoc name attlist) | |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
536 (error "XML: (Not Well-Formed) Each attribute must be unique within an element")) |
49036
466922eb2b8d
(xml-substitute-special): Move "&" -> "&" last.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
48869
diff
changeset
|
537 |
50144
ff1b1d15e1f2
(xml-ucs-to-string): New function to convert Unicode codepoints to strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
50081
diff
changeset
|
538 ;; Multiple whitespace characters should be replaced with a single one |
ff1b1d15e1f2
(xml-ucs-to-string): New function to convert Unicode codepoints to strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
50081
diff
changeset
|
539 ;; in the attributes |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
540 (let ((string (match-string-no-properties 1)) |
50144
ff1b1d15e1f2
(xml-ucs-to-string): New function to convert Unicode codepoints to strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
50081
diff
changeset
|
541 (pos 0)) |
51102 | 542 (replace-regexp-in-string "\\s-\\{2,\\}" " " string) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
543 (let ((expansion (xml-substitute-special string))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
544 (unless (stringp expansion) |
68534
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
545 ; We say this is the constraint. It is acctually that |
bf640be8a692
fixing bug report
Mark A. Hershberger <mah@everybody.org>
parents:
66646
diff
changeset
|
546 ; external entities nor "<" can be in an attribute value. |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
547 (error "XML: (Not Well-Formed) Entities in attributes cannot expand into elements")) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
548 (push (cons name expansion) attlist))) |
50144
ff1b1d15e1f2
(xml-ucs-to-string): New function to convert Unicode codepoints to strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
50081
diff
changeset
|
549 |
52975
6958c2be0aa9
Allow comments following the top-level element.
Eli Zaretskii <eliz@gnu.org>
parents:
52401
diff
changeset
|
550 (goto-char end-pos) |
51102 | 551 (skip-syntax-forward " ")) |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
552 (nreverse attlist))) |
30329 | 553 |
554 ;;******************************************************************* | |
555 ;;** | |
556 ;;** The DTD (document type declaration) | |
557 ;;** The following functions know how to skip or parse the DTD of | |
558 ;;** a document | |
559 ;;** | |
560 ;;******************************************************************* | |
561 | |
51102 | 562 ;; Fixme: This fails at least if the DTD contains conditional sections. |
563 | |
564 (defun xml-skip-dtd () | |
565 "Skip the DTD at point. | |
30329 | 566 This follows the rule [28] in the XML specifications." |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
567 (let ((xml-validating-parser nil)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
568 (xml-parse-dtd))) |
30329 | 569 |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
570 (defun xml-parse-dtd (&optional parse-ns) |
51102 | 571 "Parse the DTD at point." |
572 (forward-char (eval-when-compile (length "<!DOCTYPE"))) | |
573 (skip-syntax-forward " ") | |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
574 (if (and (looking-at ">") |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
575 xml-validating-parser) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
576 (error "XML: (Validity) Invalid DTD (expecting name of the document)")) |
49036
466922eb2b8d
(xml-substitute-special): Move "&" -> "&" last.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
48869
diff
changeset
|
577 |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
578 ;; Get the name of the document |
51102 | 579 (looking-at xml-name-regexp) |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
580 (let ((dtd (list (match-string-no-properties 0) 'dtd)) |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
581 type element end-pos) |
30329 | 582 (goto-char (match-end 0)) |
583 | |
51102 | 584 (skip-syntax-forward " ") |
585 ;; XML [75] | |
586 (cond ((looking-at "PUBLIC\\s-+") | |
587 (goto-char (match-end 0)) | |
588 (unless (or (re-search-forward | |
589 "\\=\"\\([[:space:][:alnum:]-'()+,./:=?;!*#@$_%]*\\)\"" | |
590 nil t) | |
591 (re-search-forward | |
592 "\\='\\([[:space:][:alnum:]-()+,./:=?;!*#@$_%]*\\)'" | |
593 nil t)) | |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
594 (error "XML: Missing Public ID")) |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
595 (let ((pubid (match-string-no-properties 1))) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
596 (skip-syntax-forward " ") |
51102 | 597 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t) |
598 (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t)) | |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
599 (error "XML: Missing System ID")) |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
600 (push (list pubid (match-string-no-properties 1) 'public) dtd))) |
51102 | 601 ((looking-at "SYSTEM\\s-+") |
602 (goto-char (match-end 0)) | |
603 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t) | |
604 (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t)) | |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
605 (error "XML: Missing System ID")) |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
606 (push (list (match-string-no-properties 1) 'system) dtd))) |
51102 | 607 (skip-syntax-forward " ") |
608 (if (eq ?> (char-after)) | |
609 (forward-char) | |
610 (if (not (eq (char-after) ?\[)) | |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
611 (error "XML: Bad DTD") |
51102 | 612 (forward-char) |
613 ;; Parse the rest of the DTD | |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
614 ;; Fixme: Deal with NOTATION, PIs. |
51102 | 615 (while (not (looking-at "\\s-*\\]")) |
616 (skip-syntax-forward " ") | |
617 (cond | |
49036
466922eb2b8d
(xml-substitute-special): Move "&" -> "&" last.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
48869
diff
changeset
|
618 |
51102 | 619 ;; Translation of rule [45] of XML specifications |
620 ((looking-at | |
621 "<!ELEMENT\\s-+\\([[:alnum:].%;]+\\)\\s-+\\([^>]+\\)>") | |
622 | |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
623 (setq element (match-string-no-properties 1) |
51102 | 624 type (match-string-no-properties 2)) |
625 (setq end-pos (match-end 0)) | |
30329 | 626 |
51102 | 627 ;; Translation of rule [46] of XML specifications |
628 (cond | |
629 ((string-match "^EMPTY[ \t\n\r]*$" type) ;; empty declaration | |
630 (setq type 'empty)) | |
631 ((string-match "^ANY[ \t\n\r]*$" type) ;; any type of contents | |
632 (setq type 'any)) | |
633 ((string-match "^(\\(.*\\))[ \t\n\r]*$" type) ;; children ([47]) | |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
634 (setq type (xml-parse-elem-type (match-string-no-properties 1 type)))) |
51102 | 635 ((string-match "^%[^;]+;[ \t\n\r]*$" type) ;; substitution |
636 nil) | |
637 (t | |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
638 (if xml-validating-parser |
57346
8e110e726b85
(xml-parse-dtd): Fix `error' call.
John Paul Wallington <jpw@pobox.com>
parents:
57344
diff
changeset
|
639 (error "XML: (Validity) Invalid element type in the DTD")))) |
58723
9104d032d2fa
Change existence of &; to not-well-formed.
Mark A. Hershberger <mah@everybody.org>
parents:
58721
diff
changeset
|
640 |
51102 | 641 ;; rule [45]: the element declaration must be unique |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
642 (if (and (assoc element dtd) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
643 xml-validating-parser) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
644 (error "XML: (Validity) Element declarations must be unique in a DTD (<%s>)" |
53011
45bd3ad34572
(xml-parse-dtd): Fix misplaced paren.
Andreas Schwab <schwab@suse.de>
parents:
52975
diff
changeset
|
645 element)) |
30329 | 646 |
51102 | 647 ;; Store the element in the DTD |
648 (push (list element type) dtd) | |
649 (goto-char end-pos)) | |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
650 |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
651 ;; Translation of rule [52] of XML specifications |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
652 ((looking-at (concat "<!ATTLIST[ \t\n\r]*\\(" xml-name-re |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
653 "\\)[ \t\n\r]*\\(" xml-att-def-re |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
654 "\\)*[ \t\n\r]*>")) |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
655 |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
656 ;; We don't do anything with ATTLIST currently |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
657 (goto-char (match-end 0))) |
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
658 |
51102 | 659 ((looking-at "<!--") |
660 (search-forward "-->")) | |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
661 ((looking-at (concat "<!ENTITY[ \t\n\r]*\\(" xml-name-re |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
662 "\\)[ \t\n\r]*\\(" xml-entity-value-re |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
663 "\\)[ \t\n\r]*>")) |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
664 (let ((name (match-string-no-properties 1)) |
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
665 (value (substring (match-string-no-properties 2) 1 |
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
666 (- (length (match-string-no-properties 2)) 1)))) |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
667 (goto-char (match-end 0)) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
668 (setq xml-entity-alist |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
669 (append xml-entity-alist |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
670 (list (cons name |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
671 (with-temp-buffer |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
672 (insert value) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
673 (goto-char (point-min)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
674 (xml-parse-fragment |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
675 xml-validating-parser |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
676 parse-ns)))))))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
677 ((or (looking-at (concat "<!ENTITY[ \t\n\r]+\\(" xml-name-re |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
678 "\\)[ \t\n\r]+SYSTEM[ \t\n\r]+" |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
679 "\\(\"[^\"]*\"\\|'[^']*'\\)[ \t\n\r]*>")) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
680 (looking-at (concat "<!ENTITY[ \t\n\r]+\\(" xml-name-re |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
681 "\\)[ \t\n\r]+PUBLIC[ \t\n\r]+" |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
682 "\"[- \r\na-zA-Z0-9'()+,./:=?;!*#@$_%]*\"" |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
683 "\\|'[- \r\na-zA-Z0-9()+,./:=?;!*#@$_%]*'" |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
684 "[ \t\n\r]+\\(\"[^\"]*\"\\|'[^']*'\\)" |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
685 "[ \t\n\r]*>"))) |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
686 (let ((name (match-string-no-properties 1)) |
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
687 (file (substring (match-string-no-properties 2) 1 |
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
688 (- (length (match-string-no-properties 2)) 1)))) |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
689 (goto-char (match-end 0)) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
690 (setq xml-entity-alist |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
691 (append xml-entity-alist |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
692 (list (cons name (with-temp-buffer |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
693 (insert-file-contents file) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
694 (goto-char (point-min)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
695 (xml-parse-fragment |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
696 xml-validating-parser |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
697 parse-ns)))))))) |
58724
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
698 ;; skip parameter entity declarations |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
699 ((or (looking-at (concat "<!ENTITY[ \t\n\r]+%[ \t\n\r]+\\(" xml-name-re |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
700 "\\)[ \t\n\r]+SYSTEM[ \t\n\r]+" |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
701 "\\(\"[^\"]*\"\\|'[^']*'\\)[ \t\n\r]*>")) |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
702 (looking-at (concat "<!ENTITY[ \t\n\r]+" |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
703 "%[ \t\n\r]+" |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
704 "\\(" xml-name-re "\\)[ \t\n\r]+" |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
705 "PUBLIC[ \t\n\r]+" |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
706 "\\(\"[- \r\na-zA-Z0-9'()+,./:=?;!*#@$_%]*\"" |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
707 "\\|'[- \r\na-zA-Z0-9()+,./:=?;!*#@$_%]*'\\)[ \t\n\r]+" |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
708 "\\(\"[^\"]+\"\\|'[^']+'\\)" |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
709 "[ \t\n\r]*>"))) |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
710 (goto-char (match-end 0))) |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
711 ;; skip parameter entities |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
712 ((looking-at (concat "%" xml-name-re ";")) |
99943ffd0774
Skip parameter entity declarations.
Mark A. Hershberger <mah@everybody.org>
parents:
58723
diff
changeset
|
713 (goto-char (match-end 0))) |
51102 | 714 (t |
58721
ff6b2a793277
Ensure that validity messages only show when xml-validating-parser is set.
Mark A. Hershberger <mah@everybody.org>
parents:
58698
diff
changeset
|
715 (when xml-validating-parser |
58723
9104d032d2fa
Change existence of &; to not-well-formed.
Mark A. Hershberger <mah@everybody.org>
parents:
58721
diff
changeset
|
716 (error "XML: (Validity) Invalid DTD item")))))) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
717 (if (looking-at "\\s-*]>") |
63282
3609dc754369
eliminate use of inefficient match-data
Mark A. Hershberger <mah@everybody.org>
parents:
62752
diff
changeset
|
718 (goto-char (match-end 0)))) |
53011
45bd3ad34572
(xml-parse-dtd): Fix misplaced paren.
Andreas Schwab <schwab@suse.de>
parents:
52975
diff
changeset
|
719 (nreverse dtd))) |
30329 | 720 |
721 (defun xml-parse-elem-type (string) | |
51102 | 722 "Convert element type STRING into a Lisp structure." |
30329 | 723 |
724 (let (elem modifier) | |
725 (if (string-match "(\\([^)]+\\))\\([+*?]?\\)" string) | |
726 (progn | |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
727 (setq elem (match-string-no-properties 1 string) |
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
728 modifier (match-string-no-properties 2 string)) |
30329 | 729 (if (string-match "|" elem) |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
730 (setq elem (cons 'choice |
30329 | 731 (mapcar 'xml-parse-elem-type |
732 (split-string elem "|")))) | |
733 (if (string-match "," elem) | |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
734 (setq elem (cons 'seq |
30329 | 735 (mapcar 'xml-parse-elem-type |
51102 | 736 (split-string elem ","))))))) |
50144
ff1b1d15e1f2
(xml-ucs-to-string): New function to convert Unicode codepoints to strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
50081
diff
changeset
|
737 (if (string-match "[ \t\n\r]*\\([^+*?]+\\)\\([+*?]?\\)" string) |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
738 (setq elem (match-string-no-properties 1 string) |
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
739 modifier (match-string-no-properties 2 string)))) |
30329 | 740 |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
741 (if (and (stringp elem) (string= elem "#PCDATA")) |
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
742 (setq elem 'pcdata)) |
49036
466922eb2b8d
(xml-substitute-special): Move "&" -> "&" last.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
48869
diff
changeset
|
743 |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
744 (cond |
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
745 ((string= modifier "+") |
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
746 (list '+ elem)) |
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
747 ((string= modifier "*") |
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
748 (list '* elem)) |
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
749 ((string= modifier "?") |
49787
6269b5c10aec
(xml-parse-elem-type): Fix use of character constant.
Juanma Barranquero <lekktu@gmail.com>
parents:
49133
diff
changeset
|
750 (list '\? elem)) |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
751 (t |
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
752 elem)))) |
30329 | 753 |
50144
ff1b1d15e1f2
(xml-ucs-to-string): New function to convert Unicode codepoints to strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
50081
diff
changeset
|
754 ;;******************************************************************* |
ff1b1d15e1f2
(xml-ucs-to-string): New function to convert Unicode codepoints to strings.
Juanma Barranquero <lekktu@gmail.com>
parents:
50081
diff
changeset
|
755 ;;** |
30329 | 756 ;;** Substituting special XML sequences |
757 ;;** | |
758 ;;******************************************************************* | |
759 | |
760 (defun xml-substitute-special (string) | |
51102 | 761 "Return STRING, after subsituting entity references." |
762 ;; This originally made repeated passes through the string from the | |
763 ;; beginning, which isn't correct, since then either "&amp;" or | |
764 ;; "&amp;" won't DTRT. | |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
765 |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
766 (let ((point 0) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
767 children end-point) |
58698
10ecc7ffdc5a
2004-11-30 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
57367
diff
changeset
|
768 (while (string-match "&\\([^;]*\\);" string point) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
769 (setq end-point (match-end 0)) |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
770 (let* ((this-part (match-string-no-properties 1 string)) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
771 (prev-part (substring string point (match-beginning 0))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
772 (entity (assoc this-part xml-entity-alist)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
773 (expansion |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
774 (cond ((string-match "#\\([0-9]+\\)" this-part) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
775 (let ((c (decode-char |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
776 'ucs |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
777 (string-to-number (match-string-no-properties 1 this-part))))) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
778 (if c (string c)))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
779 ((string-match "#x\\([[:xdigit:]]+\\)" this-part) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
780 (let ((c (decode-char |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
781 'ucs |
76507
d1760553962c
* xml.el (xml-parse-tag, xml-parse-string, xml-parse-attlist)
Chong Yidong <cyd@stupidchicken.com>
parents:
75347
diff
changeset
|
782 (string-to-number (match-string-no-properties 1 this-part) 16)))) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
783 (if c (string c)))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
784 (entity |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
785 (cdr entity)) |
58698
10ecc7ffdc5a
2004-11-30 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
57367
diff
changeset
|
786 ((eq (length this-part) 0) |
58723
9104d032d2fa
Change existence of &; to not-well-formed.
Mark A. Hershberger <mah@everybody.org>
parents:
58721
diff
changeset
|
787 (error "XML: (Not Well-Formed) No entity given")) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
788 (t |
62752
d0f8033496b1
2005-05-26 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
58939
diff
changeset
|
789 (if xml-validating-parser |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
790 (error "XML: (Validity) Undefined entity `%s'" |
62752
d0f8033496b1
2005-05-26 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
58939
diff
changeset
|
791 this-part) |
d0f8033496b1
2005-05-26 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
58939
diff
changeset
|
792 xml-undefined-entity))))) |
30329 | 793 |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
794 (cond ((null children) |
57367
8f9302e4a35f
2004-10-07 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
57346
diff
changeset
|
795 ;; FIXME: If we have an entity that expands into XML, this won't work. |
8f9302e4a35f
2004-10-07 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
57346
diff
changeset
|
796 (setq children |
8f9302e4a35f
2004-10-07 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
57346
diff
changeset
|
797 (concat prev-part expansion))) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
798 ((stringp children) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
799 (if (stringp expansion) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
800 (setq children (concat children prev-part expansion)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
801 (setq children (list expansion (concat prev-part children))))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
802 ((and (stringp expansion) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
803 (stringp (car children))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
804 (setcar children (concat prev-part expansion (car children)))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
805 ((stringp expansion) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
806 (setq children (append (concat prev-part expansion) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
807 children))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
808 ((stringp (car children)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
809 (setcar children (concat (car children) prev-part)) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
810 (setq children (append expansion children))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
811 (t |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
812 (setq children (list expansion |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
813 prev-part |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
814 children)))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
815 (setq point end-point))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
816 (cond ((stringp children) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
817 (concat children (substring string point))) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
818 ((stringp (car (last children))) |
57344
95ee82562c2a
fix to for xml-substitute-special to produce a single string instead
Mark A. Hershberger <mah@everybody.org>
parents:
56375
diff
changeset
|
819 (concat (car (last children)) (substring string point))) |
56375
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
820 ((null children) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
821 string) |
2e4e974fa50b
2004-07-09 Mark A. Hershberger <mah@everybody.org>
Mark A. Hershberger <mah@everybody.org>
parents:
55316
diff
changeset
|
822 (t |
57344
95ee82562c2a
fix to for xml-substitute-special to produce a single string instead
Mark A. Hershberger <mah@everybody.org>
parents:
56375
diff
changeset
|
823 (concat (mapconcat 'identity |
95ee82562c2a
fix to for xml-substitute-special to produce a single string instead
Mark A. Hershberger <mah@everybody.org>
parents:
56375
diff
changeset
|
824 (nreverse children) |
95ee82562c2a
fix to for xml-substitute-special to produce a single string instead
Mark A. Hershberger <mah@everybody.org>
parents:
56375
diff
changeset
|
825 "") |
95ee82562c2a
fix to for xml-substitute-special to produce a single string instead
Mark A. Hershberger <mah@everybody.org>
parents:
56375
diff
changeset
|
826 (substring string point)))))) |
95ee82562c2a
fix to for xml-substitute-special to produce a single string instead
Mark A. Hershberger <mah@everybody.org>
parents:
56375
diff
changeset
|
827 |
106458 | 828 (defun xml-substitute-numeric-entities (string) |
829 "Substitute SGML numeric entities by their respective utf characters. | |
830 This function replaces numeric entities in the input STRING and | |
831 returns the modified string. For example \"*\" gets replaced | |
832 by \"*\"." | |
833 (if (and string (stringp string)) | |
834 (let ((start 0)) | |
835 (while (string-match "&#\\([0-9]+\\);" string start) | |
836 (condition-case nil | |
837 (setq string (replace-match | |
838 (string (read (substring string | |
839 (match-beginning 1) | |
840 (match-end 1)))) | |
841 nil nil string)) | |
842 (error nil)) | |
843 (setq start (1+ (match-beginning 0)))) | |
844 string) | |
845 nil)) | |
846 | |
30329 | 847 ;;******************************************************************* |
848 ;;** | |
849 ;;** Printing a tree. | |
850 ;;** This function is intended mainly for debugging purposes. | |
851 ;;** | |
852 ;;******************************************************************* | |
853 | |
55253
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
854 (defun xml-debug-print (xml &optional indent-string) |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
855 "Outputs the XML in the current buffer. |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
856 XML can be a tree or a list of nodes. |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
857 The first line is indented with the optional INDENT-STRING." |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
858 (setq indent-string (or indent-string "")) |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
859 (dolist (node xml) |
55253
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
860 (xml-debug-print-internal node indent-string))) |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
861 |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
862 (defalias 'xml-print 'xml-debug-print) |
30329 | 863 |
87317
e8a485c87523
fix up xml-debug-print
Mark A. Hershberger <mah@everybody.org>
parents:
78236
diff
changeset
|
864 (defun xml-escape-string (string) |
87318
3b14ea2b1d8a
Forgot docstring on xml-escape-string
Mark A. Hershberger <mah@everybody.org>
parents:
87317
diff
changeset
|
865 "Return the string with entity substitutions made from |
3b14ea2b1d8a
Forgot docstring on xml-escape-string
Mark A. Hershberger <mah@everybody.org>
parents:
87317
diff
changeset
|
866 xml-entity-alist." |
87317
e8a485c87523
fix up xml-debug-print
Mark A. Hershberger <mah@everybody.org>
parents:
78236
diff
changeset
|
867 (mapconcat (lambda (byte) |
e8a485c87523
fix up xml-debug-print
Mark A. Hershberger <mah@everybody.org>
parents:
78236
diff
changeset
|
868 (let ((char (char-to-string byte))) |
e8a485c87523
fix up xml-debug-print
Mark A. Hershberger <mah@everybody.org>
parents:
78236
diff
changeset
|
869 (if (rassoc char xml-entity-alist) |
e8a485c87523
fix up xml-debug-print
Mark A. Hershberger <mah@everybody.org>
parents:
78236
diff
changeset
|
870 (concat "&" (car (rassoc char xml-entity-alist)) ";") |
e8a485c87523
fix up xml-debug-print
Mark A. Hershberger <mah@everybody.org>
parents:
78236
diff
changeset
|
871 char))) |
91342
3ec2fe8547cf
* xml.el (xml-escape-string): Don't do any encoding changes on the string.
Mark A. Hershberger <mah@everybody.org>
parents:
91327
diff
changeset
|
872 ;; This differs from the non-unicode branch. Just |
3ec2fe8547cf
* xml.el (xml-escape-string): Don't do any encoding changes on the string.
Mark A. Hershberger <mah@everybody.org>
parents:
91327
diff
changeset
|
873 ;; grabbing the string works here. |
3ec2fe8547cf
* xml.el (xml-escape-string): Don't do any encoding changes on the string.
Mark A. Hershberger <mah@everybody.org>
parents:
91327
diff
changeset
|
874 string "")) |
87317
e8a485c87523
fix up xml-debug-print
Mark A. Hershberger <mah@everybody.org>
parents:
78236
diff
changeset
|
875 |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
876 (defun xml-debug-print-internal (xml indent-string) |
30329 | 877 "Outputs the XML tree in the current buffer. |
51102 | 878 The first line is indented with INDENT-STRING." |
30329 | 879 (let ((tree xml) |
880 attlist) | |
51102 | 881 (insert indent-string ?< (symbol-name (xml-node-name tree))) |
49036
466922eb2b8d
(xml-substitute-special): Move "&" -> "&" last.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
48869
diff
changeset
|
882 |
30329 | 883 ;; output the attribute list |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
884 (setq attlist (xml-node-attributes tree)) |
30329 | 885 (while attlist |
87317
e8a485c87523
fix up xml-debug-print
Mark A. Hershberger <mah@everybody.org>
parents:
78236
diff
changeset
|
886 (insert ?\ (symbol-name (caar attlist)) "=\"" |
e8a485c87523
fix up xml-debug-print
Mark A. Hershberger <mah@everybody.org>
parents:
78236
diff
changeset
|
887 (xml-escape-string (cdar attlist)) ?\") |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
888 (setq attlist (cdr attlist))) |
49036
466922eb2b8d
(xml-substitute-special): Move "&" -> "&" last.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
48869
diff
changeset
|
889 |
42031
54db4085a7df
Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40030
diff
changeset
|
890 (setq tree (xml-node-children tree)) |
30329 | 891 |
55253
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
892 (if (null tree) |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
893 (insert ?/ ?>) |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
894 (insert ?>) |
30329 | 895 |
55253
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
896 ;; output the children |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
897 (dolist (node tree) |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
898 (cond |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
899 ((listp node) |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
900 (insert ?\n) |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
901 (xml-debug-print-internal node (concat indent-string " "))) |
87317
e8a485c87523
fix up xml-debug-print
Mark A. Hershberger <mah@everybody.org>
parents:
78236
diff
changeset
|
902 ((stringp node) |
e8a485c87523
fix up xml-debug-print
Mark A. Hershberger <mah@everybody.org>
parents:
78236
diff
changeset
|
903 (insert (xml-escape-string node))) |
55253
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
904 (t |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
905 (error "Invalid XML tree")))) |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
906 |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
907 (when (not (and (null (cdr tree)) |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
908 (stringp (car tree)))) |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
909 (insert ?\n indent-string)) |
d33879ad154a
(xml-debug-print-internal): Don't add newline and
Alex Schroeder <alex@gnu.org>
parents:
54937
diff
changeset
|
910 (insert ?< ?/ (symbol-name (xml-node-name xml)) ?>)))) |
30329 | 911 |
912 (provide 'xml) | |
913 | |
55316
7ac80356d84c
Arch-tags shouldn't be outline headers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
55253
diff
changeset
|
914 ;; arch-tag: 5864b283-5a68-4b59-a20d-36a72b353b9b |
30329 | 915 ;;; xml.el ends here |