diff --git a/Makefile b/Makefile index ca981d3..3b51c39 100644 --- a/Makefile +++ b/Makefile @@ -23,10 +23,6 @@ serve : lesson-rmd site : lesson-rmd ${JEKYLL} build --config _config.yml,_config_dev.yml -## figures : re-generate inclusion displaying all figures. -figures : - @bin/extract_figures.py -s _episodes -p ${PARSER} > _includes/all_figures.html - # repo-check : check repository settings. repo-check : @bin/repo_check.py -s . @@ -96,6 +92,10 @@ lesson-check : lesson-check-all : @bin/lesson_check.py -s . -p ${PARSER} -l -w +## lesson-figures : re-generate inclusion displaying all figures. +lesson-figures : + @bin/extract_figures.py -p ${PARSER} ${MARKDOWN_SRC} > _includes/all_figures.html + ## unittest : run unit tests on checking tools. unittest : python bin/test_lesson_check.py diff --git a/bin/extract_figures.py b/bin/extract_figures.py index e89c552..5199122 100755 --- a/bin/extract_figures.py +++ b/bin/extract_figures.py @@ -5,16 +5,7 @@ import glob from optparse import OptionParser -from util import Reporter, read_markdown - - -# Things an image file's name can end with. -PATH_SUFFICES = { - '.gif', - '.jpg', - '.png', - '.svg' -} +from util import Reporter, read_markdown, IMAGE_FILE_SUFFIX def main(): @@ -22,7 +13,7 @@ def main(): args = parse_args() images = [] - for filename in get_filenames(args.source_dir): + for filename in args.filenames: images += get_images(args.parser, filename) save(sys.stdout, images) @@ -35,19 +26,14 @@ def parse_args(): default=None, dest='parser', help='path to Markdown parser') - parser.add_option('-s', '--source', - default=None, - dest='source_dir', - help='source directory') args, extras = parser.parse_args() require(args.parser is not None, 'Path to Markdown parser not provided') - require(args.source_dir is not None, - 'Source directory not provided') - require(not extras, - 'Unexpected trailing command-line arguments "{0}"'.format(extras)) + require(extras, + 'No filenames specified') + args.filenames = extras return args @@ -70,20 +56,22 @@ def get_images(parser, filename): def find_image_nodes(doc, result): """Find all nested nodes representing images.""" - if (doc["type"] == "img") or \ - ((doc["type"] == "html_element") and (doc["value"] == "img")): + if (doc['type'] == 'img') or \ + ((doc['type'] == 'html_element') and (doc['value'] == 'img')): result.append({'alt': doc['attr']['alt'], 'src': doc['attr']['src']}) else: - for child in doc.get("children", []): + for child in doc.get('children', []): find_image_nodes(child, result) def find_image_links(doc, result): """Find all links to files in the 'fig' directory.""" - if (doc['type'] == 'a') and ('attr' in doc) and ('href' in doc['attr']): + if ((doc['type'] == 'a') and ('attr' in doc) and ('href' in doc['attr'])) \ + or \ + ((doc['type'] == 'html_element') and (doc['value'] == 'a')): path = doc['attr']['href'] - if os.path.splitext(path)[1].lower() in PATH_SUFFICES: + if os.path.splitext(path)[1].lower() in IMAGE_FILE_SUFFIX: result.append({'alt':'', 'src': doc['attr']['href']}) else: for child in doc.get('children', []): diff --git a/bin/lesson_check.py b/bin/lesson_check.py index 3a43ba3..0b3ba96 100755 --- a/bin/lesson_check.py +++ b/bin/lesson_check.py @@ -11,7 +11,7 @@ import re from optparse import OptionParser -from util import Reporter, read_markdown, load_yaml, check_unwanted_files, require +from util import Reporter, read_markdown, load_yaml, check_unwanted_files, require, IMAGE_FILE_SUFFIX __version__ = '0.2' @@ -227,9 +227,9 @@ def check_figures(source_dir, reporter): 'File not found') return - # Get actual files. + # Get actual image files (ignore non-image files). fig_dir_path = os.path.join(source_dir, 'fig') - actual = [f for f in os.listdir(fig_dir_path) if not f.startswith('.')] + actual = [f for f in os.listdir(fig_dir_path) if os.path.splitext(f)[1] in IMAGE_FILE_SUFFIX] # Report differences. unexpected = set(actual) - set(referenced) diff --git a/bin/util.py b/bin/util.py index df350e7..92fd50d 100644 --- a/bin/util.py +++ b/bin/util.py @@ -11,11 +11,21 @@ sys.exit(1) +# Things an image file's name can end with. +IMAGE_FILE_SUFFIX = { + '.gif', + '.jpg', + '.png', + '.svg' +} + +# Files that shouldn't be present. UNWANTED_FILES = [ '.nojekyll' ] - +# Marker to show that an expected value hasn't been provided. +# (Can't use 'None' because that might be a legitimate value.) REPORTER_NOT_SET = [] class Reporter(object):