Tighter checks for figures
authorGreg Wilson <gvwilson@third-bit.com>
Thu, 7 Jul 2016 20:46:22 +0000 (16:46 -0400)
committerGreg Wilson <gvwilson@third-bit.com>
Thu, 7 Jul 2016 20:46:22 +0000 (16:46 -0400)
Makefile
bin/extract_figures.py
bin/lesson_check.py
bin/util.py

index ca981d3ee95ffaf6d07603673c30db648cde4e0a..3b51c3980040754c590ef14ff06e45115dd93ab2 100644 (file)
--- 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
index e89c5528ceaa24d14243cb29c8569f2dc30c0b94..519912285a14d62fad8a354470a78cc858f9a723 100755 (executable)
@@ -5,16 +5,7 @@ import os
 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', []):
index 3a43ba37467c5377dd351a1e143653e351fcd812..0b3ba9612b736b34e8be89fd583e924a989535c8 100755 (executable)
@@ -11,7 +11,7 @@ import json
 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)
index df350e7a7895bdfc656b1e64c3a66eead0a715d0..92fd50d7522f4675d179e4df0b95e7d9488fd57a 100644 (file)
@@ -11,11 +11,21 @@ except ImportError:
     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):