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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 106458
diff changeset
4 ;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
5
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
6 ;; Author: Emmanuel Briot <briot@gnat.com>
51697
79747466c43b Record new maintainer.
Richard M. Stallman <rms@gnu.org>
parents: 51334
diff changeset
7 ;; Maintainer: Mark A. Hershberger <mah@everybody.org>
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
8 ;; Keywords: xml, data
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
9
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
16
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
21
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
24
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
25 ;;; Commentary:
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
26
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
27 ;; This file contains a somewhat incomplete non-validating XML parser. It
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
28 ;; parses a file, and returns a list that can be used internally by
54937
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
29 ;; any other Lisp libraries.
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
31 ;;; FILE FORMAT
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
32
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
33 ;; The document type declaration may either be ignored or (optionally)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
34 ;; parsed, but currently the parsing will only accept element
54937
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
35 ;; declarations. The XML file is assumed to be well-formed. In case
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
36 ;; of error, the parsing stops and the XML file is shown where the
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
37 ;; parsing stopped.
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
38 ;;
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
39 ;; It also knows how to ignore comments and processing instructions.
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
40 ;;
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
45 ;; </node1>
54937
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
46 ;; Of course, the name of the nodes and attributes can be anything. There can
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
47 ;; be any number of attributes (or none), as well as any number of children
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
48 ;; below the nodes.
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
49 ;;
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
50 ;; There can be only top level node, but with any number of children below.
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
51
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
52 ;;; LIST FORMAT
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
56 ;;
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
59 ;; child_node_list ::= child_node child_node ...
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
63 ;; | nil
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
64 ;; string ::= "..."
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
65 ;;
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
66 ;; Some macros are provided to ease the parsing of this list.
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
67 ;; Whitespace is preserved. Fixme: There should be a tree-walker that
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
68 ;; can remove it.
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
75 ;;; Code:
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
83
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
84 ;;*******************************************************************
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
85 ;;**
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86 ;;** Macros to parse the list
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
87 ;;**
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88 ;;*******************************************************************
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108 "Return the tag associated with NODE.
54937
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
109 Without namespace-aware parsing, the tag is a symbol.
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
110
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
111 With namespace-aware parsing, the tag is a cons of a string
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
112 representing the uri of the namespace with the local name of the
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
113 tag. For example,
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
114
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
115 <foo>
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
116
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
117 would be represented by
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
118
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
119 '(\"\" . \"foo\")."
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
120
42031
54db4085a7df Use setq rather than (set 'foo bar).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 40030
diff changeset
121 (car node))
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
124 "Return the list of attributes of NODE.
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
129 "Return the list of children of NODE.
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
132
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
133 (defun xml-get-children (node child-name)
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
134 "Return the children of NODE whose tag is CHILD-NAME.
54937
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
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
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
138 (if (and (listp child)
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
139 (equal (xml-node-name child) child-name))
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
144 "Get from NODE the value of ATTRIBUTE.
54937
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
156
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
157 ;;*******************************************************************
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
158 ;;**
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
159 ;;** Creating the list
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
160 ;;**
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
161 ;;*******************************************************************
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
162
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
165 "Parse the well-formed XML file FILE.
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
166 If FILE is already visited, use its buffer and don't kill it.
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
258 ;; Note that this is setup so that we can do whitespace-skipping with
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
259 ;; `(skip-syntax-forward " ")', inter alia. Previously this was slow
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
260 ;; compared with `re-search-forward', but that has been fixed. Also
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
261 ;; note that the standard syntax table contains other characters with
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
262 ;; whitespace syntax, like NBSP, but they are invalid in contexts in
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
263 ;; which we might skip whitespace -- specifically, they're not
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
264 ;; NameChars [XML 4].
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
265
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
266 (defvar xml-syntax-table
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
267 (let ((table (make-syntax-table)))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
268 ;; Get space syntax correct per XML [3].
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
269 (dotimes (c 31)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
272 (modify-syntax-entry c " " table))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
273 ;; For skipping attributes.
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
274 (modify-syntax-entry ?\" "\"" table)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
275 (modify-syntax-entry ?' "\"" table)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
276 ;; Non-alnum name chars should be symbol constituents (`-' and `_'
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
277 ;; are OK by default).
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
278 (modify-syntax-entry ?. "_" table)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
279 (modify-syntax-entry ?: "_" table)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
280 ;; XML [89]
66646
173cd676da78 xml.el fixes
Mark A. Hershberger <mah@everybody.org>
parents: 64794
diff changeset
281 (unless (featurep 'xemacs)
173cd676da78 xml.el fixes
Mark A. Hershberger <mah@everybody.org>
parents: 64794
diff changeset
282 (dolist (c '(#x00B7 #x02D0 #x02D1 #x0387 #x0640 #x0E46 #x0EC6 #x3005
173cd676da78 xml.el fixes
Mark A. Hershberger <mah@everybody.org>
parents: 64794
diff changeset
283 #x3031 #x3032 #x3033 #x3034 #x3035 #x309D #x309E #x30FC
173cd676da78 xml.el fixes
Mark A. Hershberger <mah@everybody.org>
parents: 64794
diff changeset
284 #x30FD #x30FE))
173cd676da78 xml.el fixes
Mark A. Hershberger <mah@everybody.org>
parents: 64794
diff changeset
285 (modify-syntax-entry (decode-char 'ucs c) "w" table)))
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
286 ;; Fixme: rest of [4]
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
287 table)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
288 "Syntax table used by `xml-parse-region'.")
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
289
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
290 ;; XML [5]
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
294
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
295 ;; Fixme: This needs re-writing to deal with the XML grammar properly, i.e.
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
296 ;; document ::= prolog element Misc*
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
297 ;; prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
298
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
301 "Parse the region from BEG to END in BUFFER.
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
302 If BUFFER is nil, it defaults to the current buffer.
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
318 (goto-char (point-min))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
319 (while (not (eobp))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
320 (if (search-forward "<" nil t)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
321 (progn
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
338 (goto-char (point-max))))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
339 (if parse-dtd
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
340 (cons dtd (nreverse xml))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
341 (nreverse xml)))))))
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
344 "Perform any namespace expansion.
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
381 "Parse the tag at point.
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
382 If PARSE-DTD is non-nil, the DTD of the document, if any, is parsed and
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
385 Returns one of:
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
386 - a list : the matching node
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
387 - nil : the point is not looking at a tag.
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
173cd676da78 xml.el fixes
Mark A. Hershberger <mah@everybody.org>
parents: 64794
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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 "&amp;" -> "&" 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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
513 "Return the attribute-list after point.
42293f0612cc Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54936
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
517 (skip-syntax-forward " ")
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
518 (while (looking-at (eval-when-compile
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
526 ;; Do we have a string between quotes (or double-quotes),
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
533
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
534 ;; Each attribute must be unique within a given element
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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 "&amp;" -> "&" 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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
553
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
554 ;;*******************************************************************
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
555 ;;**
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
556 ;;** The DTD (document type declaration)
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
557 ;;** The following functions know how to skip or parse the DTD of
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
558 ;;** a document
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
559 ;;**
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
560 ;;*******************************************************************
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
561
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
562 ;; Fixme: This fails at least if the DTD contains conditional sections.
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
563
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
564 (defun xml-skip-dtd ()
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
565 "Skip the DTD at point.
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
571 "Parse the DTD at point."
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
572 (forward-char (eval-when-compile (length "<!DOCTYPE")))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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 "&amp;" -> "&" 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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
582 (goto-char (match-end 0))
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
583
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
584 (skip-syntax-forward " ")
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
585 ;; XML [75]
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
586 (cond ((looking-at "PUBLIC\\s-+")
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
587 (goto-char (match-end 0))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
588 (unless (or (re-search-forward
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
589 "\\=\"\\([[:space:][:alnum:]-'()+,./:=?;!*#@$_%]*\\)\""
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
590 nil t)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
591 (re-search-forward
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
592 "\\='\\([[:space:][:alnum:]-()+,./:=?;!*#@$_%]*\\)'"
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
597 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
601 ((looking-at "SYSTEM\\s-+")
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
602 (goto-char (match-end 0))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
603 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
607 (skip-syntax-forward " ")
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
608 (if (eq ?> (char-after))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
609 (forward-char)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
612 (forward-char)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
615 (while (not (looking-at "\\s-*\\]"))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
616 (skip-syntax-forward " ")
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
617 (cond
49036
466922eb2b8d (xml-substitute-special): Move "&amp;" -> "&" last.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 48869
diff changeset
618
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
619 ;; Translation of rule [45] of XML specifications
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
620 ((looking-at
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
621 "<!ELEMENT\\s-+\\([[:alnum:].%;]+\\)\\s-+\\([^>]+\\)>")
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
624 type (match-string-no-properties 2))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
625 (setq end-pos (match-end 0))
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
626
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
627 ;; Translation of rule [46] of XML specifications
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
628 (cond
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
629 ((string-match "^EMPTY[ \t\n\r]*$" type) ;; empty declaration
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
630 (setq type 'empty))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
631 ((string-match "^ANY[ \t\n\r]*$" type) ;; any type of contents
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
632 (setq type 'any))
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
635 ((string-match "^%[^;]+;[ \t\n\r]*$" type) ;; substitution
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
636 nil)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
646
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
647 ;; Store the element in the DTD
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
648 (push (list element type) dtd)
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
659 ((looking-at "<!--")
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
720
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
721 (defun xml-parse-elem-type (string)
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
722 "Convert element type STRING into a Lisp structure."
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
723
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
724 (let (elem modifier)
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
725 (if (string-match "(\\([^)]+\\))\\([+*?]?\\)" string)
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
731 (mapcar 'xml-parse-elem-type
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
732 (split-string elem "|"))))
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
735 (mapcar 'xml-parse-elem-type
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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 "&amp;" -> "&" 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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
756 ;;** Substituting special XML sequences
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
757 ;;**
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
758 ;;*******************************************************************
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
759
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
760 (defun xml-substitute-special (string)
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
761 "Return STRING, after subsituting entity references."
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
762 ;; This originally made repeated passes through the string from the
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
763 ;; beginning, which isn't correct, since then either "&amp;amp;" or
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
764 ;; "&#38;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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
828 (defun xml-substitute-numeric-entities (string)
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
829 "Substitute SGML numeric entities by their respective utf characters.
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
830 This function replaces numeric entities in the input STRING and
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
831 returns the modified string. For example \"&#42;\" gets replaced
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
832 by \"*\"."
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
833 (if (and string (stringp string))
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
834 (let ((start 0))
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
835 (while (string-match "&#\\([0-9]+\\);" string start)
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
836 (condition-case nil
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
837 (setq string (replace-match
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
838 (string (read (substring string
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
839 (match-beginning 1)
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
840 (match-end 1))))
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
841 nil nil string))
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
842 (error nil))
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
843 (setq start (1+ (match-beginning 0))))
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
844 string)
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
845 nil))
3b1d7962549d Fixed Bug#5008.
Ulf Jasper <ulf.jasper@web.de>
parents: 100908
diff changeset
846
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
847 ;;*******************************************************************
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
848 ;;**
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
849 ;;** Printing a tree.
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
850 ;;** This function is intended mainly for debugging purposes.
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
851 ;;**
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
852 ;;*******************************************************************
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
877 "Outputs the XML tree in the current buffer.
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
878 The first line is indented with INDENT-STRING."
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
879 (let ((tree xml)
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
880 attlist)
51102
d604b76d3bbd Doc fixes.
Dave Love <fx@gnu.org>
parents: 50210
diff changeset
881 (insert indent-string ?< (symbol-name (xml-node-name tree)))
49036
466922eb2b8d (xml-substitute-special): Move "&amp;" -> "&" last.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 48869
diff changeset
882
30329
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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 "&amp;" -> "&" 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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
911
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
912 (provide 'xml)
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1ea701655cf8 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
915 ;;; xml.el ends here