tocer 5.0.0 → 6.0.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/README.md +40 -40
- data/lib/tocer/builder.rb +23 -19
- data/lib/tocer/cli.rb +6 -5
- data/lib/tocer/elements/comment_block.rb +10 -6
- data/lib/tocer/identity.rb +1 -5
- data/lib/tocer/writer.rb +25 -38
- metadata +8 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc14839d2577710ed5cf36a50119597ed809581f
|
4
|
+
data.tar.gz: 6e0e455468f5ba1f2c9d71f1db42702ab44a7343
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ee34bfa069b8aef9c0a6ce4fea96cb4f98890476e8d44dec4fb6e644eb186dccf6581a32a794789b792568a7720ffaa4f4209a43bc2fda2c52162832935fc01
|
7
|
+
data.tar.gz: 8c6c61f73ad832cc5f904dc1dbbd66ab2203ca1dcf0aef492e522445bb7a67b598bcc5a2265c37eb3282459bf18ae6c9186a5b13718125f8d771d96344285513
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
[](https://codeclimate.com/github/bkuhlmann/tocer)
|
5
5
|
[](https://codeclimate.com/github/bkuhlmann/tocer)
|
6
6
|
[](https://gemnasium.com/bkuhlmann/tocer)
|
7
|
-
[](https://circleci.com/gh/bkuhlmann/tocer)
|
8
8
|
[](https://www.patreon.com/bkuhlmann)
|
9
9
|
|
10
10
|
Tocer (a.k.a. Table of Contenter) is a command line interface for generating table of contents for
|
@@ -12,41 +12,41 @@ Markdown files.
|
|
12
12
|
|
13
13
|
<!-- Tocer[start]: Auto-generated, don't remove. -->
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
- [Features](#features)
|
18
|
-
- [Requirements](#requirements)
|
19
|
-
- [Setup](#setup)
|
20
|
-
- [Usage](#usage)
|
21
|
-
|
22
|
-
|
23
|
-
- [Tests](#tests)
|
24
|
-
- [Versioning](#versioning)
|
25
|
-
- [Code of Conduct](#code-of-conduct)
|
26
|
-
- [Contributions](#contributions)
|
27
|
-
- [License](#license)
|
28
|
-
- [History](#history)
|
29
|
-
- [Credits](#credits)
|
15
|
+
## Table of Contents
|
16
|
+
|
17
|
+
- [Features](#features)
|
18
|
+
- [Requirements](#requirements)
|
19
|
+
- [Setup](#setup)
|
20
|
+
- [Usage](#usage)
|
21
|
+
- [Command Line Interface (CLI)](#command-line-interface-cli)
|
22
|
+
- [Customization](#customization)
|
23
|
+
- [Tests](#tests)
|
24
|
+
- [Versioning](#versioning)
|
25
|
+
- [Code of Conduct](#code-of-conduct)
|
26
|
+
- [Contributions](#contributions)
|
27
|
+
- [License](#license)
|
28
|
+
- [History](#history)
|
29
|
+
- [Credits](#credits)
|
30
30
|
|
31
31
|
<!-- Tocer[finish]: Auto-generated, don't remove. -->
|
32
32
|
|
33
|
-
|
33
|
+
## Features
|
34
34
|
|
35
35
|
- Supports Markdown ATX-style headers. Example: `# Header`.
|
36
36
|
- Does not support header suffixes. Example: `# Header #`.
|
37
37
|
- Does not support header prefixes without spaces. Example: `#Header`.
|
38
38
|
- Supports table of contents generation for single or multiple files.
|
39
|
-
- Supports custom label. Default: "
|
39
|
+
- Supports custom label. Default: "## Table of Contents".
|
40
40
|
- Supports whitelist filtering. Default: "README.md".
|
41
41
|
- Prepends table of contents to Markdown documents that don't have table of contents.
|
42
42
|
- Rebuilds Markdown documents that have existing table of contents.
|
43
43
|
|
44
|
-
|
44
|
+
## Requirements
|
45
45
|
|
46
46
|
0. A UNIX-based system.
|
47
47
|
0. [Ruby 2.4.x](https://www.ruby-lang.org).
|
48
48
|
|
49
|
-
|
49
|
+
## Setup
|
50
50
|
|
51
51
|
For a secure install, type the following (recommended):
|
52
52
|
|
@@ -61,9 +61,9 @@ For an insecure install, type the following (not recommended):
|
|
61
61
|
|
62
62
|
gem install tocer
|
63
63
|
|
64
|
-
|
64
|
+
## Usage
|
65
65
|
|
66
|
-
|
66
|
+
### Command Line Interface (CLI)
|
67
67
|
|
68
68
|
From the command line, type: `tocer --help`
|
69
69
|
|
@@ -95,24 +95,24 @@ In the case that Tocer has already auto-generated a table of contents for a Mark
|
|
95
95
|
existing table of contents has become stale, or placement of the table of contents has changed you
|
96
96
|
can re-run Tocer on that file to auto-update it with new table of contents.
|
97
97
|
|
98
|
-
|
98
|
+
### Customization
|
99
99
|
|
100
|
-
|
101
|
-
determined in the following order (with the last one taking top priority):
|
100
|
+
This gem can be configured via a global configuration:
|
102
101
|
|
103
|
-
|
104
|
-
0. Local: `<project_root>/.tocerrc`.
|
105
|
-
0. CLI: `tocer --generate . --label "## Custom Label" --whitelist CHANGES.md`
|
102
|
+
~/.config/tocer/configuration.yml
|
106
103
|
|
107
|
-
|
108
|
-
|
104
|
+
It can also be configured via [XDG environment variables](https://github.com/bkuhlmann/runcom#xdg)
|
105
|
+
as provided by the [Runcom](https://github.com/bkuhlmann/runcom) gem.
|
109
106
|
|
110
|
-
The
|
107
|
+
The default configuration is as follows:
|
111
108
|
|
112
|
-
:label: "
|
109
|
+
:label: "## Table of Contents"
|
113
110
|
:whitelist: ["README.md"]
|
114
111
|
|
115
|
-
|
112
|
+
Feel free to take this default configuration, modify, and save as your own custom
|
113
|
+
`configuration.yml`.
|
114
|
+
|
115
|
+
The `configuration.yml` file can be configured as follows:
|
116
116
|
|
117
117
|
- `label`: The header label for the table of contents. Default: "# Table of Contents".
|
118
118
|
- `whitelist`: The list of *included* files. Default: "*.md".
|
@@ -138,13 +138,13 @@ There are multiple ways the *whitelist* can be defined. Here are some examples:
|
|
138
138
|
:whitelist:
|
139
139
|
- **/*.md
|
140
140
|
|
141
|
-
|
141
|
+
## Tests
|
142
142
|
|
143
143
|
To test, run:
|
144
144
|
|
145
145
|
bundle exec rake
|
146
146
|
|
147
|
-
|
147
|
+
## Versioning
|
148
148
|
|
149
149
|
Read [Semantic Versioning](http://semver.org) for details. Briefly, it means:
|
150
150
|
|
@@ -152,26 +152,26 @@ Read [Semantic Versioning](http://semver.org) for details. Briefly, it means:
|
|
152
152
|
- Minor (x.Y.z) - Incremented for new, backwards compatible, public API enhancements/fixes.
|
153
153
|
- Patch (x.y.Z) - Incremented for small, backwards compatible, bug fixes.
|
154
154
|
|
155
|
-
|
155
|
+
## Code of Conduct
|
156
156
|
|
157
157
|
Please note that this project is released with a [CODE OF CONDUCT](CODE_OF_CONDUCT.md). By
|
158
158
|
participating in this project you agree to abide by its terms.
|
159
159
|
|
160
|
-
|
160
|
+
## Contributions
|
161
161
|
|
162
162
|
Read [CONTRIBUTING](CONTRIBUTING.md) for details.
|
163
163
|
|
164
|
-
|
164
|
+
## License
|
165
165
|
|
166
166
|
Copyright (c) 2015 [Alchemists](https://www.alchemists.io).
|
167
167
|
Read [LICENSE](LICENSE.md) for details.
|
168
168
|
|
169
|
-
|
169
|
+
## History
|
170
170
|
|
171
171
|
Read [CHANGES](CHANGES.md) for details.
|
172
172
|
Built with [Gemsmith](https://github.com/bkuhlmann/gemsmith).
|
173
173
|
|
174
|
-
|
174
|
+
## Credits
|
175
175
|
|
176
176
|
Developed by [Brooke Kuhlmann](https://www.alchemists.io) at
|
177
177
|
[Alchemists](https://www.alchemists.io).
|
data/lib/tocer/builder.rb
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "forwardable"
|
4
|
+
|
3
5
|
module Tocer
|
4
6
|
# Builds a table of contents for a Markdown document.
|
5
|
-
# :reek:TooManyInstanceVariables
|
6
7
|
class Builder
|
8
|
+
extend Forwardable
|
9
|
+
|
7
10
|
CODE_BLOCK_PUNCTUATION = "```"
|
8
11
|
|
12
|
+
def_delegators :comment_block, :start_index, :finish_index, :prependable?
|
13
|
+
|
9
14
|
def self.transformer header
|
10
15
|
if header.match?(/\[.+\]\(.+\)/)
|
11
16
|
Transformers::Link.new header
|
@@ -14,35 +19,27 @@ module Tocer
|
|
14
19
|
end
|
15
20
|
end
|
16
21
|
|
17
|
-
def initialize
|
18
|
-
@lines = lines
|
22
|
+
def initialize label: "## Table of Contents", comment_block: Elements::CommentBlock.new
|
19
23
|
@label = label
|
20
|
-
@comment_block = comment_block
|
24
|
+
@comment_block = comment_block
|
21
25
|
@url_count = Hash.new { |hash, key| hash[key] = 0 }
|
22
26
|
@code_block = false
|
23
27
|
end
|
24
28
|
|
25
|
-
def
|
26
|
-
lines.
|
27
|
-
toggle_code_block line
|
28
|
-
line.start_with?(Parsers::Header::PUNCTUATION) && !code_block
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def build
|
33
|
-
return "" if headers.empty?
|
29
|
+
def build lines
|
30
|
+
return "" if headers(lines).empty?
|
34
31
|
|
35
32
|
[
|
36
|
-
"#{comment_block.
|
33
|
+
"#{comment_block.start_tag}\n\n",
|
37
34
|
"#{label}\n\n",
|
38
|
-
|
39
|
-
"\n\n#{comment_block.
|
35
|
+
links(lines).join("\n"),
|
36
|
+
"\n\n#{comment_block.finish_tag}\n"
|
40
37
|
].join
|
41
38
|
end
|
42
39
|
|
43
40
|
private
|
44
41
|
|
45
|
-
attr_reader :
|
42
|
+
attr_reader :label, :comment_block, :url_count
|
46
43
|
attr_accessor :code_block
|
47
44
|
|
48
45
|
def toggle_code_block line
|
@@ -63,8 +60,15 @@ module Tocer
|
|
63
60
|
link
|
64
61
|
end
|
65
62
|
|
66
|
-
def
|
67
|
-
|
63
|
+
def headers lines
|
64
|
+
lines.select do |line|
|
65
|
+
toggle_code_block line
|
66
|
+
line.start_with?(Parsers::Header::PUNCTUATION) && !code_block
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def links lines
|
71
|
+
headers(lines).map { |header| transform header }
|
68
72
|
end
|
69
73
|
end
|
70
74
|
end
|
data/lib/tocer/cli.rb
CHANGED
@@ -14,8 +14,8 @@ module Tocer
|
|
14
14
|
package_name Identity.version_label
|
15
15
|
|
16
16
|
def self.configuration
|
17
|
-
Runcom::Configuration.new
|
18
|
-
label: "
|
17
|
+
Runcom::Configuration.new project_name: Identity.name, defaults: {
|
18
|
+
label: "## Table of Contents",
|
19
19
|
whitelist: ["README.md"]
|
20
20
|
}
|
21
21
|
end
|
@@ -50,7 +50,7 @@ module Tocer
|
|
50
50
|
files.each { |file| say " #{file}" }
|
51
51
|
end
|
52
52
|
|
53
|
-
desc "-c, [--config]",
|
53
|
+
desc "-c, [--config]", "Manage gem configuration."
|
54
54
|
map %w[-c --config] => :config
|
55
55
|
method_option :edit,
|
56
56
|
aliases: "-e",
|
@@ -61,10 +61,11 @@ module Tocer
|
|
61
61
|
desc: "Print gem configuration.",
|
62
62
|
type: :boolean, default: false
|
63
63
|
def config
|
64
|
-
path = self.class.configuration.
|
64
|
+
path = self.class.configuration.path
|
65
65
|
|
66
66
|
if options.edit? then `#{editor} #{path}`
|
67
|
-
elsif options.info?
|
67
|
+
elsif options.info?
|
68
|
+
path ? say(path) : say("Configuration doesn't exist.")
|
68
69
|
else help(:config)
|
69
70
|
end
|
70
71
|
end
|
@@ -17,22 +17,26 @@ module Tocer
|
|
17
17
|
@message = message
|
18
18
|
end
|
19
19
|
|
20
|
-
def start
|
21
|
-
comment start_id, message
|
22
|
-
end
|
23
|
-
|
24
20
|
def start_index lines
|
25
21
|
self.class.index lines, start_id
|
26
22
|
end
|
27
23
|
|
28
|
-
def
|
29
|
-
comment
|
24
|
+
def start_tag
|
25
|
+
comment start_id, message
|
30
26
|
end
|
31
27
|
|
32
28
|
def finish_index lines
|
33
29
|
self.class.index lines, finish_id
|
34
30
|
end
|
35
31
|
|
32
|
+
def finish_tag
|
33
|
+
comment finish_id, message
|
34
|
+
end
|
35
|
+
|
36
|
+
def prependable? lines
|
37
|
+
start_index(lines).zero? && finish_index(lines).zero?
|
38
|
+
end
|
39
|
+
|
36
40
|
private
|
37
41
|
|
38
42
|
attr_reader :start_id, :finish_id, :message
|
data/lib/tocer/identity.rb
CHANGED
data/lib/tocer/writer.rb
CHANGED
@@ -2,63 +2,50 @@
|
|
2
2
|
|
3
3
|
module Tocer
|
4
4
|
# Writes table of contents to a Markdown document.
|
5
|
-
# :reek:TooManyInstanceVariables
|
6
5
|
class Writer
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
def self.add start_index:, old_lines:, new_lines:
|
7
|
+
computed_new_lines = start_index.zero? ? new_lines : new_lines + "\n"
|
8
|
+
old_lines.insert start_index, *computed_new_lines
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.remove start_index, finish_index, lines
|
12
|
+
range = (start_index - 1)..finish_index
|
13
|
+
lines.reject.with_index { |_, index| range.include? index }
|
14
|
+
end
|
12
15
|
|
16
|
+
def initialize file_path, label: "## Table of Contents", builder: Builder.new(label: label)
|
13
17
|
@file_path = file_path
|
14
|
-
@file_lines = File.open(file_path, &:to_a)
|
15
|
-
@label = label
|
16
18
|
@builder = builder
|
17
|
-
setup_indexes comment_block.new, @file_lines
|
18
19
|
end
|
19
20
|
|
20
21
|
def write
|
21
|
-
|
22
|
+
lines = File.readlines file_path
|
23
|
+
body = builder.prependable?(lines) ? unshift(lines) : replace(lines)
|
22
24
|
File.open(file_path, "w") { |file| file.write body }
|
23
25
|
end
|
24
26
|
|
25
27
|
private
|
26
28
|
|
27
|
-
attr_reader :file_path,
|
28
|
-
:file_lines,
|
29
|
-
:label,
|
30
|
-
:start_index,
|
31
|
-
:finish_index,
|
32
|
-
:builder,
|
33
|
-
:comment_block
|
34
|
-
|
35
|
-
def setup_indexes comment_block, lines
|
36
|
-
@start_index = comment_block.start_index lines
|
37
|
-
@finish_index = comment_block.finish_index lines
|
38
|
-
end
|
29
|
+
attr_reader :file_path, :builder
|
39
30
|
|
40
31
|
def content lines
|
41
|
-
builder.
|
42
|
-
end
|
43
|
-
|
44
|
-
def remove_toc lines
|
45
|
-
toc_range = ((start_index - 1)..finish_index)
|
46
|
-
lines.reject.with_index { |_, index| toc_range.include? index }
|
47
|
-
end
|
48
|
-
|
49
|
-
def add_toc old_lines, new_lines
|
50
|
-
old_lines.insert start_index, new_lines
|
32
|
+
builder.build lines
|
51
33
|
end
|
52
34
|
|
53
|
-
def
|
54
|
-
|
55
|
-
|
35
|
+
def replace lines
|
36
|
+
start_index = builder.start_index lines
|
37
|
+
finish_index = builder.finish_index lines
|
38
|
+
klass = self.class
|
56
39
|
|
57
|
-
|
40
|
+
klass.add(
|
41
|
+
start_index: start_index,
|
42
|
+
old_lines: klass.remove(start_index, finish_index, lines),
|
43
|
+
new_lines: content(lines[finish_index, lines.length])
|
44
|
+
).join
|
58
45
|
end
|
59
46
|
|
60
|
-
def
|
61
|
-
content(
|
47
|
+
def unshift lines
|
48
|
+
content(lines) + "\n" + lines.join
|
62
49
|
end
|
63
50
|
end
|
64
51
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tocer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '1.1'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '1.1'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,20 +80,6 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '12.0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: gemsmith
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '9.4'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '9.4'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: pry
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -240,28 +226,28 @@ dependencies:
|
|
240
226
|
requirements:
|
241
227
|
- - "~>"
|
242
228
|
- !ruby/object:Gem::Version
|
243
|
-
version: '4.
|
229
|
+
version: '4.7'
|
244
230
|
type: :development
|
245
231
|
prerelease: false
|
246
232
|
version_requirements: !ruby/object:Gem::Requirement
|
247
233
|
requirements:
|
248
234
|
- - "~>"
|
249
235
|
- !ruby/object:Gem::Version
|
250
|
-
version: '4.
|
236
|
+
version: '4.7'
|
251
237
|
- !ruby/object:Gem::Dependency
|
252
238
|
name: rubocop
|
253
239
|
requirement: !ruby/object:Gem::Requirement
|
254
240
|
requirements:
|
255
241
|
- - "~>"
|
256
242
|
- !ruby/object:Gem::Version
|
257
|
-
version: '0.
|
243
|
+
version: '0.49'
|
258
244
|
type: :development
|
259
245
|
prerelease: false
|
260
246
|
version_requirements: !ruby/object:Gem::Requirement
|
261
247
|
requirements:
|
262
248
|
- - "~>"
|
263
249
|
- !ruby/object:Gem::Version
|
264
|
-
version: '0.
|
250
|
+
version: '0.49'
|
265
251
|
- !ruby/object:Gem::Dependency
|
266
252
|
name: codeclimate-test-reporter
|
267
253
|
requirement: !ruby/object:Gem::Requirement
|