pro_generate_toc 1.0.0 → 1.0.2
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/README.md +1 -0
- data/lib/pro_generate_toc.rb +108 -0
- data/pro_generate_toc.gemspec +18 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae3bd0311b08f8cc00fafc299213869f54624c6f98f96c2924f7e7c134f486ce
|
4
|
+
data.tar.gz: 38bbadd318cfc80b043d56daea283bb447e1c6c1b6fb7fb0228800a3d037115e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f95e0729456a884c45723e438e606321960a206e196b2932df2dc942fd442f42cf745fed689e782ac8e4aa6c25934b42157e7ac2b13578e16051abed2e4939f1
|
7
|
+
data.tar.gz: 7cbfe614cac202e8ad03c72a6e88128e097596e7027c9a9caf0703d18cf21a2755cf4f2305ba6e3468d72dd96fbfbaab1fbebd55908b545eab511bc99165c3f0
|
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# pro_generate_toc
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
class RenderTocPro < Liquid::Tag
|
5
|
+
def initialize(tag_name, input, tokens)
|
6
|
+
super
|
7
|
+
end
|
8
|
+
def render(context)
|
9
|
+
@doc = Nokogiri::HTML::DocumentFragment.parse(context.registers[:page]['content'])
|
10
|
+
|
11
|
+
%(<ul id="pro-sidebar" class="js-scroll-nav list-group">\n#{Parser.new(@doc).build_toc_list}</ul>)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
module TableOfContentsFilter
|
15
|
+
def pro_toc(html)
|
16
|
+
@doc = Nokogiri::HTML::DocumentFragment.parse(html)
|
17
|
+
|
18
|
+
%(<ul id="pro-sidebar" class="js-scroll-nav list-group">\n#{Parser.new(@doc).build_toc_list}</ul>)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
class Parser
|
22
|
+
def initialize(html, options = {})
|
23
|
+
@doc = Nokogiri::HTML::DocumentFragment.parse(html)
|
24
|
+
@entries = parse_content
|
25
|
+
end
|
26
|
+
def parse_content
|
27
|
+
headers = Hash.new(0)
|
28
|
+
|
29
|
+
(@doc.css(toc_headings) - @doc.css(toc_headings_within))
|
30
|
+
.reject { |n| n.classes.include?('no_toc_section') }
|
31
|
+
.inject([]) do |entries, node|
|
32
|
+
text = node.text
|
33
|
+
id = node.attribute('id') || 'ryan-id'
|
34
|
+
|
35
|
+
suffix_num = headers[id]
|
36
|
+
headers[id] += 1
|
37
|
+
|
38
|
+
entries << {
|
39
|
+
id: suffix_num.zero? ? id : "#{id}-#{suffix_num}",
|
40
|
+
text: CGI.escapeHTML(text),
|
41
|
+
node_name: node.name,
|
42
|
+
header_content: node.children.first,
|
43
|
+
h_num: node.name.delete('h').to_i
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def toc_headings
|
49
|
+
@toc_levels = 2..2
|
50
|
+
@toc_levels.map { |level| "h#{level}" }.join(',')
|
51
|
+
end
|
52
|
+
|
53
|
+
def toc_headings_within
|
54
|
+
@toc_levels = 2..2
|
55
|
+
@toc_levels.map { |level| ".no_toc_section h#{level}" }.join(',')
|
56
|
+
end
|
57
|
+
|
58
|
+
def build_toc_list
|
59
|
+
entries = @entries;
|
60
|
+
i = 0
|
61
|
+
limit = 3
|
62
|
+
hasToggle = 0
|
63
|
+
toc_list = +''
|
64
|
+
min_h_num = @entries.map { |e| e[:h_num] }.min
|
65
|
+
|
66
|
+
while i < entries.count
|
67
|
+
entry = entries[i]
|
68
|
+
if entry[:h_num] == min_h_num
|
69
|
+
next_i = i + 1
|
70
|
+
if next_i <= limit
|
71
|
+
toc_list << %(<li><a href="#" class="js-go-to" data-target="##{entry[:id]}">#{next_i}. #{entry[:text]}</a>)
|
72
|
+
|
73
|
+
if next_i < entries.count && entries[next_i][:h_num] > min_h_num
|
74
|
+
nest_entries = get_nest_entries(entries[next_i, entries.count], min_h_num)
|
75
|
+
toc_list << %(\n<ul id="pro-sidebar-sub" class="js-scroll-nav list-group">\n#{build_toc_list(nest_entries)}</ul>\n)
|
76
|
+
i += nest_entries.count
|
77
|
+
end
|
78
|
+
else
|
79
|
+
hasToggle += 1
|
80
|
+
toc_list << %(<li id="sidebar-collapse" class="collapse"><a href="#" class="js-go-to" data-target="##{entry[:id]}">#{next_i}. #{entry[:text]}</a>)
|
81
|
+
end
|
82
|
+
|
83
|
+
toc_list << %(</li>\n)
|
84
|
+
elsif entry[:h_num] > min_h_num
|
85
|
+
nest_entries = get_nest_entries(entries[i, entries.count], min_h_num)
|
86
|
+
toc_list << build_toc_list(nest_entries)
|
87
|
+
i += nest_entries.count - 1
|
88
|
+
end
|
89
|
+
i += 1
|
90
|
+
end
|
91
|
+
if hasToggle > 0
|
92
|
+
toc_list << %(<div id="blog-sidebar-loadmore" data-toggle="collapse" data-target="#sidebar-collapse" aria-expanded="false" aria-controls="sidebar-collapse" style="text-align: center; cursor: pointer; color: #407bff"><i class="fa"></i></div>)
|
93
|
+
end
|
94
|
+
toc_list
|
95
|
+
end
|
96
|
+
|
97
|
+
def get_nest_entries(entries, min_h_num)
|
98
|
+
entries.inject([]) do |nest_entries, entry|
|
99
|
+
break nest_entries if entry[:h_num] == min_h_num
|
100
|
+
|
101
|
+
nest_entries << entry
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
Liquid::Template.register_filter(Jekyll::TableOfContentsFilter)
|
108
|
+
Liquid::Template.register_tag('render_toc', Jekyll::RenderTocPro)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = 'pro_generate_toc'
|
3
|
+
spec.version = '1.0.2'
|
4
|
+
spec.summary = 'Jekyll Table of Contents plugin'
|
5
|
+
spec.description = 'Jekyll (Ruby static website generator) plugin which generates a Table of Contents for the page.'
|
6
|
+
spec.authors = %w[Ryan]
|
7
|
+
spec.email = 'sonnb@mageplaza.com'
|
8
|
+
spec.homepage = 'https://mageplaza.com'
|
9
|
+
spec.license = 'Ryan'
|
10
|
+
spec.require_paths = ['lib']
|
11
|
+
|
12
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
13
|
+
spec.metadata['source_code_uri'] = spec.homepage
|
14
|
+
spec.metadata['changelog_uri'] = spec.homepage
|
15
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0")
|
18
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pro_generate_toc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan
|
@@ -16,7 +16,10 @@ email: sonnb@mageplaza.com
|
|
16
16
|
executables: []
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
|
-
files:
|
19
|
+
files:
|
20
|
+
- README.md
|
21
|
+
- lib/pro_generate_toc.rb
|
22
|
+
- pro_generate_toc.gemspec
|
20
23
|
homepage: https://mageplaza.com
|
21
24
|
licenses:
|
22
25
|
- Ryan
|