jekyll-jtd-toc-nav 0.2.6 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e47efee6a267af3e358e577ef316d23751943725d55820830a1dc4c03b51768
4
- data.tar.gz: f4f987f57a4ca7a8f1d718af39ab385eb9d8edfcd1526d5eb537f0983fd6c942
3
+ metadata.gz: d78498cdafec4ae7aae82bc4e2cf319711e5ae17ad881cd7495149ba29af7e97
4
+ data.tar.gz: e80b1d91582fa159c4e10047e29947e1c2cfd7315ac312def881bc3b8a860811
5
5
  SHA512:
6
- metadata.gz: d43e9ebd07ce40722600133b6bee1b66af44bcfd8f06f4977a7ae2e099e979d0a780a0fd328da24fa6e06979e7d8dcfffc1e5bc8d46e83280b48f222d33342db
7
- data.tar.gz: 8787e52ccb3cf97ca332ecf11533861f8d32bdfcf6c6c39fd33c2698d1d37329a734b3cde0286e9557a683f621bf3c16d69cf6a36c9e2df18c1534d67041a3d9
6
+ metadata.gz: 573528e4c17b0bd289f4e00bc68e8ed053c09ebc2d46bd20cfe4742e1144035e06f5d852292810a48c80edca974579cc8f733f68a449a360a7f745eec19c18a3
7
+ data.tar.gz: aa7bbf410a6cc1b71713a689d9c11902b1eb640a9589ec1afb5de0cdca07a1205f2c9f58a10b09ce8bc0ec7ddcd4a468d99f9df2e2f09e29ffbf928d695d5229
@@ -3,29 +3,30 @@
3
3
  module Jekyll
4
4
  module JtdTocNav
5
5
  class Injector
6
- DEFAULT_LEVELS = (2..4).to_a
6
+ DEFAULT_LEVELS = (1..4).to_a
7
7
 
8
8
  def initialize(site:)
9
9
  @site = site
10
10
  end
11
11
 
12
12
  def levels
13
- raw = @site.config["sidebar_toc_levels"]
14
- return DEFAULT_LEVELS if raw.nil?
15
-
16
- if raw.is_a?(String) && raw.include?("..")
17
- a, b = raw.split("..", 2).map { |x| Integer(x) rescue nil }
18
- return DEFAULT_LEVELS if a.nil? || b.nil?
19
- return (a..b).to_a
20
- end
13
+ configured_levels(@site.config["sidebar_toc_levels"]) || DEFAULT_LEVELS
14
+ end
21
15
 
22
- if raw.is_a?(Array)
23
- ints = raw.map { |x| Integer(x) rescue nil }.compact
24
- return DEFAULT_LEVELS if ints.empty?
25
- return ints
16
+ def levels_for(page_like)
17
+ data = page_like.data if page_like.respond_to?(:data)
18
+ if data.respond_to?(:key?) && data.key?("sidebar_toc_levels")
19
+ raw = data["sidebar_toc_levels"]
20
+ parsed = configured_levels(raw)
21
+ return parsed if parsed
22
+
23
+ Jekyll.logger.warn(
24
+ "jtd-toc-nav:",
25
+ "invalid sidebar_toc_levels on #{page_label(page_like)}: #{raw.inspect}"
26
+ )
26
27
  end
27
28
 
28
- DEFAULT_LEVELS
29
+ levels
29
30
  end
30
31
 
31
32
  def expand_all?
@@ -38,7 +39,7 @@ module Jekyll
38
39
  html = page_like.output
39
40
  doc = Nokogiri::HTML(html)
40
41
 
41
- headings = extract_headings(doc)
42
+ headings = extract_headings(doc, levels_for(page_like))
42
43
  return if headings.empty?
43
44
 
44
45
  nav = doc.at_css("#site-nav")
@@ -70,8 +71,62 @@ module Jekyll
70
71
 
71
72
  private
72
73
 
73
- def extract_headings(doc)
74
- selector = levels.map { |lvl| "main h#{lvl}" }.join(", ")
74
+ def configured_levels(raw)
75
+ return nil if raw.nil?
76
+
77
+ if raw.is_a?(Array)
78
+ ints = raw.map { |x| Integer(x) rescue nil }.compact
79
+ return nil if ints.empty?
80
+
81
+ return ints
82
+ end
83
+
84
+ parsed = parse_levels_spec(raw)
85
+ return nil if parsed.nil? || parsed.empty?
86
+
87
+ parsed
88
+ end
89
+
90
+ # "1..4", "2, 3, 5", or "2 3". Returns nil when the spec is not usable.
91
+ def parse_levels_spec(raw)
92
+ str = raw.to_s.strip
93
+ if (str.start_with?('"') && str.end_with?('"')) || (str.start_with?("'") && str.end_with?("'"))
94
+ str = str[1..-2].strip
95
+ end
96
+ return nil if str.empty?
97
+
98
+ if str.include?("..")
99
+ a_str, b_str = str.split("..", 2)
100
+ a = Integer(a_str.strip) rescue nil
101
+ b = Integer(b_str.strip) rescue nil
102
+ return nil if a.nil? || b.nil? || a > b
103
+
104
+ return (a..b).to_a
105
+ end
106
+
107
+ parts = str.split(/[\s,]+/).reject(&:empty?)
108
+ return nil if parts.empty?
109
+
110
+ ints = parts.map { |part| Integer(part) rescue nil }
111
+ return nil if ints.any?(&:nil?)
112
+
113
+ ints
114
+ end
115
+
116
+ def page_label(page_like)
117
+ if page_like.respond_to?(:relative_path) && page_like.relative_path
118
+ page_like.relative_path
119
+ elsif page_like.respond_to?(:path) && page_like.path
120
+ page_like.path
121
+ elsif page_like.respond_to?(:url)
122
+ page_like.url
123
+ else
124
+ "(unknown page)"
125
+ end
126
+ end
127
+
128
+ def extract_headings(doc, heading_levels)
129
+ selector = heading_levels.map { |lvl| "main h#{lvl}" }.join(", ")
75
130
  doc.css(selector).filter_map do |h|
76
131
  next if h["id"].to_s.empty?
77
132
  classes = h["class"].to_s.split(/\s+/)
@@ -0,0 +1,6 @@
1
+ module Jekyll
2
+ module JtdTocNav
3
+ VERSION = "0.4.0"
4
+ end
5
+ end
6
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-jtd-toc-nav
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - directsun
@@ -44,6 +44,7 @@ extra_rdoc_files: []
44
44
  files:
45
45
  - lib/jekyll-jtd-toc-nav.rb
46
46
  - lib/jekyll/jtd_toc_nav/injector.rb
47
+ - lib/jekyll/jtd_toc_nav/version.rb
47
48
  homepage: ''
48
49
  licenses:
49
50
  - MIT