diff options
Diffstat (limited to 'pypers/doctest_talk/maketalk.py')
-rwxr-xr-x | pypers/doctest_talk/maketalk.py | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/pypers/doctest_talk/maketalk.py b/pypers/doctest_talk/maketalk.py new file mode 100755 index 0000000..9c03b46 --- /dev/null +++ b/pypers/doctest_talk/maketalk.py @@ -0,0 +1,179 @@ +#!/usr/bin/python +import exc_debugger, webbrowser +from ms.html_utils import makelink +import os, sys, re +INCLUDE = re.compile(r"\n.. include::\s+([\w\./]+)") + +BGCOLOR = "lightblue" +CSS = """ +<STYLE TYPE="text/css"> + body { font-size: 160%; } +</STYLE> +""" + +# used for my doctest talk; poor approach +class TableList(list): + """A table is a list of lists/tuple of the same length. + A table has methods to display itself as plain text and + as HTML. """ + + border = 1 + color = "white" + + def __str__(self): + return self.to_html() + + def to_text(self): + return "\n".join(["\t".join(map(str, t)) for t in self]) + + def _gen_html(self): + """Returns an HTML table as an iterator.""" + yield "\n<table border=%r summary='a table'>\n" % self.border + header = self.header + for row in self: + yield "<tr>\n " + for el in row: + if header: + yield "<th>%s</th> " % el + else: + yield '<td bgcolor="%s">%s</td> ' % \ + (getattr(row, "color", self.color), el) + yield "\n</tr>\n" + header = False + yield "</table>\n" + + def to_html(self, header = False): + """Generates an HTML table.""" + self.header = header + return "".join(self._gen_html()) + + def make(cls, *args, **kw): # convenience factory + ncols = kw.get("ncols", 2) + missingcols = ncols - (len(args) % ncols) + args += ('',) * missingcols # add empty columns to fill the table + table = cls(chop(args, ncols)) + vars(table).update(kw) + return table + make = classmethod(make) + + def row(cls, *args, **kw): # convenience factory + table = cls([args]) + vars(table).update(kw) + return table + row = classmethod(row) + + def col(cls, *args, **kw): # convenience factory + table = cls([(arg,) for arg in args]) + vars(table).update(kw) + return table + col = classmethod(col) + +def testTable(): + t=TableList([ + ['a', 1, 2], + ['b',2, 3], + ['c',2, 3], + ]) + print t.to_html() + print t + +## def testTemplate(): +## @template() +## def hello(name="Unknown"): +## yield "<body>" +## yield "hello $name" +## yield "</body>" +## print hello() +## print hello("Tania") + +## def testT(): +## ciao = "ciao" +## @template() +## def t(nina="nina"): +## yield "$ciao $nina" +## print t() + +class HTMLDocument(list): + def __init__(self, ls = []): + super(HTMLDocument, self).__init__(ls) + self.reorder() + def reorder(self): + """Generates circular 'prev' and 'next' tabs.""" + self.npages = len(self) + self.pageindex = [] + for i, page in enumerate(self): + page.prev = self[i-1].namext + if i == self.npages-1: i = -1 + page.next = self[i+1].namext + page.first = self[0].namext + page.last = self[-1].namext + page.document = self + self.pageindex.append(page) + +class HTMLPage(object): + def __init__(self, id_txt): + self.BGCOLOR = BGCOLOR + id, txt = id_txt + if isinstance(id, int): + self.name = "P%02d" % (id + 1) + else: + self.name = id + self.namext = self.name + ".html" + lines = txt.splitlines() + if lines: # empty page + self.title = lines[0] + self.txt = "\n".join(lines[2:]) + else: + self.title = "" + self.txt = "" + self.txt = "<h1>%s</h1><br/>\n" % self.title + \ + INCLUDE.sub(lambda m: "<pre>%s</pre>" % + file(m.group(1)).read(), self.txt) + self.head = """ + <head> + <meta name="generator" content="Generated by Python"> + <title>%s</title> + %s + </head>""" % (self.name, CSS) + def html(self): + self.body = """\n<body bgcolor="%(BGCOLOR)s">\n + %(txt)s + </body> + """ % vars(self) + return """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> + <html>%s\n</html>""" % (self.head + self.body) + def __str__(self): + box = TableList.make( + makelink(self.next, "Next"), + makelink(self.prev, "Prev"), + makelink(self.first, "First"), + makelink(self.last, "Last"), + makelink(self.namext, self.name), + '', + border = 0, + color = BGCOLOR) + logo = TableList.col( + '<img src = "cjlogo.jpg" alt = "logo">', + border = 0, + color = BGCOLOR) + links = [makelink(page.namext, page.name) + for page in self.document.pageindex] + opts = dict(border = 0, color = BGCOLOR, ncols=2) + index = TableList.make(*links, **opts) + self.txt = str( + TableList.row("<small>%s</small>" % TableList.col(logo, box, index, + border = 0, color = BGCOLOR), + self.txt, border = 0, color = BGCOLOR)) + return self.html() + +def main(fname): + BLANK = re.compile(r"\n\n\n\s*") + chunks = BLANK.split(file(fname).read()) + pages = HTMLDocument(map(HTMLPage, enumerate(chunks))) + for page in pages: + print >> file(page.namext, "w"), page + #os.system("xterm -e elinks P01.html&") + webbrowser.open("file:%s/P01.html" % os.getcwd()) + +if __name__ == "__main__": + main(sys.argv[1]) |