summaryrefslogtreecommitdiffstats
path: root/scripts/copy-examples
blob: e8eb2f2413989e3f59743d02a1ba0906bdf45b2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python

from __future__ import absolute_import, division, print_function
import argparse
import codecs
import os.path
import re

RE_EACH_CODE_BLOCK = re.compile(
    r'(?s)(?:```|\{\{< high rust[^>]+>\}\})[^\n]*\n(.*?)(?:```|\{\{< /high >\}\})'  # noqa
)
RE_MARKER = re.compile(r'^(?:# )?//([^/].*)$')
RE_STRIP_COMMENT = re.compile(r'^# ?')

if __name__ == '__main__':
    p = argparse.ArgumentParser()
    p.add_argument('--rust-file', default='src/cookbook.rs')
    p.add_argument('--example-dir', default='grep/examples')
    args = p.parse_args()

    with codecs.open(args.rust_file, encoding='utf-8') as f:
        rustcode = f.read()
    for m in RE_EACH_CODE_BLOCK.finditer(rustcode):
        lines = m.group(1).splitlines()
        marker, codelines = lines[0], lines[1:]
        m = RE_MARKER.search(marker)
        if m is None:
            continue

        code = '\n'.join(RE_STRIP_COMMENT.sub('', line) for line in codelines)
        fpath = os.path.join(args.example_dir, m.group(1))
        with codecs.open(fpath, mode='w+', encoding='utf-8') as f:
            print(code, file=f)