root/livinglogic.python.xist/src/ll/xist/ns/htmlspecials.py @ 3691:4af6e4e1cf02

Revision 3691:4af6e4e1cf02, 8.7 KB (checked in by Walter Doerwald <walter@…>, 11 years ago)

Bump copyright year.

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