| CODENOTIFIER | HelpYou are not signed inSign in |
Project: Trac
Revision: 7458
Author: jonas
Date: 13 Aug 2008 17:17:53
Diff at Trac: http://trac.edgewall.org/changeset/7458
Changes:0.11-stable: Added XHTML outout validation, closes #7445. Thanks Remy.
Files:| ... | ...@@ -35,7 +35,7 @@ | |
| 35 | 35 | xmlns:xi="http://www.w3.org/2001/XInclude" |
| 36 | 36 | class="diff"> |
| 37 | 37 | |
| 38 | <ul class="entries"> | |
| 38 | <ul py:if="any(item.diffs or item.props for item in changes)" class="entries"> | |
| 39 | 39 | <py:for each="idx, item in enumerate(changes)"> |
| 40 | 40 | <li py:if="item.diffs or item.props" class="entry" py:with="comments = item.get('comments')"> |
| 41 | 41 | <h2 id="${not no_id and 'file%s' % idx or None}" py:choose=""> |
| ... | ...@@ -5,12 +5,20 @@ | |
| 5 | 5 | """ |
| 6 | 6 | |
| 7 | 7 | import os |
| 8 | from os.path import abspath, dirname, join | |
| 8 | 9 | import sys |
| 9 | 10 | try: |
| 10 | 11 | from cStringIO import StringIO |
| 11 | 12 | except ImportError: |
| 12 | 13 | from StringIO import StringIO |
| 13 | 14 | |
| 15 | # On OSX lxml needs to be imported before twill to avoid Resolver issues | |
| 16 | # somehow caused by the mac specific 'ic' module | |
| 17 | try: | |
| 18 | from lxml import etree | |
| 19 | except ImportError: | |
| 20 | pass | |
| 21 | ||
| 14 | 22 | try: |
| 15 | 23 | import twill |
| 16 | 24 | except ImportError: |
| ... | ...@@ -38,6 +46,48 @@ | |
| 38 | 46 | tc = twill.commands |
| 39 | 47 | b = twill.get_browser() |
| 40 | 48 | |
| 49 | # Setup XHTML validation for all retrieved pages | |
| 50 | try: | |
| 51 | from lxml import etree | |
| 52 | except ImportError: | |
| 53 | print "SKIP: validation of XHTML output in functional tests " \ | |
| 54 | "(no lxml installed)" | |
| 55 | else: | |
| 56 | class _Resolver(etree.Resolver): | |
| 57 | base_dir = dirname(abspath(__file__)) | |
| 58 | ||
| 59 | def resolve(self, system_url, public_id, context): | |
| 60 | return self.resolve_filename(join(self.base_dir, | |
| 61 | system_url.split("/")[-1]), | |
| 62 | context) | |
| 63 | ||
| 64 | _parser = etree.XMLParser(dtd_validation=True) | |
| 65 | _parser.resolvers.add(_Resolver()) | |
| 66 | etree.set_default_parser(_parser) | |
| 67 | ||
| 68 | def _format_error_log(data, log): | |
| 69 | msg = [] | |
| 70 | for each in log: | |
| 71 | context = data.splitlines()[max(0, each.line - 5): | |
| 72 | each.line + 6] | |
| 73 | msg.append("%s\n\nURL: %s\nLine %d, column %d\n\n%s" % ( | |
| 74 | each.message, each.filename, each.line, each.column, | |
| 75 | "\n".join(context))) | |
| 76 | return "\n".join(msg) | |
| 77 | ||
| 78 | def _validate_xhtml(func_name, *args, **kwargs): | |
| 79 | page = b.get_html() | |
| 80 | if "xhtml1-strict.dtd" not in page: | |
| 81 | return | |
| 82 | etree.clear_error_log() | |
| 83 | try: | |
| 84 | doc = etree.parse(StringIO(page), base_url=b.get_url()) | |
| 85 | except etree.XMLSyntaxError, e: | |
| 86 | raise twill.errors.TwillAssertionError( | |
| 87 | _format_error_log(page, e.error_log)) | |
| 88 | ||
| 89 | b._post_load_hooks.append(_validate_xhtml) | |
| 90 | ||
| 41 | 91 | # When we can't find something we expected, or find something we didn't |
| 42 | 92 | # expect, it helps the debugging effort to have a copy of the html to |
| 43 | 93 | # analyze. |
| ... | ...@@ -0,0 +1,978 @@ | |
| 1 | <!-- | |
| 2 | Extensible HTML version 1.0 Strict DTD | |
| 3 | ||
| 4 | This is the same as HTML 4 Strict except for | |
| 5 | changes due to the differences between XML and SGML. | |
| 6 | ||
| 7 | Namespace = http://www.w3.org/1999/xhtml | |
| 8 | ||
| 9 | For further information, see: http://www.w3.org/TR/xhtml1 | |
| 10 | ||
| 11 | Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio), | |
| 12 | All Rights Reserved. | |
| 13 | ||
| 14 | This DTD module is identified by the PUBLIC and SYSTEM identifiers: | |
| 15 | ||
| 16 | PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |
| 17 | SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" | |
| 18 | ||
| 19 | $Revision: 1.1 $ | |
| 20 | $Date: 2002/08/01 13:56:03 $ | |
| 21 | ||
| 22 | --> | |
| 23 | ||
| 24 | <!--================ Character mnemonic entities =========================--> | |
| 25 | ||
| 26 | <!ENTITY % HTMLlat1 PUBLIC | |
| 27 | "-//W3C//ENTITIES Latin 1 for XHTML//EN" | |
| 28 | "xhtml-lat1.ent"> | |
| 29 | %HTMLlat1; | |
| 30 | ||
| 31 | <!ENTITY % HTMLsymbol PUBLIC | |
| 32 | "-//W3C//ENTITIES Symbols for XHTML//EN" | |
| 33 | "xhtml-symbol.ent"> | |
| 34 | %HTMLsymbol; | |
| 35 | ||
| 36 | <!ENTITY % HTMLspecial PUBLIC | |
| 37 | "-//W3C//ENTITIES Special for XHTML//EN" | |
| 38 | "xhtml-special.ent"> | |
| 39 | %HTMLspecial; | |
| 40 | ||
| 41 | <!--================== Imported Names ====================================--> | |
| 42 | ||
| 43 | <!ENTITY % ContentType "CDATA"> | |
| 44 | <!-- media type, as per [RFC2045] --> | |
| 45 | ||
| 46 | <!ENTITY % ContentTypes "CDATA"> | |
| 47 | <!-- comma-separated list of media types, as per [RFC2045] --> | |
| 48 | ||
| 49 | <!ENTITY % Charset "CDATA"> | |
| 50 | <!-- a character encoding, as per [RFC2045] --> | |
| 51 | ||
| 52 | <!ENTITY % Charsets "CDATA"> | |
| 53 | <!-- a space separated list of character encodings, as per [RFC2045] --> | |
| 54 | ||
| 55 | <!ENTITY % LanguageCode "NMTOKEN"> | |
| 56 | <!-- a language code, as per [RFC3066] --> | |
| 57 | ||
| 58 | <!ENTITY % Character "CDATA"> | |
| 59 | <!-- a single character, as per section 2.2 of [XML] --> | |
| 60 | ||
| 61 | <!ENTITY % Number "CDATA"> | |
| 62 | <!-- one or more digits --> | |
| 63 | ||
| 64 | <!ENTITY % LinkTypes "CDATA"> | |
| 65 | <!-- space-separated list of link types --> | |
| 66 | ||
| 67 | <!ENTITY % MediaDesc "CDATA"> | |
| 68 | <!-- single or comma-separated list of media descriptors --> | |
| 69 | ||
| 70 | <!ENTITY % URI "CDATA"> | |
| 71 | <!-- a Uniform Resource Identifier, see [RFC2396] --> | |
| 72 | ||
| 73 | <!ENTITY % UriList "CDATA"> | |
| 74 | <!-- a space separated list of Uniform Resource Identifiers --> | |
| 75 | ||
| 76 | <!ENTITY % Datetime "CDATA"> | |
| 77 | <!-- date and time information. ISO date format --> | |
| 78 | ||
| 79 | <!ENTITY % Script "CDATA"> | |
| 80 | <!-- script expression --> | |
| 81 | ||
| 82 | <!ENTITY % StyleSheet "CDATA"> | |
| 83 | <!-- style sheet data --> | |
| 84 | ||
| 85 | <!ENTITY % Text "CDATA"> | |
| 86 | <!-- used for titles etc. --> | |
| 87 | ||
| 88 | <!ENTITY % Length "CDATA"> | |
| 89 | <!-- nn for pixels or nn% for percentage length --> | |
| 90 | ||
| 91 | <!ENTITY % MultiLength "CDATA"> | |
| 92 | <!-- pixel, percentage, or relative --> | |
| 93 | ||
| 94 | <!ENTITY % Pixels "CDATA"> | |
| 95 | <!-- integer representing length in pixels --> | |
| 96 | ||
| 97 | <!-- these are used for image maps --> | |
| 98 | ||
| 99 | <!ENTITY % Shape "(rect|circle|poly|default)"> | |
| 100 | ||
| 101 | <!ENTITY % Coords "CDATA"> | |
| 102 | <!-- comma separated list of lengths --> | |
| 103 | ||
| 104 | <!--=================== Generic Attributes ===============================--> | |
| 105 | ||
| 106 | <!-- core attributes common to most elements | |
| 107 | id document-wide unique id | |
| 108 | class space separated list of classes | |
| 109 | style associated style info | |
| 110 | title advisory title/amplification | |
| 111 | --> | |
| 112 | <!ENTITY % coreattrs | |
| 113 | "id ID #IMPLIED | |
| 114 | class CDATA #IMPLIED | |
| 115 | style %StyleSheet; #IMPLIED | |
| 116 | title %Text; #IMPLIED" | |
| 117 | > | |
| 118 | ||
| 119 | <!-- internationalization attributes | |
| 120 | lang language code (backwards compatible) | |
| 121 | xml:lang language code (as per XML 1.0 spec) | |
| 122 | dir direction for weak/neutral text | |
| 123 | --> | |
| 124 | <!ENTITY % i18n | |
| 125 | "lang %LanguageCode; #IMPLIED | |
| 126 | xml:lang %LanguageCode; #IMPLIED | |
| 127 | dir (ltr|rtl) #IMPLIED" | |
| 128 | > | |
| 129 | ||
| 130 | <!-- attributes for common UI events | |
| 131 | onclick a pointer button was clicked | |
| 132 | ondblclick a pointer button was double clicked | |
| 133 | onmousedown a pointer button was pressed down | |
| 134 | onmouseup a pointer button was released | |
| 135 | onmousemove a pointer was moved onto the element | |
| 136 | onmouseout a pointer was moved away from the element | |
| 137 | onkeypress a key was pressed and released | |
| 138 | onkeydown a key was pressed down | |
| 139 | onkeyup a key was released | |
| 140 | --> | |
| 141 | <!ENTITY % events | |
| 142 | "onclick %Script; #IMPLIED | |
| 143 | ondblclick %Script; #IMPLIED | |
| 144 | onmousedown %Script; #IMPLIED | |
| 145 | onmouseup %Script; #IMPLIED | |
| 146 | onmouseover %Script; #IMPLIED | |
| 147 | onmousemove %Script; #IMPLIED | |
| 148 | onmouseout %Script; #IMPLIED | |
| 149 | onkeypress %Script; #IMPLIED | |
| 150 | onkeydown %Script; #IMPLIED | |
| 151 | onkeyup %Script; #IMPLIED" | |
| 152 | > | |
| 153 | ||
| 154 | <!-- attributes for elements that can get the focus | |
| 155 | accesskey accessibility key character | |
| 156 | tabindex position in tabbing order | |
| 157 | onfocus the element got the focus | |
| 158 | onblur the element lost the focus | |
| 159 | --> | |
| 160 | <!ENTITY % focus | |
| 161 | "accesskey %Character; #IMPLIED | |
| 162 | tabindex %Number; #IMPLIED | |
| 163 | onfocus %Script; #IMPLIED | |
| 164 | onblur %Script; #IMPLIED" | |
| 165 | > | |
| 166 | ||
| 167 | <!ENTITY % attrs "%coreattrs; %i18n; %events;"> | |
| 168 | ||
| 169 | <!--=================== Text Elements ====================================--> | |
| 170 | ||
| 171 | <!ENTITY % special.pre | |
| 172 | "br | span | bdo | map"> | |
| 173 | ||
| 174 | ||
| 175 | <!ENTITY % special | |
| 176 | "%special.pre; | object | img "> | |
| 177 | ||
| 178 | <!ENTITY % fontstyle "tt | i | b | big | small "> | |
| 179 | ||
| 180 | <!ENTITY % phrase "em | strong | dfn | code | q | | |
| 181 | samp | kbd | var | cite | abbr | acronym | sub | sup "> | |
| 182 | ||
| 183 | <!ENTITY % inline.forms "input | select | textarea | label | button"> | |
| 184 | ||
| 185 | <!-- these can occur at block or inline level --> | |
| 186 | <!ENTITY % misc.inline "ins | del | script"> | |
| 187 | ||
| 188 | <!-- these can only occur at block level --> | |
| 189 | <!ENTITY % misc "noscript | %misc.inline;"> | |
| 190 | ||
| 191 | <!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;"> | |
| 192 | ||
| 193 | <!-- %Inline; covers inline or "text-level" elements --> | |
| 194 | <!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*"> | |
| 195 | ||
| 196 | <!--================== Block level elements ==============================--> | |
| 197 | ||
| 198 | <!ENTITY % heading "h1|h2|h3|h4|h5|h6"> | |
| 199 | <!ENTITY % lists "ul | ol | dl"> | |
| 200 | <!ENTITY % blocktext "pre | hr | blockquote | address"> | |
| 201 | ||
| 202 | <!ENTITY % block | |
| 203 | "p | %heading; | div | %lists; | %blocktext; | fieldset | table"> | |
| 204 | ||
| 205 | <!ENTITY % Block "(%block; | form | %misc;)*"> | |
| 206 | ||
| 207 | <!-- %Flow; mixes block and inline and is used for list items etc. --> | |
| 208 | <!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*"> | |
| 209 | ||
| 210 | <!--================== Content models for exclusions =====================--> | |
| 211 | ||
| 212 | <!-- a elements use %Inline; excluding a --> | |
| 213 | ||
| 214 | <!ENTITY % a.content | |
| 215 | "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc.inline;)*"> | |
| 216 | ||
| 217 | <!-- pre uses %Inline excluding big, small, sup or sup --> | |
| 218 | ||
| 219 | <!ENTITY % pre.content | |
| 220 | "(#PCDATA | a | %fontstyle; | %phrase; | %special.pre; | %misc.inline; | |
| 221 | | %inline.forms;)*"> | |
| 222 | ||
| 223 | <!-- form uses %Block; excluding form --> | |
| 224 | ||
| 225 | <!ENTITY % form.content "(%block; | %misc;)*"> | |
| 226 | ||
| 227 | <!-- button uses %Flow; but excludes a, form and form controls --> | |
| 228 | ||
| 229 | <!ENTITY % button.content | |
| 230 | "(#PCDATA | p | %heading; | div | %lists; | %blocktext; | | |
| 231 | table | %special; | %fontstyle; | %phrase; | %misc;)*"> | |
| 232 | ||
| 233 | <!--================ Document Structure ==================================--> | |
| 234 | ||
| 235 | <!-- the namespace URI designates the document profile --> | |
| 236 | ||
| 237 | <!ELEMENT html (head, body)> | |
| 238 | <!ATTLIST html | |
| 239 | %i18n; | |
| 240 | id ID #IMPLIED | |
| 241 | xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml' | |
| 242 | > | |
| 243 | ||
| 244 | <!--================ Document Head =======================================--> | |
| 245 | ||
| 246 | <!ENTITY % head.misc "(script|style|meta|link|object)*"> | |
| 247 | ||
| 248 | <!-- content model is %head.misc; combined with a single | |
| 249 | title and an optional base element in any order --> | |
| 250 | ||
| 251 | <!ELEMENT head (%head.misc;, | |
| 252 | ((title, %head.misc;, (base, %head.misc;)?) | | |
| 253 | (base, %head.misc;, (title, %head.misc;))))> | |
| 254 | ||
| 255 | <!ATTLIST head | |
| 256 | %i18n; | |
| 257 | id ID #IMPLIED | |
| 258 | profile %URI; #IMPLIED | |
| 259 | > | |
| 260 | ||
| 261 | <!-- The title element is not considered part of the flow of text. | |
| 262 | It should be displayed, for example as the page header or | |
| 263 | window title. Exactly one title is required per document. | |
| 264 | --> | |
| 265 | <!ELEMENT title (#PCDATA)> | |
| 266 | <!ATTLIST title | |
| 267 | %i18n; | |
| 268 | id ID #IMPLIED | |
| 269 | > | |
| 270 | ||
| 271 | <!-- document base URI --> | |
| 272 | ||
| 273 | <!ELEMENT base EMPTY> | |
| 274 | <!ATTLIST base | |
| 275 | href %URI; #REQUIRED | |
| 276 | id ID #IMPLIED | |
| 277 | > | |
| 278 | ||
| 279 | <!-- generic metainformation --> | |
| 280 | <!ELEMENT meta EMPTY> | |
| 281 | <!ATTLIST meta | |
| 282 | %i18n; | |
| 283 | id ID #IMPLIED | |
| 284 | http-equiv CDATA #IMPLIED | |
| 285 | name CDATA #IMPLIED | |
| 286 | content CDATA #REQUIRED | |
| 287 | scheme CDATA #IMPLIED | |
| 288 | > | |
| 289 | ||
| 290 | <!-- | |
| 291 | Relationship values can be used in principle: | |
| 292 | ||
| 293 | a) for document specific toolbars/menus when used | |
| 294 | with the link element in document head e.g. | |
| 295 | start, contents, previous, next, index, end, help | |
| 296 | b) to link to a separate style sheet (rel="stylesheet") | |
| 297 | c) to make a link to a script (rel="script") | |
| 298 | d) by stylesheets to control how collections of | |
| 299 | html nodes are rendered into printed documents | |
| 300 | e) to make a link to a printable version of this document | |
| 301 | e.g. a PostScript or PDF version (rel="alternate" media="print") | |
| 302 | --> | |
| 303 | ||
| 304 | <!ELEMENT link EMPTY> | |
| 305 | <!ATTLIST link | |
| 306 | %attrs; | |
| 307 | charset %Charset; #IMPLIED | |
| 308 | href %URI; #IMPLIED | |
| 309 | hreflang %LanguageCode; #IMPLIED | |
| 310 | type %ContentType; #IMPLIED | |
| 311 | rel %LinkTypes; #IMPLIED | |
| 312 | rev %LinkTypes; #IMPLIED | |
| 313 | media %MediaDesc; #IMPLIED | |
| 314 | > | |
| 315 | ||
| 316 | <!-- style info, which may include CDATA sections --> | |
| 317 | <!ELEMENT style (#PCDATA)> | |
| 318 | <!ATTLIST style | |
| 319 | %i18n; | |
| 320 | id ID #IMPLIED | |
| 321 | type %ContentType; #REQUIRED | |
| 322 | media %MediaDesc; #IMPLIED | |
| 323 | title %Text; #IMPLIED | |
| 324 | xml:space (preserve) #FIXED 'preserve' | |
| 325 | > | |
| 326 | ||
| 327 | <!-- script statements, which may include CDATA sections --> | |
| 328 | <!ELEMENT script (#PCDATA)> | |
| 329 | <!ATTLIST script | |
| 330 | id ID #IMPLIED | |
| 331 | charset %Charset; #IMPLIED | |
| 332 | type %ContentType; #REQUIRED | |
| 333 | src %URI; #IMPLIED | |
| 334 | defer (defer) #IMPLIED | |
| 335 | xml:space (preserve) #FIXED 'preserve' | |
| 336 | > | |
| 337 | ||
| 338 | <!-- alternate content container for non script-based rendering --> | |
| 339 | ||
| 340 | <!ELEMENT noscript %Block;> | |
| 341 | <!ATTLIST noscript | |
| 342 | %attrs; | |
| 343 | > | |
| 344 | ||
| 345 | <!--=================== Document Body ====================================--> | |
| 346 | ||
| 347 | <!ELEMENT body %Block;> | |
| 348 | <!ATTLIST body | |
| 349 | %attrs; | |
| 350 | onload %Script; #IMPLIED | |
| 351 | onunload %Script; #IMPLIED | |
| 352 | > | |
| 353 | ||
| 354 | <!ELEMENT div %Flow;> <!-- generic language/style container --> | |
| 355 | <!ATTLIST div | |
| 356 | %attrs; | |
| 357 | > | |
| 358 | ||
| 359 | <!--=================== Paragraphs =======================================--> | |
| 360 | ||
| 361 | <!ELEMENT p %Inline;> | |
| 362 | <!ATTLIST p | |
| 363 | %attrs; | |
| 364 | > | |
| 365 | ||
| 366 | <!--=================== Headings =========================================--> | |
| 367 | ||
| 368 | <!-- | |
| 369 | There are six levels of headings from h1 (the most important) | |
| 370 | to h6 (the least important). | |
| 371 | --> | |
| 372 | ||
| 373 | <!ELEMENT h1 %Inline;> | |
| 374 | <!ATTLIST h1 | |
| 375 | %attrs; | |
| 376 | > | |
| 377 | ||
| 378 | <!ELEMENT h2 %Inline;> | |
| 379 | <!ATTLIST h2 | |
| 380 | %attrs; | |
| 381 | > | |
| 382 | ||
| 383 | <!ELEMENT h3 %Inline;> | |
| 384 | <!ATTLIST h3 | |
| 385 | %attrs; | |
| 386 | > | |
| 387 | ||
| 388 | <!ELEMENT h4 %Inline;> | |
| 389 | <!ATTLIST h4 | |
| 390 | %attrs; | |
| 391 | > | |
| 392 | ||
| 393 | <!ELEMENT h5 %Inline;> | |
| 394 | <!ATTLIST h5 | |
| 395 | %attrs; | |
| 396 | > | |
| 397 | ||
| 398 | <!ELEMENT h6 %Inline;> | |
| 399 | <!ATTLIST h6 | |
| 400 | %attrs; | |
| 401 | > | |
| 402 | ||
| 403 | <!--=================== Lists ============================================--> | |
| 404 | ||
| 405 | <!-- Unordered list --> | |
| 406 | ||
| 407 | <!ELEMENT ul (li)+> | |
| 408 | <!ATTLIST ul | |
| 409 | %attrs; | |
| 410 | > | |
| 411 | ||
| 412 | <!-- Ordered (numbered) list --> | |
| 413 | ||
| 414 | <!ELEMENT ol (li)+> | |
| 415 | <!ATTLIST ol | |
| 416 | %attrs; | |
| 417 | > | |
| 418 | ||
| 419 | <!-- list item --> | |
| 420 | ||
| 421 | <!ELEMENT li %Flow;> | |
| 422 | <!ATTLIST li | |
| 423 | %attrs; | |
| 424 | > | |
| 425 | ||
| 426 | <!-- definition lists - dt for term, dd for its definition --> | |
| 427 | ||
| 428 | <!ELEMENT dl (dt|dd)+> | |
| 429 | <!ATTLIST dl | |
| 430 | %attrs; | |
| 431 | > | |
| 432 | ||
| 433 | <!ELEMENT dt %Inline;> | |
| 434 | <!ATTLIST dt | |
| 435 | %attrs; | |
| 436 | > | |
| 437 | ||
| 438 | <!ELEMENT dd %Flow;> | |
| 439 | <!ATTLIST dd | |
| 440 | %attrs; | |
| 441 | > | |
| 442 | ||
| 443 | <!--=================== Address ==========================================--> | |
| 444 | ||
| 445 | <!-- information on author --> | |
| 446 | ||
| 447 | <!ELEMENT address %Inline;> | |
| 448 | <!ATTLIST address | |
| 449 | %attrs; | |
| 450 | > | |
| 451 | ||
| 452 | <!--=================== Horizontal Rule ==================================--> | |
| 453 | ||
| 454 | <!ELEMENT hr EMPTY> | |
| 455 | <!ATTLIST hr | |
| 456 | %attrs; | |
| 457 | > | |
| 458 | ||
| 459 | <!--=================== Preformatted Text ================================--> | |
| 460 | ||
| 461 | <!-- content is %Inline; excluding "img|object|big|small|sub|sup" --> | |
| 462 | ||
| 463 | <!ELEMENT pre %pre.content;> | |
| 464 | <!ATTLIST pre | |
| 465 | %attrs; | |
| 466 | xml:space (preserve) #FIXED 'preserve' | |
| 467 | > | |
| 468 | ||
| 469 | <!--=================== Block-like Quotes ================================--> | |
| 470 | ||
| 471 | <!ELEMENT blockquote %Block;> | |
| 472 | <!ATTLIST blockquote | |
| 473 | %attrs; | |
| 474 | cite %URI; #IMPLIED | |
| 475 | > | |
| 476 | ||
| 477 | <!--=================== Inserted/Deleted Text ============================--> | |
| 478 | ||
| 479 | <!-- | |
| 480 | ins/del are allowed in block and inline content, but its | |
| 481 | inappropriate to include block content within an ins element | |
| 482 | occurring in inline content. | |
| 483 | --> | |
| 484 | <!ELEMENT ins %Flow;> | |
| 485 | <!ATTLIST ins | |
| 486 | %attrs; | |
| 487 | cite %URI; #IMPLIED | |
| 488 | datetime %Datetime; #IMPLIED | |
| 489 | > | |
| 490 | ||
| 491 | <!ELEMENT del %Flow;> | |
| 492 | <!ATTLIST del | |
| 493 | %attrs; | |
| 494 | cite %URI; #IMPLIED | |
| 495 | datetime %Datetime; #IMPLIED | |
| 496 | > | |
| 497 | ||
| 498 | <!--================== The Anchor Element ================================--> | |
| 499 | ||
| 500 | <!-- content is %Inline; except that anchors shouldn't be nested --> | |
| 501 | ||
| 502 | <!ELEMENT a %a.content;> | |
| 503 | <!ATTLIST a | |
| 504 | %attrs; | |
| 505 | %focus; | |
| 506 | charset %Charset; #IMPLIED | |
| 507 | type %ContentType; #IMPLIED | |
| 508 | name NMTOKEN #IMPLIED | |
| 509 | href %URI; #IMPLIED | |
| 510 | hreflang %LanguageCode; #IMPLIED | |
| 511 | rel %LinkTypes; #IMPLIED | |
| 512 | rev %LinkTypes; #IMPLIED | |
| 513 | shape %Shape; "rect" | |
| 514 | coords %Coords; #IMPLIED | |
| 515 | > | |
| 516 | ||
| 517 | <!--===================== Inline Elements ================================--> | |
| 518 | ||
| 519 | <!ELEMENT span %Inline;> <!-- generic language/style container --> | |
| 520 | <!ATTLIST span | |
| 521 | %attrs; | |
| 522 | > | |
| 523 | ||
| 524 | <!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride --> | |
| 525 | <!ATTLIST bdo | |
| 526 | %coreattrs; | |
| 527 | %events; | |
| 528 | lang %LanguageCode; #IMPLIED | |
| 529 | xml:lang %LanguageCode; #IMPLIED | |
| 530 | dir (ltr|rtl) #REQUIRED | |
| 531 | > | |
| 532 | ||
| 533 | <!ELEMENT br EMPTY> <!-- forced line break --> | |
| 534 | <!ATTLIST br | |
| 535 | %coreattrs; | |
| 536 | > | |
| 537 | ||
| 538 | <!ELEMENT em %Inline;> <!-- emphasis --> | |
| 539 | <!ATTLIST em %attrs;> | |
| 540 | ||
| 541 | <!ELEMENT strong %Inline;> <!-- strong emphasis --> | |
| 542 | <!ATTLIST strong %attrs;> | |
| 543 | ||
| 544 | <!ELEMENT dfn %Inline;> <!-- definitional --> | |
| 545 | <!ATTLIST dfn %attrs;> | |
| 546 | ||
| 547 | <!ELEMENT code %Inline;> <!-- program code --> | |
| 548 | <!ATTLIST code %attrs;> | |
| 549 | ||
| 550 | <!ELEMENT samp %Inline;> <!-- sample --> | |
| 551 | <!ATTLIST samp %attrs;> | |
| 552 | ||
| 553 | <!ELEMENT kbd %Inline;> <!-- something user would type --> | |
| 554 | <!ATTLIST kbd %attrs;> | |
| 555 | ||
| 556 | <!ELEMENT var %Inline;> <!-- variable --> | |
| 557 | <!ATTLIST var %attrs;> | |
| 558 | ||
| 559 | <!ELEMENT cite %Inline;> <!-- citation --> | |
| 560 | <!ATTLIST cite %attrs;> | |
| 561 | ||
| 562 | <!ELEMENT abbr %Inline;> <!-- abbreviation --> | |
| 563 | <!ATTLIST abbr %attrs;> | |
| 564 | ||
| 565 | <!ELEMENT acronym %Inline;> <!-- acronym --> | |
| 566 | <!ATTLIST acronym %attrs;> | |
| 567 | ||
| 568 | <!ELEMENT q %Inline;> <!-- inlined quote --> | |
| 569 | <!ATTLIST q | |
| 570 | %attrs; | |
| 571 | cite %URI; #IMPLIED | |
| 572 | > | |
| 573 | ||
| 574 | <!ELEMENT sub %Inline;> <!-- subscript --> | |
| 575 | <!ATTLIST sub %attrs;> | |
| 576 | ||
| 577 | <!ELEMENT sup %Inline;> <!-- superscript --> | |
| 578 | <!ATTLIST sup %attrs;> | |
| 579 | ||
| 580 | <!ELEMENT tt %Inline;> <!-- fixed pitch font --> | |
| 581 | <!ATTLIST tt %attrs;> | |
| 582 | ||
| 583 | <!ELEMENT i %Inline;> <!-- italic font --> | |
| 584 | <!ATTLIST i %attrs;> | |
| 585 | ||
| 586 | <!ELEMENT b %Inline;> <!-- bold font --> | |
| 587 | <!ATTLIST b %attrs;> | |
| 588 | ||
| 589 | <!ELEMENT big %Inline;> <!-- bigger font --> | |
| 590 | <!ATTLIST big %attrs;> | |
| 591 | ||
| 592 | <!ELEMENT small %Inline;> <!-- smaller font --> | |
| 593 | <!ATTLIST small %attrs;> | |
| 594 | ||
| 595 | <!--==================== Object ======================================--> | |
| 596 | <!-- | |
| 597 | object is used to embed objects as part of HTML pages. | |
| 598 | param elements should precede other content. Parameters | |
| 599 | can also be expressed as attribute/value pairs on the | |
| 600 | object element itself when brevity is desired. | |
| 601 | --> | |
| 602 | ||
| 603 | <!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*> | |
| 604 | <!ATTLIST object | |
| 605 | %attrs; | |
| 606 | declare (declare) #IMPLIED | |
| 607 | classid %URI; #IMPLIED | |
| 608 | codebase %URI; #IMPLIED | |
| 609 | data %URI; #IMPLIED | |
| 610 | type %ContentType; #IMPLIED | |
| 611 | codetype %ContentType; #IMPLIED | |
| 612 | archive %UriList; #IMPLIED | |
| 613 | standby %Text; #IMPLIED | |
| 614 | height %Length; #IMPLIED | |
| 615 | width %Length; #IMPLIED | |
| 616 | usemap %URI; #IMPLIED | |
| 617 | name NMTOKEN #IMPLIED | |
| 618 | tabindex %Number; #IMPLIED | |
| 619 | > | |
| 620 | ||
| 621 | <!-- | |
| 622 | param is used to supply a named property value. | |
| 623 | In XML it would seem natural to follow RDF and support an | |
| 624 | abbreviated syntax where the param elements are replaced | |
| 625 | by attribute value pairs on the object start tag. | |
| 626 | --> | |
| 627 | <!ELEMENT param EMPTY> | |
| 628 | <!ATTLIST param | |
| 629 | id ID #IMPLIED | |
| 630 | name CDATA #IMPLIED | |
| 631 | value CDATA #IMPLIED | |
| 632 | valuetype (data|ref|object) "data" | |
| 633 | type %ContentType; #IMPLIED | |
| 634 | > | |
| 635 | ||
| 636 | <!--=================== Images ===========================================--> | |
| 637 | ||
| 638 | <!-- | |
| 639 | To avoid accessibility problems for people who aren't | |
| 640 | able to see the image, you should provide a text | |
| 641 | description using the alt and longdesc attributes. | |
| 642 | In addition, avoid the use of server-side image maps. | |
| 643 | Note that in this DTD there is no name attribute. That | |
| 644 | is only available in the transitional and frameset DTD. | |
| 645 | --> | |
| 646 | ||
| 647 | <!ELEMENT img EMPTY> | |
| 648 | <!ATTLIST img | |
| 649 | %attrs; | |
| 650 | src %URI; #REQUIRED | |
| 651 | alt %Text; #REQUIRED | |
| 652 | longdesc %URI; #IMPLIED | |
| 653 | height %Length; #IMPLIED | |
| 654 | width %Length; #IMPLIED | |
| 655 | usemap %URI; #IMPLIED | |
| 656 | ismap (ismap) #IMPLIED | |
| 657 | > | |
| 658 | ||
| 659 | <!-- usemap points to a map element which may be in this document | |
| 660 | or an external document, although the latter is not widely supported --> | |
| 661 | ||
| 662 | <!--================== Client-side image maps ============================--> | |
| 663 | ||
| 664 | <!-- These can be placed in the same document or grouped in a | |
| 665 | separate document although this isn't yet widely supported --> | |
| 666 | ||
| 667 | <!ELEMENT map ((%block; | form | %misc;)+ | area+)> | |
| 668 | <!ATTLIST map | |
| 669 | %i18n; | |
| 670 | %events; | |
| 671 | id ID #REQUIRED | |
| 672 | class CDATA #IMPLIED | |
| 673 | style %StyleSheet; #IMPLIED | |
| 674 | title %Text; #IMPLIED | |
| 675 | name NMTOKEN #IMPLIED | |
| 676 | > | |
| 677 | ||
| 678 | <!ELEMENT area EMPTY> | |
| 679 | <!ATTLIST area | |
| 680 | %attrs; | |
| 681 | %focus; | |
| 682 | shape %Shape; "rect" | |
| 683 | coords %Coords; #IMPLIED | |
| 684 | href %URI; #IMPLIED | |
| 685 | nohref (nohref) #IMPLIED | |
| 686 | alt %Text; #REQUIRED | |
| 687 | > | |
| 688 | ||
| 689 | <!--================ Forms ===============================================--> | |
| 690 | <!ELEMENT form %form.content;> <!-- forms shouldn't be nested --> | |
| 691 | ||
| 692 | <!ATTLIST form | |
| 693 | %attrs; | |
| 694 | action %URI; #REQUIRED | |
| 695 | method (get|post) "get" | |
| 696 | enctype %ContentType; "application/x-www-form-urlencoded" | |
| 697 | onsubmit %Script; #IMPLIED | |
| 698 | onreset %Script; #IMPLIED | |
| 699 | accept %ContentTypes; #IMPLIED | |
| 700 | accept-charset %Charsets; #IMPLIED | |
| 701 | > | |
| 702 | ||
| 703 | <!-- | |
| 704 | Each label must not contain more than ONE field | |
| 705 | Label elements shouldn't be nested. | |
| 706 | --> | |
| 707 | <!ELEMENT label %Inline;> | |
| 708 | <!ATTLIST label | |
| 709 | %attrs; | |
| 710 | for IDREF #IMPLIED | |
| 711 | accesskey %Character; #IMPLIED | |
| 712 | onfocus %Script; #IMPLIED | |
| 713 | onblur %Script; #IMPLIED | |
| 714 | > | |
| 715 | ||
| 716 | <!ENTITY % InputType | |
| 717 | "(text | password | checkbox | | |
| 718 | radio | submit | reset | | |
| 719 | file | hidden | image | button)" | |
| 720 | > | |
| 721 | ||
| 722 | <!-- the name attribute is required for all but submit & reset --> | |
| 723 | ||
| 724 | <!ELEMENT input EMPTY> <!-- form control --> | |
| 725 | <!ATTLIST input | |
| 726 | %attrs; | |
| 727 | %focus; | |
| 728 | type %InputType; "text" | |
| 729 | name CDATA #IMPLIED | |
| 730 | value CDATA #IMPLIED | |
| 731 | checked (checked) #IMPLIED | |
| 732 | disabled (disabled) #IMPLIED | |
| 733 | readonly (readonly) #IMPLIED | |
| 734 | size CDATA #IMPLIED | |
| 735 | maxlength %Number; #IMPLIED | |
| 736 | src %URI; #IMPLIED | |
| 737 | alt CDATA #IMPLIED | |
| 738 | usemap %URI; #IMPLIED | |
| 739 | onselect %Script; #IMPLIED | |
| 740 | onchange %Script; #IMPLIED | |
| 741 | accept %ContentTypes; #IMPLIED | |
| 742 | > | |
| 743 | ||
| 744 | <!ELEMENT select (optgroup|option)+> <!-- option selector --> | |
| 745 | <!ATTLIST select | |
| 746 | %attrs; | |
| 747 | name CDATA #IMPLIED | |
| 748 | size %Number; #IMPLIED | |
| 749 | multiple (multiple) #IMPLIED | |
| 750 | disabled (disabled) #IMPLIED | |
| 751 | tabindex %Number; #IMPLIED | |
| 752 | onfocus %Script; #IMPLIED | |
| 753 | onblur %Script; #IMPLIED | |
| 754 | onchange %Script; #IMPLIED | |
| 755 | > | |
| 756 | ||
| 757 | <!ELEMENT optgroup (option)+> <!-- option group --> | |
| 758 | <!ATTLIST optgroup | |
| 759 | %attrs; | |
| 760 | disabled (disabled) #IMPLIED | |
| 761 | label %Text; #REQUIRED | |
| 762 | > | |
| 763 | ||
| 764 | <!ELEMENT option (#PCDATA)> <!-- selectable choice --> | |
| 765 | <!ATTLIST option | |
| 766 | %attrs; | |
| 767 | selected (selected) #IMPLIED | |
| 768 | disabled (disabled) #IMPLIED | |
| 769 | label %Text; #IMPLIED | |
| 770 | value CDATA #IMPLIED | |
| 771 | > | |
| 772 | ||
| 773 | <!ELEMENT textarea (#PCDATA)> <!-- multi-line text field --> | |
| 774 | <!ATTLIST textarea | |
| 775 | %attrs; | |
| 776 | %focus; | |
| 777 | name CDATA #IMPLIED | |
| 778 | rows %Number; #REQUIRED | |
| 779 | cols %Number; #REQUIRED | |
| 780 | disabled (disabled) #IMPLIED | |
| 781 | readonly (readonly) #IMPLIED | |
| 782 | onselect %Script; #IMPLIED | |
| 783 | onchange %Script; #IMPLIED | |
| 784 | > | |
| 785 | ||
| 786 | <!-- | |
| 787 | The fieldset element is used to group form fields. | |
| 788 | Only one legend element should occur in the content | |
| 789 | and if present should only be preceded by whitespace. | |
| 790 | --> | |
| 791 | <!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*> | |
| 792 | <!ATTLIST fieldset | |
| 793 | %attrs; | |
| 794 | > | |
| 795 | ||
| 796 | <!ELEMENT legend %Inline;> <!-- fieldset label --> | |
| 797 | <!ATTLIST legend | |
| 798 | %attrs; | |
| 799 | accesskey %Character; #IMPLIED | |
| 800 | > | |
| 801 | ||
| 802 | <!-- | |
| 803 | Content is %Flow; excluding a, form and form controls | |
| 804 | --> | |
| 805 | <!ELEMENT button %button.content;> <!-- push button --> | |
| 806 | <!ATTLIST button | |
| 807 | %attrs; | |
| 808 | %focus; | |
| 809 | name CDATA #IMPLIED | |
| 810 | value CDATA #IMPLIED | |
| 811 | type (button|submit|reset) "submit" | |
| 812 | disabled (disabled) #IMPLIED | |
| 813 | > | |
| 814< |