summaryrefslogtreecommitdiff
path: root/pypers/doctest_talk/maketalk.py
diff options
context:
space:
mode:
Diffstat (limited to 'pypers/doctest_talk/maketalk.py')
-rwxr-xr-xpypers/doctest_talk/maketalk.py179
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])