from cgi import escape from urllib import quote import re from .formats import BaseFormat, placeholder from .tokens import * _absolute_url_pattern = re.compile(r'^/|^\w+:/') HTML_SIZES = { -4: '6pt', -3: '8pt', -2: '9pt', -1: '10pt', 0: '12pt', 1: '14pt', 2: '18pt', 3: '24pt', 4: '30pt', 5: '36pt' } def make_absolute(url): #if isinstance(url,unicode): # url = url.encode('utf-8') # We trust the URL to have been made valid at a higher layer. # u = quote(url, '/:~#') assert '"' not in url, url if not _absolute_url_pattern.match(url): url = './'+url return url class HTMLFormat(BaseFormat): def __init__(self): self.pclass = None def text(self, text): yield escape(text) def tag(self, t, arg=None): if t == BOLD: return u'b' elif t == ITALIC: return u'i' elif t == MONOSPACE: return u'tt' elif t == SUPERSCRIPT: return u'sup' elif t == SUBSCRIPT: return u'sub' elif t == UNDERLINE: return u'u' elif t == STRIKE: return u'strike' elif t == CODEBLOCK: return u'pre' elif t == HEADING: return u'h%s' % (arg,) elif t == TABLE_HEADING: return u'th' elif t == CENTER: return u'center' else: assert False, t LISTMAP = {ORDERED: 'ol', UNORDERED: 'ul', BLOCKQUOTE: 'blockquote'} def start(self, t, arg=None): if t in self.LISTMAP: tag = self.LISTMAP[t] start = (arg * 2 - 2) * ' ' yield u'%s<%s>\n' % (start, tag) elif t in (ORDERED_ITEM, UNORDERED_ITEM): yield '%s
' elif t == TABLE: yield u'
| ' % argbit
elif t == FOOTNOTE:
yield u''
elif t == RIGHT:
yield u' ' elif t == NOINDENT: yield u' ' elif t == SIZE: yield u'' % HTML_SIZES[arg] elif t == ERROR: yield u'' else: yield u'<%s>' % self.tag(t, arg) def end(self, t, arg=None): if t in self.LISTMAP: tag = self.LISTMAP[t] start = (arg * 2 - 2) * ' ' if arg > 1: end = '\n' else: end = '' yield u'%s%s>%s' % (start, tag, end) elif t in (ORDERED_ITEM, UNORDERED_ITEM): yield '\n' elif t == BLOCKQUOTE_LINE: yield '\n' elif t == LINK: yield u'' elif t == IMAGE: yield u'">' elif t == PARAGRAPH: self.pclass = None yield u' ' elif t == TABLE: yield u' |