jekyll-slides 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Slides
5
+ # Reads one Markdown file and returns its slide sources. The file's own
6
+ # front matter (+layout+, +background+, +class+) becomes a default
7
+ # metadata comment applied to every slide the file contains; a slide's
8
+ # own comment wins key by key.
9
+ class SlideFile
10
+ def initialize(path, warning: nil, read_options: {})
11
+ @path = path
12
+ @warning = warning
13
+ @read_options = read_options
14
+ end
15
+
16
+ def slides
17
+ @slides ||= build_slides
18
+ end
19
+
20
+ private
21
+
22
+ def build_slides
23
+ file_values, body = FrontMatter.split(File.read(@path, **@read_options))
24
+ defaults = file_defaults(file_values)
25
+ slide_sources = PresentationParser.new(body).parse
26
+
27
+ if slide_sources.empty?
28
+ Support.warn(@warning, "#{@path} produced no slides; skipping")
29
+ return []
30
+ end
31
+
32
+ slide_sources.map { |slide| apply_defaults(slide, defaults) }
33
+ end
34
+
35
+ def file_defaults(file_values)
36
+ file_values.each_with_object({}) do |(key, value), defaults|
37
+ if SlideMetadata::KEYS.include?(key)
38
+ defaults[key] = value
39
+ else
40
+ Support.warn(@warning, "Unknown slide file key #{key.inspect}; ignoring")
41
+ end
42
+ end
43
+ end
44
+
45
+ def apply_defaults(slide, defaults)
46
+ return slide if defaults.empty?
47
+
48
+ body, own_values = SlideMetadata.split_comment(slide)
49
+ merged = defaults.merge(own_values)
50
+ lines = SlideMetadata::KEYS.filter_map { |key| "#{key}: #{merged[key]}" if merged.key?(key) }
51
+ "<!--\n#{lines.join("\n")}\n-->\n#{body}"
52
+ end
53
+ end
54
+ end
55
+ end
@@ -13,6 +13,31 @@ module Jekyll
13
13
  new(content, index: index, warning: warning).parse(components: components)
14
14
  end
15
15
 
16
+ # Parses a leading "<!-- key: value -->" metadata comment off +body+.
17
+ # Returns [body_without_comment, values]. A comment whose lines are not
18
+ # all "key: value", or that carries no recognized key, is left in the
19
+ # body untouched. Unknown keys warn only when +warning+ is given.
20
+ def self.split_comment(body, warning: nil)
21
+ match = body.match(/\A[ \t]*(<!--(.*?)-->)[ \t]*(?:\r?\n)?/m)
22
+ return [body, {}] unless match
23
+
24
+ values = {}
25
+ lines = match[2].to_s.lines.map(&:strip).reject(&:empty?)
26
+ parsed = lines.map { |line| line.match(/\A(\w[\w-]*)\s*:\s*(.*?)\z/) }
27
+ return [body, {}] unless parsed.all?
28
+ return [body, {}] unless parsed.any? { |match_data| KEYS.include?(match_data[1]) }
29
+
30
+ parsed.each do |match_data|
31
+ key = match_data[1]
32
+ if KEYS.include?(key)
33
+ values[key] = match_data[2].strip
34
+ else
35
+ Support.warn(warning, "Unknown slide metadata key #{key.inspect}; ignoring")
36
+ end
37
+ end
38
+ [body[match.end(0)..].to_s, values]
39
+ end
40
+
16
41
  def initialize(content, index: 0, warning: nil)
17
42
  @original_content = content.to_s
18
43
  @index = index
@@ -40,24 +65,7 @@ module Jekyll
40
65
  private
41
66
 
42
67
  def extract_comment(body)
43
- match = body.match(/\A[ \t]*(<!--(.*?)-->)[ \t]*(?:\r?\n)?/m)
44
- return [body, {}] unless match
45
-
46
- values = {}
47
- lines = match[2].to_s.lines.map(&:strip).reject(&:empty?)
48
- parsed = lines.map { |line| line.match(/\A(\w[\w-]*)\s*:\s*(.*?)\z/) }
49
- return [body, {}] unless parsed.all?
50
- return [body, {}] unless parsed.any? { |match_data| KEYS.include?(match_data[1]) }
51
-
52
- parsed.each do |match_data|
53
- key = match_data[1]
54
- if KEYS.include?(key)
55
- values[key] = match_data[2].strip
56
- else
57
- Support.warn(@warning, "Unknown slide metadata key #{key.inspect}; ignoring")
58
- end
59
- end
60
- [body[match.end(0)..].to_s, values]
68
+ self.class.split_comment(body, warning: @warning)
61
69
  end
62
70
 
63
71
  def inferred_layout(components)
@@ -20,6 +20,20 @@ module Jekyll
20
20
  def escape(value)
21
21
  CGI.escapeHTML(value.to_s)
22
22
  end
23
+
24
+ # A comparable Array key for natural filename ordering: digit runs
25
+ # compare numerically, text runs compare case-insensitively, and digit
26
+ # runs sort before text runs. The name itself is appended as a stable
27
+ # tiebreaker so equal-value keys (e.g. "01-a" and "1-a") still order
28
+ # deterministically.
29
+ def natural_sort_key(name)
30
+ name = name.to_s
31
+ key = name.scan(/\d+|\D+/).map do |run|
32
+ run.match?(/\A\d+\z/) ? [0, run.to_i, ""] : [1, 0, run.downcase]
33
+ end
34
+ key << [2, 0, name]
35
+ key
36
+ end
23
37
  end
24
38
  end
25
39
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Slides
5
- VERSION = "0.1.0"
5
+ VERSION = "0.3.0"
6
6
  end
7
7
  end
data/lib/jekyll/slides.rb CHANGED
@@ -12,8 +12,7 @@ module Jekyll
12
12
  # while preserving the site's theme and local overrides.
13
13
  #
14
14
  # Configure defaults under +slides:+ in _config.yml, or use front matter on
15
- # individual decks. Themes are +midnight+, +minimal-light+, +minimal-dark+,
16
- # and +ruby+. The supported aspect ratio is 16:9; quote this value in YAML.
15
+ # individual decks. The supported aspect ratio is 16:9; quote this value in YAML.
17
16
  #
18
17
  # Jekyll runs Liquid before rendering each slide as one Markdown document.
19
18
  # Jekyll::Slides::Presentation also renders slide HTML directly when Jekyll integration
@@ -21,13 +20,26 @@ module Jekyll
21
20
  module Slides
22
21
  ROOT = File.expand_path("../..", __dir__)
23
22
  LAYOUT_NAME = "presentation"
23
+
24
+ # Every theme name the plugin ships. A theme sets the whole deck through
25
+ # front matter, and any one of them also restyles a single editor or
26
+ # terminal block through that block's +theme+ attribute.
27
+ THEMES = %w[
28
+ minimal-light minimal-dark midnight ruby
29
+ catppuccin-latte catppuccin-frappe catppuccin-macchiato catppuccin-mocha
30
+ ].freeze
31
+ DEFAULT_THEME = "midnight"
24
32
  end
25
33
  end
26
34
 
27
35
  require_relative "slides/version"
28
36
  require_relative "slides/support"
37
+ require_relative "slides/front_matter"
29
38
  require_relative "slides/presentation_parser"
30
39
  require_relative "slides/slide_metadata"
40
+ require_relative "slides/slide_file"
41
+ require_relative "slides/deck"
42
+ require_relative "slides/deck_assembler"
31
43
  require_relative "slides/range_parser"
32
44
  require_relative "slides/rouge_renderer"
33
45
  require_relative "slides/component_renderer"
@@ -2,7 +2,7 @@
2
2
 
3
3
  | | |
4
4
  | --- | --- |
5
- | **Defined in** | lib/jekyll/slides.rb, lib/jekyll/slides/assets.rb, lib/jekyll/slides/layout.rb, lib/jekyll/slides/support.rb, lib/jekyll/slides/version.rb, lib/jekyll/slides/renderer.rb, lib/jekyll/slides/presentation.rb, lib/jekyll/slides/range_parser.rb, lib/jekyll/slides/rouge_renderer.rb, lib/jekyll/slides/slide_metadata.rb, lib/jekyll/slides/slide_renderer.rb, lib/jekyll/slides/component_renderer.rb, lib/jekyll/slides/jekyll_integration.rb, lib/jekyll/slides/presentation_parser.rb |
5
+ | **Defined in** | lib/jekyll/slides.rb, lib/jekyll/slides/deck.rb, lib/jekyll/slides/assets.rb, lib/jekyll/slides/layout.rb, lib/jekyll/slides/support.rb, lib/jekyll/slides/version.rb, lib/jekyll/slides/renderer.rb, lib/jekyll/slides/slide_file.rb, lib/jekyll/slides/front_matter.rb, lib/jekyll/slides/presentation.rb, lib/jekyll/slides/range_parser.rb, lib/jekyll/slides/deck_assembler.rb, lib/jekyll/slides/rouge_renderer.rb, lib/jekyll/slides/slide_metadata.rb, lib/jekyll/slides/slide_renderer.rb, lib/jekyll/slides/component_renderer.rb, lib/jekyll/slides/jekyll_integration.rb, lib/jekyll/slides/presentation_parser.rb |
6
6
 
7
7
  Markdown presentations for Jekyll, with editor and terminal components.
8
8
 
@@ -13,9 +13,8 @@ includes, styles, scripts, and offline fonts while preserving the site's theme
13
13
  and local overrides.
14
14
 
15
15
  Configure defaults under <code>slides:</code> in _config.yml, or use front
16
- matter on individual decks. Themes are `midnight`, <code>minimal-light</code>,
17
- <code>minimal-dark</code>, and `ruby`. The supported aspect ratio is 16:9;
18
- quote this value in YAML.
16
+ matter on individual decks. The supported aspect ratio is 16:9; quote this
17
+ value in YAML.
19
18
 
20
19
  Jekyll runs Liquid before rendering each slide as one Markdown document.
21
20
  Jekyll::Slides::Presentation also renders slide HTML directly when Jekyll
@@ -23,12 +22,20 @@ integration is not needed; it does not evaluate Liquid or wrap the
23
22
  presentation layout.
24
23
 
25
24
  ## Constants
25
+ ### `DEFAULT_THEME` <a id="constant-DEFAULT_THEME"></a> <a id="DEFAULT_THEME-constant"></a>
26
+ Not documented.
27
+
26
28
  ### `LAYOUT_NAME` <a id="constant-LAYOUT_NAME"></a> <a id="LAYOUT_NAME-constant"></a>
27
29
  Not documented.
28
30
 
29
31
  ### `ROOT` <a id="constant-ROOT"></a> <a id="ROOT-constant"></a>
30
32
  Not documented.
31
33
 
34
+ ### `THEMES` <a id="constant-THEMES"></a> <a id="THEMES-constant"></a>
35
+ Every theme name the plugin ships. A theme sets the whole deck through front
36
+ matter, and any one of them also restyles a single editor or terminal block
37
+ through that block's `theme` attribute.
38
+
32
39
  ### `VERSION` <a id="constant-VERSION"></a> <a id="VERSION-constant"></a>
33
40
  Not documented.
34
41
 
@@ -38,6 +45,9 @@ Not documented.
38
45
  - [Slides/Assets.md](doc/Jekyll/Slides/Assets.md)
39
46
  - [Slides/ComponentRenderer/RenderedDocument.md](doc/Jekyll/Slides/ComponentRenderer/RenderedDocument.md)
40
47
  - [Slides/ComponentRenderer.md](doc/Jekyll/Slides/ComponentRenderer.md)
48
+ - [Slides/Deck.md](doc/Jekyll/Slides/Deck.md)
49
+ - [Slides/DeckAssembler.md](doc/Jekyll/Slides/DeckAssembler.md)
50
+ - [Slides/FrontMatter.md](doc/Jekyll/Slides/FrontMatter.md)
41
51
  - [Slides/JekyllIntegration.md](doc/Jekyll/Slides/JekyllIntegration.md)
42
52
  - [Slides/Layout.md](doc/Jekyll/Slides/Layout.md)
43
53
  - [Slides/Presentation.md](doc/Jekyll/Slides/Presentation.md)
@@ -45,6 +55,7 @@ Not documented.
45
55
  - [Slides/RangeParser.md](doc/Jekyll/Slides/RangeParser.md)
46
56
  - [Slides/Renderer.md](doc/Jekyll/Slides/Renderer.md)
47
57
  - [Slides/RougeRenderer.md](doc/Jekyll/Slides/RougeRenderer.md)
58
+ - [Slides/SlideFile.md](doc/Jekyll/Slides/SlideFile.md)
48
59
  - [Slides/SlideMetadata.md](doc/Jekyll/Slides/SlideMetadata.md)
49
60
  - [Slides/SlideRenderer.md](doc/Jekyll/Slides/SlideRenderer.md)
50
61
  - [Slides/Support.md](doc/Jekyll/Slides/Support.md)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-slides
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lucian Ghinda
@@ -118,6 +118,9 @@ files:
118
118
  - doc/Jekyll/Slides/Assets/SiteAssetFile.md
119
119
  - doc/Jekyll/Slides/ComponentRenderer.md
120
120
  - doc/Jekyll/Slides/ComponentRenderer/RenderedDocument.md
121
+ - doc/Jekyll/Slides/Deck.md
122
+ - doc/Jekyll/Slides/DeckAssembler.md
123
+ - doc/Jekyll/Slides/FrontMatter.md
121
124
  - doc/Jekyll/Slides/JekyllIntegration.md
122
125
  - doc/Jekyll/Slides/Layout.md
123
126
  - doc/Jekyll/Slides/Presentation.md
@@ -125,6 +128,7 @@ files:
125
128
  - doc/Jekyll/Slides/RangeParser.md
126
129
  - doc/Jekyll/Slides/Renderer.md
127
130
  - doc/Jekyll/Slides/RougeRenderer.md
131
+ - doc/Jekyll/Slides/SlideFile.md
128
132
  - doc/Jekyll/Slides/SlideMetadata.md
129
133
  - doc/Jekyll/Slides/SlideRenderer.md
130
134
  - doc/Jekyll/Slides/Support.md
@@ -134,6 +138,9 @@ files:
134
138
  - lib/jekyll/slides.rb
135
139
  - lib/jekyll/slides/assets.rb
136
140
  - lib/jekyll/slides/component_renderer.rb
141
+ - lib/jekyll/slides/deck.rb
142
+ - lib/jekyll/slides/deck_assembler.rb
143
+ - lib/jekyll/slides/front_matter.rb
137
144
  - lib/jekyll/slides/jekyll_integration.rb
138
145
  - lib/jekyll/slides/layout.rb
139
146
  - lib/jekyll/slides/presentation.rb
@@ -141,11 +148,12 @@ files:
141
148
  - lib/jekyll/slides/range_parser.rb
142
149
  - lib/jekyll/slides/renderer.rb
143
150
  - lib/jekyll/slides/rouge_renderer.rb
151
+ - lib/jekyll/slides/slide_file.rb
144
152
  - lib/jekyll/slides/slide_metadata.rb
145
153
  - lib/jekyll/slides/slide_renderer.rb
146
154
  - lib/jekyll/slides/support.rb
147
155
  - lib/jekyll/slides/version.rb
148
- - llm.txt
156
+ - llms.txt
149
157
  homepage: https://github.com/lucianghinda/jekyll-slides
150
158
  licenses:
151
159
  - Apache-2.0