diff --git a/slides/count-slides.py b/slides/count-slides.py index 3b0f5aa9..6643d3ba 100755 --- a/slides/count-slides.py +++ b/slides/count-slides.py @@ -1,57 +1,75 @@ #!/usr/bin/env python import re import sys +import yaml + +FIRST_SLIDE_MARKER = "name: toc-" +PART_PREFIX = "part-" + +filename = sys.argv[1] +if filename.endswith(".html"): + html_file = filename + yaml_file = filename[: -len(".html")] +else: + html_file = filename + ".html" + yaml_file = filename +excluded_classes = yaml.safe_load(open(yaml_file))["exclude"] -PREFIX = "name: toc-" -EXCLUDED = ["in-person"] class State(object): def __init__(self): - self.current_slide = 1 - self.section_title = None - self.section_start = 0 - self.section_slides = 0 + self.current_slide = -1 self.parts = {} - self.sections = {} - def show(self): - if self.section_title.startswith("part-"): - return - print("{0.section_title}\t{0.section_start}\t{0.section_slides}".format(self)) - self.sections[self.section_title] = self.section_slides + + def end_section(self): + if state.section_title: + print( + "{0.section_start}\t{0.section_slides}\t{0.section_title}".format(self) + ) + if self.section_part: + if self.section_part not in self.parts: + self.parts[self.section_part] = 0 + self.parts[self.section_part] += self.section_slides + + def new_section(self, slide): + # Normally, the title should be prefixed by a space + # (because section titles are first-level titles in markdown, + # e.g. "# Introduction", and markmaker removes the # but leaves + # the leading space). + self.section_title = None + if "\n " in slide: + self.section_title = slide.split("\n ")[1].split("\n")[0] + toc_links = re.findall("\(#toc-(.*)\)", slide) + self.section_part = None + for toc_link in toc_links: + if toc_link.startswith(PART_PREFIX): + self.section_part = toc_link + self.section_start = self.current_slide + self.section_slides = 0 + state = State() +state.new_section("") +print("{}\t{}\t{}".format("index", "size", "title")) -title = None -for line in open(sys.argv[1]): - line = line.rstrip() - if line.startswith(PREFIX): - if state.section_title is None: - print("{}\t{}\t{}".format("title", "index", "size")) - else: - state.show() - state.section_title = line[len(PREFIX):].strip() - state.section_start = state.current_slide - state.section_slides = 0 - if line == "---": +for slide in open(html_file).read().split("\n---\n"): + excluded = False + for line in slide.split("\n"): + if line.startswith("class:"): + for klass in excluded_classes: + if klass in line.split(): + excluded = True + if excluded: + continue + if FIRST_SLIDE_MARKER in slide: + # A new section starts. Show info about the part that just ended. + state.end_section() + state.new_section(slide) + state.section_slides += 1 + for sub_slide in slide.split("\n--\n"): state.current_slide += 1 - state.section_slides += 1 - if line == "--": - state.current_slide += 1 - toc_links = re.findall("\(#toc-(.*)\)", line) - if toc_links and state.section_title.startswith("part-"): - if state.section_title not in state.parts: - state.parts[state.section_title] = [] - state.parts[state.section_title].append(toc_links[0]) - # This is really hackish - if line.startswith("class:"): - for klass in EXCLUDED: - if klass in line: - state.section_slides -= 1 - state.current_slide -= 1 - -state.show() +else: + state.end_section() for part in sorted(state.parts, key=lambda f: int(f.split("-")[1])): - part_size = sum(state.sections[s] for s in state.parts[part]) - print("{}\t{}\t{}".format("total size for", part, part_size)) - + print("{}\t{}\t{}".format(0, state.parts[part], "total size for " + part))