root/livinglogic.python.xist/src/ll/xist/ns/html.py @ 2821:d149d59fdf49

Revision 2821:d149d59fdf49, 36.7 KB (checked in by Walter Doerwald <walter@…>, 12 years ago)

Add an iterator class for recursive iterating all CSS rules in an HTML tree.

html.itercssrules() can be iterated and will collect all <style type="text/css">
and <link rel="stylesheet"> element, parse the CSS files (and any that are
imported via @import) and will produce all rules (this uses the cssutils
package).

RevLine 
[2520]1# -*- coding: iso-8859-1 -*-
2
[2618]3## Copyright 1999-2007 by LivingLogic AG, Bayreuth/Germany.
4## Copyright 1999-2007 by Walter Dörwald
[2520]5##
6## All Rights Reserved
7##
8## See xist/__init__.py for the license
9
[2789]10
[2821]11from __future__ import with_statement
12
[2520]13"""
14<par>An &xist; namespace that contains definitions for all the elements
15in <link href="http://www.w3.org/TR/html4/loose.dtd">&html; 4.0 transitional</link>.</par>
16"""
17
18__version__ = "$Revision$".split()[1]
19# $Source$
20
21
[2821]22import os, cgi, contextlib
23
24from ll import url
25from ll.xist import xsc, utils, sims, xfind
[2520]26from ll.xist.ns import xml
27
28
[2821]29object_ = object
30
[2618]31xmlns = "http://www.w3.org/1999/xhtml"
32
33
[2520]34# common attributes types
35class DirAttr(xsc.TextAttr): "direction for weak/neutral text"; values = (u"ltr", u"rtl")
36class ContentTypeAttr(xsc.TextAttr): "media type, as per [RFC2045]"
37class ContentTypesAttr(xsc.TextAttr): "comma-separated list of media types, as per [RFC2045]"
38class CharsetAttr(xsc.TextAttr): "a character encoding, as per [RFC2045]"
39class CharsetsAttr(xsc.TextAttr): "a space separated list of character encodings, as per [RFC2045]"
40class LanguageCodeAttr(xsc.TextAttr): "a language code, as per [RFC3066]"
41class CharacterAttr(xsc.TextAttr): "a single character, as per section 2.2 of [XML]"
42class LinkTypesAttr(xsc.TextAttr): "space-separated list of link types"
43class MediaDescAttr(xsc.TextAttr): "single or comma-separated list of media descriptors"
44class URIListAttr(xsc.TextAttr): "a space separated list of Uniform Resource Identifiers"
45class DatetimeAttr(xsc.TextAttr): "date and time information. ISO date format"
46class ScriptAttr(xsc.TextAttr): "script expression"
47class StyleSheetAttr(xsc.StyleAttr): "style sheet data"
48class TextAttr(xsc.TextAttr): "used for titles etc."
49class FrameTargetAttr(xsc.TextAttr): "render in this frame"
50class LengthAttr(xsc.TextAttr): "<rep>nn</rep> for pixels or <rep>nn%</rep> for percentage length"
51class MultiLengthAttr(xsc.TextAttr): "pixel, percentage, or relative"
52class PixelsAttr(xsc.IntAttr): "integer representing length in pixels"
53class ShapeAttr(xsc.TextAttr): "image shapes"; values = (u"rect", u"circle", u"poly", u"default")
54class CoordsAttr(xsc.TextAttr): "comma separated list of lengths"
55class ImgAlignAttr(xsc.TextAttr): "image alignment"; values = (u"top", u"middle", u"bottom", u"left", u"right", u"absmiddle")
56class ColorAttr(xsc.ColorAttr): "a color using sRGB: #RRGGBB as Hex values"
57class TextAlignAttr(xsc.TextAttr): "text alignment"; values = (u"left", u"right", u"center", u"justify")
58class OLStyleAttr(xsc.TextAttr): values = "1aAiI"
59class ULStyleAttr(xsc.TextAttr): values = (u"disc", u"square", u"circle")
60class InputTypeAttr(xsc.TextAttr): values = (u"text", u"password", u"checkbox", u"radio", u"submit", u"reset", u"file", u"hidden", u"image", u"button")
61class TRulesAttr(xsc.TextAttr): values = (u"none", u"groups", u"rows", u"cols", u"all")
62class TAlignAttr(xsc.TextAttr): values = (u"left", u"right", u"center")
63class CAlignAttr(xsc.TextAttr): values = (u"top", u"bottom", u"left", u"right")
64class TFrameAttr(xsc.TextAttr): values = (u"void", u"above", u"below", u"hsides", u"lhs", u"rhs", u"vsides", u"box", u"border")
65class ScopeAttr(xsc.TextAttr): values = (u"row", u"col", u"rowgroup", u"colgroup")
66
67
68# common attributes sets
[2618]69class coreattrs(xsc.Attrs):
[2520]70    "core attributes common to most elements"
71    class id(xsc.IDAttr): "document-wide unique id"
72    class class_(xsc.TextAttr): "space separated list of classes"; xmlname = "class"
73    class style(StyleSheetAttr): "associated style info"
74    class title(TextAttr): "advisory title/amplification"
75
76
[2618]77class i18nattrs(xsc.Attrs):
[2520]78    "internationalization attributes"
79    class lang(LanguageCodeAttr): "language code (backwards compatible)"
80    class dir(DirAttr): pass
81
82
[2618]83class eventattrs(xsc.Attrs):
[2520]84    "attributes for common UI events"
85    class onclick(ScriptAttr): "a pointer button was clicked"
86    class ondblclick(ScriptAttr): "a pointer button was double clicked"
87    class onmousedown(ScriptAttr): "a pointer button was pressed down"
88    class onmouseup(ScriptAttr): "a pointer button was released"
89    class onmousemove(ScriptAttr): "a pointer was moved onto the element"
90    class onmouseover(ScriptAttr): "a pointer was moved onto the element" # deprecated
91    class onmouseout(ScriptAttr): "a pointer was moved away from the element"
92    class onkeypress(ScriptAttr): "a key was pressed and released"
93    class onkeydown(ScriptAttr): "a key was pressed down"
94    class onkeyup(ScriptAttr): "a key was released"
95
96
[2618]97class focusattrs(xsc.Attrs):
[2520]98    "attributes for elements that can get the focus"
99    class accesskey(CharacterAttr): "accessibility key character"
100    class tabindex(xsc.IntAttr): "position in tabbing order"
101    class onfocus(ScriptAttr): "the element got the focus"
102    class onblur(ScriptAttr): "the element lost the focus"
103
104
105class allattrs(coreattrs, i18nattrs, eventattrs):
106    pass
107
108
[2618]109class cellhalignattrs(xsc.Attrs):
[2520]110    class align(xsc.TextAttr): values = ("left", "center", "right", "justify", "char")
111    class char(CharacterAttr): pass
112    class charoff(LengthAttr): pass
113
114
[2618]115class cellvalignattrs(xsc.Attrs):
[2520]116    class valign(xsc.TextAttr): values = ("top", "middle", "bottom", "baseline")
117
118
119class DocTypeHTML40transitional(xsc.DocType):
120    """
121    document type for HTML 4.0 transitional
122    """
123    def __init__(self):
124        xsc.DocType.__init__(self, 'html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"')
125
126
127class DocTypeHTML401transitional(xsc.DocType):
128    """
129    document type for HTML 4.01 transitional
130    """
131    def __init__(self):
132        xsc.DocType.__init__(self, 'html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"')
133
134
135class DocTypeXHTML10strict(xsc.DocType):
136    """
137    document type for XHTML 1.0 strict
138    """
139    def __init__(self):
140        xsc.DocType.__init__(self, 'html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"')
141
142
143class DocTypeXHTML10transitional(xsc.DocType):
144    """
145    document type for XHTML 1.0 transitional
146    """
147    def __init__(self):
148        xsc.DocType.__init__(self, 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"')
149
150
151class DocTypeXHTML11(xsc.DocType):
152    """
153    document type for XHTML 1.1
154    """
155    def __init__(self):
156        xsc.DocType.__init__(self, 'html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"')
157
158
159# The global structure of an HTML document
160class html(xsc.Element):
161    """
162    document structure
163    """
[2618]164    xmlns = xmlns
[2520]165    class Attrs(i18nattrs):
166        class id(xsc.IDAttr): pass
167
168    def convert(self, converter):
[2618]169        if converter.lang is not None and "lang" not in self.attrs and ("lang", xml) not in self.attrs:
170            node = html(self.content, self.attrs, {"lang": converter.lang, ("lang", xml): converter.lang})
[2520]171            return node.convert(converter)
172        else:
173            return super(html, self).convert(converter)
174
175
176class head(xsc.Element):
177    """
178    document head
179    """
[2618]180    xmlns = xmlns
[2520]181    class Attrs(i18nattrs):
182        class id(xsc.IDAttr): pass
183        class profile(xsc.URLAttr): pass
184
185
186class title(xsc.Element):
187    """
188    document title
189    """
[2618]190    xmlns = xmlns
[2520]191    class Attrs(i18nattrs):
192        class id(xsc.IDAttr): pass
193
194    def unwrapHTML(self, node, converter):
[2618]195        if isinstance(node, xsc.Element) and node.xmlns==xmlns: # is this one of our own elements => filter it out
[2520]196            if isinstance(node, img):
197                node = node["alt"]
198            else:
199                node = node.content.mapped(self.unwrapHTML, converter)
200        return node
201
202    def convert(self, converter):
203        content = self.content.convert(converter)
204        content = content.mapped(self.unwrapHTML, converter)
205        return title(content, self.attrs)
206
207
208class base(xsc.Element):
209    """
210    document base URI
211    """
[2618]212    xmlns = xmlns
[2520]213    model = sims.Empty()
[2618]214
[2520]215    class Attrs(xsc.Element.Attrs):
216        class id(xsc.IDAttr): pass
217        class href(xsc.URLAttr): pass
218        class target(FrameTargetAttr): pass
219
220
221class meta(xsc.Element):
222    """
223    generic metainformation. If the <lit>http-equiv</lit> attribute
224    has the value "content-type" the encoding in the <lit>content</lit>
225    attribute will be set automatically when publishing.
226    """
[2618]227    xmlns = xmlns
[2520]228    model = sims.Empty()
[2618]229
[2520]230    class Attrs(i18nattrs):
231        class id(xsc.IDAttr): pass
232        class http_equiv(xsc.TextAttr): xmlname = "http-equiv"
233        class name(xsc.TextAttr): pass
234        class content(xsc.TextAttr): required = True
235        class scheme(xsc.TextAttr): pass
236
237    def publish(self, publisher):
238        if u"http_equiv" in self.attrs and not self.attrs.http_equiv.isfancy():
239            ctype = unicode(self[u"http_equiv"]).lower()
240            if ctype == u"content-type" and u"content" in self.attrs:
241                (contenttype, options) = cgi.parse_header(unicode(self[u"content"]))
242                if u"charset" not in options or options[u"charset"] != publisher.encoding:
243                    options[u"charset"] = publisher.encoding
244                    node = self.__class__(
245                        self.attrs,
246                        http_equiv=u"Content-Type",
247                        content=(contenttype, u"; ", u"; ".join(u"%s=%s" % option for option in options.items()))
248                    )
249                    return node.publish(publisher) # return a generator-iterator
250        return super(meta, self).publish(publisher) # return a generator-iterator
251
252
253class link(xsc.Element):
254    """
255    a media-independent link
256    """
[2618]257    xmlns = xmlns
[2520]258    model = sims.Empty()
[2618]259
[2520]260    class Attrs(allattrs):
261        class charset(CharsetAttr): pass
262        class href(xsc.URLAttr): pass
263        class hreflang(LanguageCodeAttr): pass
264        class type(ContentTypeAttr): pass
265        class rel(LinkTypesAttr): pass
266        class rev(LinkTypesAttr): pass
267        class media(MediaDescAttr): pass
268        class target(FrameTargetAttr): pass
269
270
271class style(xsc.Element):
272    """
273    style info, which may include CDATA sections
274    """
[2618]275    xmlns = xmlns
[2520]276    model = sims.NoElements()
[2618]277
[2520]278    class Attrs(i18nattrs):
279        class id(xsc.IDAttr): pass
280        class type(ContentTypeAttr): required = True
281        class media(MediaDescAttr): pass
282        class title(TextAttr): pass
283
284
285class script(xsc.Element):
286    """
287    script statements, which may include CDATA sections
288    """
[2618]289    xmlns = xmlns
[2520]290    model = sims.NoElements()
[2618]291
[2520]292    class Attrs(xsc.Element.Attrs):
293        class id(xsc.IDAttr): pass
294        class charset(CharsetAttr): pass
295        class type(ContentTypeAttr): required = True
296        class language(xsc.TextAttr): pass
297        class src(xsc.URLAttr): pass
298        class defer(xsc.BoolAttr): pass
299
300
301class noscript(xsc.Element):
302    """
303    alternate content container for non script-based rendering
304    """
[2618]305    xmlns = xmlns
[2520]306    class Attrs(allattrs):
307        pass
308
309
310class iframe(xsc.Element):
311    """
312    inline subwindow
313    """
[2618]314    xmlns = xmlns
[2520]315    class Attrs(coreattrs):
316        class longdesc(xsc.URLAttr): pass
317        class name(xsc.TextAttr): pass
318        class src(xsc.URLAttr): pass
319        class frameborder(xsc.TextAttr): values = (1, 0)
320        class marginwidth(PixelsAttr): pass
321        class marginheight(PixelsAttr): pass
322        class noresize(xsc.BoolAttr): pass # deprecated
323        class scrolling(xsc.TextAttr): values = (u"yes", u"no", u"auto")
324        class align(ImgAlignAttr): pass
325        class height(LengthAttr): pass
326        class width(LengthAttr): pass
327        class hspace(xsc.IntAttr): pass # deprecated
328        class vspace(xsc.IntAttr): pass # deprecated
329        class bordercolor(xsc.ColorAttr): pass # deprecated
330
331
332class noframes(xsc.Element):
333    """
334    alternate content container for non frame-based rendering
335    """
[2618]336    xmlns = xmlns
[2520]337    class Attrs(allattrs):
338        pass
339
340
341class body(xsc.Element):
342    """
343    document body
344    """
[2618]345    xmlns = xmlns
[2520]346    class Attrs(allattrs):
347        class onload(ScriptAttr): pass
348        class onunload(ScriptAttr): pass
349        class onfocus(xsc.TextAttr): pass # deprecated
350        class background(xsc.URLAttr): pass # deprecated
351        class bgcolor(xsc.ColorAttr): pass # deprecated
352        class text(xsc.ColorAttr): pass # deprecated
353        class link(xsc.ColorAttr): pass # deprecated
354        class vlink(xsc.ColorAttr): pass # deprecated
355        class alink(xsc.ColorAttr): pass # deprecated
356        class leftmargin(xsc.IntAttr): pass # deprecated
357        class topmargin(xsc.IntAttr): pass # deprecated
358        class marginwidth(xsc.IntAttr): pass # deprecated
359        class marginheight(xsc.IntAttr): pass # deprecated
360
361
362class div(xsc.Element):
363    """
364    generic language/style container
365    """
[2618]366    xmlns = xmlns
[2520]367    class Attrs(allattrs):
368        class align(TextAlignAttr): pass
369
370
371class p(xsc.Element):
372    """
373    paragraph
374    """
[2618]375    xmlns = xmlns
[2520]376    class Attrs(allattrs):
377        class align(TextAlignAttr): pass
378
379
[2649]380class h(xsc.Element):
381    """
382    heading
383    """
384    register = False
385    xmlns = xmlns
386    class Attrs(allattrs):
387        class align(TextAlignAttr): pass
388
389
390class h1(h):
[2520]391    """
392    heading
393    """
[2618]394    xmlns = xmlns
[2520]395
396
[2649]397class h2(h):
[2520]398    """
399    heading
400    """
[2618]401    xmlns = xmlns
[2520]402
403
[2649]404class h3(h):
[2520]405    """
406    heading
407    """
[2618]408    xmlns = xmlns
[2520]409
410
[2649]411class h4(h):
[2520]412    """
413    heading
414    """
[2618]415    xmlns = xmlns
[2520]416
417
[2649]418class h5(h):
[2520]419    """
420    heading
421    """
[2618]422    xmlns = xmlns
[2520]423
424
[2649]425class h6(h):
[2520]426    """
427    heading
428    """
[2618]429    xmlns = xmlns
[2520]430
431
432class ul(xsc.Element):
433    """
434    unordered list
435    """
[2618]436    xmlns = xmlns
[2520]437    class Attrs(allattrs):
438        class type(ULStyleAttr): pass
439        class compact(xsc.BoolAttr): pass
440
441
442class ol(xsc.Element):
443    """
444    ordered list
445    """
[2618]446    xmlns = xmlns
[2520]447    class Attrs(allattrs):
448        class type(OLStyleAttr): pass
449        class compact(xsc.BoolAttr): pass
450        class start(xsc.IntAttr): pass
451
452
453class menu(xsc.Element):
454    """
455    single column list (deprecated)
456    """
[2618]457    xmlns = xmlns
[2520]458    class Attrs(allattrs):
459        class compact(xsc.BoolAttr): pass
460
461
462class dir(xsc.Element):
463    """
464    multiple column list (deprecated)
465    """
[2618]466    xmlns = xmlns
[2520]467    class Attrs(allattrs):
468        class compact(xsc.BoolAttr): pass
469
470
471class li(xsc.Element):
472    """
473    list item
474    """
[2618]475    xmlns = xmlns
[2520]476    class Attrs(allattrs):
477        class type(xsc.TextAttr): pass
478        class value(xsc.IntAttr): pass
479
480
481class dl(xsc.Element):
482    """
483    definition list
484    """
[2618]485    xmlns = xmlns
[2520]486    class Attrs(allattrs):
487        class compact(xsc.BoolAttr): pass
488
489
490class dt(xsc.Element):
491    """
492    definition term
493    """
[2618]494    xmlns = xmlns
[2520]495    class Attrs(allattrs):
496        pass
497
498
499class dd(xsc.Element):
500    """
501    definition description
502    """
[2618]503    xmlns = xmlns
[2520]504    class Attrs(allattrs):
505        pass
506
507
508class address(xsc.Element):
509    """
510    information on author
511    """
[2618]512    xmlns = xmlns
[2520]513    class Attrs(allattrs):
514        pass
515
516
517class hr(xsc.Element):
518    """
519    horizontal rule
520    """
[2618]521    xmlns = xmlns
[2520]522    model = sims.Empty()
523    class Attrs(allattrs):
524        class align(xsc.TextAttr): values = (u"left", u"right", u"center")
525        class noshade(xsc.BoolAttr): pass
526        class size(PixelsAttr): pass
527        class width(LengthAttr): pass # deprecated
528        class color(xsc.ColorAttr): pass # deprecated
529
530
531class pre(xsc.Element):
532    """
533    preformatted text
534    """
[2618]535    xmlns = xmlns
[2520]536    class Attrs(allattrs):
537        class width(xsc.IntAttr): pass
538
539
540class blockquote(xsc.Element):
541    """
542    block-like quotes
543    """
[2618]544    xmlns = xmlns
[2520]545    class Attrs(allattrs):
546        class cite(xsc.URLAttr): pass
547
548
549class center(xsc.Element): # deprecated
550    """
551    centered block level element
552    """
[2618]553    xmlns = xmlns
[2520]554    class Attrs(allattrs):
555        pass
556
557
558class ins(xsc.Element):
559    """
560    inserted text
561    """
[2618]562    xmlns = xmlns
[2520]563    class Attrs(allattrs):
564        class cite(xsc.URLAttr): pass
565        class datetime(DatetimeAttr): pass
566
567
568class del_(xsc.Element):
569    """
570    deleted text
571    """
[2618]572    xmlns = xmlns
[2520]573    xmlname = "del"
[2618]574
[2520]575    class Attrs(allattrs):
576        class cite(xsc.URLAttr): pass
577        class datetime(DatetimeAttr): pass
578
579
580class a(xsc.Element):
581    """
582    anchor
583    """
[2618]584    xmlns = xmlns
[2520]585    class Attrs(allattrs, focusattrs):
586        class charset(CharsetAttr): pass
587        class type(ContentTypeAttr): pass
588        class name(xsc.TextAttr): pass
589        class href(xsc.URLAttr): pass
590        class hreflang(LanguageCodeAttr): pass
591        class rel(LinkTypesAttr): pass
592        class rev(LinkTypesAttr): pass
593        class shape(ShapeAttr): pass
594        class coords(CoordsAttr): pass
595        class target(FrameTargetAttr): pass
596        class oncontextmenu(xsc.TextAttr): pass # deprecated
597
598
599class span(xsc.Element):
600    """
601    generic language/style container
602    """
[2618]603    xmlns = xmlns
[2520]604    class Attrs(allattrs):
605        pass
606
607
608class bdo(xsc.Element):
609    """
610    I18N BiDi over-ride
611    """
[2618]612    xmlns = xmlns
[2520]613    class Attrs(coreattrs, eventattrs):
614        class lang(LanguageCodeAttr): pass
615        class dir(DirAttr): required = True
616
617
618class br(xsc.Element):
619    """
620    forced line break
621    """
[2618]622    xmlns = xmlns
[2520]623    model = sims.Empty()
[2618]624
[2520]625    class Attrs(coreattrs):
626        class clear(xsc.TextAttr): values = (u"left", u"all", u"right", u"none")
627
628
629class em(xsc.Element):
630    """
631    Indicates emphasis.
632    """
[2618]633    xmlns = xmlns
[2520]634    class Attrs(allattrs):
635        pass
636
637
638class strong(xsc.Element):
639    """
640    Indicates stronger emphasis than em.
641    """
[2618]642    xmlns = xmlns
[2520]643    class Attrs(allattrs):
644        pass
645
646
647class dfn(xsc.Element):
648    """
649    Indicates that this is the defining instance of the enclosed term.
650    """
[2618]651    xmlns = xmlns
[2520]652    class Attrs(allattrs):
653        pass
654
655
656class code(xsc.Element):
657    """
658    Designates a fragment of computer code.
659    """
[2618]660    xmlns = xmlns
[2520]661    class Attrs(allattrs):
662        pass
663
664
665class samp(xsc.Element):
666    """
667    Designates sample output from programs, scripts, etc.
668    """
[2618]669    xmlns = xmlns
[2520]670    class Attrs(allattrs):
671        pass
672
673
674class kbd(xsc.Element):
675    """
676    Indicates text to be entered by the user.
677    """
[2618]678    xmlns = xmlns
[2520]679    class Attrs(allattrs):
680        pass
681
682
683class var(xsc.Element):
684    """
685    Indicates an instance of a variable or program argument.
686    """
[2618]687    xmlns = xmlns
[2520]688    class Attrs(allattrs):
689        pass
690
691
692class cite(xsc.Element):
693    """
694    Contains a citation or a reference to other sources.
695    """
[2618]696    xmlns = xmlns
[2520]697    class Attrs(allattrs):
698        pass
699
700
701class abbr(xsc.Element):
702    """
703    Indicates an abbreviated form (e.g., WWW, HTTP, URI, Mass., etc.)
704    """
[2618]705    xmlns = xmlns
[2520]706    class Attrs(allattrs):
707        pass
708
709
710class acronym(xsc.Element):
711    """
712    Indicates an acronym (e.g., WAC, radar, etc.).
713    """
[2618]714    xmlns = xmlns
[2520]715    class Attrs(allattrs):
716        pass
717
718
719class q(xsc.Element):
720    """
721    short inline quotation
722    """
[2618]723    xmlns = xmlns
[2520]724    class Attrs(allattrs):
725        class cite(xsc.URLAttr): pass
726
727
728class sub(xsc.Element):
729    """
730    subscript
731    """
[2618]732    xmlns = xmlns
[2520]733    class Attrs(allattrs):
734        pass
735
736
737class sup(xsc.Element):
738    """
739    superscript
740    """
[2618]741    xmlns = xmlns
[2520]742    class Attrs(allattrs):
743        pass
744
745
746class tt(xsc.Element):
747    """
748    teletype or monospaced text style
749    """
[2618]750    xmlns = xmlns
[2520]751    class Attrs(allattrs):
752        pass
753
754
755class i(xsc.Element):
756    """
757    italic text style
758    """
[2618]759    xmlns = xmlns
[2520]760    class Attrs(allattrs):
761        pass
762
763
764class b(xsc.Element):
765    """
766    bold text style
767    """
[2618]768    xmlns = xmlns
[2520]769    class Attrs(allattrs):
770        pass
771
772
773class big(xsc.Element):
774    """
775    large text style
776    """
[2618]777    xmlns = xmlns
[2520]778    class Attrs(allattrs):
779        pass
780
781
782class small(xsc.Element):
783    """
784    small text style
785    """
[2618]786    xmlns = xmlns
[2520]787    class Attrs(allattrs):
788        pass
789
790
791class u(xsc.Element):
792    """
793    underline text style
794    """
[2618]795    xmlns = xmlns
[2520]796    class Attrs(allattrs):
797        pass
798
799
800class s(xsc.Element):
801    """
802    strike-through text style
803    """
[2618]804    xmlns = xmlns
[2520]805    class Attrs(allattrs):
806        pass
807
808
809class strike(xsc.Element):
810    """
811    strike-through text style
812    """
[2618]813    xmlns = xmlns
[2520]814    class Attrs(allattrs):
815        pass
816
817
818class basefont(xsc.Element): # deprecated
819    """
820    base font size
821    """
[2618]822    xmlns = xmlns
[2520]823    model = sims.Empty()
[2618]824
[2520]825    class Attrs(coreattrs, i18nattrs):
826        class id(xsc.IDAttr): pass
827        class size(xsc.TextAttr): required = True
828        class color(xsc.ColorAttr): pass
829        class face(xsc.TextAttr): pass
830
831
832class font(xsc.Element): # deprecated
833    """
834    local change to font
835    """
[2618]836    xmlns = xmlns
[2520]837    class Attrs(coreattrs, i18nattrs):
838        class face(xsc.TextAttr): pass
839        class size(xsc.TextAttr): pass
840        class color(xsc.ColorAttr): pass
841
842
843class object(xsc.Element):
844    """
845    generic embedded object
846    """
[2618]847    xmlns = xmlns
[2520]848    class Attrs(allattrs):
849        class declare(xsc.BoolAttr): pass
850        class classid(xsc.URLAttr): pass
851        class codebase(xsc.URLAttr): pass
852        class data(xsc.URLAttr): pass
853        class type(ContentTypeAttr): pass
854        class codetype(ContentTypeAttr): pass
855        class archive(URIListAttr): pass
856        class standby(TextAttr): pass
857        class height(LengthAttr): pass
858        class width(LengthAttr): pass
859        class usemap(xsc.URLAttr): pass
860        class name(xsc.TextAttr): pass
861        class tabindex(xsc.IntAttr): pass
862        class align(ImgAlignAttr): pass
863        class border(PixelsAttr): pass
864        class hspace(PixelsAttr): pass
865        class vspace(PixelsAttr): pass
866
867
868class param(xsc.Element):
869    """
870    named property value
871    """
[2618]872    xmlns = xmlns
[2520]873    model = sims.Empty()
[2618]874
[2520]875    class Attrs(xsc.Element.Attrs):
876        class id(xsc.IDAttr): pass
877        class name(xsc.TextAttr): required = True
878        class value(xsc.TextAttr): pass
879        class valuetype(xsc.TextAttr): values = (u"data", u"ref", u"object")
880        class type(ContentTypeAttr): pass
881
882
883class applet(xsc.Element): # deprecated
884    """
885    Java applet
886    """
[2618]887    xmlns = xmlns
[2520]888    class Attrs(coreattrs):
889        class codebase(xsc.URLAttr): pass
890        class archive(xsc.TextAttr): pass
891        class code(xsc.TextAttr): pass
892        class object(xsc.TextAttr): pass
893        class alt(TextAttr): pass
894        class name(xsc.TextAttr): pass
895        class width(LengthAttr): required = True
896        class height(LengthAttr): required = True
897        class align(ImgAlignAttr): pass
898        class hspace(PixelsAttr): pass
899        class vspace(PixelsAttr): pass
900
901
902class img(xsc.Element):
903    """
904    Embedded image
905    """
[2618]906    xmlns = xmlns
[2520]907    model = sims.Empty()
[2618]908
[2520]909    class Attrs(allattrs):
910        class src(xsc.URLAttr): required = True
911        class alt(TextAttr): required = True
912        class name(xsc.TextAttr): pass
913        class longdesc(xsc.URLAttr): pass
914        class width(LengthAttr): pass
915        class height(LengthAttr): pass
916        class usemap(xsc.URLAttr): pass
917        class ismap(xsc.BoolAttr): pass
918        class align(ImgAlignAttr): pass
919        class border(LengthAttr): pass
920        class hspace(PixelsAttr): pass
921        class vspace(PixelsAttr): pass
922        class lowsrc(xsc.URLAttr): pass # deprecated
923
924    def __unicode__(self):
925        return unicode(self["alt"])
926
927
928class map(xsc.Element):
929    """
930    client-side image map
931    """
[2618]932    xmlns = xmlns
[2520]933    class Attrs(i18nattrs, eventattrs):
934        class id(xsc.IDAttr): required = True
935        class class_(xsc.TextAttr): pass
936        class style(StyleSheetAttr): pass
937        class title(TextAttr): pass
938        class name(xsc.TextAttr): pass
939
940
941class area(xsc.Element):
942    """
943    client-side image map area
944    """
[2618]945    xmlns = xmlns
[2520]946    model = sims.Empty()
[2618]947
[2520]948    class Attrs(allattrs, focusattrs):
949        class shape(ShapeAttr): pass
950        class coords(CoordsAttr): pass
951        class href(xsc.URLAttr): pass
952        class nohref(xsc.BoolAttr): pass
953        class alt(TextAttr): required = True
954        class target(FrameTargetAttr): pass
955
956
957class form(xsc.Element):
958    """
959    interactive form
960    """
[2618]961    xmlns = xmlns
[2520]962    class Attrs(allattrs):
963        class action(xsc.URLAttr): required = True
964        class method(xsc.TextAttr): values = (u"get", u"post")
965        class name(xsc.TextAttr): pass
966        class enctype(ContentTypeAttr): pass
967        class onsubmit(ScriptAttr): pass
968        class onreset(ScriptAttr): pass
969        class accept_charset(CharsetsAttr): xmlname = "accept-charset"
970        class target(FrameTargetAttr): pass
971
972
973class label(xsc.Element):
974    """
975    form field label text
976    """
[2618]977    xmlns = xmlns
[2520]978    class Attrs(allattrs):
979        class for_(xsc.TextAttr): xmlname = "for"
980        class accesskey(CharacterAttr): pass
981        class onfocus(ScriptAttr): pass
982        class onblur(ScriptAttr): pass
983
984
985class input(xsc.Element):
986    """
987    form control
988    """
[2618]989    xmlns = xmlns
[2520]990    model = sims.Empty()
[2618]991
[2520]992    class Attrs(allattrs, focusattrs):
993        class type(InputTypeAttr): pass
994        class name(xsc.TextAttr): pass
995        class value(xsc.TextAttr): pass
996        class checked(xsc.BoolAttr): pass
997        class disabled(xsc.BoolAttr): pass
998        class readonly(xsc.BoolAttr): pass
999        class size(xsc.TextAttr): pass
1000        class maxlength(xsc.IntAttr): pass
1001        class src(xsc.URLAttr): pass
1002        class alt(xsc.TextAttr): pass
1003        class usemap(xsc.URLAttr): pass
1004        class onselect(ScriptAttr): pass
1005        class onchange(ScriptAttr): pass
1006        class accept(ContentTypesAttr): pass
1007        class align(ImgAlignAttr): pass
1008        class border(xsc.IntAttr): pass # deprecated
1009
1010
1011class select(xsc.Element):
1012    """
1013    option selector
1014    """
[2618]1015    xmlns = xmlns
[2520]1016    class Attrs(allattrs):
1017        class name(xsc.TextAttr): pass
1018        class size(xsc.IntAttr): pass
1019        class multiple(xsc.BoolAttr): pass
1020        class disabled(xsc.BoolAttr): pass
1021        class tabindex(xsc.IntAttr): pass
1022        class onfocus(ScriptAttr): pass
1023        class onblur(ScriptAttr): pass
1024        class onchange(ScriptAttr): pass
1025        class rows(xsc.TextAttr): pass # deprecated
1026
1027
1028class optgroup(xsc.Element):
1029    """
1030    option group
1031    """
[2618]1032    xmlns = xmlns
[2520]1033    class Attrs(allattrs):
1034        class disabled(xsc.BoolAttr): pass
1035        class label(TextAttr): required = True
1036
1037
1038class option(xsc.Element):
1039    """
1040    selectable choice
1041    """
[2618]1042    xmlns = xmlns
[2520]1043    class Attrs(allattrs):
1044        class selected(xsc.BoolAttr): pass
1045        class disabled(xsc.BoolAttr): pass
1046        class label(TextAttr): pass
1047        class value(xsc.TextAttr): pass
1048
1049
1050class textarea(xsc.Element):
1051    """
1052    multi-line text field
1053    """
[2618]1054    xmlns = xmlns
[2520]1055    class Attrs(allattrs, focusattrs):
1056        class name(xsc.TextAttr): pass
1057        class rows(xsc.IntAttr): required = True
1058        class cols(xsc.IntAttr): required = True
1059        class disabled(xsc.BoolAttr): pass
1060        class readonly(xsc.BoolAttr): pass
1061        class onselect(ScriptAttr): pass
1062        class onchange(ScriptAttr): pass
1063        class wrap(xsc.TextAttr): values = (u"virtual", u"physical", u"off") # deprecated
1064
1065
1066class fieldset(xsc.Element):
1067    """
1068    form control group
1069    """
[2618]1070    xmlns = xmlns
[2520]1071    class Attrs(allattrs):
1072        pass
1073
1074
1075class legend(xsc.Element):
1076    """
1077    fieldset legend
1078    """
[2618]1079    xmlns = xmlns
[2520]1080    class Attrs(allattrs):
1081        class accesskey(xsc.TextAttr): pass
1082        class align(xsc.TextAttr): values = (u"top", u"bottom", u"left", u"right")
1083
1084
1085class button(xsc.Element):
1086    """
1087    push button
1088    """
[2618]1089    xmlns = xmlns
[2520]1090    class Attrs(allattrs, focusattrs):
1091        class name(xsc.TextAttr): pass
1092        class value(xsc.TextAttr): pass
1093        class type(xsc.TextAttr): values = (u"button", u"submit", u"reset")
1094        class disabled(xsc.BoolAttr): pass
1095
1096
1097class isindex(xsc.Element):
[2618]1098    xmlns = xmlns
[2520]1099    model = sims.Empty()
1100    class Attrs(coreattrs, i18nattrs):
1101        class prompt(TextAttr): pass
1102
1103
1104class table(xsc.Element):
1105    """
1106    table
1107    """
[2618]1108    xmlns = xmlns
[2520]1109    class Attrs(allattrs):
1110        class summary(TextAttr): pass
1111        class width(LengthAttr): pass
1112        class border(PixelsAttr): pass
1113        class frame(TFrameAttr): pass
1114        class rules(TRulesAttr): pass
1115        class cellspacing(LengthAttr): pass
1116        class cellpadding(LengthAttr): pass
1117        class align(TAlignAttr): pass
1118        class bgcolor(xsc.ColorAttr): pass # deprecated
1119        class height(xsc.TextAttr): pass # deprecated
1120        class background(xsc.URLAttr): pass # deprecated
1121        class bordercolor(xsc.ColorAttr): pass # deprecated
1122        class hspace(xsc.IntAttr): pass # deprecated
1123        class vspace(xsc.IntAttr): pass # deprecated
1124
1125
1126class caption(xsc.Element):
1127    """
1128    table caption
1129    """
[2618]1130    xmlns = xmlns
[2520]1131    class Attrs(allattrs):
1132        class align(CAlignAttr): pass
1133
1134
1135class colgroup(xsc.Element):
1136    """
1137    table column group
1138    """
[2618]1139    xmlns = xmlns
[2520]1140    class Attrs(allattrs, cellhalignattrs, cellvalignattrs):
1141        class span(xsc.TextAttr): pass
1142        class width(MultiLengthAttr): pass
1143
1144
1145class col(xsc.Element):
1146    """
1147    table column
1148    """
[2618]1149    xmlns = xmlns
[2520]1150    class Attrs(allattrs, cellhalignattrs, cellvalignattrs):
1151        class span(xsc.TextAttr): pass
1152        class width(MultiLengthAttr): pass
1153
1154
1155class thead(xsc.Element):
1156    """
1157    table header
1158    """
[2618]1159    xmlns = xmlns
[2520]1160    class Attrs(allattrs, cellhalignattrs, cellvalignattrs):
1161        pass
1162
1163
1164class tfoot(xsc.Element):
1165    """
1166    table footer
1167    """
[2618]1168    xmlns = xmlns
[2520]1169    class Attrs(allattrs, cellhalignattrs, cellvalignattrs):
1170        pass
1171
1172
1173class tbody(xsc.Element):
1174    """
1175    table body
1176    """
[2618]1177    xmlns = xmlns
[2520]1178    class Attrs(allattrs, cellhalignattrs, cellvalignattrs):
1179        pass
1180
1181
1182class tr(xsc.Element):
1183    """
1184    table row
1185    """
[2618]1186    xmlns = xmlns
[2520]1187    class Attrs(allattrs, cellhalignattrs, cellvalignattrs):
1188        class bgcolor(xsc.ColorAttr): pass
1189        class nowrap(xsc.BoolAttr): pass # deprecated
1190        class width(LengthAttr): pass # deprecated
1191        class background(xsc.URLAttr): pass # deprecated
1192
1193
1194class th(xsc.Element):
1195    """
1196    table header cell
1197    """
[2618]1198    xmlns = xmlns
[2520]1199    class Attrs(allattrs, cellhalignattrs, cellvalignattrs):
1200        class abbr(TextAttr): pass
1201        class axis(xsc.TextAttr): pass
1202        class headers(xsc.TextAttr): pass
1203        class scope(ScopeAttr): pass
1204        class rowspan(xsc.IntAttr): pass
1205        class colspan(xsc.IntAttr): pass
1206        class nowrap(xsc.BoolAttr): pass
1207        class bgcolor(xsc.ColorAttr): pass
1208        class width(LengthAttr): pass
1209        class height(LengthAttr): pass
1210        class background(xsc.URLAttr): pass # deprecated
1211        class bordercolor(xsc.ColorAttr): pass # deprecated
1212
1213
1214class td(xsc.Element):
1215    """
1216    table data cell
1217    """
[2618]1218    xmlns = xmlns
[2520]1219    class Attrs(allattrs, cellhalignattrs, cellvalignattrs):
1220        class abbr(TextAttr): pass
1221        class axis(xsc.TextAttr): pass
1222        class headers(xsc.TextAttr): pass
1223        class scope(ScopeAttr): pass
1224        class rowspan(xsc.IntAttr): pass
1225        class colspan(xsc.IntAttr): pass
1226        class nowrap(xsc.BoolAttr): pass
1227        class bgcolor(xsc.ColorAttr): pass
1228        class width(LengthAttr): pass
1229        class height(LengthAttr): pass
1230        class background(xsc.URLAttr): pass # deprecated
1231        class bordercolor(xsc.ColorAttr): pass # deprecated
1232
1233
1234class embed(xsc.Element):
1235    """
1236    generic embedded object (Internet Exploder)
1237    """
[2618]1238    xmlns = xmlns
[2520]1239    class Attrs(xsc.Element.Attrs):
1240        class width(xsc.TextAttr): pass
1241        class height(xsc.TextAttr): pass
1242        class src(xsc.URLAttr): pass
1243        class controller(xsc.TextAttr): pass
1244        class href(xsc.URLAttr): pass
1245        class target(xsc.TextAttr): pass
1246        class border(xsc.IntAttr): pass
1247        class pluginspage(xsc.URLAttr): pass
1248        class quality(xsc.TextAttr): pass
1249        class type(xsc.TextAttr): pass
1250        class bgcolor(xsc.ColorAttr): pass
1251        class menu(xsc.TextAttr): pass # deprecated
1252
1253
1254# The pain, the pain ...
1255class frameset(xsc.Element):
1256    """
1257    window subdivision
1258    """
[2618]1259    xmlns = xmlns
[2520]1260    class Attrs(coreattrs):
1261        class rows(xsc.TextAttr): pass
1262        class cols(xsc.TextAttr): pass
1263        class onload(xsc.TextAttr): pass
1264        class onunload(xsc.TextAttr): pass
1265        class framespacing(xsc.TextAttr): pass # deprecated
1266        class border(xsc.IntAttr): pass # deprecated
1267        class marginwidth(xsc.IntAttr): pass # deprecated
1268        class marginheight(xsc.IntAttr): pass # deprecated
1269        class frameborder(xsc.IntAttr): pass # deprecated
1270        class noresize(xsc.BoolAttr): pass # deprecated
1271        class scrolling(xsc.TextAttr): pass # deprecated
1272
1273
1274class frame(xsc.Element):
1275    """
1276    subwindow
1277    """
[2618]1278    xmlns = xmlns
[2520]1279    model = sims.Empty()
1280    class Attrs(coreattrs):
1281        class longdesc(xsc.TextAttr): pass
1282        class name(xsc.TextAttr): pass
1283        class src(xsc.URLAttr): pass
1284        class frameborder(xsc.TextAttr): pass
1285        class marginwidht(xsc.TextAttr): pass
1286        class marginheight(xsc.TextAttr): pass
1287        class noresize(xsc.BoolAttr): pass
1288        class scrolling(xsc.TextAttr): pass
1289        class framespacing(xsc.TextAttr): pass # deprecated
1290        class border(xsc.IntAttr): pass # deprecated
1291        class marginwidth(xsc.IntAttr): pass # deprecated
1292        class marginheight(xsc.IntAttr): pass # deprecated
1293        class frameborder(xsc.IntAttr): pass # deprecated
1294        class noresize(xsc.BoolAttr): pass # deprecated
1295        class scrolling(xsc.TextAttr): pass # deprecated
1296
1297
1298# More pain
1299class nobr(xsc.Element): # deprecated
1300    """
1301    prevents line breaks
1302    """
[2618]1303    xmlns = xmlns
[2520]1304
1305
[2590]1306def astext(node, encoding="iso-8859-1", width=72):
1307    """
1308    <par>Return the node <arg>node</arg> as a formatted plain string. <arg>node</arg>
[2683]1309    must contain an &html; tree.</par>
[2590]1310
1311    <par>This requires that <app moreinfo="http://elinks.or.cz/">elinks</app> is
1312    installed.</par>
1313
1314    <par><arg>encoding</arg> specifies the output encoding. <arg>width</arg>
1315    specifies the output width.</par>
1316    """
1317
[2683]1318    # Fix the HTML
1319    def decorateheader(node, converter, c):
1320        content = unicode(node)
1321        l = len(content)
1322        if c:
1323            underline = ((c*l)[:l], br())
1324        else:
1325            underline = None
1326        return node.__class__(
1327            br(),
1328            node.content.mapped(decorate, converter), br(),
1329            underline,
1330            node.attrs,
1331        )
1332
1333    def decorate(node, converter):
1334        if isinstance(node, xsc.Text):
1335            node = node.replace(u"\N{EM DASH}", u"--")
1336            node = node.replace(u"\N{EN DASH}", u"-")
1337            node = node.replace(u"\u200b", u"")
1338            node = node.replace(u"\N{GREEK CAPITAL LETTER ALPHA}", u"Alpha")
1339            node = node.replace(u"\N{GREEK CAPITAL LETTER BETA}", u"Beta")
1340            node = node.replace(u"\N{GREEK CAPITAL LETTER GAMMA}", u"Gamma")
1341            node = node.replace(u"\N{GREEK SMALL LETTER ALPHA}", u"alpha")
1342            node = node.replace(u"\N{GREEK SMALL LETTER BETA}", u"beta")
1343            node = node.replace(u"\N{GREEK SMALL LETTER GAMMA}", u"gamma")
1344        elif isinstance(node, (h1, h2)):
1345            node = decorateheader(node, converter, "=")
1346        elif isinstance(node, (h3, h4, h5, h6)):
1347            node = decorateheader(node, converter, "-")
1348        return node
1349
1350    node = node.mapped(decorate)
1351
[2590]1352    options = [
1353        "-dump 1",
1354        "-dump-charset %s" % encoding,
1355        "-dump-width %d" % width,
1356        "-force-html",
1357        "-no-home",
1358        "-no-numbering",
1359        "-no-references",
1360        "-verbose 0",
1361    ]
1362
[2782]1363    text = node.bytes(encoding=encoding)
[2590]1364
1365    cmd = "elinks %s" % " ".join(options)
1366    (stdin, stdout) = os.popen2(cmd)
1367
1368    stdin.write(text)
1369    stdin.close()
1370    text = stdout.read()
1371    stdout.close()
1372    text = "\n".join(line.rstrip() for line in text.splitlines())
1373    return text
1374
1375
[2821]1376try:
1377    import cssutils
1378    from cssutils import css, stylesheets
1379    from cssutils.css import cssstyledeclaration, cssvalue
1380except ImportError:
1381    pass
1382
1383
1384class itercssrules(object_):
1385    def __init__(self, node, base=None):
1386        self.node = node
1387        if base is not None:
1388            base = url.URL(base)
1389        self.base = base
1390
1391    def _isstyle(self, path):
1392        if path:
1393            node = path[-1]
1394            return (isinstance(node, style) and unicode(node.attrs.type) == "text/css") or (isinstance(node, link) and unicode(node.attrs.rel) == "stylesheet")
1395        return False
1396
1397    def _fixurl(self, rule, base):
1398        for proplist in rule.style.seq:
1399            for prop in proplist:
1400                for (i, value) in enumerate(prop.cssValue.seq):
1401                        if value.startswith("url(") and value.endswith(")"):
1402                            if base is not None:
1403                                value = "url(%s)" % (base/value[4:-1])
1404                            prop.cssValue.seq[i] = value
1405
1406    def _doimport(self, parentsheet, base):
1407        for rule in parentsheet.cssRules:
1408            if rule.type == css.CSSRule.IMPORT_RULE:
1409                href = url.URL(rule.href)
1410                if base is not None:
1411                    href = base/href
1412                media = rule.media
1413                with contextlib.closing(href.open("rb")) as r:
1414                    href = r.finalurl()
1415                    text = r.read()
1416                sheet = css.CSSStyleSheet(href=str(href), media=media, parentStyleSheet=parentsheet)
1417                sheet.cssText = text
1418                for rule in self._doimport(sheet, href):
1419                    yield rule
1420            elif rule.type == css.CSSRule.STYLE_RULE:
1421                self._fixurl(rule, base)
1422                yield rule
1423
1424    def __iter__(self):
1425        import cssutils
1426        for cssnode in self.node.walknode(self._isstyle):
1427            if isinstance(cssnode, style):
1428                stylesheet = cssutils.parseString(unicode(cssnode.content))
1429                if self.base is not None:
1430                    stylesheet.href = str(self.base)
1431                for rule in self._doimport(stylesheet, self.base):
1432                    yield rule
1433            else: # link
1434                if "href" in cssnode.attrs:
1435                    href = cssnode.attrs.href.asURL()
1436                    if self.base is not None:
1437                        href = self.base/href
1438                    with contextlib.closing(href.open("rb")) as r:
1439                        s = r.read()
1440                    stylesheet = cssutils.parseString(unicode(s))
1441                    stylesheet.href = str(href)
1442                    for rule in self._doimport(stylesheet, href):
1443                        yield rule
1444
1445
[2520]1446# Parameter entities defined in the DTD
1447pe_special_extra = (object, embed, applet, img, map, iframe) # embed is deprecated
1448pe_special_basic = (br, span, bdo)
1449pe_special = pe_special_basic + pe_special_extra
1450pe_fontstyle_extra = (big, small, font, basefont)
1451pe_fontstyle_basic = (tt, i, b, u, s, strike)
1452pe_fontstyle = pe_fontstyle_basic + pe_fontstyle_extra
1453pe_phrase_extra = (sub, sup)
1454pe_phrase_basic = (em, strong, dfn, code, q, samp, kbd, var, cite, abbr, acronym)
1455pe_phrase = pe_phrase_basic + pe_phrase_extra
1456pe_inline_forms = (input, select, textarea, label, button)
1457pe_misc_inline = (ins, del_, script)
1458pe_misc = (noscript,) + pe_misc_inline
1459pe_inline = (a,) + pe_special + pe_fontstyle + pe_phrase + pe_inline_forms
1460pe_Inline = pe_inline + pe_misc_inline
1461pe_heading = (h1, h2, h3, h4, h5, h6)
1462pe_lists = (ul, ol, dl, menu, dir)
1463pe_blocktext = (pre, hr, blockquote, address, center, noframes)
1464pe_block = (p,) + pe_heading + (div,) + pe_lists + pe_blocktext + (isindex, fieldset, table)
1465pe_Flow = pe_block + (form,) + pe_inline + pe_misc
1466
1467
1468base.model = \
1469meta.model = \
1470link.model = \
1471hr.model = \
1472br.model = \
1473basefont.model = \
1474param.model = \
1475img.model = \
1476area.model = \
1477input.model = \
1478isindex.model = \
1479col.model = \
1480frame.model = sims.Empty()
1481noscript.model = \
1482iframe.model = \
1483body.model = \
1484div.model = \
1485li.model = \
1486dd.model = \
1487blockquote.model = \
1488center.model = \
1489ins.model = \
1490del_.model = \
1491th.model = \
1492td.model = \
1493nobr.model = sims.ElementsOrText(*pe_Flow)
1494p.model = \
1495h1.model = \
1496h2.model = \
1497h3.model = \
1498h4.model = \
1499h5.model = \
1500h6.model = \
1501dt.model = \
1502span.model = \
1503bdo.model = \
1504em.model = \
1505strong.model = \
1506dfn.model = \
1507code.model = \
1508samp.model = \
1509kbd.model = \
1510var.model = \
1511cite.model = \
1512abbr.model = \
1513acronym.model = \
1514q.model = \
1515sub.model = \
1516sup.model = \
1517tt.model = \
1518i.model = \
1519b.model = \
1520big.model = \
1521small.model = \
1522u.model = \
1523s.model = \
1524strike.model = \
1525font.model = \
1526label.model = \
1527legend.model = \
1528caption.model = sims.ElementsOrText(*pe_Inline)
1529ul.model = \
1530ol.model = \
1531menu.model = \
1532dir.model = sims.Elements(li)
1533title.model = \
1534style.model = \
1535script.model = \
1536option.model = \
1537textarea.model = sims.NoElements()
1538object.model = \
1539applet.model = \
1540embed.model = sims.ElementsOrText(*((param,) + pe_block + (form,) + pe_inline + pe_misc))
1541thead.model = \
1542tfoot.model = \
1543tbody.model = sims.Elements(tr)
1544map.model = sims.Elements(*(pe_block + (form,) + pe_misc + (area,)))
1545noframes.model = sims.Elements(body)
1546table.model = sims.Elements(caption, col, colgroup, thead, tfoot, tbody, tr)
1547colgroup.model = sims.Elements(col)
1548dl.model = sims.Elements(dt, dd)
1549frameset.model = sims.Elements(frameset, frame, noframes)
1550html.model = sims.Elements(head, body, frameset)
1551select.model = sims.Elements(optgroup, option)
1552optgroup.model = sims.Elements(option)
1553tr.model = sims.Elements(th, td)
1554head.model = sims.Elements(title, base, script, style, meta, link, object, isindex)
1555pre.model = sims.ElementsOrText(*((a,) + pe_special_basic + pe_fontstyle_basic + pe_phrase_basic + pe_inline_forms + pe_misc_inline))
1556fieldset.model = sims.ElementsOrText(*((legend,) + pe_block + (form,) + pe_inline + pe_misc))
1557button.model = sims.ElementsOrText(*((p,) + pe_heading + (div,) + pe_lists + pe_blocktext + (table, br, span, bdo, object, applet, img, map) + pe_fontstyle + pe_phrase + pe_misc))
1558form.model = sims.ElementsOrText(*(pe_block + pe_inline + pe_misc))
1559address.model = sims.ElementsOrText(*(pe_inline + pe_misc_inline + (p,)))
1560a.model = sims.ElementsOrText(*(pe_special + pe_fontstyle + pe_phrase + pe_inline_forms + pe_misc_inline))
Note: See TracBrowser for help on using the browser.