jekyll-toc 0.12.1 → 0.15.0.rc

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79d1409209555ff59be7d83d30b1576ca4ae792835a934fa2618e9efb13c0a61
4
- data.tar.gz: 1008538004cb196a363fca3748988f1156d21e6ff72b30505d4a4f20ad0c1600
3
+ metadata.gz: 3d791df4c69353cee2810d445dc565746e9d4ed2f7f738e205f6ee2fef19d369
4
+ data.tar.gz: '084bc15ad6fe3fb08b2ad83e979e08d93ffb988adbccc6c7981479cd210d9de4'
5
5
  SHA512:
6
- metadata.gz: 4a4f68a3f04691f78bfe05f8a5b3e5e59f0b75b26e43cdb199ba8a5aa08192c397fd7bc2ffbbf458d5923b136369d986dac1f1a6556ef6c820faa95365873a8e
7
- data.tar.gz: 83ad420d0a58ca60ef99635b1ed13b85e2f17f7a638c35724f22c0f6b628121cf73c25ae4a9d6e2c65d909dcae72355220c3465471bd3f14d858f9af5c143764
6
+ metadata.gz: 44021a6c5bf17fa105b698571d43715aa381297b47355f4f439179063f695318f8071a8c1120318682c9eb25c17d7067fcacfdfc0ea5ce62995428f3e2f3649f
7
+ data.tar.gz: 69af07e31563443aa18492717b820aa3d274cc2e1cbb520a9b1489b87c72492ef3611fb96a25403565ea9e809161cffb2809aaead154b047984dac67da268bcb
@@ -0,0 +1,32 @@
1
+ name: CI
2
+ on: [push, pull_request]
3
+ jobs:
4
+ build:
5
+ strategy:
6
+ matrix:
7
+ ruby: [2.4, 2.5, 2.6, 2.7]
8
+ gemfile:
9
+ - gemfiles/jekyll_3.8.gemfile
10
+ - gemfiles/jekyll_3.9.gemfile
11
+ - gemfiles/jekyll_4.0.gemfile
12
+ - gemfiles/jekyll_4.1.gemfile
13
+ exclude:
14
+ - ruby: 2.4
15
+ gemfile: gemfiles/jekyll_4.0.gemfile
16
+ - ruby: 2.4
17
+ gemfile: gemfiles/jekyll_4.1.gemfile
18
+ env:
19
+ BUNDLE_GEMFILE: ${{ matrix.gemfile }}
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - uses: actions/checkout@v2
23
+ - name: Set up Ruby ${{ matrix.ruby }}
24
+ uses: eregon/use-ruby-action@master
25
+ with:
26
+ ruby-version: ${{ matrix.ruby }}
27
+ - name: bundle install
28
+ run: |
29
+ gem install bundler
30
+ bundle install --jobs 4 --retry 3
31
+ - name: Run Test
32
+ run: bundle exec rake
@@ -0,0 +1,22 @@
1
+ name: Coverage
2
+ on: [push, pull_request]
3
+ jobs:
4
+ build:
5
+ strategy:
6
+ matrix:
7
+ ruby: [2.6]
8
+ runs-on: ubuntu-latest
9
+ name: coverage
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - name: Set up Ruby ${{ matrix.ruby }}
13
+ uses: eregon/use-ruby-action@master
14
+ with:
15
+ ruby-version: ${{ matrix.ruby }}
16
+ - name: bundle install
17
+ run: bundle install --jobs 4 --retry 3
18
+ - uses: paambaati/codeclimate-action@v2.4.0
19
+ env:
20
+ CC_TEST_REPORTER_ID: 6b81e393ea6ad38560386f650ea2fb0e57a7beb5e20f8c8364fabee30d5bff07
21
+ with:
22
+ coverageCommand: bundle exec rake
@@ -0,0 +1,19 @@
1
+ name: RuboCop
2
+ on: [push, pull_request]
3
+ jobs:
4
+ build:
5
+ strategy:
6
+ matrix:
7
+ ruby: [2.6]
8
+ runs-on: ubuntu-latest
9
+ name: rubocop
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - name: Set up Ruby ${{ matrix.ruby }}
13
+ uses: eregon/use-ruby-action@master
14
+ with:
15
+ ruby-version: ${{ matrix.ruby }}
16
+ - name: bundle install
17
+ run: bundle install --jobs 4 --retry 3
18
+ - name: Run RuboCop
19
+ run: bundle exec rubocop
@@ -1,22 +1,39 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.3
2
+ TargetRubyVersion: 2.4
3
3
  Exclude:
4
- - '*.gemspec'
5
- - 'gemfiles/*'
4
+ - "*.gemspec"
5
+ - "gemfiles/*"
6
+ - "vendor/**/*"
6
7
  - Rakefile
7
8
  - Gemfile
8
9
 
9
- Metrics/LineLength:
10
- Enabled: false
11
-
12
10
  Metrics/MethodLength:
13
11
  Enabled: false
14
-
15
12
  Metrics/AbcSize:
16
13
  Enabled: false
17
-
18
14
  Metrics/ClassLength:
19
15
  Enabled: false
20
16
 
21
- Style/FileName:
17
+ Naming/FileName:
18
+ Enabled: false
19
+
20
+ Layout/LineLength:
21
+ Enabled: false
22
+ Layout/SpaceAroundMethodCallOperator:
23
+ Enabled: true
24
+
25
+ Lint/RaiseException:
26
+ Enabled: true
27
+ Lint/StructNewOverride:
28
+ Enabled: true
29
+
30
+ Style/WordArray:
22
31
  Enabled: false
32
+ Style/HashEachMethods:
33
+ Enabled: true
34
+ Style/HashTransformKeys:
35
+ Enabled: true
36
+ Style/HashTransformValues:
37
+ Enabled: true
38
+ Style/ExponentialNotation:
39
+ Enabled: true
data/Appraisals CHANGED
@@ -1,13 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- appraise 'jekyll-3.8' do
4
- gem 'jekyll', '3.8'
5
- end
6
-
7
- appraise 'jekyll-3.7' do
8
- gem 'jekyll', '3.7'
9
- end
3
+ SUPPORTED_VERSIONS = %w[3.8 3.9 4.0 4.1].freeze
10
4
 
11
- appraise 'jekyll-3.6' do
12
- gem 'jekyll', '3.6'
5
+ SUPPORTED_VERSIONS.each do |version|
6
+ appraise "jekyll-#{version}" do
7
+ gem 'jekyll', version
8
+ end
13
9
  end
data/Gemfile CHANGED
@@ -1,3 +1,11 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ gem 'appraisal'
6
+ gem 'minitest-reporters'
7
+ gem 'minitest'
8
+ gem 'pry'
9
+ gem 'rake'
10
+ gem 'rubocop', '~> 0.81'
11
+ gem 'simplecov', '~> 0.17.1'
data/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2019 Toshimaru
3
+ Copyright (c) 2020 Toshimaru
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # jekyll-toc
2
2
 
3
- [![Build Status](https://travis-ci.org/toshimaru/jekyll-toc.svg?branch=master)](https://travis-ci.org/toshimaru/jekyll-toc)
4
- [![Gem Version](https://badge.fury.io/rb/jekyll-toc.svg)](http://badge.fury.io/rb/jekyll-toc)
3
+ ![CI](https://github.com/toshimaru/jekyll-toc/workflows/CI/badge.svg)
4
+ [![Gem Version](https://badge.fury.io/rb/jekyll-toc.svg)](https://badge.fury.io/rb/jekyll-toc)
5
5
  [![Code Climate](https://codeclimate.com/github/toshimaru/jekyll-toc/badges/gpa.svg)](https://codeclimate.com/github/toshimaru/jekyll-toc)
6
6
  [![Test Coverage](https://api.codeclimate.com/v1/badges/cd56b207f327603662a1/test_coverage)](https://codeclimate.com/github/toshimaru/jekyll-toc/test_coverage)
7
7
 
@@ -19,6 +19,7 @@
19
19
  - [Skip TOC Section](#skip-toc-section)
20
20
  - [CSS Styling](#css-styling)
21
21
  - [Custom CSS Class](#custom-css-class)
22
+ - [Using Unordered/Ordered lists](#using-unorderedordered-lists)
22
23
 
23
24
  ## Installation
24
25
 
@@ -64,11 +65,9 @@ This filter places the TOC directly above the content.
64
65
 
65
66
  ### 2. Advanced Usage
66
67
 
67
- If you'd like separated TOC and content, you can use `toc_only` and `inject_anchors` filters.
68
+ If you'd like separated TOC and content, you can use `{% toc %}` tag (or `toc_only` filter) and `inject_anchors` filter.
68
69
 
69
- #### ~~`toc_only` filter~~ `toc` tag
70
-
71
- ⚠️ Please use `{% toc %}` instead of `{{ content | toc_only }}`.
70
+ #### `{% toc %}` tag
72
71
 
73
72
  Generates the TOC itself as described [below](#generated-html).
74
73
  Mostly useful in cases where the TOC should _not_ be placed immediately
@@ -85,9 +84,20 @@ above the content but at some other place of the page, i.e. an aside.
85
84
  </div>
86
85
  ```
87
86
 
88
- #### Current Limitation
87
+ :warning: **`{% toc %}` Tag Limitation**
88
+
89
+ `{% toc %}` can be available only in [Jekyll Posts](https://jekyllrb.com/docs/step-by-step/08-blogging/) and [Jekyll Collections](https://jekyllrb.com/docs/collections/). If you'd like to use `{% toc %}` except posts or collections, please use `toc_only` filter as described below.
89
90
 
90
- **`{% toc %}` can be available only in [Jekyll Posts](https://jekyllrb.com/docs/step-by-step/08-blogging/) and [Jekyll Collections](https://jekyllrb.com/docs/collections/). If any concern or issue, please report it on [issue](https://github.com/toshimaru/jekyll-toc/issues/new).**
91
+ ```html
92
+ <div>
93
+ <div id="table-of-contents">
94
+ {{ content | toc_only }}
95
+ </div>
96
+ <div id="markdown-content">
97
+ {{ content | inject_anchors }}
98
+ </div>
99
+ </div>
100
+ ```
91
101
 
92
102
  #### `inject_anchors` filter
93
103
 
@@ -137,6 +147,7 @@ jekyll-toc generates an unordered list. The HTML output is as follows.
137
147
  toc:
138
148
  min_level: 1
139
149
  max_level: 6
150
+ ordered_list: false
140
151
  no_toc_section_class: no_toc_section
141
152
  list_class: section-nav
142
153
  sublist_class: ''
@@ -236,3 +247,39 @@ toc:
236
247
  # Default is "toc-":
237
248
  item_prefix: item-
238
249
  ```
250
+
251
+ ### Using Unordered/Ordered lists
252
+
253
+ By default the table of contents will be generated as an unordered list via `<ul></ul>` tags. This can be configured to use ordered lists instead `<ol></ol>`.
254
+ This can be configured in `_config.yml`:
255
+
256
+ ```yml
257
+ toc:
258
+ ordered_list: true # default is false
259
+ ```
260
+
261
+ In order to change the list type, use the [list-style-type](https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type) css property.
262
+ Add a class to the `sublist_class` configuration to append it to the `ol` tags so that you can add the `list-style-type` property.
263
+
264
+ Example
265
+
266
+ ```yml
267
+ toc:
268
+ ordered_list: true
269
+ list_class: my-list-class
270
+ sublist_class: my-sublist-class
271
+ ```
272
+
273
+ ```css
274
+ .my-list-class {
275
+ list-style-type: upper-alpha;
276
+ }
277
+
278
+ .my-sublist-class: {
279
+ list-style-type: lower-alpha;
280
+ }
281
+ ```
282
+
283
+ This will produce:
284
+
285
+ ![screenshot](https://user-images.githubusercontent.com/7675276/85813980-a0ea5a80-b719-11ea-9458-ccf9b86a778b.png)
@@ -2,6 +2,13 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "appraisal"
6
+ gem "minitest-reporters"
7
+ gem "minitest"
8
+ gem "pry"
9
+ gem "rake"
10
+ gem "rubocop", "~> 0.81"
11
+ gem "simplecov", "~> 0.17.1"
5
12
  gem "jekyll", "3.8"
6
13
 
7
14
  gemspec path: "../"
@@ -0,0 +1,14 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "minitest-reporters"
7
+ gem "minitest"
8
+ gem "pry"
9
+ gem "rake"
10
+ gem "rubocop", "~> 0.81"
11
+ gem "simplecov", "~> 0.17.1"
12
+ gem "jekyll", "3.9"
13
+
14
+ gemspec path: "../"
@@ -0,0 +1,14 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "minitest-reporters"
7
+ gem "minitest"
8
+ gem "pry"
9
+ gem "rake"
10
+ gem "rubocop", "~> 0.81"
11
+ gem "simplecov", "~> 0.17.1"
12
+ gem "jekyll", "4.0"
13
+
14
+ gemspec path: "../"
@@ -0,0 +1,14 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "minitest-reporters"
7
+ gem "minitest"
8
+ gem "pry"
9
+ gem "rake"
10
+ gem "rubocop", "~> 0.81"
11
+ gem "simplecov", "~> 0.17.1"
12
+ gem "jekyll", "4.1"
13
+
14
+ gemspec path: "../"
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  lib = File.expand_path('../lib', __FILE__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require 'version'
5
+ require 'table_of_contents/version'
4
6
 
5
7
  Gem::Specification.new do |spec|
6
8
  spec.name = 'jekyll-toc'
7
- spec.version = JekyllToc::VERSION
9
+ spec.version = Jekyll::TableOfContents::VERSION
8
10
  spec.summary = 'Jekyll Table of Contents plugin'
9
- spec.description = 'A liquid filter plugin for Jekyll which generates a table of contents.'
11
+ spec.description = 'Jekyll (Ruby static website generator) plugin which generates a table of contents.'
10
12
  spec.authors = %w(toshimaru torbjoernk)
11
13
  spec.email = 'me@toshimaru.net'
12
14
  spec.files = `git ls-files -z`.split("\x0")
@@ -15,16 +17,8 @@ Gem::Specification.new do |spec|
15
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
18
  spec.require_paths = ['lib']
17
19
 
18
- spec.required_ruby_version = '>= 2.3'
19
-
20
- spec.add_runtime_dependency 'nokogiri', '~> 1.9'
20
+ spec.required_ruby_version = '>= 2.4'
21
21
 
22
- spec.add_development_dependency 'appraisal'
23
- spec.add_development_dependency 'jekyll', '>= 3.5'
24
- spec.add_development_dependency 'minitest', '~> 5.11'
25
- spec.add_development_dependency 'minitest-reporters'
26
- spec.add_development_dependency 'pry'
27
- spec.add_development_dependency 'rake'
28
- spec.add_development_dependency 'rubocop'
29
- spec.add_development_dependency 'simplecov'
22
+ spec.add_dependency 'jekyll', '>= 3.8'
23
+ spec.add_dependency 'nokogiri', '~> 1.10'
30
24
  end
@@ -20,8 +20,6 @@ module Jekyll
20
20
  module TableOfContentsFilter
21
21
  # Deprecated method. Removed in v1.0.
22
22
  def toc_only(html)
23
- Jekyll.logger.warn 'Deprecation: toc_only filter is deprecated and will be remove in jekyll-toc v1.0.',
24
- 'Use `{% toc %}` instead of `{{ content | toc_only }}`.'
25
23
  return '' unless toc_enabled?
26
24
 
27
25
  TableOfContents::Parser.new(html, toc_config).build_toc
@@ -4,12 +4,13 @@ module Jekyll
4
4
  module TableOfContents
5
5
  # jekyll-toc configuration class
6
6
  class Configuration
7
- attr_accessor :toc_levels, :no_toc_class, :no_toc_section_class,
8
- :list_class, :sublist_class, :item_class, :item_prefix
7
+ attr_reader :toc_levels, :no_toc_class, :ordered_list, :no_toc_section_class,
8
+ :list_class, :sublist_class, :item_class, :item_prefix
9
9
 
10
10
  DEFAULT_CONFIG = {
11
11
  'min_level' => 1,
12
12
  'max_level' => 6,
13
+ 'ordered_list' => false,
13
14
  'no_toc_section_class' => 'no_toc_section',
14
15
  'list_class' => 'section-nav',
15
16
  'sublist_class' => '',
@@ -21,6 +22,7 @@ module Jekyll
21
22
  options = generate_option_hash(options)
22
23
 
23
24
  @toc_levels = options['min_level']..options['max_level']
25
+ @ordered_list = options['ordered_list']
24
26
  @no_toc_class = 'no_toc'
25
27
  @no_toc_section_class = options['no_toc_section_class']
26
28
  @list_class = options['list_class']
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module TableOfContents
5
+ # helper methods for Parser
6
+ module Helper
7
+ PUNCTUATION_REGEXP = /[^\p{Word}\- ]/u.freeze
8
+
9
+ def generate_toc_id(text)
10
+ text = text.downcase
11
+ .gsub(PUNCTUATION_REGEXP, '') # remove punctuation
12
+ .tr(' ', '-') # replace spaces with dash
13
+ CGI.escape(text)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'table_of_contents/helper'
4
+
3
5
  module Jekyll
4
6
  module TableOfContents
5
7
  # Parse html contents and generate table of contents
6
8
  class Parser
7
- PUNCTUATION_REGEXP = /[^\p{Word}\- ]/u
9
+ include ::Jekyll::TableOfContents::Helper
8
10
 
9
11
  def initialize(html, options = {})
10
12
  @doc = Nokogiri::HTML::DocumentFragment.parse(html)
@@ -17,11 +19,12 @@ module Jekyll
17
19
  end
18
20
 
19
21
  def build_toc
20
- %(<ul class="#{@configuration.list_class}">\n#{build_toc_list(@entries)}</ul>)
22
+ %(<#{list_tag} class="#{@configuration.list_class}">\n#{build_toc_list(@entries)}</#{list_tag}>)
21
23
  end
22
24
 
23
25
  def inject_anchors_into_html
24
26
  @entries.each do |entry|
27
+ # NOTE: `entry[:id]` is automatically URL encoded by Nokogiri
25
28
  entry[:header_content].add_previous_sibling(
26
29
  %(<a class="anchor" href="##{entry[:id]}" aria-hidden="true"><span class="octicon octicon-link"></span></a>)
27
30
  )
@@ -41,10 +44,7 @@ module Jekyll
41
44
  .reject { |n| n.classes.include?(@configuration.no_toc_class) }
42
45
  .inject([]) do |entries, node|
43
46
  text = node.text
44
- id = node.attribute('id') || text
45
- .downcase
46
- .gsub(PUNCTUATION_REGEXP, '') # remove punctuation
47
- .tr(' ', '-') # replace spaces with dash
47
+ id = node.attribute('id') || generate_toc_id(text)
48
48
 
49
49
  suffix_num = headers[id]
50
50
  headers[id] += 1
@@ -74,7 +74,7 @@ module Jekyll
74
74
  next_i = i + 1
75
75
  if next_i < entries.count && entries[next_i][:h_num] > min_h_num
76
76
  nest_entries = get_nest_entries(entries[next_i, entries.count], min_h_num)
77
- toc_list << %(\n<ul#{ul_attributes}>\n#{build_toc_list(nest_entries)}</ul>\n)
77
+ toc_list << %(\n<#{list_tag}#{ul_attributes}>\n#{build_toc_list(nest_entries)}</#{list_tag}>\n)
78
78
  i += nest_entries.count
79
79
  end
80
80
  # Add the closing tag for the current entry in the list
@@ -107,7 +107,7 @@ module Jekyll
107
107
  end
108
108
 
109
109
  def toc_headings_in_no_toc_section
110
- if @configuration.no_toc_section_class.is_a? Array
110
+ if @configuration.no_toc_section_class.is_a?(Array)
111
111
  @configuration.no_toc_section_class.map { |cls| toc_headings_within(cls) }.join(',')
112
112
  else
113
113
  toc_headings_within(@configuration.no_toc_section_class)
@@ -121,6 +121,10 @@ module Jekyll
121
121
  def ul_attributes
122
122
  @ul_attributes ||= @configuration.sublist_class.empty? ? '' : %( class="#{@configuration.sublist_class}")
123
123
  end
124
+
125
+ def list_tag
126
+ @list_tag ||= @configuration.ordered_list ? 'ol' : 'ul'
127
+ end
124
128
  end
125
129
  end
126
130
  end