tocer 8.2.1 → 9.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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +16 -1
- data/lib/tocer.rb +2 -0
- data/lib/tocer/builder.rb +21 -29
- data/lib/tocer/cli.rb +4 -12
- data/lib/tocer/configuration.rb +15 -0
- data/lib/tocer/identity.rb +1 -1
- data/lib/tocer/rake/setup.rb +4 -0
- data/lib/tocer/rake/tasks.rb +33 -0
- data/lib/tocer/runner.rb +2 -2
- data/lib/tocer/transformers/finder.rb +18 -0
- data/lib/tocer/transformers/link.rb +18 -15
- data/lib/tocer/transformers/text.rb +12 -9
- data/lib/tocer/writer.rb +2 -2
- metadata +16 -40
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3c9b3dae9b9556720306f6c34cc8f516f447e3cca5e461949c4f417c24e9e7f
|
4
|
+
data.tar.gz: c41d9489fc0f358d580e7e002fda5ab52cca4bd169000de3a9aa0f76edd5381e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57c8ebbfdc73807bf818b4f871e5aea7631c2a8b1be6739ee677a670ee52ff7541bc4070785b3ef09f29e79d8c3727d83650020ec19d3e93e9d44b83ff399a5c
|
7
|
+
data.tar.gz: 3137ddfc17abba4c07ce2cbce0558809cb8c2eb0eb04b5ed40d3953c454683bc86d292375d8dc19c04f8a06b7421a095090a9ddf880d9a12645b617c3a29a8df
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -22,6 +22,7 @@ Markdown files.
|
|
22
22
|
- [Usage](#usage)
|
23
23
|
- [Command Line Interface (CLI)](#command-line-interface-cli)
|
24
24
|
- [Customization](#customization)
|
25
|
+
- [Rake](#rake)
|
25
26
|
- [Tests](#tests)
|
26
27
|
- [Versioning](#versioning)
|
27
28
|
- [Code of Conduct](#code-of-conduct)
|
@@ -109,7 +110,7 @@ Feel free to take this default configuration, modify, and save as your own custo
|
|
109
110
|
The `configuration.yml` file can be configured as follows:
|
110
111
|
|
111
112
|
- `label`: The header label for the table of contents. Default: "# Table of Contents".
|
112
|
-
- `includes`: The list of included files. Default: "
|
113
|
+
- `includes`: The list of included files. Default: "\*.md".
|
113
114
|
|
114
115
|
There are multiple ways the include list can be defined. Here are some examples:
|
115
116
|
|
@@ -132,6 +133,20 @@ There are multiple ways the include list can be defined. Here are some examples:
|
|
132
133
|
:includes:
|
133
134
|
- "**/*.md"
|
134
135
|
|
136
|
+
### Rake
|
137
|
+
|
138
|
+
You can add Rake support by adding the following to your `Rakefile`:
|
139
|
+
|
140
|
+
begin
|
141
|
+
require "tocer/rake/setup"
|
142
|
+
rescue LoadError => error
|
143
|
+
puts error.message
|
144
|
+
end
|
145
|
+
|
146
|
+
Once configured, the following tasks will be available (i.e. `bundle exec rake -T`):
|
147
|
+
|
148
|
+
rake toc[label,includes] # Add/Update Table of Contents (README)
|
149
|
+
|
135
150
|
## Tests
|
136
151
|
|
137
152
|
To test, run:
|
data/lib/tocer.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "tocer/identity"
|
4
|
+
require "tocer/configuration"
|
4
5
|
require "tocer/elements/comment_block"
|
5
6
|
require "tocer/parsers/header"
|
6
7
|
require "tocer/transformers/link"
|
7
8
|
require "tocer/transformers/text"
|
9
|
+
require "tocer/transformers/finder"
|
8
10
|
require "tocer/builder"
|
9
11
|
require "tocer/writer"
|
10
12
|
require "tocer/runner"
|
data/lib/tocer/builder.rb
CHANGED
@@ -11,22 +11,14 @@ module Tocer
|
|
11
11
|
|
12
12
|
def_delegators :comment_block, :start_index, :finish_index, :prependable?
|
13
13
|
|
14
|
-
def self.transformer header
|
15
|
-
if header.match?(/\[.+\]\(.+\)/)
|
16
|
-
Transformers::Link.new header
|
17
|
-
else
|
18
|
-
Transformers::Text.new header
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
14
|
def initialize label: "## Table of Contents", comment_block: Elements::CommentBlock.new
|
23
15
|
@label = label
|
24
16
|
@comment_block = comment_block
|
25
|
-
@url_count = Hash.new
|
17
|
+
@url_count = Hash.new 0
|
26
18
|
@code_block = false
|
27
19
|
end
|
28
20
|
|
29
|
-
def
|
21
|
+
def call lines
|
30
22
|
return "" if headers(lines).empty?
|
31
23
|
|
32
24
|
[
|
@@ -42,23 +34,8 @@ module Tocer
|
|
42
34
|
attr_reader :label, :comment_block, :url_count
|
43
35
|
attr_accessor :code_block
|
44
36
|
|
45
|
-
def
|
46
|
-
|
47
|
-
|
48
|
-
self.code_block = !code_block
|
49
|
-
end
|
50
|
-
|
51
|
-
def url_suffix url
|
52
|
-
count = url_count[url]
|
53
|
-
count.zero? ? "" : count
|
54
|
-
end
|
55
|
-
|
56
|
-
def transform header
|
57
|
-
transformer = self.class.transformer header
|
58
|
-
url = transformer.url
|
59
|
-
link = transformer.transform url_suffix: url_suffix(url)
|
60
|
-
url_count[url] += 1
|
61
|
-
link
|
37
|
+
def links lines
|
38
|
+
headers(lines).map { |markdown| transform markdown }
|
62
39
|
end
|
63
40
|
|
64
41
|
def headers lines
|
@@ -68,8 +45,23 @@ module Tocer
|
|
68
45
|
end
|
69
46
|
end
|
70
47
|
|
71
|
-
def
|
72
|
-
|
48
|
+
def toggle_code_block line
|
49
|
+
return unless line.start_with? CODE_BLOCK_PUNCTUATION
|
50
|
+
|
51
|
+
self.code_block = !code_block
|
52
|
+
end
|
53
|
+
|
54
|
+
def transform markdown
|
55
|
+
Transformers::Finder.call(markdown).then do |transformer|
|
56
|
+
url = transformer.url
|
57
|
+
link = transformer.call url_suffix: url_suffix(url)
|
58
|
+
url_count[url] += 1
|
59
|
+
link
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def url_suffix url
|
64
|
+
url_count[url].then { |count| count.zero? ? "" : count }
|
73
65
|
end
|
74
66
|
end
|
75
67
|
end
|
data/lib/tocer/cli.rb
CHANGED
@@ -11,17 +11,9 @@ module Tocer
|
|
11
11
|
|
12
12
|
package_name Identity.version_label
|
13
13
|
|
14
|
-
def self.configuration
|
15
|
-
Runcom::Config.new Identity.name,
|
16
|
-
defaults: {
|
17
|
-
label: "## Table of Contents",
|
18
|
-
includes: ["README.md"]
|
19
|
-
}
|
20
|
-
end
|
21
|
-
|
22
14
|
def initialize args = [], options = {}, config = {}
|
23
15
|
super args, options, config
|
24
|
-
@configuration =
|
16
|
+
@configuration = Tocer::Configuration.default
|
25
17
|
rescue Runcom::Errors::Base => error
|
26
18
|
abort error.message
|
27
19
|
end
|
@@ -32,12 +24,12 @@ module Tocer
|
|
32
24
|
aliases: "-l",
|
33
25
|
desc: "Label",
|
34
26
|
type: :string,
|
35
|
-
default:
|
27
|
+
default: Tocer::Configuration.default.to_h.fetch(:label)
|
36
28
|
method_option :includes,
|
37
29
|
aliases: "-i",
|
38
30
|
desc: "File include list",
|
39
31
|
type: :array,
|
40
|
-
default:
|
32
|
+
default: Tocer::Configuration.default.to_h.fetch(:includes)
|
41
33
|
# :reek:TooManyStatements
|
42
34
|
def generate path = "."
|
43
35
|
updated_configuration = configuration.merge label: options.label, includes: options.includes
|
@@ -46,7 +38,7 @@ module Tocer
|
|
46
38
|
|
47
39
|
return if files.empty?
|
48
40
|
|
49
|
-
runner.
|
41
|
+
runner.call
|
50
42
|
|
51
43
|
say "Processed table of contents for:"
|
52
44
|
files.each { |file| say " #{file}" }
|
data/lib/tocer/identity.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rake"
|
4
|
+
|
5
|
+
module Tocer
|
6
|
+
module Rake
|
7
|
+
class Tasks
|
8
|
+
include ::Rake::DSL
|
9
|
+
|
10
|
+
def self.setup
|
11
|
+
new.install
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize configuration: Tocer::Configuration.default, runner: Runner
|
15
|
+
@configuration = configuration
|
16
|
+
@runner = runner
|
17
|
+
end
|
18
|
+
|
19
|
+
def install
|
20
|
+
desc "Add/Update Table of Contents (README)"
|
21
|
+
task :toc, %i[label includes] do |_task, arguments|
|
22
|
+
inputs = {label: arguments[:label], includes: arguments[:includes]}.compact
|
23
|
+
updated_configuration = configuration.merge inputs
|
24
|
+
runner.new(configuration: updated_configuration.to_h).call
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :configuration, :runner
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/tocer/runner.rb
CHANGED
@@ -17,8 +17,8 @@ module Tocer
|
|
17
17
|
Pathname.glob(%(#{path}/{#{includes.join ","}})).select(&:file?)
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
files.each { |file| writer.new(file, label: configuration.fetch(:label)).
|
20
|
+
def call
|
21
|
+
files.each { |file| writer.new(file, label: configuration.fetch(:label)).call }
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tocer
|
4
|
+
module Transformers
|
5
|
+
# Finds appropriate header transformer for matching pattern.
|
6
|
+
class Finder
|
7
|
+
TRANSFORMERS = {
|
8
|
+
/\[.+\]\(.+\)/ => Transformers::Link,
|
9
|
+
/.*/ => Transformers::Text
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
def self.call markdown
|
13
|
+
TRANSFORMERS.find { |pattern, transformer| break transformer if pattern.match? markdown }
|
14
|
+
.then { |transformer| transformer.new markdown }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -8,46 +8,49 @@ module Tocer
|
|
8
8
|
class Link
|
9
9
|
using Refinements::Arrays
|
10
10
|
|
11
|
-
def initialize text,
|
12
|
-
@
|
11
|
+
def initialize text, parser: Parsers::Header
|
12
|
+
@parser = parser.new text
|
13
13
|
end
|
14
14
|
|
15
15
|
def label
|
16
|
-
|
16
|
+
parser.content.gsub embedded_link, embedded_link_label
|
17
17
|
end
|
18
18
|
|
19
19
|
def url
|
20
20
|
label.downcase.gsub(/\s/, "-").gsub(/[^\w\-]+/, "")
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
|
25
|
-
"#{indented_bullet}[#{label}](##{modified_url})"
|
23
|
+
def call url_suffix: ""
|
24
|
+
"#{indented_bullet}[#{label}](##{computed_url url_suffix})"
|
26
25
|
end
|
27
26
|
|
28
27
|
private
|
29
28
|
|
30
|
-
attr_reader :
|
29
|
+
attr_reader :parser
|
31
30
|
|
32
|
-
def
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
def embedded_link_url
|
37
|
-
header.content[/\((.*)\)/, 1]
|
31
|
+
def computed_url suffix = ""
|
32
|
+
[url, suffix.to_s].compress.join "-"
|
38
33
|
end
|
39
34
|
|
40
35
|
def embedded_link
|
41
36
|
"[#{embedded_link_label}](#{embedded_link_url})"
|
42
37
|
end
|
43
38
|
|
44
|
-
def
|
45
|
-
|
39
|
+
def embedded_link_label
|
40
|
+
parser.content[/\[(.*)\]/, 1]
|
41
|
+
end
|
42
|
+
|
43
|
+
def embedded_link_url
|
44
|
+
parser.content[/\((.*)\)/, 1]
|
46
45
|
end
|
47
46
|
|
48
47
|
def indented_bullet
|
49
48
|
prefix_to_spaces.gsub(/\s{2}$/, "- ")
|
50
49
|
end
|
50
|
+
|
51
|
+
def prefix_to_spaces
|
52
|
+
Array.new(parser.prefix.length, " ").join
|
53
|
+
end
|
51
54
|
end
|
52
55
|
end
|
53
56
|
end
|
@@ -8,34 +8,37 @@ module Tocer
|
|
8
8
|
class Text
|
9
9
|
using Refinements::Arrays
|
10
10
|
|
11
|
-
def initialize text,
|
12
|
-
@
|
11
|
+
def initialize text, parser: Parsers::Header
|
12
|
+
@parser = parser.new text
|
13
13
|
end
|
14
14
|
|
15
15
|
def label
|
16
|
-
|
16
|
+
parser.content
|
17
17
|
end
|
18
18
|
|
19
19
|
def url
|
20
20
|
label.downcase.gsub(/\s/, "-").gsub(/[^\w\-]+/, "")
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
|
25
|
-
"#{indented_bullet}[#{label}](##{modified_url})"
|
23
|
+
def call url_suffix: ""
|
24
|
+
"#{indented_bullet}[#{label}](##{computed_url url_suffix})"
|
26
25
|
end
|
27
26
|
|
28
27
|
private
|
29
28
|
|
30
|
-
attr_reader :
|
29
|
+
attr_reader :parser
|
31
30
|
|
32
|
-
def
|
33
|
-
|
31
|
+
def computed_url suffix = ""
|
32
|
+
[url, suffix.to_s].compress.join "-"
|
34
33
|
end
|
35
34
|
|
36
35
|
def indented_bullet
|
37
36
|
prefix_to_spaces.gsub(/\s{2}$/, "- ")
|
38
37
|
end
|
38
|
+
|
39
|
+
def prefix_to_spaces
|
40
|
+
Array.new(parser.prefix.length, " ").join
|
41
|
+
end
|
39
42
|
end
|
40
43
|
end
|
41
44
|
end
|
data/lib/tocer/writer.rb
CHANGED
@@ -18,7 +18,7 @@ module Tocer
|
|
18
18
|
@builder = builder
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
21
|
+
def call
|
22
22
|
lines = File.readlines file_path
|
23
23
|
body = builder.prependable?(lines) ? prepend(lines) : replace(lines)
|
24
24
|
File.open(file_path, "w") { |file| file.write body }
|
@@ -29,7 +29,7 @@ module Tocer
|
|
29
29
|
attr_reader :file_path, :builder
|
30
30
|
|
31
31
|
def content lines
|
32
|
-
builder.
|
32
|
+
builder.call lines
|
33
33
|
end
|
34
34
|
|
35
35
|
def replace lines
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tocer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 9.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
@@ -28,7 +28,7 @@ cert_chain:
|
|
28
28
|
dKvURM+1PwDCzC5tvRwjhUJIizau6+MtkFCvJHmaAj1aZL3odcPejHj5Hxt/0CUW
|
29
29
|
y84=
|
30
30
|
-----END CERTIFICATE-----
|
31
|
-
date: 2019-
|
31
|
+
date: 2019-06-01 00:00:00.000000000 Z
|
32
32
|
dependencies:
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: refinements
|
@@ -50,14 +50,14 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
53
|
+
version: '5.0'
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
60
|
+
version: '5.0'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: thor
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,34 +128,6 @@ dependencies:
|
|
128
128
|
- - "~>"
|
129
129
|
- !ruby/object:Gem::Version
|
130
130
|
version: '0.1'
|
131
|
-
- !ruby/object:Gem::Dependency
|
132
|
-
name: gemsmith
|
133
|
-
requirement: !ruby/object:Gem::Requirement
|
134
|
-
requirements:
|
135
|
-
- - "~>"
|
136
|
-
- !ruby/object:Gem::Version
|
137
|
-
version: '13.0'
|
138
|
-
type: :development
|
139
|
-
prerelease: false
|
140
|
-
version_requirements: !ruby/object:Gem::Requirement
|
141
|
-
requirements:
|
142
|
-
- - "~>"
|
143
|
-
- !ruby/object:Gem::Version
|
144
|
-
version: '13.0'
|
145
|
-
- !ruby/object:Gem::Dependency
|
146
|
-
name: git-cop
|
147
|
-
requirement: !ruby/object:Gem::Requirement
|
148
|
-
requirements:
|
149
|
-
- - "~>"
|
150
|
-
- !ruby/object:Gem::Version
|
151
|
-
version: '3.0'
|
152
|
-
type: :development
|
153
|
-
prerelease: false
|
154
|
-
version_requirements: !ruby/object:Gem::Requirement
|
155
|
-
requirements:
|
156
|
-
- - "~>"
|
157
|
-
- !ruby/object:Gem::Version
|
158
|
-
version: '3.0'
|
159
131
|
- !ruby/object:Gem::Dependency
|
160
132
|
name: guard-rspec
|
161
133
|
requirement: !ruby/object:Gem::Requirement
|
@@ -232,14 +204,14 @@ dependencies:
|
|
232
204
|
requirements:
|
233
205
|
- - "~>"
|
234
206
|
- !ruby/object:Gem::Version
|
235
|
-
version: '5.
|
207
|
+
version: '5.4'
|
236
208
|
type: :development
|
237
209
|
prerelease: false
|
238
210
|
version_requirements: !ruby/object:Gem::Requirement
|
239
211
|
requirements:
|
240
212
|
- - "~>"
|
241
213
|
- !ruby/object:Gem::Version
|
242
|
-
version: '5.
|
214
|
+
version: '5.4'
|
243
215
|
- !ruby/object:Gem::Dependency
|
244
216
|
name: rspec
|
245
217
|
requirement: !ruby/object:Gem::Requirement
|
@@ -260,42 +232,42 @@ dependencies:
|
|
260
232
|
requirements:
|
261
233
|
- - "~>"
|
262
234
|
- !ruby/object:Gem::Version
|
263
|
-
version: '0.
|
235
|
+
version: '0.69'
|
264
236
|
type: :development
|
265
237
|
prerelease: false
|
266
238
|
version_requirements: !ruby/object:Gem::Requirement
|
267
239
|
requirements:
|
268
240
|
- - "~>"
|
269
241
|
- !ruby/object:Gem::Version
|
270
|
-
version: '0.
|
242
|
+
version: '0.69'
|
271
243
|
- !ruby/object:Gem::Dependency
|
272
244
|
name: rubocop-performance
|
273
245
|
requirement: !ruby/object:Gem::Requirement
|
274
246
|
requirements:
|
275
247
|
- - "~>"
|
276
248
|
- !ruby/object:Gem::Version
|
277
|
-
version: '1.
|
249
|
+
version: '1.3'
|
278
250
|
type: :development
|
279
251
|
prerelease: false
|
280
252
|
version_requirements: !ruby/object:Gem::Requirement
|
281
253
|
requirements:
|
282
254
|
- - "~>"
|
283
255
|
- !ruby/object:Gem::Version
|
284
|
-
version: '1.
|
256
|
+
version: '1.3'
|
285
257
|
- !ruby/object:Gem::Dependency
|
286
258
|
name: rubocop-rspec
|
287
259
|
requirement: !ruby/object:Gem::Requirement
|
288
260
|
requirements:
|
289
261
|
- - "~>"
|
290
262
|
- !ruby/object:Gem::Version
|
291
|
-
version: '1.
|
263
|
+
version: '1.33'
|
292
264
|
type: :development
|
293
265
|
prerelease: false
|
294
266
|
version_requirements: !ruby/object:Gem::Requirement
|
295
267
|
requirements:
|
296
268
|
- - "~>"
|
297
269
|
- !ruby/object:Gem::Version
|
298
|
-
version: '1.
|
270
|
+
version: '1.33'
|
299
271
|
- !ruby/object:Gem::Dependency
|
300
272
|
name: simplecov
|
301
273
|
requirement: !ruby/object:Gem::Requirement
|
@@ -340,10 +312,14 @@ files:
|
|
340
312
|
- lib/tocer.rb
|
341
313
|
- lib/tocer/builder.rb
|
342
314
|
- lib/tocer/cli.rb
|
315
|
+
- lib/tocer/configuration.rb
|
343
316
|
- lib/tocer/elements/comment_block.rb
|
344
317
|
- lib/tocer/identity.rb
|
345
318
|
- lib/tocer/parsers/header.rb
|
319
|
+
- lib/tocer/rake/setup.rb
|
320
|
+
- lib/tocer/rake/tasks.rb
|
346
321
|
- lib/tocer/runner.rb
|
322
|
+
- lib/tocer/transformers/finder.rb
|
347
323
|
- lib/tocer/transformers/link.rb
|
348
324
|
- lib/tocer/transformers/text.rb
|
349
325
|
- lib/tocer/writer.rb
|
metadata.gz.sig
CHANGED
Binary file
|