jekyll-toc 0.3.0 → 0.4.0.rc
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/Appraisals +4 -4
- data/README.md +8 -9
- data/gemfiles/{jekyll_2.gemfile → jekyll_3.6.gemfile} +1 -1
- data/lib/table_of_contents/parser.rb +25 -41
- data/lib/version.rb +1 -1
- data/test/test_helper.rb +7 -8
- data/test/test_various_toc_html.rb +96 -0
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14addb9f45e2c59684378d0a893225af44329358
|
4
|
+
data.tar.gz: 61974f038bb809635bb874991aa9d962a1759a48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea6df1586db53071164ffa49bd6ef5e9cec024d690aa890838c222853e83de86e817fdd4c916618d4c50604ca3f61f3c253917cb015acb51f45787254d31e8fc
|
7
|
+
data.tar.gz: 4c5b95c5d20a28f7bacdc1effaa717d6e9466fa555c449e7e53b80882c9bd7daf17ae715fb51b79b6abb3983e9ad4cee9075e6c2bf48bb37af12950f1ba98955
|
data/.travis.yml
CHANGED
data/Appraisals
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
appraise "jekyll-3.6" do
|
2
|
+
gem "jekyll", "3.6"
|
3
|
+
end
|
4
|
+
|
1
5
|
appraise "jekyll-3.5" do
|
2
6
|
gem "jekyll", "3.5.1"
|
3
7
|
end
|
@@ -21,7 +25,3 @@ end
|
|
21
25
|
appraise "jekyll-3" do
|
22
26
|
gem "jekyll", "3.0.3"
|
23
27
|
end
|
24
|
-
|
25
|
-
appraise "jekyll-2" do
|
26
|
-
gem "jekyll", "2.5.3"
|
27
|
-
end
|
data/README.md
CHANGED
@@ -8,20 +8,20 @@
|
|
8
8
|
|
9
9
|
# Installation
|
10
10
|
|
11
|
-
Add jekyll-toc plugin in your site's `Gemfile`.
|
11
|
+
Add jekyll-toc plugin in your site's `Gemfile`, and run `bundle install`.
|
12
12
|
|
13
13
|
```ruby
|
14
14
|
gem 'jekyll-toc'
|
15
15
|
```
|
16
16
|
|
17
|
-
|
17
|
+
Add jekyll-toc to the `gems:` section in your site's `_config.yml`.
|
18
18
|
|
19
19
|
```yml
|
20
20
|
gems:
|
21
21
|
- jekyll-toc
|
22
22
|
```
|
23
23
|
|
24
|
-
Set `toc: true` in
|
24
|
+
Set `toc: true` in posts for which you want the TOC to appear.
|
25
25
|
|
26
26
|
```yml
|
27
27
|
---
|
@@ -33,15 +33,14 @@ toc: true
|
|
33
33
|
|
34
34
|
# Usage
|
35
35
|
|
36
|
-
There are three Liquid filters
|
37
|
-
|
38
|
-
Jekyll's templates.
|
36
|
+
There are three Liquid filters, which can be applied to HTML content,
|
37
|
+
e.g. the Liquid variable `content` available in Jekyll's templates.
|
39
38
|
|
40
39
|
## 1. Basic Usage
|
41
40
|
|
42
41
|
### `toc` filter
|
43
42
|
|
44
|
-
Add `toc` filter to your site's `{{ content }}` (e.g. `_layouts/post.html`).
|
43
|
+
Add the `toc` filter to your site's `{{ content }}` (e.g. `_layouts/post.html`).
|
45
44
|
|
46
45
|
```liquid
|
47
46
|
{{ content | toc }}
|
@@ -73,9 +72,9 @@ TOC itself. They are of the form:
|
|
73
72
|
This is only useful when the TOC itself should be placed at some other
|
74
73
|
location with the `toc_only` filter.
|
75
74
|
|
76
|
-
## Generated
|
75
|
+
## Generated HTML
|
77
76
|
|
78
|
-
jekyll-toc generates
|
77
|
+
jekyll-toc generates an unordered list. The final output is as follows.
|
79
78
|
|
80
79
|
**Heads-up**: As of v0.3, nested toc has been supported. If you update jekyll-toc from 0.2 to 0.3, please check [upgrade guide](https://github.com/toshimaru/jekyll-toc/wiki/0.3-Upgrade-Guide)
|
81
80
|
|
@@ -12,16 +12,7 @@ module Jekyll
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def build_toc
|
15
|
-
|
16
|
-
|
17
|
-
min_h_num = 6
|
18
|
-
@entries.each do |entry|
|
19
|
-
h_num = entry[:node_name].delete('h').to_i
|
20
|
-
min_h_num = [min_h_num, h_num].min
|
21
|
-
end
|
22
|
-
toc << build_lis(@entries, min_h_num)
|
23
|
-
|
24
|
-
toc << '</ul>'
|
15
|
+
%(<ul class="section-nav">\n#{build_toc_list(@entries)}</ul>)
|
25
16
|
end
|
26
17
|
|
27
18
|
def inject_anchors_into_html
|
@@ -60,7 +51,8 @@ module Jekyll
|
|
60
51
|
uniq: uniq,
|
61
52
|
text: text,
|
62
53
|
node_name: node.name,
|
63
|
-
content_node: header_content
|
54
|
+
content_node: header_content,
|
55
|
+
h_num: node.name.delete('h').to_i
|
64
56
|
}
|
65
57
|
end
|
66
58
|
|
@@ -68,55 +60,47 @@ module Jekyll
|
|
68
60
|
end
|
69
61
|
|
70
62
|
# Returns the list items for entries
|
71
|
-
def
|
72
|
-
lis = ''
|
63
|
+
def build_toc_list(entries)
|
73
64
|
i = 0
|
74
|
-
|
65
|
+
toc_list = ''
|
66
|
+
min_h_num = entries.map { |e| e[:h_num] }.min
|
67
|
+
|
68
|
+
while i < entries.count
|
75
69
|
entry = entries[i]
|
76
|
-
|
77
|
-
if curr_h_num == min_h_num
|
70
|
+
if entry[:h_num] == min_h_num
|
78
71
|
# If the current entry should not be indented in the list, add the entry to the list
|
79
|
-
|
72
|
+
toc_list << %(<li class="toc-entry toc-#{entry[:node_name]}"><a href="##{entry[:id]}#{entry[:uniq]}">#{entry[:text]}</a>)
|
80
73
|
# If the next entry should be indented in the list, generate a sublist
|
81
|
-
if i + 1 < entries.
|
74
|
+
if i + 1 < entries.count
|
82
75
|
next_entry = entries[i + 1]
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
nest_entries = get_nest_entries(entries[i + 1, entries.length], min_h_num)
|
88
|
-
lis << build_lis(nest_entries, min_h_num + 1)
|
89
|
-
lis << %(</ul>\n)
|
90
|
-
i += nest_entries.length
|
76
|
+
if next_entry[:h_num] > min_h_num
|
77
|
+
nest_entries = get_nest_entries(entries[i + 1, entries.count], min_h_num)
|
78
|
+
toc_list << %(\n<ul>\n#{build_toc_list(nest_entries)}</ul>\n)
|
79
|
+
i += nest_entries.count
|
91
80
|
end
|
92
81
|
end
|
93
82
|
# Add the closing tag for the current entry in the list
|
94
|
-
|
95
|
-
elsif
|
83
|
+
toc_list << %(</li>\n)
|
84
|
+
elsif entry[:h_num] > min_h_num
|
96
85
|
# If the current entry should be indented in the list, generate a sublist
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
lis << %(</ul>\n)
|
101
|
-
i += nest_entries.length - 1
|
86
|
+
nest_entries = get_nest_entries(entries[i, entries.count], min_h_num)
|
87
|
+
toc_list << %(<ul>\n#{build_toc_list(nest_entries)}</ul>\n)
|
88
|
+
i += nest_entries.count - 1
|
102
89
|
end
|
103
90
|
i += 1
|
104
91
|
end
|
105
|
-
|
92
|
+
|
93
|
+
toc_list
|
106
94
|
end
|
107
95
|
|
108
96
|
# Returns the entries in a nested list
|
109
97
|
# The nested list starts at the first entry in entries (inclusive)
|
110
98
|
# The nested list ends at the first entry in entries with depth min_h_num or greater (exclusive)
|
111
99
|
def get_nest_entries(entries, min_h_num)
|
112
|
-
nest_entries
|
113
|
-
|
114
|
-
|
115
|
-
nest_h_num = nest_entry[:node_name].delete('h').to_i
|
116
|
-
break unless nest_h_num > min_h_num
|
117
|
-
nest_entries.push(nest_entry)
|
100
|
+
entries.inject([]) do |nest_entries, entry|
|
101
|
+
break nest_entries if entry[:h_num] == min_h_num
|
102
|
+
nest_entries << entry
|
118
103
|
end
|
119
|
-
nest_entries
|
120
104
|
end
|
121
105
|
end
|
122
106
|
end
|
data/lib/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -5,18 +5,17 @@ require 'minitest/autorun'
|
|
5
5
|
require 'jekyll'
|
6
6
|
require 'jekyll-toc'
|
7
7
|
|
8
|
-
SIMPLE_HTML = <<-HTML
|
9
|
-
<h1>Simple H1</h1>
|
10
|
-
<h2>Simple H2</h2>
|
11
|
-
<h3>Simple H3</h3>
|
12
|
-
<h4>Simple H4</h4>
|
13
|
-
<h5>Simple H5</h5>
|
14
|
-
<h6>Simple H6</h6>
|
8
|
+
SIMPLE_HTML = <<-HTML.freeze
|
9
|
+
<h1>Simple H1</h1>
|
10
|
+
<h2>Simple H2</h2>
|
11
|
+
<h3>Simple H3</h3>
|
12
|
+
<h4>Simple H4</h4>
|
13
|
+
<h5>Simple H5</h5>
|
14
|
+
<h6>Simple H6</h6>
|
15
15
|
HTML
|
16
16
|
|
17
17
|
module TestHelpers
|
18
18
|
def read_html_and_create_parser
|
19
19
|
@parser = Jekyll::TableOfContents::Parser.new(SIMPLE_HTML)
|
20
|
-
assert_match(/Simple H1/, @parser.doc.inner_html)
|
21
20
|
end
|
22
21
|
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestVariousTocHtml < Minitest::Test
|
4
|
+
TEST_HTML_1 = <<-HTML
|
5
|
+
<h1>h1</h1>
|
6
|
+
<h3>h3</h3>
|
7
|
+
<h6>h6</h6>
|
8
|
+
HTML
|
9
|
+
|
10
|
+
TEST_HTML_2 = <<-HTML
|
11
|
+
<h1>h1</h1>
|
12
|
+
<h3>h3</h3>
|
13
|
+
<h2>h2</h2>
|
14
|
+
<h6>h6</h6>
|
15
|
+
HTML
|
16
|
+
|
17
|
+
TEST_HTML_3 = <<-HTML
|
18
|
+
<h6>h6</h6>
|
19
|
+
<h5>h5</h5>
|
20
|
+
<h4>h4</h4>
|
21
|
+
<h3>h3</h3>
|
22
|
+
<h2>h2</h2>
|
23
|
+
<h1>h1</h1>
|
24
|
+
HTML
|
25
|
+
|
26
|
+
def test_nested_toc
|
27
|
+
@parser = Jekyll::TableOfContents::Parser.new(TEST_HTML_1)
|
28
|
+
doc = Nokogiri::HTML(@parser.toc)
|
29
|
+
assert_equal(doc.css('ul.section-nav').to_s, <<-HTML
|
30
|
+
<ul class="section-nav">
|
31
|
+
<li class="toc-entry toc-h1">
|
32
|
+
<a href="#h1">h1</a>
|
33
|
+
<ul>
|
34
|
+
<li class="toc-entry toc-h3">
|
35
|
+
<a href="#h3">h3</a>
|
36
|
+
<ul>
|
37
|
+
<li class="toc-entry toc-h6"><a href="#h6">h6</a></li>
|
38
|
+
</ul>
|
39
|
+
</li>
|
40
|
+
</ul>
|
41
|
+
</li>
|
42
|
+
</ul>
|
43
|
+
HTML
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_complex_nested_toc
|
48
|
+
@parser = Jekyll::TableOfContents::Parser.new(TEST_HTML_2)
|
49
|
+
doc = Nokogiri::HTML(@parser.toc)
|
50
|
+
assert_equal(doc.css('ul.section-nav').to_s, <<-HTML
|
51
|
+
<ul class="section-nav">
|
52
|
+
<li class="toc-entry toc-h1">
|
53
|
+
<a href="#h1">h1</a>
|
54
|
+
<ul>
|
55
|
+
<ul>
|
56
|
+
<li class="toc-entry toc-h3"><a href="#h3">h3</a></li>
|
57
|
+
</ul>
|
58
|
+
<li class="toc-entry toc-h2">
|
59
|
+
<a href="#h2">h2</a>
|
60
|
+
<ul>
|
61
|
+
<li class="toc-entry toc-h6"><a href="#h6">h6</a></li>
|
62
|
+
</ul>
|
63
|
+
</li>
|
64
|
+
</ul>
|
65
|
+
</li>
|
66
|
+
</ul>
|
67
|
+
HTML
|
68
|
+
)
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_decremental_headings
|
72
|
+
@parser = Jekyll::TableOfContents::Parser.new(TEST_HTML_3)
|
73
|
+
doc = Nokogiri::HTML(@parser.toc)
|
74
|
+
assert_equal(doc.css('ul.section-nav').to_s, <<-HTML
|
75
|
+
<ul class="section-nav">
|
76
|
+
<ul>
|
77
|
+
<ul>
|
78
|
+
<ul>
|
79
|
+
<ul>
|
80
|
+
<ul>
|
81
|
+
<li class="toc-entry toc-h6"><a href="#h6">h6</a></li>
|
82
|
+
</ul>
|
83
|
+
<li class="toc-entry toc-h5"><a href="#h5">h5</a></li>
|
84
|
+
</ul>
|
85
|
+
<li class="toc-entry toc-h4"><a href="#h4">h4</a></li>
|
86
|
+
</ul>
|
87
|
+
<li class="toc-entry toc-h3"><a href="#h3">h3</a></li>
|
88
|
+
</ul>
|
89
|
+
<li class="toc-entry toc-h2"><a href="#h2">h2</a></li>
|
90
|
+
</ul>
|
91
|
+
<li class="toc-entry toc-h1"><a href="#h1">h1</a></li>
|
92
|
+
</ul>
|
93
|
+
HTML
|
94
|
+
)
|
95
|
+
end
|
96
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-toc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0.rc
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- toshimaru
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-10-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -123,12 +123,12 @@ files:
|
|
123
123
|
- LICENSE.md
|
124
124
|
- README.md
|
125
125
|
- Rakefile
|
126
|
-
- gemfiles/jekyll_2.gemfile
|
127
126
|
- gemfiles/jekyll_3.1.gemfile
|
128
127
|
- gemfiles/jekyll_3.2.gemfile
|
129
128
|
- gemfiles/jekyll_3.3.gemfile
|
130
129
|
- gemfiles/jekyll_3.4.gemfile
|
131
130
|
- gemfiles/jekyll_3.5.gemfile
|
131
|
+
- gemfiles/jekyll_3.6.gemfile
|
132
132
|
- gemfiles/jekyll_3.gemfile
|
133
133
|
- jekyll-toc.gemspec
|
134
134
|
- lib/jekyll-toc.rb
|
@@ -138,6 +138,7 @@ files:
|
|
138
138
|
- test/test_inject_anchors_filter.rb
|
139
139
|
- test/test_toc_filter.rb
|
140
140
|
- test/test_toc_only_filter.rb
|
141
|
+
- test/test_various_toc_html.rb
|
141
142
|
homepage: https://github.com/toshimaru/jekyll-toc
|
142
143
|
licenses:
|
143
144
|
- MIT
|
@@ -156,12 +157,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
156
157
|
version: 2.1.0
|
157
158
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
159
|
requirements:
|
159
|
-
- - "
|
160
|
+
- - ">"
|
160
161
|
- !ruby/object:Gem::Version
|
161
|
-
version:
|
162
|
+
version: 1.3.1
|
162
163
|
requirements: []
|
163
164
|
rubyforge_project:
|
164
|
-
rubygems_version: 2.
|
165
|
+
rubygems_version: 2.6.13
|
165
166
|
signing_key:
|
166
167
|
specification_version: 4
|
167
168
|
summary: Jekyll Table of Contents plugin
|
@@ -170,3 +171,4 @@ test_files:
|
|
170
171
|
- test/test_inject_anchors_filter.rb
|
171
172
|
- test/test_toc_filter.rb
|
172
173
|
- test/test_toc_only_filter.rb
|
174
|
+
- test/test_various_toc_html.rb
|