Initial check-in
[dygraphs.git] / mochikit_v14 / scripts / make_docs.py
1 #!/usr/bin/env python
2 import os
3 import sys
4 try:
5 from pkg_resources import require
6 require("docutils>0.3.9")
7 except ImportError:
8 pass
9 from docutils import nodes, utils
10 from docutils.core import publish_parts
11 from docutils.parsers.rst import roles
12
13 TEMPLATE = u"""%(html_prolog)s
14 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
15 <head>
16 %(html_head)s
17 <link rel="stylesheet" href="../../../include/css/documentation.css" type="text/css" />
18 <script type="text/javascript" src="../../../packed/MochiKit/MochiKit.js"></script>
19 <script type="text/javascript" src="../../js/toc.js"></script>
20 </head>
21 <body>
22 %(html_body)s
23 </body>
24 </html>
25 """
26 def mochi_name(text):
27 name = text.split('(', 1)[0].split()[0]
28 base = ''
29 if name.startswith('MochiKit.'):
30 # cross-reference
31 parts = name.split('.')
32 base = parts[1] + '.html'
33 if parts[-1] in ("call", "apply"):
34 parts.pop()
35 name = '.'.join(parts[2:])
36 return base, name
37
38 def role_mochiref(role, rawtext, text, lineno, inliner, options=None, content=[]):
39 if options is None:
40 options = {}
41 base, name = mochi_name(text)
42 ref = base
43 if name:
44 ref += '#fn-' + name.lower()
45 roles.set_classes(options)
46 options.setdefault('classes', []).append('mochiref')
47 node = nodes.reference(
48 text, utils.unescape(text), refuri=ref, **options)
49 return [node], []
50
51 roles.register_canonical_role('mochiref', role_mochiref)
52
53 def role_mochidef(role, rawtext, text, lineno, inliner, options=None, content=[]):
54 if options is None:
55 options = {}
56 base, name = mochi_name(text)
57 assert base == ''
58 ref = 'fn-' + utils.unescape(name.lower())
59 anchor = nodes.raw('', '\n<a name="%s"></a>\n' % (ref,), format='html')
60 roles.set_classes(options)
61 options.setdefault('classes', []).append('mochidef')
62 node = nodes.reference(
63 text, utils.unescape(text), refuri='#' + ref, **options)
64 return [anchor, node], []
65
66 roles.register_canonical_role('mochidef', role_mochidef)
67
68
69
70 def main():
71 basepath = os.path.join('doc/rst', '')
72 destpath = os.path.join('doc/html', '')
73 for root, dirs, files in os.walk(basepath):
74 if '.svn' in dirs:
75 dirs.remove('.svn')
76 destroot = destpath + root[len(basepath):]
77 if not os.path.exists(destroot):
78 os.makedirs(destroot)
79 for fn in files:
80 basefn, ext = os.path.splitext(fn)
81 if ext == '.rst':
82 srcfn = os.path.join(root, fn)
83 dest = os.path.join(destroot, basefn + '.html')
84 if basefn != "index":
85 try:
86 if os.path.getmtime(dest) >= os.path.getmtime(srcfn):
87 print srcfn, "not changed"
88 continue
89 except OSError:
90 pass
91 print srcfn
92 parts = publish_parts(
93 source_path=srcfn,
94 source=file(srcfn, 'rb').read().decode('utf8'),
95 destination_path=dest,
96 writer_name='html',
97 settings_overrides=dict(
98 embed_stylesheet=False,
99 stylesheet_path='include/css/documentation.css',
100 ),
101 )
102 parts['html_head'] = parts['html_head'] % ('utf-8',)
103 parts['html_prolog'] = parts['html_prolog'] % ('utf-8',)
104 doc = (TEMPLATE % parts).encode("utf8")
105 out = file(dest, 'wb')
106 out.write(doc)
107 out.close()
108
109 if __name__ == '__main__':
110 main()