tocer 10.5.0 → 12.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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.adoc +12 -20
- data/bin/tocer +1 -3
- data/lib/tocer.rb +9 -2
- data/lib/tocer/builder.rb +19 -19
- data/lib/tocer/cli/configuration/content.rb +10 -0
- data/lib/tocer/cli/configuration/defaults.yml +3 -0
- data/lib/tocer/cli/configuration/loader.rb +33 -0
- data/lib/tocer/cli/parsers.rb +11 -0
- data/lib/tocer/cli/parsers/assembler.rb +34 -0
- data/lib/tocer/cli/parsers/build.rb +52 -0
- data/lib/tocer/cli/parsers/core.rb +61 -0
- data/lib/tocer/cli/processors/build.rb +24 -0
- data/lib/tocer/cli/processors/config.rb +31 -0
- data/lib/tocer/cli/shell.rb +45 -0
- data/lib/tocer/elements/comment_block.rb +6 -18
- data/lib/tocer/identity.rb +2 -1
- data/lib/tocer/parsers/header.rb +2 -6
- data/lib/tocer/rake/tasks.rb +6 -7
- data/lib/tocer/runner.rb +12 -17
- data/lib/tocer/transformers/finder.rb +1 -4
- data/lib/tocer/transformers/link.rb +9 -27
- data/lib/tocer/transformers/text.rb +6 -18
- data/lib/tocer/writer.rb +19 -16
- metadata +28 -34
- metadata.gz.sig +0 -0
- data/lib/tocer/cli.rb +0 -85
- data/lib/tocer/configuration.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e87cdc42651955652ee2d24f27b95c6722561c4b284a0ff5fb6b3341425f9eb8
|
4
|
+
data.tar.gz: 6170cd85486b4e8c5a9168b265ba1d3d6127fab7e662ea26f8095a028f7e9699
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 012aca333c7cd34bc26bba320e1ddce5fb25f138f93378efdf551d6c65873eba8745960ccdccc296616569359681f4f6e68342f9c52d0ce10d6eba30b2d1f080
|
7
|
+
data.tar.gz: 3f9a398064fbb8521952cf6ac5e9749eaa2373ff6ca48c865ea23b6eb814d1e11f046e0656e6230264a3e55d35c39838f867817baf44e0124f98e32ae9457dbc
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.adoc
CHANGED
@@ -45,22 +45,18 @@ gem install tocer
|
|
45
45
|
|
46
46
|
=== Command Line Interface (CLI)
|
47
47
|
|
48
|
-
From the command line,
|
48
|
+
From the command line, run: `tocer --help`
|
49
49
|
|
50
50
|
....
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
-l, [--label=LABEL] # Label
|
61
|
-
# Default: ## Table of Contents
|
62
|
-
-i, [--includes=one two three] # File include list
|
63
|
-
# Default: ["README.md"]
|
51
|
+
USAGE:
|
52
|
+
-b, --build [PATH] Build table of contents. Default path: "."
|
53
|
+
-c, --config ACTION Manage gem configuration: edit or view.
|
54
|
+
-h, --help Show this message.
|
55
|
+
-v, --version Show gem version.
|
56
|
+
|
57
|
+
BUILD OPTIONS:
|
58
|
+
-i, --includes [a,b,c] Include pattern list. Default: ["README.md"].
|
59
|
+
-l, --label [LABEL] Label. Default: "## Table of Contents".
|
64
60
|
....
|
65
61
|
|
66
62
|
To generate the table of contents at a specific position within your Markdown files, add the
|
@@ -72,10 +68,6 @@ following lines to your file(s) prior to generation:
|
|
72
68
|
<!-- Tocer[finish] -->
|
73
69
|
----
|
74
70
|
|
75
|
-
Alternatively, you can run `+tocer -g <directory>+` on files that do not have Tocer support and it
|
76
|
-
will prepend the table of contents to your file(s), complete with an auto-generated table of
|
77
|
-
contents.
|
78
|
-
|
79
71
|
In the case that Tocer has already auto-generated a table of contents for a Markdown file, the
|
80
72
|
existing table of contents has become stale, or placement of the table of contents has changed you
|
81
73
|
can re-run Tocer on that file to auto-update it with new table of contents.
|
@@ -101,8 +93,8 @@ Feel free to take this default configuration, modify, and save as your own custo
|
|
101
93
|
|
102
94
|
The `configuration.yml` file can be configured as follows:
|
103
95
|
|
104
|
-
* `label`: The header label for the table of contents.
|
105
|
-
* `includes`: The list of included files.
|
96
|
+
* `label`: The header label for the table of contents.
|
97
|
+
* `includes`: The list of included files.
|
106
98
|
|
107
99
|
There are multiple ways the include list can be defined. Here are some examples:
|
108
100
|
|
data/bin/tocer
CHANGED
data/lib/tocer.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "tocer/identity"
|
4
|
-
require "tocer/configuration"
|
5
4
|
require "tocer/elements/comment_block"
|
6
5
|
require "tocer/parsers/header"
|
7
6
|
require "tocer/transformers/link"
|
@@ -10,4 +9,12 @@ require "tocer/transformers/finder"
|
|
10
9
|
require "tocer/builder"
|
11
10
|
require "tocer/writer"
|
12
11
|
require "tocer/runner"
|
13
|
-
require "tocer/cli"
|
12
|
+
require "tocer/cli/configuration/content"
|
13
|
+
require "tocer/cli/configuration/loader"
|
14
|
+
require "tocer/cli/parsers"
|
15
|
+
require "tocer/cli/parsers/build"
|
16
|
+
require "tocer/cli/parsers/core"
|
17
|
+
require "tocer/cli/parsers/assembler"
|
18
|
+
require "tocer/cli/processors/build"
|
19
|
+
require "tocer/cli/processors/config"
|
20
|
+
require "tocer/cli/shell"
|
data/lib/tocer/builder.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require "forwardable"
|
4
4
|
|
5
5
|
module Tocer
|
6
|
-
# Builds
|
6
|
+
# Builds table of contents for a Markdown document.
|
7
7
|
class Builder
|
8
8
|
extend Forwardable
|
9
9
|
|
@@ -11,33 +11,35 @@ module Tocer
|
|
11
11
|
|
12
12
|
def_delegators :comment_block, :start_index, :finish_index, :prependable?
|
13
13
|
|
14
|
-
def initialize
|
15
|
-
@label = label
|
14
|
+
def initialize comment_block: Elements::CommentBlock.new, transformer: Transformers::Finder.new
|
16
15
|
@comment_block = comment_block
|
16
|
+
@transformer = transformer
|
17
17
|
@url_count = Hash.new 0
|
18
18
|
@code_block = false
|
19
19
|
end
|
20
20
|
|
21
|
-
def call lines
|
21
|
+
def call lines, label: CLI::Configuration::Loader.call.label
|
22
22
|
return "" if headers(lines).empty?
|
23
23
|
|
24
|
-
|
25
|
-
"#{comment_block.start_tag}\n\n",
|
26
|
-
"#{label}\n\n",
|
27
|
-
links(lines).join("\n"),
|
28
|
-
"\n\n#{comment_block.finish_tag}\n"
|
29
|
-
].join
|
24
|
+
assemble(lines, label).join
|
30
25
|
end
|
31
26
|
|
32
27
|
private
|
33
28
|
|
34
|
-
attr_reader :
|
29
|
+
attr_reader :comment_block, :transformer, :url_count
|
35
30
|
attr_accessor :code_block
|
36
31
|
|
37
|
-
def
|
38
|
-
|
32
|
+
def assemble lines, label
|
33
|
+
[
|
34
|
+
"#{comment_block.start_tag}\n\n",
|
35
|
+
"#{label}\n\n",
|
36
|
+
links(lines).join("\n"),
|
37
|
+
"\n\n#{comment_block.finish_tag}\n"
|
38
|
+
]
|
39
39
|
end
|
40
40
|
|
41
|
+
def links(lines) = headers(lines).map { |markdown| transform markdown }
|
42
|
+
|
41
43
|
def headers lines
|
42
44
|
lines.select do |line|
|
43
45
|
toggle_code_block line
|
@@ -52,16 +54,14 @@ module Tocer
|
|
52
54
|
end
|
53
55
|
|
54
56
|
def transform markdown
|
55
|
-
|
56
|
-
url =
|
57
|
-
link =
|
57
|
+
transformer.call(markdown).then do |instance|
|
58
|
+
url = instance.url
|
59
|
+
link = instance.call url_suffix: url_suffix(url)
|
58
60
|
url_count[url] += 1
|
59
61
|
link
|
60
62
|
end
|
61
63
|
end
|
62
64
|
|
63
|
-
def url_suffix url
|
64
|
-
url_count[url].then { |count| count.zero? ? "" : count }
|
65
|
-
end
|
65
|
+
def url_suffix(url) = url_count[url].then { |count| count.zero? ? "" : count }
|
66
66
|
end
|
67
67
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pathname"
|
4
|
+
require "refinements/structs"
|
5
|
+
require "runcom"
|
6
|
+
require "yaml"
|
7
|
+
|
8
|
+
module Tocer
|
9
|
+
module CLI
|
10
|
+
module Configuration
|
11
|
+
# Represents the fully assembled Command Line Interface (CLI) configuration.
|
12
|
+
class Loader
|
13
|
+
using Refinements::Structs
|
14
|
+
|
15
|
+
DEFAULTS = YAML.load_file(Pathname(__dir__).join("defaults.yml")).freeze
|
16
|
+
CLIENT = Runcom::Config.new "#{Identity::NAME}/configuration.yml", defaults: DEFAULTS
|
17
|
+
|
18
|
+
def self.call = new.call
|
19
|
+
|
20
|
+
def initialize content: Content.new, client: CLIENT
|
21
|
+
@content = content
|
22
|
+
@client = client
|
23
|
+
end
|
24
|
+
|
25
|
+
def call = content.merge(**client.to_h)
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :content, :client
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tocer
|
4
|
+
module CLI
|
5
|
+
module Parsers
|
6
|
+
# Assembles and parses all Command Line Interface (CLI) options.
|
7
|
+
class Assembler
|
8
|
+
SECTIONS = [Core, Build].freeze # Order is important.
|
9
|
+
|
10
|
+
def initialize configuration: CLI::Configuration::Loader.call,
|
11
|
+
sections: SECTIONS,
|
12
|
+
client: CLIENT
|
13
|
+
@options = configuration.to_h
|
14
|
+
@sections = sections
|
15
|
+
@client = client
|
16
|
+
end
|
17
|
+
|
18
|
+
def call arguments = []
|
19
|
+
sections.each { |parser| parser.call client: client, options: options }
|
20
|
+
client.parse! arguments
|
21
|
+
options
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_h = options
|
25
|
+
|
26
|
+
def to_s = client.to_s
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :options, :sections, :client
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tocer
|
4
|
+
module CLI
|
5
|
+
module Parsers
|
6
|
+
# Handles parsing of Command Line Interface (CLI) build options.
|
7
|
+
class Build
|
8
|
+
def self.call options: {}, configuration: Configuration::Loader.call, client: CLIENT
|
9
|
+
new(options: options, configuration: configuration, client: client).call
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize options: {}, configuration: Configuration::Loader.call, client: CLIENT
|
13
|
+
@options = options
|
14
|
+
@configuration = configuration
|
15
|
+
@client = client
|
16
|
+
end
|
17
|
+
|
18
|
+
def call arguments = []
|
19
|
+
client.separator "\nBUILD OPTIONS:\n"
|
20
|
+
private_methods.sort.grep(/add_/).each { |method| __send__ method }
|
21
|
+
arguments.empty? ? arguments : client.parse!(arguments)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :options, :configuration, :client
|
27
|
+
|
28
|
+
def add_label
|
29
|
+
client.on(
|
30
|
+
"-l",
|
31
|
+
"--label [LABEL]",
|
32
|
+
%(Label. Default: "#{CLI::Configuration::Loader.call.label}".)
|
33
|
+
) do |value|
|
34
|
+
options[:label] = value || configuration.to_h.fetch(:label)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_include
|
39
|
+
client.on(
|
40
|
+
"-i",
|
41
|
+
"--includes [a,b,c]",
|
42
|
+
Array,
|
43
|
+
%(Include pattern list. Default: #{CLI::Configuration::Loader.call.includes}.)
|
44
|
+
) do |value|
|
45
|
+
list = Array value
|
46
|
+
options[:includes] = list.empty? ? configuration.to_h.fetch(:includes) : list
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "tocer/identity"
|
4
|
+
|
5
|
+
module Tocer
|
6
|
+
module CLI
|
7
|
+
module Parsers
|
8
|
+
# Handles parsing of Command Line Interface (CLI) core options.
|
9
|
+
class Core
|
10
|
+
def self.call(options: {}, client: CLIENT) = new(options: options, client: client).call
|
11
|
+
|
12
|
+
def initialize options: {}, client: CLIENT
|
13
|
+
@options = options
|
14
|
+
@client = client
|
15
|
+
end
|
16
|
+
|
17
|
+
def call arguments = []
|
18
|
+
client.banner = "#{Identity::LABEL} - #{Identity::SUMMARY}"
|
19
|
+
client.separator "\nUSAGE:\n"
|
20
|
+
collate
|
21
|
+
arguments.empty? ? arguments : client.parse!(arguments)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :options, :client
|
27
|
+
|
28
|
+
def collate = private_methods.sort.grep(/add_/).each { |method| __send__ method }
|
29
|
+
|
30
|
+
def add_config
|
31
|
+
client.on(
|
32
|
+
"-c",
|
33
|
+
"--config ACTION",
|
34
|
+
%i[edit view],
|
35
|
+
"Manage gem configuration: edit or view."
|
36
|
+
) do |action|
|
37
|
+
options[:config] = action
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_build
|
42
|
+
client.on "-b", "--build [PATH]", %(Build table of contents. Default path: ".") do |value|
|
43
|
+
options[:build] = value || "."
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def add_version
|
48
|
+
client.on "-v", "--version", "Show gem version." do
|
49
|
+
options[:version] = Identity::VERSION_LABEL
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_help
|
54
|
+
client.on "-h", "--help", "Show this message." do
|
55
|
+
options[:help] = true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tocer
|
4
|
+
module CLI
|
5
|
+
module Processors
|
6
|
+
# Handles the Command Line Interface (CLI) for building of table of contents.
|
7
|
+
class Build
|
8
|
+
def initialize runner: Runner.new
|
9
|
+
@runner = runner
|
10
|
+
end
|
11
|
+
|
12
|
+
def call root_dir = ".", configuration = {}
|
13
|
+
runner.call(root_dir: root_dir, **configuration.slice(:label, :includes)) do |path|
|
14
|
+
puts " #{path}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
attr_reader :runner
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tocer
|
4
|
+
module CLI
|
5
|
+
module Processors
|
6
|
+
# Handles the Command Line Interface (CLI) configuration processing.
|
7
|
+
class Config
|
8
|
+
def initialize configuration: CLI::Configuration::Loader::CLIENT, kernel: Kernel
|
9
|
+
@configuration = configuration
|
10
|
+
@kernel = kernel
|
11
|
+
end
|
12
|
+
|
13
|
+
def call action
|
14
|
+
case action
|
15
|
+
when :edit then edit
|
16
|
+
when :view then view
|
17
|
+
else fail StandardError, "Invalid configuration action: #{action}."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_reader :configuration, :kernel
|
24
|
+
|
25
|
+
def edit = kernel.system("$EDITOR #{configuration.current}")
|
26
|
+
|
27
|
+
def view = kernel.system("cat #{configuration.current}")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tocer
|
4
|
+
module CLI
|
5
|
+
# The main Command Line Interface (CLI) object.
|
6
|
+
class Shell
|
7
|
+
PROCESSORS = {config: Processors::Config.new, build: Processors::Build.new}.freeze
|
8
|
+
|
9
|
+
def initialize parser: Parsers::Assembler.new, processors: PROCESSORS
|
10
|
+
@parser = parser
|
11
|
+
@processors = processors
|
12
|
+
end
|
13
|
+
|
14
|
+
def call arguments = []
|
15
|
+
parse arguments
|
16
|
+
|
17
|
+
case options
|
18
|
+
in config: action then process_config action
|
19
|
+
in build: path then process_build path
|
20
|
+
in version: then puts version
|
21
|
+
in help: then usage
|
22
|
+
else usage
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
attr_reader :parser, :processors
|
29
|
+
|
30
|
+
def parse arguments = []
|
31
|
+
parser.call arguments
|
32
|
+
rescue StandardError => error
|
33
|
+
puts error.message
|
34
|
+
end
|
35
|
+
|
36
|
+
def process_config(action) = processors.fetch(:config).call(action)
|
37
|
+
|
38
|
+
def process_build(path) = processors.fetch(:build).call(path, options)
|
39
|
+
|
40
|
+
def options = parser.to_h
|
41
|
+
|
42
|
+
def usage = puts(parser.to_s)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -17,33 +17,21 @@ module Tocer
|
|
17
17
|
@message = message
|
18
18
|
end
|
19
19
|
|
20
|
-
def start_index lines
|
21
|
-
self.class.index lines, start_id
|
22
|
-
end
|
20
|
+
def start_index(lines) = self.class.index(lines, start_id)
|
23
21
|
|
24
|
-
def start_tag
|
25
|
-
comment start_id, message
|
26
|
-
end
|
22
|
+
def start_tag = comment(start_id, message)
|
27
23
|
|
28
|
-
def finish_index lines
|
29
|
-
self.class.index lines, finish_id
|
30
|
-
end
|
24
|
+
def finish_index(lines) = self.class.index(lines, finish_id)
|
31
25
|
|
32
|
-
def finish_tag
|
33
|
-
comment finish_id, message
|
34
|
-
end
|
26
|
+
def finish_tag = comment(finish_id, message)
|
35
27
|
|
36
|
-
def prependable? lines
|
37
|
-
start_index(lines).zero? && finish_index(lines).zero?
|
38
|
-
end
|
28
|
+
def prependable?(lines) = start_index(lines).zero? && finish_index(lines).zero?
|
39
29
|
|
40
30
|
private
|
41
31
|
|
42
32
|
attr_reader :start_id, :finish_id, :message
|
43
33
|
|
44
|
-
def comment
|
45
|
-
"<!-- #{id}: #{message} -->"
|
46
|
-
end
|
34
|
+
def comment(id, message) = "<!-- #{id}: #{message} -->"
|
47
35
|
end
|
48
36
|
end
|
49
37
|
end
|
data/lib/tocer/identity.rb
CHANGED
data/lib/tocer/parsers/header.rb
CHANGED
@@ -10,13 +10,9 @@ module Tocer
|
|
10
10
|
@markdown = markdown
|
11
11
|
end
|
12
12
|
|
13
|
-
def prefix
|
14
|
-
String markdown[/#{PUNCTUATION}{1,}/o]
|
15
|
-
end
|
13
|
+
def prefix = String(markdown[/#{PUNCTUATION}{1,}/o])
|
16
14
|
|
17
|
-
def content
|
18
|
-
markdown[prefix.length + 1, markdown.length].strip
|
19
|
-
end
|
15
|
+
def content = markdown[prefix.length + 1, markdown.length].strip
|
20
16
|
|
21
17
|
private
|
22
18
|
|
data/lib/tocer/rake/tasks.rb
CHANGED
@@ -2,17 +2,18 @@
|
|
2
2
|
|
3
3
|
require "rake"
|
4
4
|
require "tocer"
|
5
|
+
require "refinements/structs"
|
5
6
|
|
6
7
|
module Tocer
|
7
8
|
module Rake
|
9
|
+
# Provides Rake tasks for convenience.
|
8
10
|
class Tasks
|
9
11
|
include ::Rake::DSL
|
12
|
+
using Refinements::Structs
|
10
13
|
|
11
|
-
def self.setup
|
12
|
-
new.install
|
13
|
-
end
|
14
|
+
def self.setup = new.install
|
14
15
|
|
15
|
-
def initialize configuration:
|
16
|
+
def initialize configuration: CLI::Configuration::Loader.new.call, runner: Runner.new
|
16
17
|
@configuration = configuration
|
17
18
|
@runner = runner
|
18
19
|
end
|
@@ -20,9 +21,7 @@ module Tocer
|
|
20
21
|
def install
|
21
22
|
desc "Add/Update Table of Contents (README)"
|
22
23
|
task :toc, %i[label includes] do |_task, arguments|
|
23
|
-
|
24
|
-
updated_configuration = configuration.merge inputs
|
25
|
-
runner.new(configuration: updated_configuration.to_h).call
|
24
|
+
runner.call(**configuration.merge(**arguments.to_h).to_h)
|
26
25
|
end
|
27
26
|
end
|
28
27
|
|
data/lib/tocer/runner.rb
CHANGED
@@ -1,32 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "refinements/pathnames"
|
4
4
|
|
5
5
|
module Tocer
|
6
|
-
# Generates/updates Table of Contents for files in
|
6
|
+
# Generates/updates Table of Contents for files in root path.
|
7
7
|
class Runner
|
8
|
-
|
9
|
-
|
8
|
+
using Refinements::Pathnames
|
9
|
+
|
10
|
+
def initialize configuration: CLI::Configuration::Loader.call, writer: Writer.new
|
10
11
|
@configuration = configuration
|
11
12
|
@writer = writer
|
12
13
|
end
|
13
14
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
def call
|
21
|
-
files.each { |file| writer.new(file, label: configuration.fetch(:label)).call }
|
15
|
+
def call root_dir: ".", label: configuration.label, includes: configuration.includes
|
16
|
+
Pathname(root_dir).files(%({#{includes.join ","}}))
|
17
|
+
.each do |path|
|
18
|
+
yield path if block_given?
|
19
|
+
writer.call path, label: label
|
20
|
+
end
|
22
21
|
end
|
23
22
|
|
24
23
|
private
|
25
24
|
|
26
|
-
attr_reader :
|
27
|
-
|
28
|
-
def includes
|
29
|
-
Array configuration[:includes]
|
30
|
-
end
|
25
|
+
attr_reader :configuration, :writer
|
31
26
|
end
|
32
27
|
end
|
@@ -4,10 +4,7 @@ module Tocer
|
|
4
4
|
module Transformers
|
5
5
|
# Finds appropriate header transformer for matching pattern.
|
6
6
|
class Finder
|
7
|
-
TRANSFORMERS = {
|
8
|
-
/\[.+\]\(.+\)/ => Transformers::Link,
|
9
|
-
/.*/ => Transformers::Text
|
10
|
-
}.freeze
|
7
|
+
TRANSFORMERS = {/\[.+\]\(.+\)/ => Transformers::Link, /.*/ => Transformers::Text}.freeze
|
11
8
|
|
12
9
|
def initialize transformers: TRANSFORMERS
|
13
10
|
@transformers = transformers
|
@@ -12,45 +12,27 @@ module Tocer
|
|
12
12
|
@parser = parser.new text
|
13
13
|
end
|
14
14
|
|
15
|
-
def label
|
16
|
-
parser.content.gsub embedded_link, embedded_link_label
|
17
|
-
end
|
15
|
+
def label = parser.content.gsub(embedded_link, embedded_link_label)
|
18
16
|
|
19
|
-
def url
|
20
|
-
label.downcase.gsub(/\s/, "-").gsub(/[^\w\-]+/, "")
|
21
|
-
end
|
17
|
+
def url = label.downcase.gsub(/\s/, "-").gsub(/[^\w\-]+/, "")
|
22
18
|
|
23
|
-
def call
|
24
|
-
"#{indented_bullet}[#{label}](##{computed_url url_suffix})"
|
25
|
-
end
|
19
|
+
def call(url_suffix: "") = "#{indented_bullet}[#{label}](##{computed_url url_suffix})"
|
26
20
|
|
27
21
|
private
|
28
22
|
|
29
23
|
attr_reader :parser
|
30
24
|
|
31
|
-
def computed_url
|
32
|
-
[url, suffix.to_s].compress.join "-"
|
33
|
-
end
|
25
|
+
def computed_url(suffix = "") = [url, suffix.to_s].compress.join("-")
|
34
26
|
|
35
|
-
def embedded_link
|
36
|
-
"[#{embedded_link_label}](#{embedded_link_url})"
|
37
|
-
end
|
27
|
+
def embedded_link = "[#{embedded_link_label}](#{embedded_link_url})"
|
38
28
|
|
39
|
-
def embedded_link_label
|
40
|
-
parser.content[/\[(.*)\]/, 1]
|
41
|
-
end
|
29
|
+
def embedded_link_label = parser.content[/\[(.*)\]/, 1]
|
42
30
|
|
43
|
-
def embedded_link_url
|
44
|
-
parser.content[/\((.*)\)/, 1]
|
45
|
-
end
|
31
|
+
def embedded_link_url = parser.content[/\((.*)\)/, 1]
|
46
32
|
|
47
|
-
def indented_bullet
|
48
|
-
prefix_to_spaces.gsub(/\s{2}$/, "- ")
|
49
|
-
end
|
33
|
+
def indented_bullet = prefix_to_spaces.gsub(/\s{2}$/, "- ")
|
50
34
|
|
51
|
-
def prefix_to_spaces
|
52
|
-
Array.new(parser.prefix.length, " ").join
|
53
|
-
end
|
35
|
+
def prefix_to_spaces = Array.new(parser.prefix.length, " ").join
|
54
36
|
end
|
55
37
|
end
|
56
38
|
end
|
@@ -12,33 +12,21 @@ module Tocer
|
|
12
12
|
@parser = parser.new text
|
13
13
|
end
|
14
14
|
|
15
|
-
def label
|
16
|
-
parser.content
|
17
|
-
end
|
15
|
+
def label = parser.content
|
18
16
|
|
19
|
-
def url
|
20
|
-
label.downcase.gsub(/\s/, "-").gsub(/[^\w\-]+/, "")
|
21
|
-
end
|
17
|
+
def url = label.downcase.gsub(/\s/, "-").gsub(/[^\w\-]+/, "")
|
22
18
|
|
23
|
-
def call
|
24
|
-
"#{indented_bullet}[#{label}](##{computed_url url_suffix})"
|
25
|
-
end
|
19
|
+
def call(url_suffix: "") = "#{indented_bullet}[#{label}](##{computed_url url_suffix})"
|
26
20
|
|
27
21
|
private
|
28
22
|
|
29
23
|
attr_reader :parser
|
30
24
|
|
31
|
-
def computed_url
|
32
|
-
[url, suffix.to_s].compress.join "-"
|
33
|
-
end
|
25
|
+
def computed_url(suffix = "") = [url, suffix.to_s].compress.join("-")
|
34
26
|
|
35
|
-
def indented_bullet
|
36
|
-
prefix_to_spaces.gsub(/\s{2}$/, "- ")
|
37
|
-
end
|
27
|
+
def indented_bullet = prefix_to_spaces.gsub(/\s{2}$/, "- ")
|
38
28
|
|
39
|
-
def prefix_to_spaces
|
40
|
-
Array.new(parser.prefix.length, " ").join
|
41
|
-
end
|
29
|
+
def prefix_to_spaces = Array.new(parser.prefix.length, " ").join
|
42
30
|
end
|
43
31
|
end
|
44
32
|
end
|
data/lib/tocer/writer.rb
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "refinements/arrays"
|
4
|
+
require "refinements/pathnames"
|
5
|
+
|
3
6
|
module Tocer
|
4
7
|
# Writes table of contents to a Markdown document.
|
8
|
+
# :reek:DataClump
|
5
9
|
class Writer
|
10
|
+
using Refinements::Arrays
|
11
|
+
using Refinements::Pathnames
|
12
|
+
|
6
13
|
def self.add start_index:, old_lines:, new_lines:
|
7
14
|
computed_new_lines = start_index.zero? ? new_lines : new_lines + "\n"
|
8
15
|
old_lines.insert start_index, *computed_new_lines
|
@@ -13,26 +20,22 @@ module Tocer
|
|
13
20
|
lines.reject.with_index { |_, index| range.include? index }
|
14
21
|
end
|
15
22
|
|
16
|
-
def initialize
|
17
|
-
@file_path = file_path
|
23
|
+
def initialize builder: Builder.new
|
18
24
|
@builder = builder
|
19
25
|
end
|
20
26
|
|
21
|
-
def call
|
22
|
-
|
23
|
-
|
24
|
-
|
27
|
+
def call path, label: CLI::Configuration::Loader.call.label
|
28
|
+
path.rewrite do |body|
|
29
|
+
lines = body.each_line.to_a
|
30
|
+
builder.prependable?(lines) ? prepend(lines, label) : replace(lines, label)
|
31
|
+
end
|
25
32
|
end
|
26
33
|
|
27
34
|
private
|
28
35
|
|
29
|
-
attr_reader :
|
30
|
-
|
31
|
-
def content lines
|
32
|
-
builder.call lines
|
33
|
-
end
|
36
|
+
attr_reader :builder
|
34
37
|
|
35
|
-
def replace lines
|
38
|
+
def replace lines, label
|
36
39
|
start_index = builder.start_index lines
|
37
40
|
finish_index = builder.finish_index lines
|
38
41
|
klass = self.class
|
@@ -40,12 +43,12 @@ module Tocer
|
|
40
43
|
klass.add(
|
41
44
|
start_index: start_index,
|
42
45
|
old_lines: klass.remove(start_index, finish_index, lines),
|
43
|
-
new_lines: content(lines[finish_index, lines.length])
|
46
|
+
new_lines: content(lines[finish_index, lines.length], label)
|
44
47
|
).join
|
45
48
|
end
|
46
49
|
|
47
|
-
def prepend lines
|
48
|
-
|
49
|
-
|
50
|
+
def prepend(lines, label) = [content(lines, label), lines.join].compress.join("\n")
|
51
|
+
|
52
|
+
def content(lines, label) = builder.call(lines, label: label)
|
50
53
|
end
|
51
54
|
end
|
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: 12.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
@@ -10,9 +10,9 @@ bindir: bin
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
MIIC/
|
14
|
-
|
15
|
-
|
13
|
+
MIIC/jCCAeagAwIBAgIBBDANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
|
14
|
+
a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0yMTAzMTkxMjQ4MDZaFw0yMjAzMTkx
|
15
|
+
MjQ4MDZaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
|
16
16
|
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6l1qpXTiomH1RfMRloyw7MiE
|
17
17
|
xyVx/x8Yc3EupdH7uhNaTXQGyORN6aOY//1QXXMHIZ9tW74nZLhesWMSUMYy0XhB
|
18
18
|
brs+KkurHnc9FnEJAbG7ebGvl/ncqZt72nQvaxpDxvuCBHgJAz+8i5wl6FhLw+oT
|
@@ -20,15 +20,15 @@ cert_chain:
|
|
20
20
|
D5vkU0YlAm1r98BymuJlcQ1qdkVEI1d48ph4kcS0S0nv1RiuyVb6TCAR3Nu3VaVq
|
21
21
|
3fPzZKJLZBx67UvXdbdicWPiUR75elI4PXpLIic3xytaF52ZJYyKZCNZJhNwfQID
|
22
22
|
AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU0nzow9vc
|
23
|
-
2CdikiiE3fJhP/
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBAEjpaOXHHp8s/7GL2qCb
|
24
|
+
YAs7urOLv9VHSPfQWAwaTMVnSsIf3Sw4xzISOP/mmfEPBPXtz61K5esrE/uTFtgb
|
25
|
+
FyjxQk2H0sEWgrRXGGNHBWQRhhEs7LP/TByoC15A0br++xLxRz4r7HBLGAWQQDpg
|
26
|
+
66BJ2TBVjxS6K64tKbq7+ACyrOZGgTfNHACh4M076y0x0oRf/rwBrU39/KRfuhbb
|
27
|
+
cm+nNCEtO35gTmZ2bVDHLGvWazi3gJt6+huQjfXTCUUG2YYBxwhu+GPdAGQPxpf9
|
28
|
+
lkHilIrX69jq8wMPpBhlaw2mRmeSL50Wv5u6xVBvOHhXFSP1crXM95vfLhLyRYod
|
29
|
+
W2A=
|
30
30
|
-----END CERTIFICATE-----
|
31
|
-
date:
|
31
|
+
date: 2021-05-20 00:00:00.000000000 Z
|
32
32
|
dependencies:
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: refinements
|
@@ -36,42 +36,28 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
39
|
+
version: '8.0'
|
40
40
|
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
46
|
+
version: '8.0'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: runcom
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
53
|
+
version: '7.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: '
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
name: thor
|
63
|
-
requirement: !ruby/object:Gem::Requirement
|
64
|
-
requirements:
|
65
|
-
- - "~>"
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: '0.20'
|
68
|
-
type: :runtime
|
69
|
-
prerelease: false
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
71
|
-
requirements:
|
72
|
-
- - "~>"
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: '0.20'
|
60
|
+
version: '7.0'
|
75
61
|
description:
|
76
62
|
email:
|
77
63
|
- brooke@alchemists.io
|
@@ -87,8 +73,16 @@ files:
|
|
87
73
|
- bin/tocer
|
88
74
|
- lib/tocer.rb
|
89
75
|
- lib/tocer/builder.rb
|
90
|
-
- lib/tocer/cli.rb
|
91
|
-
- lib/tocer/configuration.
|
76
|
+
- lib/tocer/cli/configuration/content.rb
|
77
|
+
- lib/tocer/cli/configuration/defaults.yml
|
78
|
+
- lib/tocer/cli/configuration/loader.rb
|
79
|
+
- lib/tocer/cli/parsers.rb
|
80
|
+
- lib/tocer/cli/parsers/assembler.rb
|
81
|
+
- lib/tocer/cli/parsers/build.rb
|
82
|
+
- lib/tocer/cli/parsers/core.rb
|
83
|
+
- lib/tocer/cli/processors/build.rb
|
84
|
+
- lib/tocer/cli/processors/config.rb
|
85
|
+
- lib/tocer/cli/shell.rb
|
92
86
|
- lib/tocer/elements/comment_block.rb
|
93
87
|
- lib/tocer/identity.rb
|
94
88
|
- lib/tocer/parsers/header.rb
|
@@ -115,14 +109,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
109
|
requirements:
|
116
110
|
- - "~>"
|
117
111
|
- !ruby/object:Gem::Version
|
118
|
-
version: '
|
112
|
+
version: '3.0'
|
119
113
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
114
|
requirements:
|
121
115
|
- - ">="
|
122
116
|
- !ruby/object:Gem::Version
|
123
117
|
version: '0'
|
124
118
|
requirements: []
|
125
|
-
rubygems_version: 3.2.
|
119
|
+
rubygems_version: 3.2.17
|
126
120
|
signing_key:
|
127
121
|
specification_version: 4
|
128
122
|
summary: A command line interface for generating table of contents for Markdown files.
|
metadata.gz.sig
CHANGED
Binary file
|
data/lib/tocer/cli.rb
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "thor"
|
4
|
-
require "thor/actions"
|
5
|
-
require "runcom"
|
6
|
-
|
7
|
-
module Tocer
|
8
|
-
# The Command Line Interface (CLI) for the gem.
|
9
|
-
class CLI < Thor
|
10
|
-
include Thor::Actions
|
11
|
-
|
12
|
-
package_name Identity::VERSION_LABEL
|
13
|
-
|
14
|
-
def initialize args = [], options = {}, config = {}
|
15
|
-
super args, options, config
|
16
|
-
@configuration = Tocer::Configuration.default
|
17
|
-
rescue Runcom::Errors::Base => error
|
18
|
-
abort error.message
|
19
|
-
end
|
20
|
-
|
21
|
-
desc "-g, [--generate=PATH]", "Generate table of contents."
|
22
|
-
map %w[-g --generate] => :generate
|
23
|
-
method_option :label,
|
24
|
-
aliases: "-l",
|
25
|
-
desc: "Label",
|
26
|
-
type: :string,
|
27
|
-
default: Tocer::Configuration.default.to_h.fetch(:label)
|
28
|
-
method_option :includes,
|
29
|
-
aliases: "-i",
|
30
|
-
desc: "File include list",
|
31
|
-
type: :array,
|
32
|
-
default: Tocer::Configuration.default.to_h.fetch(:includes)
|
33
|
-
# :reek:TooManyStatements
|
34
|
-
def generate path = "."
|
35
|
-
updated_configuration = configuration.merge label: options.label, includes: options.includes
|
36
|
-
runner = Runner.new path, configuration: updated_configuration.to_h
|
37
|
-
files = runner.files
|
38
|
-
|
39
|
-
return if files.empty?
|
40
|
-
|
41
|
-
runner.call
|
42
|
-
|
43
|
-
say "Processed table of contents for:"
|
44
|
-
files.each { |file| say " #{file}" }
|
45
|
-
end
|
46
|
-
|
47
|
-
desc "-c, [--config]", "Manage gem configuration."
|
48
|
-
map %w[-c --config] => :config
|
49
|
-
method_option :edit,
|
50
|
-
aliases: "-e",
|
51
|
-
desc: "Edit gem configuration.",
|
52
|
-
type: :boolean,
|
53
|
-
default: false
|
54
|
-
method_option :info,
|
55
|
-
aliases: "-i",
|
56
|
-
desc: "Print gem configuration.",
|
57
|
-
type: :boolean,
|
58
|
-
default: false
|
59
|
-
def config
|
60
|
-
path = configuration.current
|
61
|
-
|
62
|
-
if options.edit? then `#{ENV["EDITOR"]} #{path}`
|
63
|
-
elsif options.info?
|
64
|
-
path ? say(path) : say("Configuration doesn't exist.")
|
65
|
-
else help :config
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
desc "-v, [--version]", "Show gem version."
|
70
|
-
map %w[-v --version] => :version
|
71
|
-
def version
|
72
|
-
say Identity::VERSION_LABEL
|
73
|
-
end
|
74
|
-
|
75
|
-
desc "-h, [--help=COMMAND]", "Show this message or get help for a command."
|
76
|
-
map %w[-h --help] => :help
|
77
|
-
def help task = nil
|
78
|
-
say and super
|
79
|
-
end
|
80
|
-
|
81
|
-
private
|
82
|
-
|
83
|
-
attr_reader :configuration
|
84
|
-
end
|
85
|
-
end
|
data/lib/tocer/configuration.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "runcom"
|
4
|
-
|
5
|
-
module Tocer
|
6
|
-
module Configuration
|
7
|
-
def self.default
|
8
|
-
Runcom::Config.new "#{Identity::NAME}/configuration.yml",
|
9
|
-
defaults: {
|
10
|
-
label: "## Table of Contents",
|
11
|
-
includes: ["README.md"]
|
12
|
-
}
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|