root/livinglogic.python.xist/test/test_dtd2xsc.py @ 2590:7b6bba35f3a0

Revision 2590:7b6bba35f3a0, 5.3 KB (checked in by Walter Doerwald <walter@…>, 13 years ago)

htmlspecials.pixel() now no longer uses colored pixels, instead color is
done via CSS. The URL for the one remaining transparent pixel can now be
specified via src (either as an XML attribute or via the converter context).

Rename attrs methods with() and without() to withnames() and withoutnames()
(for Python 2.5 compatibility).

Use elinks instead of w3m for asText() and move/rename this method to a
function ll.xist.ns.html.astext().

Try to make XIST independent from PyXML (however PyXML is still required
for parsing via expat and for dtd2xsc.py (because this requires xmlproc)).

Remove the long dperecated method withSep().

Use Py_ssize_t in the C source where appropriate.

Line 
1#! /usr/bin/env/python
2# -*- coding: iso-8859-1 -*-
3
4## Copyright 1999-2006 by LivingLogic AG, Bayreuth/Germany.
5## Copyright 1999-2006 by Walter Dörwald
6##
7## All Rights Reserved
8##
9## See xist/__init__.py for the license
10
11
12from ll.xist import xsc, xnd, sims
13
14
15def dtd2ns(s, xmlname, xmlurl=None, shareattrs=None):
16    from xml.parsers.xmlproc import dtdparser
17
18    dtd = dtdparser.load_dtd_string(s)
19    data = xnd.fromdtd(dtd, xmlname=xmlname, xmlurl=xmlurl)
20
21    if shareattrs is not None:
22        data.shareattrs(shareattrs)
23
24    mod = {"__name__": xmlname}
25    encoding = "iso-8859-1"
26    code = data.aspy(encoding=encoding, asmod=False).encode(encoding)
27    exec code in mod
28
29    return mod["__ns__"]
30
31
32def test_convert():
33    dtdstring = """<?xml version='1.0' encoding='us-ascii'?>
34    <!ELEMENT foo (bar+)>
35    <!ATTLIST foo
36        id    ID    #IMPLIED
37        xmlns CDATA #FIXED "http://xmlns.foo.com/foo"
38    >
39    <!ELEMENT bar EMPTY>
40    <!ATTLIST bar
41        bar1 CDATA               #REQUIRED
42        bar2 (bar2)              #IMPLIED
43        bar3 (bar3a|bar3b|bar3c) #IMPLIED
44        bar-4 (bar-4a|bar-4b)    #IMPLIED
45        bar_4 (bar_4a|bar_4b)    #IMPLIED
46        bar_42 (bar_42a|bar_42b) #IMPLIED
47        class CDATA              #IMPLIED
48        foo:bar CDATA            #IMPLIED
49    >
50    """
51    ns = dtd2ns(dtdstring, "foo")
52
53    assert issubclass(ns, xsc.Namespace)
54    assert ns.xmlname == "foo"
55    assert ns.xmlurl == "http://xmlns.foo.com/foo"
56    assert isinstance(ns.foo.model, sims.Elements)
57    assert len(ns.foo.model.elements) == 1
58    assert ns.foo.model.elements[0] == ns.bar
59    assert issubclass(ns.foo.Attrs.id, xsc.IDAttr)
60    assert "xmlns" not in ns.foo.Attrs
61    assert isinstance(ns.bar.model, sims.Empty)
62
63    assert "bar" not in ns.bar.Attrs
64
65    assert issubclass(ns.bar.Attrs.bar1, xsc.TextAttr)
66    assert ns.bar.Attrs.bar1.required == True
67
68    assert issubclass(ns.bar.Attrs.bar2, xsc.BoolAttr)
69    assert ns.bar.Attrs.bar2.required == False
70
71    assert issubclass(ns.bar.Attrs.bar3, xsc.TextAttr)
72    assert ns.bar.Attrs.bar3.required == False
73    assert ns.bar.Attrs.bar3.values == ("bar3a", "bar3b", "bar3c")
74
75    # Attributes are alphabetically sorted
76    assert issubclass(ns.bar.Attrs.bar_4, xsc.TextAttr)
77    assert ns.bar.Attrs.bar_4.xmlname == "bar-4"
78    assert ns.bar.Attrs.bar_4.values == ("bar-4a", "bar-4b")
79
80    assert issubclass(ns.bar.Attrs.bar_42, xsc.TextAttr)
81    assert ns.bar.Attrs.bar_42.xmlname == "bar_4"
82    assert ns.bar.Attrs.bar_42.values == ("bar_4a", "bar_4b")
83
84    assert issubclass(ns.bar.Attrs.bar_422, xsc.TextAttr)
85    assert ns.bar.Attrs.bar_422.xmlname == "bar_42"
86    assert ns.bar.Attrs.bar_422.values == ("bar_42a", "bar_42b")
87
88
89def test_charref():
90    dtdstring = """<?xml version='1.0' encoding='us-ascii'?>
91    <!ELEMENT foo (EMPTY)>
92    <!ENTITY bar "&#xff;">
93    """
94    ns = dtd2ns(dtdstring, "foo")
95
96    assert ns.bar.codepoint == 0xff
97
98
99def test_keyword():
100    dtdstring = """<?xml version='1.0' encoding='us-ascii'?>
101    <!ELEMENT foo EMPTY>
102    <!ATTLIST foo
103        class CDATA              #IMPLIED
104    >
105    """
106    ns = dtd2ns(dtdstring, "foo")
107    assert issubclass(ns.foo.Attrs.class_, xsc.TextAttr)
108    assert ns.foo.Attrs.class_.__name__ == "class_"
109    assert ns.foo.Attrs.class_.xmlname == u"class"
110
111
112def test_quotes():
113    dtdstring = """<?xml version='1.0' encoding='us-ascii'?>
114    <!ELEMENT foo EMPTY>
115    """
116    ns = dtd2ns(dtdstring, "foo", xmlurl='"')
117    assert ns.xmlurl == '"'
118
119
120def test_unicode():
121    dtdstring = """<?xml version='1.0' encoding='us-ascii'?>
122    <!ELEMENT foo EMPTY>
123    """
124    ns = dtd2ns(dtdstring, "foo", xmlurl=u'\u3042')
125    assert ns.xmlurl == u'\u3042'
126
127
128def test_unicodequotes():
129    dtdstring = """<?xml version='1.0' encoding='us-ascii'?>
130    <!ELEMENT foo EMPTY>
131    """
132    ns = dtd2ns(dtdstring, "foo", xmlurl=u'"\u3042"')
133    assert ns.xmlurl == u'"\u3042"'
134
135
136def test_badelementname():
137    dtdstring = """<?xml version='1.0' encoding='us-ascii'?>
138    <!ELEMENT class EMPTY>
139    """
140    ns = dtd2ns(dtdstring, "foo")
141    assert issubclass(ns.class_, xsc.Element)
142
143
144def test_shareattrsnone():
145    dtdstring = """<?xml version='1.0' encoding='us-ascii'?>
146    <!ELEMENT foo (bar)>
147    <!ATTLIST foo
148        baz CDATA              #IMPLIED
149    >
150    <!ELEMENT bar EMPTY>
151    <!ATTLIST bar
152        baz CDATA              #IMPLIED
153    >
154    """
155    ns = dtd2ns(dtdstring, "foo", shareattrs=None)
156    assert not hasattr(ns, "baz")
157
158
159def test_shareattrsdupes():
160    dtdstring = """<?xml version='1.0' encoding='us-ascii'?>
161    <!ELEMENT foo (bar)>
162    <!ATTLIST foo
163        baz  CDATA             #IMPLIED
164        baz2 CDATA             #IMPLIED
165    >
166    <!ELEMENT bar EMPTY>
167    <!ATTLIST bar
168        baz  CDATA             #IMPLIED
169        baz2 CDATA             #REQUIRED
170    >
171    """
172    ns = dtd2ns(dtdstring, "foo", shareattrs=False)
173    assert issubclass(ns.foo.Attrs.baz, ns.baz.baz)
174    assert issubclass(ns.bar.Attrs.baz, ns.baz.baz)
175    assert not hasattr(ns, "baz2")
176    assert not ns.foo.Attrs.baz2.required
177    assert ns.bar.Attrs.baz2.required
178
179
180def test_shareattrsall():
181    dtdstring = """<?xml version='1.0' encoding='us-ascii'?>
182    <!ELEMENT foo (bar)>
183    <!ATTLIST foo
184        baz  CDATA             #IMPLIED
185        bazz CDATA             #IMPLIED
186    >
187    <!ELEMENT bar EMPTY>
188    <!ATTLIST bar
189        baz  CDATA             #IMPLIED
190        bazz CDATA             #REQUIRED
191    >
192    """
193    ns = dtd2ns(dtdstring, "foo", shareattrs=True)
194    assert issubclass(ns.foo.Attrs.baz, ns.baz.baz)
195    assert issubclass(ns.bar.Attrs.baz, ns.baz.baz)
196
197    assert ns.foo.Attrs.bazz.__bases__[0] is not xsc.TextAttr
198    assert ns.bar.Attrs.bazz.__bases__[0] is not xsc.TextAttr
199    assert ns.foo.Attrs.bazz.__bases__ != ns.bar.Attrs.bazz.__bases__
200
201    assert not ns.foo.Attrs.bazz.required
202    assert ns.bar.Attrs.bazz.required
Note: See TracBrowser for help on using the browser.