From c200c8e1da65c71c3e6607af781f8837ad2730b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Fri, 6 Jan 2023 23:11:43 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=20Refactor=20script=20to?= =?UTF-8?q?=20count=20slides?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For automatic transcription and chaptering, we'll need to know exactly at which slide each section starts. This we already had the count-slides.py script to count how many slides each section had, and count the number of slides per part. The new script does the same but also gives accurately the first slide of each section. --- slides/count-slides.py | 104 ++++++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 43 deletions(-) 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))