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 +4 -4
- data/lib/jekyll/jtd_toc_nav/injector.rb +72 -17
- data/lib/jekyll/jtd_toc_nav/version.rb +6 -0
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d78498cdafec4ae7aae82bc4e2cf319711e5ae17ad881cd7495149ba29af7e97
|
|
4
|
+
data.tar.gz: e80b1d91582fa159c4e10047e29947e1c2cfd7315ac312def881bc3b8a860811
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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 = (
|
|
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
|
-
|
|
14
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
|
74
|
-
|
|
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+/)
|
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.
|
|
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
|