markdown_helper 1.0.0 → 1.5.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/Gemfile.lock +1 -1
- data/README.md +10 -3
- data/bin/include +23 -9
- data/bin/usage/include.txt +2 -1
- data/lib/markdown_helper/version.rb +1 -1
- data/lib/markdown_helper.rb +110 -94
- data/readme_files/README.template.md +8 -2
- data/readme_files/use_cases/evergreen_examples.md +14 -0
- data/readme_files/use_cases/generated_text.md +5 -0
- data/readme_files/use_cases/image_attributes.md +8 -0
- data/readme_files/use_cases/reusable_text.md +7 -0
- data/readme_files/use_cases/rubygem_images.md +9 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1147c20c56afc8ddb67b90b57845d59d08488c7
|
4
|
+
data.tar.gz: 0d4e6f2363d0921cdc206adc4c7c8d30a654ac1a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec0b3a986477b6c9780a31073855358880375d6ccef61d669fb5b55ed121d9327c536e46f6d7cdf075dec5129c7b4c3c4be200fd7d8afbed9c128f4a11f5f518
|
7
|
+
data.tar.gz: a172ff12521ec4e2363d17d89b3149f303242fe7c506e17b376ab9499e7912a980905fc0463bb1bc84262165a3bfcc7b6e1d008ccd8e53f35c63f9414b488c8f
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -8,6 +8,10 @@
|
|
8
8
|
<!-- <<<<<< END RESOLVED IMAGES: INPUT-LINE '
|
9
9
|
' -->
|
10
10
|
|
11
|
+
## What's New?
|
12
|
+
|
13
|
+
Nested file inclusion is now supported, which means that an included file can include more files. This applies only to a file included verbatim, not to a file included as a code block or as a markdown comment.
|
14
|
+
|
11
15
|
## What's This?
|
12
16
|
|
13
17
|
Class <code>MarkdownHelper</code> supports:
|
@@ -18,11 +22,11 @@ Class <code>MarkdownHelper</code> supports:
|
|
18
22
|
|
19
23
|
## How It Works
|
20
24
|
|
21
|
-
The markdown helper reads a markdown document (template) and writes another markdown document.
|
25
|
+
The markdown helper is a preprocessor that reads a markdown document (template) and writes another markdown document.
|
22
26
|
|
23
27
|
The template can contain certain instructions that call for file inclusions and image resolutions.
|
24
28
|
|
25
|
-
|
29
|
+
### Commented or Pristine?
|
26
30
|
|
27
31
|
By default, the output markdown has added comments that show:
|
28
32
|
|
@@ -84,6 +88,8 @@ Comment text is written into the output between the comment delimiters <code>\<!
|
|
84
88
|
|
85
89
|
Verbatim text is included unadorned. Most often, verbatim text is markdown to be rendered as part of the markdown page.
|
86
90
|
|
91
|
+
The verbatim text is itself scanned for nested includes.
|
92
|
+
|
87
93
|
### Usage
|
88
94
|
|
89
95
|
#### CLI
|
@@ -91,7 +97,8 @@ Verbatim text is included unadorned. Most often, verbatim text is markdown to b
|
|
91
97
|
<!-- >>>>>> BEGIN INCLUDED FILE (code_block): SOURCE readme_files/../bin/usage/include.txt -->
|
92
98
|
<code>include.txt</code>
|
93
99
|
```
|
94
|
-
|
100
|
+
|
101
|
+
Usage: include [options] template_file_path markdown_file_page
|
95
102
|
--pristine No comments added
|
96
103
|
--help Display help
|
97
104
|
|
data/bin/include
CHANGED
@@ -6,17 +6,21 @@ require 'markdown_helper'
|
|
6
6
|
|
7
7
|
options = {:pristine => false}
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
# Save opts for use below.
|
10
|
+
opts = nil
|
11
|
+
parser = OptionParser.new do |_opts|
|
12
|
+
opts = _opts
|
13
|
+
_opts.banner = "Usage: #{File.basename(__FILE__)} [options] template_file_path markdown_file_page"
|
14
|
+
_opts.on('--pristine', 'No comments added') do |_|
|
12
15
|
options[:pristine] = true
|
13
16
|
end
|
14
|
-
|
15
|
-
usage(
|
17
|
+
_opts.on('--help', 'Display help') do
|
18
|
+
usage(_opts)
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
19
22
|
def usage(opts)
|
23
|
+
puts ''
|
20
24
|
puts opts
|
21
25
|
puts <<-EOT
|
22
26
|
|
@@ -37,8 +41,18 @@ parser.parse!
|
|
37
41
|
|
38
42
|
template_file_path, markdown_file_path = ARGV
|
39
43
|
|
40
|
-
usage(
|
41
|
-
usage(
|
42
|
-
usage(
|
44
|
+
usage(opts) unless ARGV.size == 2
|
45
|
+
usage(opts) unless File.readable?(template_file_path)
|
46
|
+
usage(opts) unless File.writable?(File.dirname(markdown_file_path))
|
47
|
+
|
48
|
+
# This code, outside of a class, had interference from Module#include.
|
49
|
+
# So now it's in a class.
|
50
|
+
class AvoidModule
|
51
|
+
def initialize(template_file_path, markdown_file_path, options)
|
52
|
+
markdown_helper = MarkdownHelper.new(options)
|
53
|
+
markdown_helper.include(template_file_path, markdown_file_path)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
AvoidModule.new(template_file_path, markdown_file_path, options)
|
43
58
|
|
44
|
-
MarkdownHelper.new(options).include(template_file_path, markdown_file_path)
|
data/bin/usage/include.txt
CHANGED
data/lib/markdown_helper.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'pathname'
|
1
2
|
require 'markdown_helper/version'
|
2
3
|
|
3
4
|
# Helper class for working with GitHub markdown.
|
@@ -26,17 +27,6 @@ class MarkdownHelper
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
29
|
-
# Get the user name and repository name from ENV.
|
30
|
-
def repo_user_and_name
|
31
|
-
repo_user = ENV['REPO_USER']
|
32
|
-
repo_name = ENV['REPO_NAME']
|
33
|
-
unless repo_user and repo_name
|
34
|
-
message = 'ENV values for both REPO_USER and REPO_NAME must be defined.'
|
35
|
-
raise RuntimeError.new(message)
|
36
|
-
end
|
37
|
-
[repo_user, repo_name]
|
38
|
-
end
|
39
|
-
|
40
30
|
# Merges external files into markdown text.
|
41
31
|
# @param template_file_path [String] the path to the input template markdown file, usually containing include pragmas.
|
42
32
|
# @param markdown_file_path [String] the path to the output merged markdown file.
|
@@ -52,29 +42,7 @@ class MarkdownHelper
|
|
52
42
|
# @[:verbatim](foo.md)
|
53
43
|
def include(template_file_path, markdown_file_path)
|
54
44
|
output = send(:generate_file, template_file_path, markdown_file_path, __method__) do |input_lines, output_lines|
|
55
|
-
input_lines
|
56
|
-
match_data = input_line.match(INCLUDE_REGEXP)
|
57
|
-
unless match_data
|
58
|
-
output_lines.push(input_line)
|
59
|
-
next
|
60
|
-
end
|
61
|
-
treatment = case match_data[1]
|
62
|
-
when ':code_block'
|
63
|
-
:code_block
|
64
|
-
when ':verbatim'
|
65
|
-
:verbatim
|
66
|
-
when ':comment'
|
67
|
-
:comment
|
68
|
-
else
|
69
|
-
match_data[1]
|
70
|
-
end
|
71
|
-
relative_file_path = match_data[2]
|
72
|
-
include_file_path = File.join(
|
73
|
-
File.dirname(template_file_path),
|
74
|
-
relative_file_path,
|
75
|
-
)
|
76
|
-
send(:include_file, include_file_path, treatment, output_lines)
|
77
|
-
end
|
45
|
+
send(:include_files, template_file_path, input_lines, output_lines, paths = [], realpaths = [])
|
78
46
|
end
|
79
47
|
output
|
80
48
|
end
|
@@ -103,24 +71,27 @@ class MarkdownHelper
|
|
103
71
|
def resolve(template_file_path, markdown_file_path)
|
104
72
|
# Method :generate_file does the first things, yields the block, does the last things.
|
105
73
|
output = send(:generate_file, template_file_path, markdown_file_path, __method__) do |input_lines, output_lines|
|
106
|
-
input_lines
|
107
|
-
scan_data = input_line.scan(IMAGE_REGEXP)
|
108
|
-
if scan_data.empty?
|
109
|
-
output_lines.push(input_line)
|
110
|
-
next
|
111
|
-
end
|
112
|
-
send(:resolve_images, scan_data, input_line, output_lines)
|
113
|
-
end
|
74
|
+
send(:resolve_images, input_lines, output_lines)
|
114
75
|
end
|
115
76
|
output
|
116
77
|
end
|
117
78
|
alias resolve_image_urls resolve
|
118
79
|
|
80
|
+
private
|
81
|
+
|
119
82
|
def comment(text)
|
120
83
|
"<!--#{text}-->\n"
|
121
84
|
end
|
122
85
|
|
123
|
-
|
86
|
+
def repo_user_and_name
|
87
|
+
repo_user = ENV['REPO_USER']
|
88
|
+
repo_name = ENV['REPO_NAME']
|
89
|
+
unless repo_user and repo_name
|
90
|
+
message = 'ENV values for both REPO_USER and REPO_NAME must be defined.'
|
91
|
+
raise RuntimeError.new(message)
|
92
|
+
end
|
93
|
+
[repo_user, repo_name]
|
94
|
+
end
|
124
95
|
|
125
96
|
def generate_file(template_file_path, markdown_file_path, method)
|
126
97
|
output_lines = []
|
@@ -137,65 +108,110 @@ class MarkdownHelper
|
|
137
108
|
output
|
138
109
|
end
|
139
110
|
|
140
|
-
def
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
111
|
+
def include_files(template_file_path, input_lines, output_lines, paths, realpaths)
|
112
|
+
realpath = Pathname.new(template_file_path).realpath
|
113
|
+
i = realpaths.index(realpath)
|
114
|
+
if i
|
115
|
+
old_path = paths[i]
|
116
|
+
new_path = template_file_path
|
117
|
+
realpath = realpaths[i]
|
118
|
+
message = <<EOT
|
119
|
+
Includes are circular:
|
120
|
+
Old path: #{old_path}
|
121
|
+
New path: #{new_path}
|
122
|
+
Real path: #{realpath}
|
123
|
+
EOT
|
124
|
+
raise RuntimeError.new(message)
|
147
125
|
end
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
126
|
+
paths.push(template_file_path)
|
127
|
+
realpaths.push(realpath)
|
128
|
+
|
129
|
+
input_lines.each do |input_line|
|
130
|
+
match_data = input_line.match(INCLUDE_REGEXP)
|
131
|
+
unless match_data
|
132
|
+
output_lines.push(input_line)
|
133
|
+
next
|
134
|
+
end
|
135
|
+
treatment = case match_data[1]
|
136
|
+
when ':code_block'
|
137
|
+
:code_block
|
138
|
+
when ':verbatim'
|
139
|
+
:verbatim
|
140
|
+
when ':comment'
|
141
|
+
:comment
|
142
|
+
else
|
143
|
+
match_data[1]
|
144
|
+
end
|
145
|
+
relative_file_path = match_data[2]
|
146
|
+
include_file_path = File.join(
|
147
|
+
File.dirname(template_file_path),
|
148
|
+
relative_file_path,
|
149
|
+
)
|
150
|
+
output_lines.push(comment(" >>>>>> BEGIN INCLUDED FILE (#{treatment}): SOURCE #{include_file_path} ")) unless pristine
|
151
|
+
include_lines = File.readlines(include_file_path)
|
152
|
+
unless include_lines.last.match("\n")
|
153
|
+
message = "Warning: Included file has no trailing newline: #{include_file_path}"
|
154
|
+
warn(message)
|
155
|
+
end
|
156
|
+
case treatment
|
157
|
+
when :verbatim
|
158
|
+
# Pass through unadorned, but honor any nested includes.
|
159
|
+
include_files(include_file_path, include_lines, output_lines, paths, realpaths)
|
160
|
+
when :comment
|
161
|
+
output_lines.push(comment(include_lines.join('')))
|
162
|
+
else
|
163
|
+
# Use the file name as a label.
|
164
|
+
file_name_line = format("<code>%s</code>\n", File.basename(include_file_path))
|
165
|
+
output_lines.push(file_name_line)
|
166
|
+
# Put into code block.
|
167
|
+
language = treatment == :code_block ? '' : treatment
|
168
|
+
output_lines.push("```#{language}\n")
|
169
|
+
output_lines.push(*include_lines)
|
170
|
+
output_lines.push("```\n")
|
171
|
+
end
|
172
|
+
output_lines.push(comment(" <<<<<< END INCLUDED FILE (#{treatment}): SOURCE #{include_file_path} ")) unless pristine
|
163
173
|
end
|
164
|
-
output_lines.push(comment(" <<<<<< END INCLUDED FILE (#{treatment}): SOURCE #{include_file.path} ")) unless pristine
|
165
174
|
end
|
166
175
|
|
167
|
-
def resolve_images(
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
formatted_attributes = ['']
|
174
|
-
attributes.each do |attribute|
|
175
|
-
name, value = attribute.split('=', 2)
|
176
|
-
formatted_attributes.push(format('%s="%s"', name, value))
|
176
|
+
def resolve_images(input_lines, output_lines)
|
177
|
+
input_lines.each do |input_line|
|
178
|
+
scan_data = input_line.scan(IMAGE_REGEXP)
|
179
|
+
if scan_data.empty?
|
180
|
+
output_lines.push(input_line)
|
181
|
+
next
|
177
182
|
end
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
183
|
+
output_lines.push(comment(" >>>>>> BEGIN RESOLVED IMAGES: INPUT-LINE '#{input_line}' ")) unless pristine
|
184
|
+
output_line = input_line
|
185
|
+
scan_data.each do |alt_text, path_and_attributes|
|
186
|
+
relative_file_path, attributes_s =path_and_attributes.split(/\s?\|\s?/, 2)
|
187
|
+
attributes = attributes_s ? attributes_s.split(/\s+/) : []
|
188
|
+
formatted_attributes = ['']
|
189
|
+
attributes.each do |attribute|
|
190
|
+
name, value = attribute.split('=', 2)
|
191
|
+
formatted_attributes.push(format('%s="%s"', name, value))
|
192
|
+
end
|
193
|
+
formatted_attributes_s = formatted_attributes.join(' ')
|
194
|
+
repo_user, repo_name = repo_user_and_name
|
195
|
+
absolute_file_path = nil
|
196
|
+
if relative_file_path.start_with?('http')
|
197
|
+
absolute_file_path = relative_file_path
|
198
|
+
else
|
199
|
+
absolute_file_path = File.join(
|
200
|
+
"https://raw.githubusercontent.com/#{repo_user}/#{repo_name}/master",
|
201
|
+
relative_file_path,
|
202
|
+
)
|
203
|
+
end
|
204
|
+
img_element = format(
|
205
|
+
'<img src="%s" alt="%s"%s>',
|
206
|
+
absolute_file_path,
|
207
|
+
alt_text,
|
208
|
+
formatted_attributes_s,
|
187
209
|
)
|
210
|
+
output_line = output_line.sub(IMAGE_REGEXP, img_element)
|
188
211
|
end
|
189
|
-
|
190
|
-
|
191
|
-
absolute_file_path,
|
192
|
-
alt_text,
|
193
|
-
formatted_attributes_s,
|
194
|
-
)
|
195
|
-
output_line = output_line.sub(IMAGE_REGEXP, img_element)
|
212
|
+
output_lines.push(output_line)
|
213
|
+
output_lines.push(comment(" <<<<<< END RESOLVED IMAGES: INPUT-LINE '#{input_line}' ")) unless pristine
|
196
214
|
end
|
197
|
-
output_lines.push(output_line)
|
198
|
-
output_lines.push(comment(" <<<<<< END RESOLVED IMAGES: INPUT-LINE '#{input_line}' ")) unless pristine
|
199
215
|
end
|
200
216
|
|
201
217
|
end
|
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|

|
4
4
|
|
5
|
+
## What's New?
|
6
|
+
|
7
|
+
Nested file inclusion is now supported, which means that an included file can include more files. This applies only to a file included verbatim, not to a file included as a code block or as a markdown comment.
|
8
|
+
|
5
9
|
## What's This?
|
6
10
|
|
7
11
|
Class <code>MarkdownHelper</code> supports:
|
@@ -12,11 +16,11 @@ Class <code>MarkdownHelper</code> supports:
|
|
12
16
|
|
13
17
|
## How It Works
|
14
18
|
|
15
|
-
The markdown helper reads a markdown document (template) and writes another markdown document.
|
19
|
+
The markdown helper is a preprocessor that reads a markdown document (template) and writes another markdown document.
|
16
20
|
|
17
21
|
The template can contain certain instructions that call for file inclusions and image resolutions.
|
18
22
|
|
19
|
-
|
23
|
+
### Commented or Pristine?
|
20
24
|
|
21
25
|
By default, the output markdown has added comments that show:
|
22
26
|
|
@@ -56,6 +60,8 @@ Comment text is written into the output between the comment delimiters <code>\<!
|
|
56
60
|
|
57
61
|
Verbatim text is included unadorned. Most often, verbatim text is markdown to be rendered as part of the markdown page.
|
58
62
|
|
63
|
+
The verbatim text is itself scanned for nested includes.
|
64
|
+
|
59
65
|
### Usage
|
60
66
|
|
61
67
|
#### CLI
|
@@ -0,0 +1,14 @@
|
|
1
|
+
### Evergreen Examples
|
2
|
+
|
3
|
+
Example code and output that's embedded in a markdown file is dead text that may no longer be correct.
|
4
|
+
|
5
|
+
Use the markdown helper to include example code and output -- but only after the project "build" has re-run the code and refreahed the output!
|
6
|
+
|
7
|
+
Here's how:
|
8
|
+
|
9
|
+
1. Maintain each code example in a separate executable file.
|
10
|
+
1. Maintain markdown files that have include desctiptions, rather than embedded code and output.
|
11
|
+
1. At project "build time" (controlled by a suitable build tool):
|
12
|
+
1. Execute each code example, capturing its output to one or more files.
|
13
|
+
1. Check output for errors and validity.
|
14
|
+
1. Run the markdown helper to re-assemble the markdown files.
|
@@ -0,0 +1,5 @@
|
|
1
|
+
### Include Generated Text
|
2
|
+
|
3
|
+
Use the markdown helper to include text that is genrated at project "build time."
|
4
|
+
|
5
|
+
Example: Project build runs each executable with option <code>--help</code>, capturing the output into a file. That file can then be included into the markdown pages for the project.
|
@@ -0,0 +1,8 @@
|
|
1
|
+
### Image Attributes
|
2
|
+
|
3
|
+
Use the markdown helper to assign attributes to images.
|
4
|
+
|
5
|
+
If you're using the markdown helper to [resolve image file paths for a Ruby gem](./rubygem_images.md), you'll be using the GitHub markdown image-description idiom (begins with exclamation point), and not the HTML <code>img</code> idiom.
|
6
|
+
|
7
|
+
The image description does not accept attributes (such as height and width), but the markdown helper does accept those, passing them through to an <code>img</code> HTML element.
|
8
|
+
s
|
@@ -0,0 +1,7 @@
|
|
1
|
+
### Reusable Text
|
2
|
+
|
3
|
+
Use the markdown helper to stay DRY (Don't Repeat Yourself).
|
4
|
+
|
5
|
+
Text that will be needed in more than one place in the documentation can be maintained in a separate file, then included wherever it's needed.
|
6
|
+
|
7
|
+
Note that the included text may itself be markdown, which can be included verbatim, or it may be code or other example data, which can be included into a code block.
|
@@ -0,0 +1,9 @@
|
|
1
|
+
### RubyGem Images
|
2
|
+
|
3
|
+
Use the markdown helper to resolve image paths for a Ruby gem.
|
4
|
+
|
5
|
+
When you release your GitHub project to gem at RubyGems.org, the documentation is rebuilt into files on RubyDoc.info. When YARD performs this rebuilding, it does some directory restructuring.
|
6
|
+
|
7
|
+
If a markdown file contains an image description that has a relative file path, that path will not be valid in the documentation on RubyDoc.info, and the image will not display in the documentation.
|
8
|
+
|
9
|
+
To avoid that error, use the markdown helper to resolve the relative path to an absolute path. This new absolute path points to a file that's automatically maintained in the GitHub project.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: markdown_helper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- burdettelamar
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -109,6 +109,11 @@ files:
|
|
109
109
|
- readme_files/include_usage.rb
|
110
110
|
- readme_files/resolve.md
|
111
111
|
- readme_files/resolve_usage.rb
|
112
|
+
- readme_files/use_cases/evergreen_examples.md
|
113
|
+
- readme_files/use_cases/generated_text.md
|
114
|
+
- readme_files/use_cases/image_attributes.md
|
115
|
+
- readme_files/use_cases/reusable_text.md
|
116
|
+
- readme_files/use_cases/rubygem_images.md
|
112
117
|
- readme_files/verbatim_ruby_template.md
|
113
118
|
homepage: https://github.com/BurdetteLamar/markdown_helper
|
114
119
|
licenses:
|