#!/usr/bin/env python """ This script strips bits of examples from a larger script, formats them as HTML, and writes them out. You mark snippets of code like: ## Snippet "snippetname" code... ## End Snippet Then a file snippets/snippetname.html is created. This isn't an example, but it's a tool for merging the examples and the documentation. This requires the presence of the source-highlight program: http://www.gnu.org/software/src-highlite/source-highlight.html """ import re, os, sys import warnings _snippetRE = re.compile(r'^##\s+Snippet\s+"(.*?)"', re.I) _endSnippetRE = re.compile(r'^##\s+End\s+Snippet', re.I) def stripSnippets(lines): results = {} name = None for line in lines: match = _snippetRE.search(line) if match: if name is not None: warnings.warn('You started snippet %s when snippet %s was not ended' % (match.group(1), name)) name = match.group(1) continue match = _endSnippetRE.search(line) if match: name = None if name is None: continue results.setdefault(name, []).append(line) return results _bodyRE = re.compile(r'
]*>', re.I) _endBodyRE = re.compile(r'', re.I) _preRE = re.compile(r'\n\n', re.I) _endPreRE = re.compile(r'\n', re.I) def snipFile(filename): f = open(filename) d = stripSnippets(f) f.close() dirname = os.path.join(os.path.dirname(filename), 'snippets') if not os.path.exists(dirname): os.mkdir(dirname) for key, value in d.items(): fn = os.path.join(dirname, '%s' % key) f = open(fn + ".py", 'w') f.write(''.join(value)) f.close() os.system('source-highlight -spython -fxhtml -cdefault.css %s > /dev/null 2>&1' % (fn + ".py")) f = open(fn + ".py.html") c = f.read() f.close() os.unlink(fn + ".py.html") c = c[_bodyRE.search(c).end():] c = c[:_endBodyRE.search(c).start()] c = _preRE.sub('
', c)
c = _endPreRE.sub('', c)
f = open(fn + ".html", 'w')
f.write(c)
f.close()
def snipAll(dir):
if dir == sys.argv[0]:
return
if dir.endswith('snippets'):
return
if os.path.isdir(dir):
for fn in os.listdir(dir):
fn = os.path.join(dir, fn)
snipAll(fn)
elif dir.endswith('.py'):
snipFile(dir)
if __name__ == '__main__':
args = sys.argv[1:]
if not args:
args = ['.']
for arg in args:
snipAll(arg)