resources rework completed
[PyX.git] / www / pt2html.py
blobdebd5602baeffd42a605ec81b30d1058ad4eed0c
1 #!/usr/bin/env python
3 import sys, os, os.path, cgi, StringIO, codecs, glob
4 import keyword, token, tokenize
5 import xml.dom.minidom
6 from zope.pagetemplate.pagetemplatefile import PageTemplateFile
7 import Image
9 sys.path[:0]=[".."]
10 import pyx
12 _KEYWORD = token.NT_OFFSET
14 tokclasses = {token.NUMBER: 'number',
15 token.OP: 'op',
16 token.STRING: 'string',
17 tokenize.COMMENT: 'comment',
18 token.NAME: 'name',
19 _KEYWORD: 'keyword'}
21 class py2html:
23 def __init__(self, input, output):
24 self.output = output
25 self.col = 0
26 self.tokclass = None
27 self.output.write("<pre id=python>")
28 tokenize.tokenize(input.readline, self.tokeneater)
29 if self.tokclass is not None:
30 self.output.write('</span>')
31 self.output.write("</pre>\n")
33 def tokeneater(self, toktype, toktext, (srow, scol), (erow, ecol), line):
34 if toktype == token.ERRORTOKEN:
35 raise RuntimeError("ErrorToken occured")
36 if toktype in [token.NEWLINE, tokenize.NL]:
37 self.output.write('\n')
38 self.col = 0
39 else:
40 # map token type to a color group
41 if token.LPAR <= toktype and toktype <= token.OP:
42 toktype = token.OP
43 elif toktype == token.NAME and keyword.iskeyword(toktext):
44 toktype = _KEYWORD
46 # restore whitespace
47 assert scol >= self.col
48 self.output.write(" "*(scol-self.col))
50 try:
51 tokclass = tokclasses[toktype]
52 except KeyError:
53 tokclass = None
54 if self.tokclass is not None and tokclass != self.tokclass:
55 self.output.write('</span>')
56 if tokclass is not None and tokclass != self.tokclass:
57 self.output.write('<span class="%s">' % tokclass)
58 self.output.write(cgi.escape(toktext))
59 self.tokclass = tokclass
61 # calculate new column position
62 self.col = scol + len(toktext)
63 newline = toktext.rfind("\n")
64 if newline != -1:
65 self.col = len(toktext) - newline - 1
68 class example:
70 def __init__(self, name):
71 if name.startswith("./"):
72 name = name[2:]
73 self.name = name
74 relname = os.path.join("..", "examples", name)
75 htmlbuffer = StringIO.StringIO()
76 py2html(codecs.open("%s.py" % relname, encoding="iso-8859-1"), htmlbuffer)
77 self.code = htmlbuffer.getvalue()
78 self.png = "%s.png" % os.path.basename(name)
79 self.width, self.height = Image.open("%s.png" % relname).size
80 self.downloads = []
81 for suffix in ["py", "dat", "eps"]:
82 try:
83 filesize = "%.1f KB" % (os.path.getsize("%s.%s" % (relname, suffix)) / 1024.0)
84 except OSError:
85 pass
86 else:
87 self.downloads.append({"filename": "%s.%s" % (name, suffix),
88 "filesize": filesize,
89 "iconname": "%s.png" % suffix})
92 class MyPageTemplateFile(PageTemplateFile):
94 def write(self, text):
95 if isinstance(text, str):
96 text = unicode(text, encoding="iso-8859-1")
97 return PageTemplateFile.write(self, text)
100 def mkrellink(linkname, options):
101 # returns a string containing the relative url for linkname (an absolute url)
102 pagename = options["pagename"]
103 while linkname.find("/") != -1 and pagename.find("/") != -1:
104 linknamefirst, linknameother = linkname.split("/", 1)
105 pagenamefirst, pagenameother = pagename.split("/", 1)
106 if linknamefirst == pagenamefirst:
107 linkname = linknameother
108 pagename = pagenameother
109 else:
110 break
111 for i in pagename.split("/")[:-1]:
112 linkname = "../" + linkname
113 return linkname
115 maintemplate = MyPageTemplateFile("maintemplate.pt")
117 latestnews = 2
118 newsdom = xml.dom.minidom.parse("news.pt")
119 news = "".join(["%s%s" % (dt.toxml(), dd.toxml())
120 for dt, dd in zip(newsdom.getElementsByTagName("dt")[:latestnews],
121 newsdom.getElementsByTagName("dd")[:latestnews])])
123 for ptname in glob.glob("*.pt"):
124 if ptname in ["maintemplate.pt", "examples.pt"]:
125 continue
126 htmlname = "%s.html" % ptname[:-3]
127 print htmlname
128 template = MyPageTemplateFile(ptname)
129 content = template(pagename=htmlname,
130 maintemplate=maintemplate,
131 examplepages=[],
132 mkrellink=mkrellink,
133 version=pyx.__version__,
134 news=news)
135 codecs.open("build/%s" % htmlname, "w", encoding="iso-8859-1").write(content)
137 examplestemplate = MyPageTemplateFile("examples.pt")
138 examplepages = [item[:-2] for item in open("../examples/INDEX").readlines() if item[-2] == "/"]
140 for dir in ["."] + examplepages:
141 try:
142 abstract = open("../examples/%s/README" % dir).read().replace("__version__", pyx.__version__).replace("\PyX{}", "PyX")
143 except IOError:
144 abstract = ""
145 examples = [example(dir + "/" + item.strip()) for item in open("../examples/%s/INDEX" % dir).readlines() if item[-2] != "/"]
146 if dir != ".":
147 htmlname = "examples/%s/index.html" % dir
148 else:
149 htmlname = "examples/index.html"
150 print htmlname
151 content = examplestemplate(pagename=htmlname,
152 maintemplate=maintemplate,
153 abstract=abstract,
154 examples=examples,
155 examplepages=examplepages,
156 mkrellink=mkrellink)
157 codecs.open("build/%s" % htmlname, "w", encoding="iso-8859-1").write(content)