Skip to content

Commit 9bcaa7b

Browse files
Add speakers task.
1 parent 3d07931 commit 9bcaa7b

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

bake/presently/slides.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,40 @@ def notes(slides_root: "slides")
3333
return nil
3434
end
3535

36+
# Print a timing breakdown grouped by speaker.
37+
#
38+
# Loads every slide in the slides directory and groups them by the `speaker`
39+
# front matter key. For each speaker, prints each of their slides with its
40+
# individual duration, followed by a total. Slides with no `speaker` key are
41+
# grouped under `(no speaker)`. Slides are listed in presentation order.
42+
#
43+
# @parameter slides_root [String] The slides directory. Default: `slides`.
44+
def speakers(slides_root: "slides")
45+
require "presently"
46+
47+
presentation = Presently::Presentation.load(slides_root)
48+
49+
# Group slides by speaker, preserving presentation order within each group.
50+
groups = {}
51+
presentation.slides.each do |slide|
52+
key = slide.speaker || "(no speaker)"
53+
(groups[key] ||= []) << slide
54+
end
55+
56+
groups.each do |speaker, slides|
57+
total_seconds = slides.sum(&:duration)
58+
puts "#{speaker}#{format_duration(total_seconds)}"
59+
60+
slides.each do |slide|
61+
puts " #{format_duration(slide.duration)} #{slide.title} (#{File.basename(slide.path)})"
62+
end
63+
64+
puts
65+
end
66+
67+
return nil
68+
end
69+
3670
# Renumber slide files sequentially with a consistent step size.
3771
#
3872
# Renames all `.md` files in the slides directory to have sequential
@@ -89,3 +123,13 @@ def renumber(slides_root: "slides", step: 10)
89123

90124
puts "Renumbered #{renames.length} slides."
91125
end
126+
127+
private
128+
129+
# Format a number of seconds as `M:SS`.
130+
# @parameter seconds [Integer]
131+
# @returns [String]
132+
def format_duration(seconds)
133+
seconds = seconds.to_i
134+
"%d:%02d" % [seconds / 60, seconds % 60]
135+
end

releases.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Releases
22

3+
## Unreleased
4+
5+
- Add `bake presently:slides:speakers` task to print a timing breakdown grouped by speaker. Each speaker's slides are listed in presentation order with individual and total durations, making it easy to balance talk time in multi-speaker presentations. Slides without a `speaker` key are grouped under `(no speaker)`.
6+
37
## v0.5.0
48

59
- Add optional `speaker` front matter key to slides. When present, the current speaker's name is shown in the timing bar. If the next slide has a different speaker, a handoff indicator (e.g. `→ Next Speaker`) is shown alongside, giving presenters an at-a-glance cue for tag-team talks.

0 commit comments

Comments
 (0)