annotate markup/markup.py @ 0:5b6f8024e177

initial commit
author Jeff Hammel <k0scist@gmail.com>
date Tue, 03 Nov 2020 13:01:49 -0800
parents
children e27d57e7722e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
1 from cStringIO import StringIO
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
2
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
3 def HTMLmarkup(tag, text=None, **attributes):
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
4 """
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
5 markups the text with the tag and
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
6 attributes
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
7 """
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
8
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
9 # ideally, this woulod be cached for cascading calls
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
10 s = StringIO()
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
11
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
12 s.write('<%s' % tag)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
13 for attribute, value in attributes.items():
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
14 if value is None:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
15 s.write(' %s' % attribute)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
16 else:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
17 s.write(' %s="%s"' % (attribute, value))
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
18
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
19 if text:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
20 if tag in block_level:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
21 s.write('>\n%s\n</%s>' % (text, tag))
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
22 else:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
23 s.write('>%s</%s>' % (text, tag))
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
24 else:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
25 s.write('/>')
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
26 return s.getvalue()
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
27
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
28 tags = [ 'a',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
29 'b', 'body', 'br',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
30 'center',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
31 'dd', 'div', 'dl', 'dt', 'em',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
32 'form',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
33 'h1', 'h2', 'h3', 'head', 'html',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
34 'i', 'img', 'input',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
35 'li', 'lh',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
36 'ol', 'option',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
37 'p',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
38 'select', 'span', 'strong',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
39 'table', 'td', 'textarea', 'th', 'title', 'tr',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
40 'ul',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
41 ]
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
42
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
43 for _i in tags:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
44 globals()[_i] = lambda x=None, _i=_i, **y: HTMLmarkup(_i, x, **y)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
45
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
46 # block-level elements
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
47 # from http://htmlhelp.com/reference/html40/block.html
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
48 block_level = set(['address',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
49 'blockquote',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
50 'center',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
51 'dir', 'div', 'dl',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
52 'fieldset', 'form',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
53 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
54 'isindex',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
55 'menu',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
56 'noframes', 'noscript',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
57 'ol',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
58 'p', 'pre',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
59 'table',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
60 'ul',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
61 # not really block level, but act like it is
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
62 'body',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
63 'dd', 'dt',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
64 'frameset',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
65 'head', 'html',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
66 'iframe',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
67 'tbody', 'tfoot', 'th', 'thead', 'tr'])
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
68
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
69 ### front ends to tags to make our lives easier
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
70 ### these don't stomp on tags -- they're just front ends
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
71 ### (these should go in a separate file)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
72
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
73 def image(src, **attributes):
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
74 attributes['src'] = src
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
75 return img(**attributes)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
76
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
77 def link(location, description=None, **attributes):
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
78 if description is None:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
79 description = location
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
80 attributes['href'] = location
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
81 return a(description, **attributes)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
82
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
83 def listify(items, ordered=False, **attributes):
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
84 """
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
85 return a HTML list of iterable items
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
86 * ordered: whether the list is a <ol> (True) or an <ul> (False)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
87 * item_attributes: attributes applied to each list item
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
88 """
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
89
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
90 # type of list
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
91 if ordered:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
92 func = ol
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
93 else:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
94 func = ul
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
95
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
96 item_attributes = attributes.pop('item_attributes', {})
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
97 listitems = [ li(item, **item_attributes) for item in items ]
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
98 return func('\n'.join(listitems), **attributes)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
99
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
100 def definition_list(items, header=None, **attributes):
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
101 """definition list
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
102 items can be a dictionary or a list of 2-tuples"""
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
103 # XXX no attributes for header, dts, dds (yet)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
104
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
105 if header is None:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
106 header = '',
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
107 else:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
108 header = '%s\n' % lh(header)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
109
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
110 # convert dicts to lists of 2-tuples
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
111 if hasattr(items, 'items'):
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
112 items = items.items()
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
113
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
114 items = [ dt(term) + dd(definition) for term, definition in items ]
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
115 return dl(('\n%s%s\n' % ( header, '\n'.join(items))), **attributes)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
116
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
117 def tablify(rows, header=False, item_attributes=None,
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
118 **attributes):
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
119 """return an HTML table from a iterable of iterable rows"""
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
120
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
121 if item_attributes is None:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
122 item_attributes = {}
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
123
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
124 retval = []
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
125 if header:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
126 markup = th
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
127 else:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
128 markup = td
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
129
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
130 for row in rows:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
131 retval.append('\n'.join([markup(str(item)) for item in row]))
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
132 markup = td
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
133
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
134 return table('\n\n'.join([tr(row) for row in retval]))
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
135
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
136 def wrap(string, pagetitle=None, stylesheets=(), icon=None, head_markup=()):
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
137 """wrap a string in a webpage"""
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
138
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
139 _head = ''
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
140 if pagetitle:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
141 _head += title(pagetitle)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
142 rel = 'stylesheet'
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
143 for i in stylesheets:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
144 attributes = dict(rel=rel,
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
145 type='text/css')
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
146 if hasattr(i, '__iter__'):
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
147 # assume a 2-tuple
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
148 attributes['href'] = i[0]
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
149 attributes['title'] = i[1]
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
150 else:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
151 attributes['href'] = i
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
152 _head += '\n' + HTMLmarkup('link', None, **attributes)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
153 rel = 'alternate stylesheet' # first stylesheet is default
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
154 if icon:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
155 _head += '\n' + HTMLmarkup('link', None, href=icon)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
156
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
157 if head_markup:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
158 # additional markup for <head>
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
159 if isinstance(head_markup, basestring):
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
160 _head += '\n' + head_markup
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
161 else:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
162 for item in head_markup:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
163 _head += '\n' + item
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
164 if _head:
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
165 _head = head(_head)
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
166
5b6f8024e177 initial commit
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
167 return html('%s\n\n%s' % ( _head, body(string) ) )