Mercurial > hg > markup
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/markup/markup.py Tue Nov 03 13:01:49 2020 -0800 @@ -0,0 +1,167 @@ +from cStringIO import StringIO + +def HTMLmarkup(tag, text=None, **attributes): + """ + markups the text with the tag and + attributes + """ + + # ideally, this woulod be cached for cascading calls + s = StringIO() + + s.write('<%s' % tag) + for attribute, value in attributes.items(): + if value is None: + s.write(' %s' % attribute) + else: + s.write(' %s="%s"' % (attribute, value)) + + if text: + if tag in block_level: + s.write('>\n%s\n</%s>' % (text, tag)) + else: + s.write('>%s</%s>' % (text, tag)) + else: + s.write('/>') + return s.getvalue() + +tags = [ 'a', + 'b', 'body', 'br', + 'center', + 'dd', 'div', 'dl', 'dt', 'em', + 'form', + 'h1', 'h2', 'h3', 'head', 'html', + 'i', 'img', 'input', + 'li', 'lh', + 'ol', 'option', + 'p', + 'select', 'span', 'strong', + 'table', 'td', 'textarea', 'th', 'title', 'tr', + 'ul', + ] + +for _i in tags: + globals()[_i] = lambda x=None, _i=_i, **y: HTMLmarkup(_i, x, **y) + +# block-level elements +# from http://htmlhelp.com/reference/html40/block.html +block_level = set(['address', + 'blockquote', + 'center', + 'dir', 'div', 'dl', + 'fieldset', 'form', + 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', + 'isindex', + 'menu', + 'noframes', 'noscript', + 'ol', + 'p', 'pre', + 'table', + 'ul', + # not really block level, but act like it is + 'body', + 'dd', 'dt', + 'frameset', + 'head', 'html', + 'iframe', + 'tbody', 'tfoot', 'th', 'thead', 'tr']) + +### front ends to tags to make our lives easier +### these don't stomp on tags -- they're just front ends +### (these should go in a separate file) + +def image(src, **attributes): + attributes['src'] = src + return img(**attributes) + +def link(location, description=None, **attributes): + if description is None: + description = location + attributes['href'] = location + return a(description, **attributes) + +def listify(items, ordered=False, **attributes): + """ + return a HTML list of iterable items + * ordered: whether the list is a <ol> (True) or an <ul> (False) + * item_attributes: attributes applied to each list item + """ + + # type of list + if ordered: + func = ol + else: + func = ul + + item_attributes = attributes.pop('item_attributes', {}) + listitems = [ li(item, **item_attributes) for item in items ] + return func('\n'.join(listitems), **attributes) + +def definition_list(items, header=None, **attributes): + """definition list + items can be a dictionary or a list of 2-tuples""" + # XXX no attributes for header, dts, dds (yet) + + if header is None: + header = '', + else: + header = '%s\n' % lh(header) + + # convert dicts to lists of 2-tuples + if hasattr(items, 'items'): + items = items.items() + + items = [ dt(term) + dd(definition) for term, definition in items ] + return dl(('\n%s%s\n' % ( header, '\n'.join(items))), **attributes) + +def tablify(rows, header=False, item_attributes=None, + **attributes): + """return an HTML table from a iterable of iterable rows""" + + if item_attributes is None: + item_attributes = {} + + retval = [] + if header: + markup = th + else: + markup = td + + for row in rows: + retval.append('\n'.join([markup(str(item)) for item in row])) + markup = td + + return table('\n\n'.join([tr(row) for row in retval])) + +def wrap(string, pagetitle=None, stylesheets=(), icon=None, head_markup=()): + """wrap a string in a webpage""" + + _head = '' + if pagetitle: + _head += title(pagetitle) + rel = 'stylesheet' + for i in stylesheets: + attributes = dict(rel=rel, + type='text/css') + if hasattr(i, '__iter__'): + # assume a 2-tuple + attributes['href'] = i[0] + attributes['title'] = i[1] + else: + attributes['href'] = i + _head += '\n' + HTMLmarkup('link', None, **attributes) + rel = 'alternate stylesheet' # first stylesheet is default + if icon: + _head += '\n' + HTMLmarkup('link', None, href=icon) + + if head_markup: + # additional markup for <head> + if isinstance(head_markup, basestring): + _head += '\n' + head_markup + else: + for item in head_markup: + _head += '\n' + item + if _head: + _head = head(_head) + + return html('%s\n\n%s' % ( _head, body(string) ) )