tocer 0.1.0 → 1.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 +29 -6
- data/lib/tocer.rb +5 -2
- data/lib/tocer/builder.rb +29 -9
- data/lib/tocer/cli.rb +13 -2
- data/lib/tocer/configuration.rb +26 -0
- data/lib/tocer/elements/comment_block.rb +40 -0
- data/lib/tocer/identity.rb +1 -1
- data/lib/tocer/parsers/header.rb +26 -0
- data/lib/tocer/transformers/link.rb +51 -0
- data/lib/tocer/transformers/text.rb +39 -0
- data/lib/tocer/writer.rb +8 -7
- metadata +30 -13
- metadata.gz.sig +0 -0
- data/lib/tocer/commenter.rb +0 -38
- data/lib/tocer/transformer.rb +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f12d5a3b405216b970f03b881e0a36c00e0091f
|
4
|
+
data.tar.gz: 898e0ba35499767b75fe50e88f15e62f6a95bb6f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6da1ab64f2fba3c688711ddc88e6c732e6c19e2b29f4da278f8c4d9cff7fbb6d4f028a6969b042eed9539cce04e9ab1de2407d98d71537b3c239c4d706f6219f
|
7
|
+
data.tar.gz: 615fa828848a718049deec38252626d94d9a4d279a618109afa2c743580e5441f9c694d38077122ceedc8a6e4aa5de455b7deacfb55da240a1b841eb64db120a
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -9,14 +9,16 @@
|
|
9
9
|
|
10
10
|
Tocer (a.k.a. Table of Contenter) is command line interface for generating table of contents for Markdown files.
|
11
11
|
|
12
|
-
<!--
|
13
|
-
|
12
|
+
<!-- Tocer[start]: Auto-generated, don't remove. -->
|
13
|
+
|
14
14
|
# Table of Contents
|
15
15
|
|
16
16
|
- [Features](#features)
|
17
17
|
- [Requirements](#requirements)
|
18
18
|
- [Setup](#setup)
|
19
19
|
- [Usage](#usage)
|
20
|
+
- [Command Line Interface (CLI)](#command-line-interface-cli)
|
21
|
+
- [Customization](#customization)
|
20
22
|
- [Tests](#tests)
|
21
23
|
- [Versioning](#versioning)
|
22
24
|
- [Code of Conduct](#code-of-conduct)
|
@@ -25,13 +27,13 @@ Tocer (a.k.a. Table of Contenter) is command line interface for generating table
|
|
25
27
|
- [History](#history)
|
26
28
|
- [Credits](#credits)
|
27
29
|
|
28
|
-
<!--
|
30
|
+
<!-- Tocer[finish]: Auto-generated, don't remove. -->
|
29
31
|
|
30
32
|
# Features
|
31
33
|
|
32
34
|
- Supports Markdown ATX-style headers. Example: `# Header`.
|
33
35
|
- Does not support header suffixes. Example: `# Header #`.
|
34
|
-
- Does not support header
|
36
|
+
- Does not support header prefixes without spaces. Example: `#Header`.
|
35
37
|
- Prepends table of contents to Markdown documents that don't have table of contents.
|
36
38
|
- Replaces/updates Markdown documents that have existing table of contents.
|
37
39
|
|
@@ -56,6 +58,8 @@ For an insecure install, type the following (not recommended):
|
|
56
58
|
|
57
59
|
# Usage
|
58
60
|
|
61
|
+
## Command Line Interface (CLI)
|
62
|
+
|
59
63
|
From the command line, type: `tocer help`
|
60
64
|
|
61
65
|
tocer -e, [--edit] # Edit Tocer settings in default editor.
|
@@ -66,8 +70,8 @@ From the command line, type: `tocer help`
|
|
66
70
|
To add Tocer support, add the following at the correct position within your Markdown files:
|
67
71
|
|
68
72
|
```
|
69
|
-
<!-- Tocer[start]
|
70
|
-
<!-- Tocer[finish]
|
73
|
+
<!-- Tocer[start] -->
|
74
|
+
<!-- Tocer[finish] -->
|
71
75
|
```
|
72
76
|
|
73
77
|
Alternatively, you can run `tocer -g <file_path>` on a file that does not have Tocer support and it will prepend the above
|
@@ -77,6 +81,25 @@ In the case that Tocer has already auto-generated a table of contents for a Mark
|
|
77
81
|
contents has become stale, or placement of the table of contents has changed you can re-run Tocer on that file to auto-
|
78
82
|
update it with new table of contents.
|
79
83
|
|
84
|
+
## Customization
|
85
|
+
|
86
|
+
If desired, this gem supports global customization via the `~/.tocerrc` file. Order of precedence is determined in the
|
87
|
+
following order (with the last one taking top priority):
|
88
|
+
|
89
|
+
0. Global `~/.tocerrc`.
|
90
|
+
0. CLI option. Example: `tocer --generate README.md --label "Custom Label"`
|
91
|
+
|
92
|
+
Any setting provided to the CLI during runtime would trump the global setting. The global setting is the weakest of all
|
93
|
+
but great for situations where custom settings should be applied to *all* projects.
|
94
|
+
|
95
|
+
The `~/.tocerrc` uses the following default settings:
|
96
|
+
|
97
|
+
:label: "# Table of Contents"
|
98
|
+
|
99
|
+
Each `~/.tocerrc` setting can be configured as follows:
|
100
|
+
|
101
|
+
- `label`: The header label for the table of contents. Default: "# Table of Contents".
|
102
|
+
|
80
103
|
# Tests
|
81
104
|
|
82
105
|
To test, run:
|
data/lib/tocer.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
require "tocer/elements/comment_block"
|
2
|
+
require "tocer/parsers/header"
|
3
|
+
require "tocer/transformers/link"
|
4
|
+
require "tocer/transformers/text"
|
1
5
|
require "tocer/builder"
|
2
|
-
require "tocer/
|
6
|
+
require "tocer/configuration"
|
3
7
|
require "tocer/identity"
|
4
|
-
require "tocer/transformer"
|
5
8
|
require "tocer/writer"
|
data/lib/tocer/builder.rb
CHANGED
@@ -1,32 +1,52 @@
|
|
1
1
|
module Tocer
|
2
|
-
# Builds table of contents for a document
|
2
|
+
# Builds a table of contents for a Markdown document.
|
3
3
|
class Builder
|
4
|
-
def initialize lines, label: "# Table of Contents",
|
4
|
+
def initialize lines, label: "# Table of Contents", comment_block: Elements::CommentBlock
|
5
5
|
@lines = lines
|
6
6
|
@label = label
|
7
|
-
@
|
8
|
-
@
|
7
|
+
@comment_block = comment_block.new
|
8
|
+
@url_count = Hash.new { |hash, key| hash[key] = 0 }
|
9
9
|
end
|
10
10
|
|
11
11
|
def headers
|
12
|
-
lines.select { |line| line.start_with?
|
12
|
+
lines.select { |line| line.start_with? Parsers::Header.punctuation }
|
13
13
|
end
|
14
14
|
|
15
15
|
def build
|
16
16
|
return "" if headers.empty?
|
17
17
|
|
18
|
-
content = "#{
|
18
|
+
content = "#{comment_block.start}\n\n"
|
19
19
|
content << "#{label}\n\n"
|
20
20
|
content << headers_as_links.join("\n")
|
21
|
-
content << "\n\n#{
|
21
|
+
content << "\n\n#{comment_block.finish}\n\n"
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
25
25
|
|
26
|
-
attr_reader :lines, :label, :
|
26
|
+
attr_reader :lines, :label, :comment_block, :url_count
|
27
|
+
|
28
|
+
def acquire_transfomer header
|
29
|
+
case
|
30
|
+
when header =~ /\[.+\]\(.+\)/
|
31
|
+
Transformers::Link.new header
|
32
|
+
else
|
33
|
+
Transformers::Text.new header
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def url_suffix url
|
38
|
+
url_count[url].zero? ? "" : url_count[url]
|
39
|
+
end
|
40
|
+
|
41
|
+
def transform header
|
42
|
+
transformer = acquire_transfomer header
|
43
|
+
link = transformer.transform url_suffix: url_suffix(transformer.url)
|
44
|
+
url_count[transformer.url] += 1
|
45
|
+
link
|
46
|
+
end
|
27
47
|
|
28
48
|
def headers_as_links
|
29
|
-
headers.map { |header|
|
49
|
+
headers.map { |header| transform header }
|
30
50
|
end
|
31
51
|
end
|
32
52
|
end
|
data/lib/tocer/cli.rb
CHANGED
@@ -13,13 +13,15 @@ module Tocer
|
|
13
13
|
|
14
14
|
def initialize args = [], options = {}, config = {}
|
15
15
|
super args, options, config
|
16
|
+
@configuration = Configuration.new
|
16
17
|
end
|
17
18
|
|
18
19
|
desc "-g, [--generate=GENERATE]", "Generate table of contents."
|
19
20
|
map %w(-g --generate) => :generate
|
21
|
+
method_option :label, aliases: "-l", desc: "Custom label", type: :string, default: "# Table of Contents"
|
20
22
|
def generate file_path
|
21
|
-
|
22
|
-
|
23
|
+
update_configuration! options
|
24
|
+
Writer.new(file_path, label: configuration.label).write
|
23
25
|
say "Generated table of contents: #{file_path}."
|
24
26
|
end
|
25
27
|
|
@@ -42,5 +44,14 @@ module Tocer
|
|
42
44
|
def help task = nil
|
43
45
|
say && super
|
44
46
|
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
attr_reader :configuration
|
51
|
+
|
52
|
+
def update_configuration! options
|
53
|
+
return if options[:label] == "# Table of Contents"
|
54
|
+
configuration.label = options[:label]
|
55
|
+
end
|
45
56
|
end
|
46
57
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Tocer
|
2
|
+
# Default configuration for gem with support for custom settings.
|
3
|
+
class Configuration
|
4
|
+
attr_reader :file_path
|
5
|
+
attr_writer :label
|
6
|
+
|
7
|
+
def initialize file_path: File.join(ENV["HOME"], Identity.file_name)
|
8
|
+
@file_path = file_path
|
9
|
+
@settings = load_settings
|
10
|
+
end
|
11
|
+
|
12
|
+
def label
|
13
|
+
@label ||= settings.fetch(:label, "# Table of Contents")
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
attr_reader :settings
|
19
|
+
|
20
|
+
def load_settings
|
21
|
+
return {} unless File.exist?(file_path)
|
22
|
+
yaml = YAML.load_file file_path
|
23
|
+
yaml.is_a?(Hash) ? yaml : {}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Tocer
|
2
|
+
module Elements
|
3
|
+
# Represents a table of contents start and finish comment block.
|
4
|
+
class CommentBlock
|
5
|
+
def initialize start_id: "Tocer[start]", finish_id: "Tocer[finish]", message: "Auto-generated, don't remove."
|
6
|
+
@start_id = start_id
|
7
|
+
@finish_id = finish_id
|
8
|
+
@message = message
|
9
|
+
end
|
10
|
+
|
11
|
+
def start
|
12
|
+
comment start_id, message
|
13
|
+
end
|
14
|
+
|
15
|
+
def start_index collection
|
16
|
+
index collection, start_id
|
17
|
+
end
|
18
|
+
|
19
|
+
def finish
|
20
|
+
comment finish_id, message
|
21
|
+
end
|
22
|
+
|
23
|
+
def finish_index collection
|
24
|
+
index collection, finish_id
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :start_id, :finish_id, :message
|
30
|
+
|
31
|
+
def comment id, message
|
32
|
+
"<!-- #{id}: #{message} -->"
|
33
|
+
end
|
34
|
+
|
35
|
+
def index collection, id
|
36
|
+
collection.index { |line| line =~ /\<\!\-\-.*#{Regexp.escape id}.*\-\-\>/ }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/tocer/identity.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Tocer
|
2
|
+
module Parsers
|
3
|
+
# Represents a Markdown header.
|
4
|
+
class Header
|
5
|
+
def self.punctuation
|
6
|
+
"#"
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize markdown
|
10
|
+
@markdown = markdown
|
11
|
+
end
|
12
|
+
|
13
|
+
def prefix
|
14
|
+
String markdown[/#{self.class.punctuation}{1,}/]
|
15
|
+
end
|
16
|
+
|
17
|
+
def content
|
18
|
+
markdown[prefix.length + 1, markdown.length].strip
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_reader :markdown
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "refinements/array_extensions"
|
2
|
+
|
3
|
+
module Tocer
|
4
|
+
module Transformers
|
5
|
+
# Transforms a Markdown header (embedded link) into a table of contents link.
|
6
|
+
class Link
|
7
|
+
using Refinements::ArrayExtensions
|
8
|
+
|
9
|
+
def initialize text, header: Parsers::Header
|
10
|
+
@header = header.new text
|
11
|
+
end
|
12
|
+
|
13
|
+
def label
|
14
|
+
header.content.gsub(embedded_link, embedded_link_label)
|
15
|
+
end
|
16
|
+
|
17
|
+
def url
|
18
|
+
label.downcase.gsub(/\s/, "-").gsub(/[^\w\-]+/, "")
|
19
|
+
end
|
20
|
+
|
21
|
+
def transform url_suffix: ""
|
22
|
+
modified_url = [url, url_suffix.to_s].compress.join "-"
|
23
|
+
"#{indented_bullet}[#{label}](##{modified_url})"
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
attr_reader :header
|
29
|
+
|
30
|
+
def embedded_link_label
|
31
|
+
header.content[/\[(.*)\]/, 1]
|
32
|
+
end
|
33
|
+
|
34
|
+
def embedded_link_url
|
35
|
+
header.content[/\((.*)\)/, 1]
|
36
|
+
end
|
37
|
+
|
38
|
+
def embedded_link
|
39
|
+
"[#{embedded_link_label}](#{embedded_link_url})"
|
40
|
+
end
|
41
|
+
|
42
|
+
def prefix_to_spaces
|
43
|
+
Array.new(header.prefix.length, " ").join
|
44
|
+
end
|
45
|
+
|
46
|
+
def indented_bullet
|
47
|
+
prefix_to_spaces.gsub(/\s{2}$/, "- ")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "refinements/array_extensions"
|
2
|
+
|
3
|
+
module Tocer
|
4
|
+
module Transformers
|
5
|
+
# Transforms a Markdown header (plain text) into a table of contents link.
|
6
|
+
class Text
|
7
|
+
using Refinements::ArrayExtensions
|
8
|
+
|
9
|
+
def initialize text, header: Parsers::Header
|
10
|
+
@header = header.new text
|
11
|
+
end
|
12
|
+
|
13
|
+
def label
|
14
|
+
header.content
|
15
|
+
end
|
16
|
+
|
17
|
+
def url
|
18
|
+
label.downcase.gsub(/\s/, "-").gsub(/[^\w\-]+/, "")
|
19
|
+
end
|
20
|
+
|
21
|
+
def transform url_suffix: ""
|
22
|
+
modified_url = [url, url_suffix.to_s].compress.join "-"
|
23
|
+
"#{indented_bullet}[#{label}](##{modified_url})"
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
attr_reader :header
|
29
|
+
|
30
|
+
def prefix_to_spaces
|
31
|
+
Array.new(header.prefix.length, " ").join
|
32
|
+
end
|
33
|
+
|
34
|
+
def indented_bullet
|
35
|
+
prefix_to_spaces.gsub(/\s{2}$/, "- ")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/tocer/writer.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module Tocer
|
2
2
|
# Writes table of contents to a Markdown document.
|
3
3
|
class Writer
|
4
|
-
def initialize file_path, builder: Builder,
|
4
|
+
def initialize file_path, label: "# Table of Contents", builder: Builder, comment_block: Elements::CommentBlock
|
5
5
|
@file_path = file_path
|
6
6
|
@file_lines = File.open(file_path).to_a
|
7
|
+
@label = label
|
7
8
|
@builder = builder
|
8
|
-
setup_indexes
|
9
|
+
setup_indexes comment_block.new, @file_lines
|
9
10
|
end
|
10
11
|
|
11
12
|
def write
|
@@ -15,15 +16,15 @@ module Tocer
|
|
15
16
|
|
16
17
|
private
|
17
18
|
|
18
|
-
attr_reader :file_path, :file_lines, :start_index, :finish_index, :builder, :
|
19
|
+
attr_reader :file_path, :file_lines, :label, :start_index, :finish_index, :builder, :comment_block
|
19
20
|
|
20
|
-
def setup_indexes
|
21
|
-
@start_index =
|
22
|
-
@finish_index =
|
21
|
+
def setup_indexes comment_block, lines
|
22
|
+
@start_index = comment_block.start_index lines
|
23
|
+
@finish_index = comment_block.finish_index lines
|
23
24
|
end
|
24
25
|
|
25
26
|
def content lines
|
26
|
-
builder.new(lines).build
|
27
|
+
builder.new(lines, label: label).build
|
27
28
|
end
|
28
29
|
|
29
30
|
def remove_toc 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: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
@@ -30,36 +30,50 @@ cert_chain:
|
|
30
30
|
aSif+qBc6oHD7EQWPF5cZkzkIURuwNwPBngZGxIKaMAgRhjGFXzUMAaq++r59cS9
|
31
31
|
xTfQ4k6fglKEgpnLAXiKdo2c8Ym+X4rIKFfedQ==
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2015-11-
|
33
|
+
date: 2015-11-21 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: thor
|
37
37
|
requirement: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - "
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '0'
|
41
|
+
version: '0.19'
|
42
42
|
type: :runtime
|
43
43
|
prerelease: false
|
44
44
|
version_requirements: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - "
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '0'
|
48
|
+
version: '0.19'
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: thor_plus
|
51
51
|
requirement: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- - "
|
53
|
+
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
55
|
+
version: '2.1'
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - "
|
60
|
+
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
62
|
+
version: '2.1'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: refinements
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '1.0'
|
63
77
|
- !ruby/object:Gem::Dependency
|
64
78
|
name: rake
|
65
79
|
requirement: !ruby/object:Gem::Requirement
|
@@ -301,13 +315,16 @@ files:
|
|
301
315
|
- lib/tocer.rb
|
302
316
|
- lib/tocer/builder.rb
|
303
317
|
- lib/tocer/cli.rb
|
304
|
-
- lib/tocer/
|
318
|
+
- lib/tocer/configuration.rb
|
319
|
+
- lib/tocer/elements/comment_block.rb
|
305
320
|
- lib/tocer/identity.rb
|
321
|
+
- lib/tocer/parsers/header.rb
|
306
322
|
- lib/tocer/tasks/rspec.rake
|
307
323
|
- lib/tocer/tasks/rubocop.rake
|
308
|
-
- lib/tocer/
|
324
|
+
- lib/tocer/transformers/link.rb
|
325
|
+
- lib/tocer/transformers/text.rb
|
309
326
|
- lib/tocer/writer.rb
|
310
|
-
homepage: https://
|
327
|
+
homepage: https://github.com/bkuhlmann/tocer
|
311
328
|
licenses:
|
312
329
|
- MIT
|
313
330
|
metadata: {}
|
metadata.gz.sig
CHANGED
Binary file
|
data/lib/tocer/commenter.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
module Tocer
|
2
|
-
# Represents table of contents start and finish comments.
|
3
|
-
class Commenter
|
4
|
-
def initialize start_id: "Tocer[start]", finish_id: "Tocer[finish]", message: "Auto-generated, don't remove."
|
5
|
-
@start_id = start_id
|
6
|
-
@finish_id = finish_id
|
7
|
-
@message = message
|
8
|
-
end
|
9
|
-
|
10
|
-
def start
|
11
|
-
comment start_id, message
|
12
|
-
end
|
13
|
-
|
14
|
-
def start_index collection
|
15
|
-
index collection, start
|
16
|
-
end
|
17
|
-
|
18
|
-
def finish
|
19
|
-
comment finish_id, message
|
20
|
-
end
|
21
|
-
|
22
|
-
def finish_index collection
|
23
|
-
index collection, finish
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
attr_reader :start_id, :finish_id, :message
|
29
|
-
|
30
|
-
def comment id, message
|
31
|
-
"<!-- #{id}: #{message} -->"
|
32
|
-
end
|
33
|
-
|
34
|
-
def index collection, text
|
35
|
-
collection.index { |line| line =~ /#{Regexp.escape text}/ }
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
data/lib/tocer/transformer.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
module Tocer
|
2
|
-
# Transforms Markdown headers into anchored links.
|
3
|
-
class Transformer
|
4
|
-
def initialize text
|
5
|
-
@text = text
|
6
|
-
end
|
7
|
-
|
8
|
-
def pounds
|
9
|
-
String text[/\#{1,}/]
|
10
|
-
end
|
11
|
-
|
12
|
-
def label
|
13
|
-
return "" if text.empty?
|
14
|
-
text[pounds.length + 1, text.length].strip
|
15
|
-
end
|
16
|
-
|
17
|
-
def bullet
|
18
|
-
return "" if pounds.empty?
|
19
|
-
pounds_to_spaces(pounds).gsub(/\s{2}$/, "- ")
|
20
|
-
end
|
21
|
-
|
22
|
-
def url
|
23
|
-
label.downcase.gsub(/\s/, "-").gsub(/[^\w\-\+\&]+/, "")
|
24
|
-
end
|
25
|
-
|
26
|
-
def transform
|
27
|
-
"#{bullet}[#{label}](##{url})"
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
attr_reader :text
|
33
|
-
|
34
|
-
def pounds_to_spaces pounds
|
35
|
-
Array.new(pounds.length, " ").join
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|