1 from zope.interface import implements
2 from nevow import tags, compy, inevow, flat
3 from ldaptor.protocols.ldap import ldapsyntax, distinguishedname
4 from ldaptor import interfaces
5
7 """
8 Render items in a mapping using patterns found in the children
9 of the element.
10
11 Keyvalue recognizes the following patterns:
12
13 - header: Rendered at the start, before the first item. If
14 multiple header patterns are provided they are rendered
15 together in the order they were defined.
16
17 - footer: Just like the header only renderer at the end, after
18 the last item.
19
20 - item: Rendered once for each item in the sequence. Can contain
21 subpatterns key and value.
22
23 If multiple item patterns are provided then the pattern is
24 cycled in the order defined.
25
26 - divider: Rendered once between each item in the
27 sequence. Multiple divider patterns are cycled.
28
29 - empty: Rendered instead of item and divider patterns when the
30 sequence contains no items.
31
32 Example::
33
34 <table nevow:render="sequence" nevow:data="peopleSeq">
35 <tr nevow:pattern="header">
36 <th>name</th>
37 <th>email</th>
38 </tr>
39 <tr nevow:pattern="item" class="odd">
40 <td>name goes here</td>
41 <td>email goes here</td>
42 </tr>
43 <tr nevow:pattern="item" class="even">
44 <td>name goes here</td>
45 <td>email goes here</td>
46 </tr>
47 <tr nevow:pattern="empty">
48 <td colspan="2"><em>they've all gone!</em></td>
49 </tr>
50 </table>
51
52 """
53 headers = context.tag.allPatterns('header')
54 item = context.tag.patternGenerator('item')
55 divider = context.tag.patternGenerator('divider', default=tags.invisible)
56 content = []
57 for key, value in data.items():
58 content.append(item(data=(key, value)))
59 content.append(divider(data=(key, value)))
60 if not content:
61 content = context.tag.allPatterns('empty')
62 else:
63
64 del content[-1]
65 footers = context.tag.allPatterns('footer')
66 return context.tag.clear()[ headers, content, footers ]
67
75
77 implements(inevow.IContainer)
78
80 self.original = original
81
82 - def child(self, context, name):
83 return self.original.get(name, None)
84
86 return self.original.items()
87
89 implements(inevow.IContainer)
90
91 - def __init__(self, original):
92 self.original = original
93
94 - def child(self, context, name):
95 if name == 'dn':
96 return self.original.dn
97 elif name == 'attributes':
98 return _DictLike(self.original)
99 else:
100 return None
101
102 compy.registerAdapter(LDAPEntryContainer, ldapsyntax.LDAPEntryWithClient, inevow.IContainer)
103
105 return flat.serialize(str(original), context)
106
107 flat.registerFlattener(dnSerializer,
108 distinguishedname.DistinguishedName)
109
110 -def entrySerializer(original, context):
111 ul = tags.ul()
112 for a,l in original.items():
113 if len(l)==0:
114 ul[tags.li[a, ': none']]
115 elif len(l)==1:
116 for attr in l:
117 first = attr
118 break
119 ul[tags.li[a, ': ', first]]
120 else:
121 li=tags.li[a, ':']
122 ul[li]
123 liul=tags.ul()
124 li[liul]
125 for i in l:
126 liul[tags.li[i]]
127 return flat.serialize(ul, context)
128
129 flat.registerFlattener(entrySerializer,
130 interfaces.ILDAPEntry)
131
133 """Marker interface for zebra."""
134 pass
135
136 -def zebra(styles=['zebra-odd', 'zebra-even']):
137 """
138 Provide alternating background colors for e.g. zebra tables.
139
140 @param styles: Two or more CSS class names to iterate.
141
142 Use like this::
143
144 render_zebra = weave.zebra()
145
146 <table>
147 <tr nevow:render="zebra"><td>foo</td></tr>
148 <tr nevow:render="zebra"><td>bar</td></tr>
149 <tr nevow:render="zebra"><td>baz</td></tr>
150 </table>
151 """
152 styles = list(styles)
153 def f(self, ctx, data):
154 request = inevow.IRequest(ctx)
155 state = IZebraStyle(request, styles)
156 r = ctx.tag(class_="%s" % state[0])
157 request.setComponent(IZebraStyle, state[1:]+state[:1])
158
159 return r
160 return f
161