Preparing for June 2016 release
[rnaseq-cwl-training.git] / bin / extract_figures.py
1 #!/usr/bin/env python
2
3 import sys
4 import os
5 import glob
6 from optparse import OptionParser
7
8 from util import Reporter, read_markdown
9
10
11 def main():
12     """Main driver."""
13
14     args = parse_args()
15     images = []
16     for filename in get_filenames(args.source_dir):
17         images += get_images(args.parser, filename)
18     save(sys.stdout, images)
19
20
21 def parse_args():
22     """Parse command-line arguments."""
23
24     parser = OptionParser()
25     parser.add_option('-p', '--parser',
26                       default=None,
27                       dest='parser',
28                       help='path to Markdown parser')
29     parser.add_option('-s', '--source',
30                       default=None,
31                       dest='source_dir',
32                       help='source directory')
33
34     args, extras = parser.parse_args()
35     require(args.parser is not None,
36             'Path to Markdown parser not provided')
37     require(args.source_dir is not None,
38             'Source directory not provided')
39     require(not extras,
40             'Unexpected trailing command-line arguments "{0}"'.format(extras))
41
42     return args
43
44
45 def get_filenames(source_dir):
46     """Get all filenames to be searched for images."""
47
48     return glob.glob(os.path.join(source_dir, '*.md'))
49
50
51 def get_images(parser, filename):
52     """Extract all images from file."""
53
54     content = read_markdown(parser, filename)
55     result = []
56     find_image_nodes(content['doc'], result)
57     return result
58
59
60 def find_image_nodes(doc, result):
61     """Find all nested nodes representing images."""
62
63     if (doc["type"] == "img") or \
64        ((doc["type"] == "html_element") and (doc["value"] == "img")):
65         result.append({'alt': doc['attr']['alt'], 'src': doc['attr']['src']})
66     else:
67         for child in doc.get("children", []):
68             find_image_nodes(child, result)
69
70
71 def save(stream, images):
72     """Save results as Markdown."""
73
74     text = '\n<hr/>\n'.join(['<p><img alt="{0}" src="{1}" /></p>'.format(img['alt'], img['src']) for img in images])
75     print(text, file=stream)
76
77
78 def require(condition, message):
79     """Fail if condition not met."""
80
81     if not condition:
82         print(message, file=sys.stderr)
83         sys.exit(1)
84
85
86 if __name__ == '__main__':
87     main()