summaryrefslogtreecommitdiffstats
path: root/src/boost/tools/litre/litre.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/tools/litre/litre.py')
-rw-r--r--src/boost/tools/litre/litre.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/boost/tools/litre/litre.py b/src/boost/tools/litre/litre.py
new file mode 100644
index 000000000..c0ac67e28
--- /dev/null
+++ b/src/boost/tools/litre/litre.py
@@ -0,0 +1,61 @@
+from docutils import writers
+from docutils import nodes
+
+class LitreTranslator(nodes.GenericNodeVisitor):
+
+ def __init__(self, document, config):
+ nodes.GenericNodeVisitor.__init__(self,document)
+ self._config = config
+
+ def default_visit(self, node):
+ pass
+ # print '**visiting:', repr(node)
+
+ def default_departure(self, node):
+ pass
+ # print '**departing:', repr(node)
+
+ def visit_raw(self, node):
+ if node.has_key('format'):
+ key = node['format'].lower()
+ if key == 'litre':
+ # This is probably very evil ;-)
+ #if node.has_key('source'):
+ # node.file = node.attributes['source']
+
+ self._handle_code(node, node.astext())
+
+ raise nodes.SkipNode
+
+ def visit_comment(self, node):
+ code = node.astext()
+ if code[0] == '@':
+ self._handle_code(node, code[1:].strip())
+
+ def _handle_code(self, node, code):
+ start_line = node.line or 0
+ start_line -= code.count('\n') + 2 # docutils bug workaround?
+ try:
+ self._execute(compile( start_line*'\n' + code, str(node.source), 'exec'))
+ except:
+ print '\n------- begin offending Python source -------'
+ print code
+ print '------- end offending Python source -------'
+ raise
+
+ def _execute(self, code):
+ """Override this to set up local variable context for code before
+ invoking it
+ """
+ eval(code)
+
+class Writer(writers.Writer):
+ translator = LitreTranslator
+ _config = None
+
+ def translate(self):
+ visitor = self.translator(self.document, self._config)
+ self.document.walkabout(visitor)
+ self.output = visitor.astext()
+
+