from pychart import *
import pychart.doc_support
import optik
import string
import sys
import re
parser = optik.OptionParser()
parser.add_option("-S", "--ps", action="store_true", default=None)
parser.add_option("-D", "--pdf", action="store_true", default=None)
parser.add_option("-X", "--pychart-dir", action="store", default=None)
opt, argv = parser.parse_args(sys.argv[1:])
ftype = "png"
pychart_dir = ".."
if opt.ps:
ftype="pdf"
elif opt.pdf:
ftype="eps"
if opt.pychart_dir:
pychart_dir = opt.pychart_dir
def resubfunc(mo):
typename = re.sub("_", "-", mo.group(1))
return "\\xref{module-%s}" % typename
def xxx(mo):
xx = "var"
return "\\" + xx + "{" + mo.group(1) + "}"
def format_doc_string(str):
str = re.sub("<<([^>]+)>>", resubfunc, str)
str = re.sub("<([^>]+)>", xxx, str)
str = re.sub("\|([^|]+)\|", "\\code{\\1}", str)
str = str.replace("#", "\\#")
str = str.replace("%", "\\%")
str = str.replace("@pxref", "\\pxref")
str = str.replace("@xref", "\\xref")
str = str.replace("@code", "\\code")
str = str.replace("@samp", "\\code")
str = str.replace("@var", "\\var")
str = str.replace("@example", "\\begin{verbatim}")
str = str.replace("@end example", "\\end{verbatim}")
str = re.sub("@cindex ([^\n]+)", "\\index{\\1}", str)
return str
def outputClassAttrs(moduleName, className):
x = pychart.doc_support.modules[moduleName]
v = x[className]
keys = v.keys.keys()
keys.sort()
for key in keys:
if key[0] == '_':
continue
val = v.keys[key]
type_str = pychart.doc_support.stringify_type(val[0])
print "\\begin{memberdesc}{%s}\n\\textbf{Type:} %s" % (key, type_str)
if False:
print "\\label{%s.%s.%s}" % (moduleName.replace("_","-"),
className.replace("_","-"),
key.replace("_", "-"))
mm = re.match("(.*)\\.T$", str(type_str))
if mm:
print "(\\pxref{module-%s})" % re.sub("_", "-", mm.group(1))
if len(val) > 3:
print "\\textbf{Default:} %s." % format_doc_string(val[3]),
else:
print "\\textbf{Default:} %s." % format_doc_string(str(pychart.doc_support.stringify_value(val[1]))),
print ""
print ""
if len(val) > 2:
print format_doc_string(val[2])
print "\\end{memberdesc}"
#print "@end multitable";
def copy_file(src, dest):
sys.stderr.write("%s->%s\n" % (src, dest))
infp = open(src, "rb")
outfp = open(dest, "wb")
outfp.writelines(infp.readlines())
infp.close()
outfp.close()
nodeNames = []
nodeReplaces = []
demoDir = pychart_dir + "/demos/"
def scan_nodes(fp):
global nodeNames
for line in fp.readlines():
mo_node = re.match("^@node ([^,]*)", line)
if mo_node:
nodeNames.append(re.compile("\\b(" + mo_node.group(1) + ")\\b"))
def include_text_file(file):
fp = open(file, "r")
print "\\noindent\\bfcode{%s}\n\n" % file
print "\\begin{verbatim}"
line = fp.readline()
if line.startswith('#'):
# Skip the first comment block. It's usually a copyright statement.
while True:
line = fp.readline()
assert line
if not line.startswith('#'):
break
print line,
for line in fp.readlines():
line = string.expandtabs(line)
print line,
fp.close()
print "\\end{verbatim}"
def format_doc(str):
out = ""
empty_line_found = False
in_example = None
for line in string.split(str, "\n"):
if empty_line_found and len(line) > 0 and line[0] != ' ':
if not in_example:
out = out + "\\begin{verbatim}\n"
in_example = True
out = out + line + "\n"
else:
if line == "":
empty_line_found = True
if in_example:
out = out + line + "\n\\end{verbatim}\n"
else:
# Do some formatting.
line = format_doc_string(line)
out = out + line + "\n"
in_example = None
if in_example:
out = out + "\n\end{verbatim}\n"
return out
fp = open(argv[0], "r")
scan_nodes(fp)
fp.seek(0)
while True:
line = fp.readline()
if line == "": break
mo7 = re.match("@xximage\\{(.*),\\}", line)
line = line.replace("@chart{}", "PyChart")
line = line.replace("@shadow", "Parameter \\var{shadow} is either None or tuple (\\var{xdelta, ydelta, shadowstyle}). If non-None, a shadow of \\var{shadowstyle} (\\pxref{module-fill-style}) is drawn beneath the polygon at the offset (\\var{xdelta, ydelta}).")
mo = re.match("^%%([^.]+)\\.(.*)", line)
if mo:
outputClassAttrs(mo.group(1), mo.group(2))
continue
mo = re.match("^@samplechartandcode\{([^,]*),(.*)\}", line)
if mo:
basename = mo.group(1)
description = mo.group(2)
for ext in ["png", "eps", "pdf"]:
copy_file("%s%s-c.%s" % (demoDir, basename, ext),
"%s.%s" % (basename, ext))
print "\\includegraphics{%s}\n" % (basename)
print description, "\n"
print "Below is the source code that produces the above chart."
include_text_file(demoDir + basename + ".py")
continue
mo = re.match("^@samplecode\{(.*)\}", line)
if mo:
basename = mo.group(1)
include_text_file(demoDir + basename + ".py")
continue
mo = re.match("^@samplechart\{(.*)\}", line)
if mo:
basename = mo.group(1)
for ext in ["png", "eps", "pdf"]:
copy_file("%s%s-c.%s" % (demoDir, basename, ext),
"%s.%s" % (basename, ext))
print "\\includegraphics{%s}\n" % (basename)
continue
mo = re.match("^@pydescribe\{(.*)\}", line)
if mo:
obj_name = mo.group(1)
obj = eval(obj_name)
print format_doc(str(obj.__doc__)), "\n"
continue
print line,
|