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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 83cc3e4482e272e458314b0cae3cd6ae40a4e73498a5bff1cecb587dfb2b9023
4
- data.tar.gz: 5ed5dea8383d01e8f4361ce26c82470fcf472c020f1fefc7e0c0508909908b90
3
+ metadata.gz: ae3bd0311b08f8cc00fafc299213869f54624c6f98f96c2924f7e7c134f486ce
4
+ data.tar.gz: 38bbadd318cfc80b043d56daea283bb447e1c6c1b6fb7fb0228800a3d037115e
5
5
  SHA512:
6
- metadata.gz: 3847e92f9f9a148afb055dd476f00d01c27d3650ee7ec0f81cd4ab062520c384a87b43121317c5694a03c15681060fc17a52b44b9ebebeefb1747d2d118d499b
7
- data.tar.gz: bbf73de4b1fa4ed2f0fcf55acee7f57cbb4929399a5648ac9f04c5e23839b2227548d3568e282e7556c28f79a2e0959f470f546604e79e50d66721a07c5f52cc
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.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