root/livinglogic.python.xist/src/ll/xist/ns/htmlspecials.py @ 3109:55f21964e0a3

Revision 3109:55f21964e0a3, 9.0 KB (checked in by Walter Doerwald <walter@…>, 12 years ago)

Add docformat.

Line 
1# -*- coding: utf-8 -*-
2
3## Copyright 1999-2008 by LivingLogic AG, Bayreuth/Germany
4## Copyright 1999-2008 by Walter Dörwald
5##
6## All Rights Reserved
7##
8## See xist/__init__.py for the license
9
10
11"""
12<par>An &xist; module that contains a collection of useful elements for
13generating &html;.</par>
14"""
15
16
17import sys, types, time as time_, string, warnings
18
19from ll.xist import xsc, parsers, sims
20from ll.xist.ns import ihtml, html, meta, specials
21
22
23__docformat__ = "xist"
24
25
26xmlns = "http://xmlns.livinglogic.de/xist/ns/htmlspecials"
27
28
29class plaintable(html.table):
30    """
31    <par>a &html; table where the values of the attributes <lit>cellpadding</lit>,
32    <lit>cellspacing</lit> and <lit>border</lit> default to <lit>0</lit>.</par>
33    """
34    xmlns = xmlns
35    class Attrs(html.table.Attrs):
36        class cellpadding(html.table.Attrs.cellpadding):
37            default = 0
38        class cellspacing(html.table.Attrs.cellspacing):
39            default = 0
40        class border(html.table.Attrs.border):
41            default = 0
42
43    def convert(self, converter):
44        e = html.table(self.content, self.attrs)
45        return e.convert(converter)
46
47
48class plainbody(html.body):
49    """
50    <par>a &html; body where the attributes <lit>leftmargin</lit>, <lit>topmargin</lit>,
51    <lit>marginheight</lit> and <lit>marginwidth</lit> default to <lit>0</lit>.</par>
52    """
53    xmlns = xmlns
54    class Attrs(html.body.Attrs):
55        class leftmargin(html.body.Attrs.leftmargin):
56            default = 0
57        class topmargin(html.body.Attrs.topmargin):
58            default = 0
59        class marginheight(html.body.Attrs.marginheight):
60            default = 0
61        class marginwidth(html.body.Attrs.marginwidth):
62            default = 0
63
64    def convert(self, converter):
65        e = html.body(self.content, self.attrs)
66        return e.convert(converter)
67
68
69class _pixelbase(html.img):
70    xmlns = xmlns
71    class Context(html.img.Context):
72        def __init__(self):
73            self.src = "root:px/spc.gif"
74
75    class Attrs(html.img.Attrs):
76        class color(xsc.TextAttr):
77            """
78            The pixel color as a &css; value. Leave it blank to get a transparent
79            pixel.
80            """
81
82        class alt(html.img.Attrs.alt):
83            default = ""
84
85
86class pixel(_pixelbase):
87    """
88    <par>element for single transparent pixel image.</par>
89   
90    <par>You can specify the pixel color via the <lit>color</lit>
91    attribute (which will set the background-color in the style attribute.</par>
92
93    <par>In addition to that you can specify width and height attributes
94    (and every other allowed attribute for the <class>img</class> element)
95    as usual.</par>
96    """
97    xmlns = xmlns
98    class Attrs(_pixelbase.Attrs):
99        class width(_pixelbase.Attrs.width):
100            default = 1
101        class height(_pixelbase.Attrs.height):
102            default = 1
103
104    def convert(self, converter):
105        if self.attrs.src:
106            src = self.attrs.src
107        else:
108            src = converter[self].src
109        if self.attrs.color:
110            style = ["background-color: ", self.attrs.color, ";"]
111            if self.attrs.style:
112                style.append(" ")
113                style.append(self.attrs.style)
114        else:
115            style = self.attrs.style
116        e = converter.target.img(
117            self.attrs.withoutnames(u"color"),
118            style=style,
119            src=src,
120        )
121        return e.convert(converter)
122
123
124class autoimg(html.img):
125    """
126    <par>An image were width and height attributes are automatically generated.</par>
127   
128    <par>If the attributes are already there, they won't be modified.</par>
129    """
130    xmlns = xmlns
131    def convert(self, converter):
132        target = converter.target
133        if target.xmlns in (ihtml.xmlns, html.xmlns):
134            e = target.img(self.attrs.convert(converter))
135        else:
136            raise ValueError("unknown conversion target %r" % target)
137        src = self[u"src"].convert(converter).forInput(converter.root)
138        e._addimagesizeattributes(src, u"width", u"height")
139        return e
140
141
142class autopixel(_pixelbase):
143    """
144    <par>A pixel image were width and height attributes are automatically generated.</par>
145   
146    <par>This works like <pyref class="pixel"><class>pixel</class></pyref> but the
147    size is <z>inherited</z> from the image specified via the <lit>src</lit> attribute.</par>
148    """
149    xmlns = xmlns
150    def convert(self, converter):
151        target = converter.target
152        if not issubclass(target, (ihtml, html)):
153            raise ValueError("unknown conversion target %r" % target)
154        e = target.img(self.attrs.withoutnames(u"color"))
155        src = self.attrs.src.convert(converter).forInput(converter.root)
156        e._addimagesizeattributes(src, u"width", u"height")
157        e.attrs.src = converter[self].src
158        return e
159
160
161class autoinput(html.input):
162    """
163    <par>Extends <pyref module="ll.xist.ns.html" class="input"><class>input</class></pyref>
164    with the ability to automatically set the size, if this element
165    has <lit>type=="image"</lit>.</par>
166    """
167    xmlns = xmlns
168    def convert(self, converter):
169        target = converter.target
170        e = target.input(self.content, self.attrs)
171        if u"type" in self.attrs and unicode(self[u"type"].convert(converter)) == u"image":
172            src = self[u"src"].convert(converter).forInput(converter.root)
173            e._addimagesizeattributes(src, u"size", None) # no height
174        return e.convert(converter)
175
176
177class redirectpage(xsc.Element):
178    xmlns = xmlns
179    model = sims.Empty()
180    class Attrs(xsc.Element.Attrs):
181        class href(xsc.URLAttr): required = True
182
183    langs = {
184        "en": (u"Redirection to ", u"Your browser doesn't understand redirects. This page has been redirected to "),
185        "de": (u"Weiterleitung auf ", u"Ihr Browser unterstÃŒtzt keine Weiterleitung. Diese Seite wurde weitergeleitet auf ")
186    }
187
188    def convert(self, converter):
189        target = converter.target
190        (title, text) = self.langs.get(converter.lang, self.langs[u"en"])
191        url = self[u"href"]
192        e = target.html(
193            target.head(
194                meta.contenttype(),
195                target.title(title, url)
196            ),
197            target.body(
198                text, target.a(url, href=url)
199            )
200        )
201        return e.convert(converter)
202
203
204class javascript(html.script):
205    """
206    <par>can be used for javascript.</par>
207    """
208    xmlns = xmlns
209    class Attrs(html.script.Attrs):
210        language = None
211        type = None
212
213    def convert(self, converter):
214        target = converter.target
215        e = target.script(self.content, self.attrs, language=u"javascript", type=u"text/javascript")
216        return e.convert(converter)
217
218
219class flash(xsc.Element):
220    xmlns = xmlns
221    model = sims.Empty()
222    class Attrs(xsc.Element.Attrs):
223        class src(xsc.URLAttr): required = True
224        class width(xsc.IntAttr): required = True
225        class height(xsc.IntAttr): required = True
226        class quality(xsc.TextAttr): default = u"high"
227        class bgcolor(xsc.ColorAttr): pass
228
229    def convert(self, converter):
230        target = converter.target
231        e = target.object(
232            target.param(name=u"movie", value=self[u"src"]),
233            target.embed(
234                src=self[u"src"],
235                quality=self[u"quality"],
236                bgcolor=self[u"bgcolor"],
237                width=self[u"width"],
238                height=self[u"height"],
239                type=u"application/x-shockwave-flash",
240                pluginspage=u"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"
241            ),
242            classid=u"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
243            codebase=u"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0",
244            width=self[u"width"],
245            height=self[u"height"]
246        )
247
248        # copy optional attributes
249        for attrname in (u"quality", u"bgcolor"):
250            if attrname in self.attrs:
251                e.insert(0, target.param(name=attrname, value=self[attrname]))
252
253        return e.convert(converter)
254
255
256class quicktime(xsc.Element):
257    xmlns = xmlns
258    model = sims.Empty()
259    class Attrs(xsc.Element.Attrs):
260        class src(xsc.URLAttr): required = True
261        class href(xsc.URLAttr): pass
262        class target(xsc.TextAttr): pass
263        class width(xsc.IntAttr): required = True
264        class height(xsc.IntAttr): required = True
265        class bgcolor(xsc.ColorAttr): pass
266        class controller(xsc.ColorAttr): values = (u"true", u"false")
267        class autoplay(xsc.ColorAttr): values = (u"true", u"false")
268        class border(xsc.IntAttr): pass
269
270    def convert(self, converter):
271        target = converter.target
272        e = target.object(
273            target.param(name=u"src", value=self[u"src"]),
274            target.param(name=u"type", value=u"video/quicktime"),
275            target.param(name=u"pluginspage", value=u"http://www.apple.com/quicktime/download/indext.html"),
276            target.embed(
277                src=self[u"src"],
278                href=self[u"href"],
279                target=self[u"target"],
280                bgcolor=self[u"bgcolor"],
281                width=self[u"width"],
282                height=self[u"height"],
283                type=u"video/quicktime",
284                border=self[u"border"],
285                pluginspage=u"http://www.apple.com/quicktime/download/indext.html"
286            ),
287            classid=u"clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B",
288            codebase=u"http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0",
289            width=self[u"width"],
290            height=self[u"height"]
291        )
292
293        # copy optional attributes
294        for attrname in (u"href", u"target", u"bgcolor", u"controller", u"autoplay"):
295            if attrname in self.attrs:
296                e.insert(0, target.param(name=attrname, value=self[attrname]))
297
298        return e.convert(converter)
299
300
301class ImgAttrDecorator(specials.AttrDecorator):
302    xmlns = xmlns
303    class Attrs(html.img.Attrs):
304        pass
305    idecoratable = (html.img,)
306
307
308class InputAttrDecorator(specials.AttrDecorator):
309    xmlns = xmlns
310    class Attrs(html.input.Attrs):
311        pass
312    decoratable = (html.input,)
313
314
315class FormAttrDecorator(specials.AttrDecorator):
316    xmlns = xmlns
317    class Attrs(html.form.Attrs):
318        pass
319    decoratable = (html.form,)
320
321
322class TextAreaAttrDecorator(specials.AttrDecorator):
323    xmlns = xmlns
324    class Attrs(html.textarea.Attrs):
325        pass
326    decoratable = (html.textarea,)
Note: See TracBrowser for help on using the browser.