Unverified Commit 7a8cc6b2 authored by Raniere Silva's avatar Raniere Silva Committed by GitHub
Browse files

Merge pull request #132 from rgaiacs/js-load-images

Replace extract_figures.py with Javacript
parents a9d52fd7 a09dae85
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -95,10 +95,6 @@ lesson-check :
lesson-check-all :
	@bin/lesson_check.py -s . -p ${PARSER} -r _includes/links.md -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
+35 −1
Original line number Diff line number Diff line
@@ -2,4 +2,38 @@
layout: page
title: Figures
---
{% include all_figures.html %}
<script>
  window.onload = function() {
    var lesson_episodes = [
    {% for episode in site.episodes %}
    "{{ episode.url}}"{% unless forloop.last %},{% endunless %}
    {% endfor %}
    ];
    var xmlHttp = [];  /* Required since we are going to query every episode. */
    for (i=0; i < lesson_episodes.length; i++) {
      xmlHttp[i] = new XMLHttpRequest();
      xmlHttp[i].episode = lesson_episodes[i];  /* To enable use this later. */
      xmlHttp[i].onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
          var article_here = document.getElementById(this.episode);
          var parser = new DOMParser();
          var htmlDoc = parser.parseFromString(this.responseText,"text/html");
          var htmlDocArticle = htmlDoc.getElementsByTagName("article")[0];
          article_here.appendChild(htmlDocArticle.getElementsByTagName("h1")[0]);
          for (let image of htmlDocArticle.getElementsByTagName("img")) {
            article_here.appendChild(image);
          }
        }
      }
      episode_url = "{{ page.root }}" + lesson_episodes[i];
      xmlHttp[i].open("GET", episode_url);
      xmlHttp[i].send(null);
    }
  }
</script>
{% comment %}
Create anchor for each one of the episodes.
{% endcomment %}
{% for episode in site.episodes %}
<article id="{{ episode.url }}"></article>
{% endfor %}

_includes/all_figures.html

deleted100644 → 0
+0 −13
Original line number Diff line number Diff line
<p><img alt="" src="{{ page.root }}/fig/using-github-import.png" /></p>
<hr/>
<p><img alt="Forking Repositories" src="{{ page.root }}/fig/forking.svg" /></p>
<hr/>
<p><img alt="Repository Links" src="{{ page.root }}/fig/repository-links.svg" /></p>
<hr/>
<p><img alt="Source and Destination Files" src="{{ page.root }}/fig/file-mapping.svg" /></p>
<hr/>
<p><img alt="Formatting Rules" src="{{ page.root }}/fig/episode-format-small.png" /></p>
<hr/>
<p><img alt="" src="{{ page.root }}/fig/episode-format.png" /></p>
<hr/>
<p><img alt="plot of chunk plot-example" src="{{ page.root }}/fig/rmd-plot-example-1.png" /></p>
+22 −0
Original line number Diff line number Diff line
@@ -153,3 +153,25 @@ span.fold-unfold {
  margin-left: 1em;
  opacity: 0.5;
}


//----------------------------------------
// keyboard key style, from StackExchange.
//----------------------------------------

kbd {
    display: inline-block;
    margin: 0 .1em;
    padding: .1em .6em;
    font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;
    font-size: 11px;
    line-height: 1.4;
    color: #242729;
    text-shadow: 0 1px 0 #FFF;
    background-color: #e1e3e5;
    border: 1px solid #adb3b9;
    border-radius: 3px;
    box-shadow: 0 1px 0 rgba(12,13,14,0.2), 0 0 0 2px #FFF inset;
    white-space: nowrap;
    font-style: normal;
}

bin/extract_figures.py

deleted100755 → 0
+0 −98
Original line number Diff line number Diff line
#!/usr/bin/env python

from __future__ import print_function
import sys
import os
import glob
from optparse import OptionParser

from util import Reporter, read_markdown, IMAGE_FILE_SUFFIX

def main():
    """Main driver."""

    args = parse_args()
    images = []
    for filename in args.filenames:
        images += get_images(args.parser, filename)
    save(sys.stdout, images)


def parse_args():
    """Parse command-line arguments."""

    parser = OptionParser()
    parser.add_option('-p', '--parser',
                      default=None,
                      dest='parser',
                      help='path to Markdown parser')

    args, extras = parser.parse_args()
    require(args.parser is not None,
            'Path to Markdown parser not provided')
    require(extras,
            'No filenames specified')

    args.filenames = extras
    return args


def get_filenames(source_dir):
    """Get all filenames to be searched for images."""

    return glob.glob(os.path.join(source_dir, '*.md'))


def get_images(parser, filename):
    """Extract all images from file."""

    content = read_markdown(parser, filename)
    result = []
    find_image_nodes(content['doc'], result)
    find_image_links(content['doc'], result)
    return result


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')):
        alt = doc['attr'].get('alt', '')
        result.append({'alt': alt, 'src': doc['attr']['src']})
    else:
        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'])) \
       or \
       ((doc['type'] == 'html_element') and (doc['value'] == 'a') and ('href' in doc['attr'])):
        path = doc['attr']['href']
        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', []):
            find_image_links(child, result)


def save(stream, images):
    """Save results as Markdown."""

    text = '\n<hr/>\n'.join(['<p><img alt="{0}" src="{1}" /></p>'.format(img['alt'], img['src']) for img in images])
    print(text, file=stream)


def require(condition, message):
    """Fail if condition not met."""

    if not condition:
        print(message, file=sys.stderr)
        sys.exit(1)


if __name__ == '__main__':
    main()
Loading