Index: docs/src/filter_demo_output.py |
diff --git a/docs/src/filter_demo_output.py b/docs/src/filter_demo_output.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..3d11b52f738195463183b11d11f6362e76d6144c |
--- /dev/null |
+++ b/docs/src/filter_demo_output.py |
@@ -0,0 +1,137 @@ |
+#!/usr/bin/env python |
+# Copyright (c) 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import collections |
+import os |
+import re |
+import sys |
+ |
+from xml.sax.saxutils import escape |
+ |
+from cStringIO import StringIO |
+ |
+if not os.path.exists('ansi2html'): |
+ print 'You must run ./make_docs.sh once before running this script.' |
+ sys.exit(1) |
+ |
+# This dependency is pulled in by make_docs.sh |
+# if it doesn't exist, run ./make_docs.sh first |
+sys.path.insert(0, 'ansi2html') |
+ |
+import ansi2html # pylint: disable=F0401, W0611 |
+import ansi2html.converter # pylint: disable=F0401, W0611 |
+ |
+def simpleXML(string): |
+ BRIGHT = 1 |
+ DIM = 2 |
+ NORMAL = 22 |
+ RESET = 0 |
+ ESC_RE = re.compile('(\x1B\\[[^m]*?)m') |
+ |
+ ret = StringIO() |
+ boldstate = False |
+ |
+ for tok in ESC_RE.split(string): |
+ if not tok: |
+ continue |
+ if tok[0] == '\x1b': |
+ codes = map(int, filter(bool, tok[2:].split(';'))) |
+ if not codes: |
+ codes = [RESET] |
+ for code in codes: |
+ # only care about Bright |
+ if code == BRIGHT and boldstate is False: |
+ boldstate = True |
+ ret.write('<emphasis role="strong">') |
+ elif code in (DIM, NORMAL, RESET) and boldstate: |
+ boldstate = False |
+ ret.write('</emphasis>') |
+ else: |
+ ret.write(escape(tok)) |
+ |
+ if boldstate: |
+ ret.write('</emphasis>') |
+ |
+ return ret.getvalue() |
+ |
+ |
+def main(): |
+ ansi2html.converter.SCHEME['custom'] = ( |
+ "#000000", "#e42e16", "#19c518", "#e7e71c", "#492ee1", |
+ "#d338d3", "#33d6e5", "#ffffff", |
+ ) |
+ |
+ backend = sys.argv[1] |
+ output = sys.stdin.read().rstrip() |
+ |
+ callout_re = re.compile('\x1b\[(\d+)c\n') |
+ callouts = collections.defaultdict(int) |
+ for i, line in enumerate(output.splitlines(True)): |
+ m = callout_re.match(line) |
+ if m: |
+ callouts[i + int(m.group(1)) - len(callouts)] += 1 |
+ |
+ output = callout_re.sub('', output) |
+ |
+ w = sys.stdout.write |
+ |
+ callout_counter = 1 |
+ if backend == 'xhtml11': |
+ preamble = ( |
+ '</p></div><div class="listingblock"><div class="content"><pre><code>' |
+ ) |
+ postamble = '</code></pre></div></div><p><div class="paragraph">' |
+ c = ansi2html.Ansi2HTMLConverter(inline=True, scheme='custom') |
+ |
+ in_code = False |
+ body = c.convert(output, full=False) |
+ for i, line in enumerate(body.splitlines()): |
+ if line.startswith('# '): |
+ if in_code: |
+ w(postamble) |
+ in_code = False |
+ w(line[1:]) |
+ else: |
+ if not in_code: |
+ w(preamble) |
+ in_code = True |
+ ext = '' |
+ for _ in xrange(callouts[i]): |
+ if not ext: |
+ ext += '</span>' |
+ ext += ' <b><%d></b>' % callout_counter |
+ callout_counter += 1 |
+ if ext: |
+ ext += '<span>' |
+ w(line + ext + '\n') |
+ if in_code: |
+ w(postamble) |
+ else: |
+ preamble = '</simpara><literallayout class="monospaced">' |
+ postamble = '</literallayout><simpara>' |
+ |
+ in_code = False |
+ body = simpleXML(output) |
+ for i, line in enumerate(body.splitlines()): |
+ if line.startswith('# '): |
+ if in_code: |
+ w(postamble) |
+ in_code = False |
+ w(line[1:]) |
+ else: |
+ if not in_code: |
+ w(preamble) |
+ in_code = True |
+ ext = '' |
+ for _ in xrange(callouts[i]): |
+ ext += ' <emphasis role="strong">(%d)</emphasis>' % callout_counter |
+ callout_counter += 1 |
+ w(line + ext + '\n') |
+ if in_code: |
+ w(postamble) |
+ |
+ |
+if __name__ == '__main__': |
+ main() |