poppins 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.md +6 -0
- data/Guardfile +24 -0
- data/README.md +15 -1
- data/bin/poppins +5 -1
- data/lib/poppins.rb +2 -0
- data/lib/poppins/document.rb +101 -51
- data/lib/poppins/inline_link.rb +34 -0
- data/lib/poppins/reference_link.rb +41 -0
- data/lib/poppins/version.rb +1 -1
- data/poppins.gemspec +1 -0
- data/spec/data/clean_formatted_sample.md +25 -0
- data/spec/data/implicit_references.md +23 -0
- data/spec/data/inline_choke.md +13 -0
- data/spec/data/mixed.md +23 -0
- data/spec/data/sample.md +3 -3
- data/spec/data/sample_inline.md +21 -0
- data/spec/lib/document_spec.rb +53 -18
- data/spec/lib/inline_link_spec.rb +40 -0
- data/spec/lib/reference_link_spec.rb +26 -0
- data/spec/poppins_spec.rb +1 -1
- metadata +38 -4
data/CHANGES.md
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec' do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
|
9
|
+
# Rails example
|
10
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
11
|
+
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
12
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
13
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
14
|
+
watch('config/routes.rb') { "spec/routing" }
|
15
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
16
|
+
|
17
|
+
# Capybara request specs
|
18
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
|
19
|
+
|
20
|
+
# Turnip features and steps
|
21
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
22
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
23
|
+
end
|
24
|
+
|
data/README.md
CHANGED
@@ -36,7 +36,17 @@ Or install it yourself as:
|
|
36
36
|
|
37
37
|
## Roadmap
|
38
38
|
|
39
|
-
Poppins is intended to be similar to [formd]
|
39
|
+
Poppins is intended to be similar to [formd][2], but with easier
|
40
|
+
integration with Ruby projects. Also, I would like to add the ability
|
41
|
+
to insert reference links they way Dr. Drang describes
|
42
|
+
[here](http://www.leancrew.com/all-this/2012/08/markdown-reference-links-in-bbedit/)
|
43
|
+
and [here][3].
|
44
|
+
|
45
|
+
It would also be really awesome if we could re-flow paragraph text and
|
46
|
+
wrap it at user-specified column lengths.
|
47
|
+
|
48
|
+
Currently, Poppins doesn't handle implicit reference links. Those are
|
49
|
+
links that look [like this] or perhaps [like this][].
|
40
50
|
|
41
51
|
|
42
52
|
## Contributing
|
@@ -48,5 +58,9 @@ Poppins is intended to be similar to [formd](http://www.drbunsen.org/formd-a-mar
|
|
48
58
|
5. Create new Pull Request
|
49
59
|
|
50
60
|
|
61
|
+
|
51
62
|
[1]: http://www.leancrew.com/all-this/2012/09/tidying-markdown-reference-links/
|
63
|
+
[2]: http://www.drbunsen.org/formd-a-markdown-formatting-tool.html
|
64
|
+
[3]: http://www.leancrew.com/all-this/2012/08/more-markdown-reference-links-in-bbedit/
|
52
65
|
|
66
|
+
[like this]: http://google.com
|
data/bin/poppins
CHANGED
data/lib/poppins.rb
CHANGED
data/lib/poppins/document.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require_relative 'reference_link'
|
3
|
+
require_relative 'inline_link'
|
4
|
+
|
1
5
|
module Poppins
|
2
6
|
class Document
|
7
|
+
attr_reader :reference_links, :inline_links, :links
|
3
8
|
|
4
9
|
def initialize(input=nil, output=nil)
|
5
10
|
if input.empty?
|
6
|
-
|
11
|
+
raise "invalid input" unless (ARGF.respond_to?(:readlines) and not ARGF.nil?)
|
7
12
|
@input = ARGF.readlines.join
|
8
13
|
else
|
9
14
|
@input = File.open(input, 'r').readlines.join
|
@@ -11,82 +16,127 @@ module Poppins
|
|
11
16
|
|
12
17
|
@output = output
|
13
18
|
|
14
|
-
|
15
|
-
|
16
|
-
# RegEx for matching labels for reference links. (Avoid footnotes!)
|
17
|
-
@labels = /^\[([^^\]]+)\]:\s+(.+)$/
|
18
|
-
@labels_with_possible_newlines = /^\[([^^\]]+)\]:\s+(.+)(\n)?/
|
19
|
+
identify_inline_links
|
20
|
+
identify_reference_links
|
19
21
|
end
|
20
22
|
|
21
|
-
##
|
22
|
-
# Returns an array of the links found in the document in order.
|
23
|
-
def links
|
24
|
-
@input.scan(@links)
|
25
|
-
end
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
##
|
25
|
+
# Identifies inline links in the document
|
26
|
+
def identify_inline_links(input=@input)
|
27
|
+
inline_links = Hash[input.scan(InlineLink.inline_regex)]
|
30
28
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
29
|
+
@inline_links = []
|
30
|
+
|
31
|
+
inline_links.each do |il|
|
32
|
+
@inline_links.push( InlineLink.new(il.to_a[1], il.to_a[0]) )
|
35
33
|
end
|
36
34
|
|
37
|
-
|
35
|
+
@inline_links
|
38
36
|
end
|
39
37
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
38
|
+
##
|
39
|
+
# Identifies reference links in the document
|
40
|
+
def identify_reference_links(input=@input)
|
41
|
+
reference_links = Hash[input.scan(ReferenceLink.link_regex)]
|
45
42
|
|
46
|
-
|
47
|
-
end
|
43
|
+
labels = Hash[input.scan(ReferenceLink.label_regex)]
|
48
44
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
45
|
+
@reference_links = []
|
46
|
+
|
47
|
+
reference_links.each do |rl|
|
48
|
+
@reference_links.push( ReferenceLink.new(labels[rl.to_a[1]], rl.to_a[0], rl.to_a[1] ) )
|
49
|
+
end
|
50
|
+
|
51
|
+
# Note that the order of the links in this list is the same as their
|
52
|
+
# appearance in the text.
|
53
|
+
@reference_links
|
58
54
|
end
|
59
55
|
|
60
56
|
|
61
57
|
##
|
62
58
|
# Produces the clean, formatted version of the Markdown with new
|
63
59
|
# reference numbers.
|
64
|
-
def clean_and_format
|
65
|
-
|
66
|
-
|
67
|
-
result =
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
60
|
+
def clean_and_format(input=@input)
|
61
|
+
result = input
|
62
|
+
result = convert_reference_to_inline(result)
|
63
|
+
result = convert_inline_to_reference(result)
|
64
|
+
|
65
|
+
identify_reference_links(result)
|
66
|
+
|
67
|
+
# Remove old reference labels from the end
|
68
|
+
# TODO: This currently destroys links that don't appear anywhere else in
|
69
|
+
# the text since they aren't added back in unless they were used in the
|
70
|
+
# text..
|
71
|
+
result = result.gsub(ReferenceLink.label_regex_with_possible_newlines, '')
|
72
|
+
|
73
|
+
# Add new reference labels to the end
|
74
|
+
@reference_links.each_with_index do |rl, i|
|
75
|
+
result += "[#{i+1}]: #{rl.url}\n"
|
72
76
|
end
|
73
77
|
|
74
78
|
# Replace old reference numbers with the new ones
|
75
|
-
result = result.gsub(
|
76
|
-
|
77
|
-
|
78
|
-
end
|
79
|
+
result = result.gsub(ReferenceLink.link_regex) do |match|
|
80
|
+
# TODO: There has to be a cleaner way to do this...
|
81
|
+
match_data = match.match(ReferenceLink.link_regex)
|
79
82
|
|
80
|
-
|
81
|
-
|
83
|
+
link_text = match_data[1].to_s
|
84
|
+
label_from_match = match_data[2].to_s
|
85
|
+
new_label = @reference_links.index { |rl| rl.label == label_from_match }
|
82
86
|
|
87
|
+
# TODO: Do you really want to strip whitespace here?
|
88
|
+
"[#{link_text.strip}][#{new_label + 1}]"
|
89
|
+
end
|
90
|
+
|
91
|
+
# return the result
|
83
92
|
if @output
|
84
93
|
File.open(@output, 'w') do |f|
|
85
94
|
f.write(result)
|
86
95
|
end
|
87
|
-
else
|
88
|
-
puts result
|
89
96
|
end
|
97
|
+
|
98
|
+
result
|
99
|
+
end
|
100
|
+
|
101
|
+
##
|
102
|
+
# Produces a clean, formatted version of the Markdown while also
|
103
|
+
# converting inline links to reference links.
|
104
|
+
def convert_inline_to_reference(input=@input)
|
105
|
+
result = input
|
106
|
+
identify_inline_links(result)
|
107
|
+
|
108
|
+
@inline_links.each do |link|
|
109
|
+
reference_label = SecureRandom.hex(8)
|
110
|
+
result = result.gsub(link.regex) do |match|
|
111
|
+
"[#{link.link_text}][#{reference_label}]"
|
112
|
+
end
|
113
|
+
result += "[#{reference_label}]: #{link.url}\n"
|
114
|
+
end
|
115
|
+
|
116
|
+
result
|
117
|
+
end
|
118
|
+
|
119
|
+
##
|
120
|
+
# Convert reference links to inline links. This can be used prior to
|
121
|
+
# converting back to reference links to ensure that all links are
|
122
|
+
# reference links and they are numbered in the order they appear.
|
123
|
+
def convert_reference_to_inline(input=@input)
|
124
|
+
result = input
|
125
|
+
|
126
|
+
# TODO: Should DRY this
|
127
|
+
labels = Hash[input.scan(ReferenceLink.label_regex)]
|
128
|
+
ref_urls = labels.values
|
129
|
+
|
130
|
+
ref_urls.each do |url|
|
131
|
+
regex = /\[([^\]]+)\]\[(#{Regexp.quote(url)})\]/
|
132
|
+
result = result.gsub(regex) do |match|
|
133
|
+
"[#{match[1]}](#{url})"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# TODO: Need to be able to store this separately if they want to have
|
138
|
+
# inline links only.
|
139
|
+
result
|
90
140
|
end
|
91
141
|
end
|
92
142
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Poppins
|
2
|
+
class InlineLink
|
3
|
+
# RegEx for matching inline links in the text.
|
4
|
+
@inline_regex = /\[([^\]]+)\]\(([^\)]+)\)/
|
5
|
+
|
6
|
+
attr_reader :url
|
7
|
+
attr_accessor :link_text, :reference_label
|
8
|
+
|
9
|
+
def initialize(url, link_text)
|
10
|
+
@url = url
|
11
|
+
@link_text = link_text
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.inline_regex
|
15
|
+
@inline_regex
|
16
|
+
end
|
17
|
+
|
18
|
+
def as_found_in_text
|
19
|
+
"[#{@link_text}](#{@url})"
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
as_found_in_text
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# Returns a regular expression that can be used to find examples of this
|
28
|
+
# link in a sample text.
|
29
|
+
def regex
|
30
|
+
/\[([^\]]+)\]\((#{Regexp.quote(@url)})\)/
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Poppins
|
2
|
+
class ReferenceLink
|
3
|
+
# RegEx for matching reference links in the text. (Avoid footnotes!)
|
4
|
+
@link_regex = /\[([^\]]+)\]\[([^^\]]+)\]/
|
5
|
+
# RegEx for matching labels for reference links. (Avoid footnotes!)
|
6
|
+
@label_regex = /^\[([^^\]]+)\]:\s+(.+)$/
|
7
|
+
@label_regex_with_possible_newlines = /^\[([^^\]]+)\]:\s+(.+)(\n)?/
|
8
|
+
|
9
|
+
attr_reader :url, :link_text, :label, :link_regex, :label_regex
|
10
|
+
|
11
|
+
def initialize(url="", link_text="", label="")
|
12
|
+
@url = url
|
13
|
+
@link_text = link_text
|
14
|
+
@label = label
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.link_regex
|
18
|
+
@link_regex
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.label_regex
|
22
|
+
@label_regex
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.label_regex_with_possible_newlines
|
26
|
+
@label_regex_with_possible_newlines
|
27
|
+
end
|
28
|
+
|
29
|
+
def as_end_reference
|
30
|
+
"[#{@link_text}]: #{@url}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def as_found_in_text
|
34
|
+
"[#{@link_text}]"
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_s
|
38
|
+
"[#{@label}]: #{@url}, found for text: #{@link_text}\n"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/poppins/version.rb
CHANGED
data/poppins.gemspec
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
Species and their hybrids, How simply are these facts! How strange that
|
2
|
+
the pollen of each But we may thus have
|
3
|
+
[succeeded][1] in selecting so many exceptions to
|
4
|
+
this rule. but the species would not all the same species living on the
|
5
|
+
White Mountains, in the arctic regions of that large island. The
|
6
|
+
exceptions which are now large, and triumphant, and which are known to
|
7
|
+
every naturalist: scarcely a single [character][2]
|
8
|
+
in the descendants of the Glacial period, would have been of use to the
|
9
|
+
plants, have been accumulated and if, in both regions.
|
10
|
+
|
11
|
+
Supposed to be extinct and unknown, form. We have seen that it yields
|
12
|
+
readily, when subjected as [under
|
13
|
+
confinement][3], to new and
|
14
|
+
improved varieties will have been much compressed, we may assume that
|
15
|
+
the species, which are already present in the ordinary spines serve as a
|
16
|
+
prehensile or snapping apparatus. Thus every gradation, from animals
|
17
|
+
with true lungs are descended from a marsupial form), "and if so, there
|
18
|
+
can be followed by which viscid matter, such as that of making
|
19
|
+
[slaves][4]. Let it be remembered that
|
20
|
+
selection may be extended--to the stigma of.
|
21
|
+
|
22
|
+
[1]: http://www.google.com
|
23
|
+
[2]: http://kungfugrippe.com
|
24
|
+
[3]: http://docs.python.org/library/index.html
|
25
|
+
[4]: http://daringfireball.net/markdown
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Species and their hybrids, How simply are these facts! How strange that
|
2
|
+
the pollen of each But we may thus have [succeeded] in selecting so
|
3
|
+
many exceptions to this rule. but the species would not all the same
|
4
|
+
species living on the White Mountains, in the arctic regions of that
|
5
|
+
large island. The [exceptions which](http://github.com) are now large,
|
6
|
+
and triumphant, and which are known to every naturalist: scarcely a
|
7
|
+
single [character][4] in the descendants of the Glacial period, would
|
8
|
+
have been of use to the plants, have been accumulated and if, in both
|
9
|
+
regions.
|
10
|
+
|
11
|
+
Supposed to be extinct and unknown, form. We have seen that it yields
|
12
|
+
readily, when subjected as [under confinement], to new and improved
|
13
|
+
varieties will have been much compressed, we [may assume](http://blaynesucks.com) that the species, which are already
|
14
|
+
present in the ordinary spines serve as a prehensile or snapping
|
15
|
+
apparatus. Thus every gradation, from animals with true lungs are
|
16
|
+
descended from a marsupial form), "and if so, there can be followed by
|
17
|
+
which viscid matter, such as that of making [slaves][1]. Let it be
|
18
|
+
remembered that selection may be extended--to the stigma of.
|
19
|
+
|
20
|
+
[1]: http://daringfireball.net/markdown/
|
21
|
+
[succeeded]: http://www.google.com/
|
22
|
+
[under confinement]: http://docs.python.org/library/index.html
|
23
|
+
[4]: http://www.kungfugrippe.com/
|
@@ -0,0 +1,13 @@
|
|
1
|
+
## Roadmap
|
2
|
+
|
3
|
+
Poppins is intended to be similar to [formd][2], but with easier
|
4
|
+
integration with Ruby projects. Also, I would like to add the ability
|
5
|
+
to insert reference links they way Dr. Drang describes
|
6
|
+
[here](http://www.leancrew.com/all-this/2012/08/markdown-reference-links-in-bbedit/)
|
7
|
+
and [here][3].
|
8
|
+
|
9
|
+
It would also be really awesome if we could re-flow paragraph text and
|
10
|
+
wrap it at user-specified column lengths.
|
11
|
+
|
12
|
+
[2]: http://www.drbunsen.org/formd-a-markdown-formatting-tool.html
|
13
|
+
[3]: http://www.leancrew.com/all-this/2012/08/more-markdown-reference-links-in-bbedit/
|
data/spec/data/mixed.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Species and their hybrids, How simply are these facts! How strange that
|
2
|
+
the pollen of each But we may thus have [succeeded][2] in selecting so
|
3
|
+
many exceptions to this rule. but the species would not all the same
|
4
|
+
species living on the White Mountains, in the arctic regions of that
|
5
|
+
large island. The [exceptions which](http://github.com) are now large,
|
6
|
+
and triumphant, and which are known to every naturalist: scarcely a
|
7
|
+
single [character][4] in the descendants of the Glacial period, would
|
8
|
+
have been of use to the plants, have been accumulated and if, in both
|
9
|
+
regions.
|
10
|
+
|
11
|
+
Supposed to be extinct and unknown, form. We have seen that it yields
|
12
|
+
readily, when subjected as [under confinement][3], to new and improved
|
13
|
+
varieties will have been much compressed, we [may assume](http://blaynesucks.com) that the species, which are already
|
14
|
+
present in the ordinary spines serve as a prehensile or snapping
|
15
|
+
apparatus. Thus every gradation, from animals with true lungs are
|
16
|
+
descended from a marsupial form), "and if so, there can be followed by
|
17
|
+
which viscid matter, such as that of making [slaves][1]. Let it be
|
18
|
+
remembered that selection may be extended--to the stigma of.
|
19
|
+
|
20
|
+
[1]: http://daringfireball.net/markdown/
|
21
|
+
[2]: http://www.google.com/
|
22
|
+
[3]: http://docs.python.org/library/index.html
|
23
|
+
[4]: http://www.kungfugrippe.com/
|
data/spec/data/sample.md
CHANGED
@@ -20,7 +20,7 @@ if so, there can be followed by which viscid matter, such as
|
|
20
20
|
that of making [slaves][1]. Let it be remembered that
|
21
21
|
selection may be extended--to the stigma of.
|
22
22
|
|
23
|
-
[1]: http://daringfireball.net/markdown
|
24
|
-
[2]: http://www.google.com
|
23
|
+
[1]: http://daringfireball.net/markdown
|
24
|
+
[2]: http://www.google.com
|
25
25
|
[3]: http://docs.python.org/library/index.html
|
26
|
-
[4]: http://www.kungfugrippe.com
|
26
|
+
[4]: http://www.kungfugrippe.com
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Species and their hybrids, How simply are these facts! How strange that
|
2
|
+
the pollen of each But we may thus have
|
3
|
+
[succeeded](http://www.google.com) in selecting so many exceptions to
|
4
|
+
this rule. but the species would not all the same species living on the
|
5
|
+
White Mountains, in the arctic regions of that large island. The
|
6
|
+
exceptions which are now large, and triumphant, and which are known to
|
7
|
+
every naturalist: scarcely a single [character](http://kungfugrippe.com)
|
8
|
+
in the descendants of the Glacial period, would have been of use to the
|
9
|
+
plants, have been accumulated and if, in both regions.
|
10
|
+
|
11
|
+
Supposed to be extinct and unknown, form. We have seen that it yields
|
12
|
+
readily, when subjected as [under
|
13
|
+
confinement](http://docs.python.org/library/index.html), to new and
|
14
|
+
improved varieties will have been much compressed, we may assume that
|
15
|
+
the species, which are already present in the ordinary spines serve as a
|
16
|
+
prehensile or snapping apparatus. Thus every gradation, from animals
|
17
|
+
with true lungs are descended from a marsupial form), "and if so, there
|
18
|
+
can be followed by which viscid matter, such as that of making
|
19
|
+
[slaves](http://daringfireball.net/markdown). Let it be remembered that
|
20
|
+
selection may be extended--to the stigma of.
|
21
|
+
|
data/spec/lib/document_spec.rb
CHANGED
@@ -1,28 +1,63 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
module Poppins
|
2
3
|
|
3
|
-
describe
|
4
|
+
describe Document do
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
before do
|
7
|
+
@file = File.dirname(__FILE__) + '/../data/sample.md'
|
8
|
+
@clean_file = File.dirname(__FILE__) + '/../data/clean_formatted_sample.md'
|
9
|
+
@inline_file = File.dirname(__FILE__) + '/../data/sample_inline.md'
|
10
|
+
end
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
+
it "should be instantiatable" do
|
13
|
+
Document.new(@file).should_not be_nil
|
14
|
+
end
|
12
15
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
+
it "should accurately identify inline links in the text" do
|
17
|
+
expected_ils = []
|
18
|
+
expected_ils.push( InlineLink.new("http://www.google.com", "succeeded") )
|
19
|
+
expected_ils.push( InlineLink.new("http://kungfugrippe.com", "character") )
|
20
|
+
expected_ils.push( InlineLink.new("http://docs.python.org/library/index.html", "under\nconfinement") )
|
21
|
+
expected_ils.push( InlineLink.new("http://daringfireball.net/markdown", "slaves") )
|
16
22
|
|
17
|
-
|
18
|
-
Poppins::Document.new(@file).labels.should == {"1"=>"http://daringfireball.net/markdown/", "2"=>"http://www.google.com/", "3"=>"http://docs.python.org/library/index.html", "4"=>"http://www.kungfugrippe.com/"}
|
19
|
-
end
|
23
|
+
actual_ils = Document.new(@inline_file).inline_links
|
20
24
|
|
21
|
-
|
22
|
-
|
23
|
-
|
25
|
+
actual_ils.count.should == 4
|
26
|
+
|
27
|
+
for i in 0..(actual_ils.count-1)
|
28
|
+
actual_ils[i].to_s.should == expected_ils[i].to_s
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should accurately identify reference links in the text" do
|
33
|
+
expected_rls = []
|
34
|
+
|
35
|
+
expected_rls.push( ReferenceLink.new("http://www.google.com", "succeeded", "2") )
|
36
|
+
expected_rls.push( ReferenceLink.new("http://www.kungfugrippe.com", "character", "4") )
|
37
|
+
expected_rls.push( ReferenceLink.new("http://docs.python.org/library/index.html", "under confinement", "3") )
|
38
|
+
expected_rls.push( ReferenceLink.new("http://daringfireball.net/markdown", "slaves", "1") )
|
39
|
+
|
40
|
+
actual_rls = Document.new(@file).reference_links
|
41
|
+
|
42
|
+
actual_rls.count.should == 4
|
43
|
+
|
44
|
+
for i in 0..(actual_rls.count-1)
|
45
|
+
actual_rls[i].to_s.should == expected_rls[i].to_s
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should convert inline links to reference links and renumber labels in order" do
|
50
|
+
actual = Document.new(@inline_file).clean_and_format
|
51
|
+
expected = File.open(@clean_file).readlines.join
|
52
|
+
|
53
|
+
actual.should == expected
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should not remove reference labels that are not used in the text"
|
57
|
+
|
58
|
+
it "should handle reference links that look [like this]"
|
59
|
+
|
60
|
+
it "should handle reference links that look [like this][]"
|
24
61
|
|
25
|
-
it "should correctly generate a new list of references" do
|
26
|
-
Poppins::Document.new(@file).ordinal_references.should == ["[1]: http://www.google.com/", "[2]: http://www.kungfugrippe.com/", "[3]: http://docs.python.org/library/index.html", "[4]: http://daringfireball.net/markdown/"]
|
27
62
|
end
|
28
63
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Poppins::InlineLink do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@url = "http://google.com"
|
7
|
+
@link_text = "Google"
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should initialize with a url and a link_text" do
|
11
|
+
il = Poppins::InlineLink.new(@url, @link_text)
|
12
|
+
il.url.should == @url
|
13
|
+
il.link_text.should == @link_text
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should correctly produce the in-text version of the link_text" do
|
17
|
+
il = Poppins::InlineLink.new(@url, @link_text)
|
18
|
+
il.as_found_in_text.should == "[Google](http://google.com)"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should be able to change the link text" do
|
22
|
+
il = Poppins::InlineLink.new(@url, @link_text)
|
23
|
+
il.link_text.should == @link_text
|
24
|
+
il.link_text = "A Search Engine"
|
25
|
+
il.link_text.should == "A Search Engine"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should have a regex to identify itself" do
|
29
|
+
il = Poppins::InlineLink.new(@url, @link_text)
|
30
|
+
|
31
|
+
sample_text = "This is a [more complex](http://google.com) example."
|
32
|
+
good_match = sample_text.match(il.regex)
|
33
|
+
good_match.should_not be nil
|
34
|
+
|
35
|
+
bad_sample_text = "This example [shouldn't work](http://yahoo.com)."
|
36
|
+
bad_match = bad_sample_text.match(il.regex)
|
37
|
+
bad_match.should be nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Poppins::ReferenceLink do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@link = "http://google.com"
|
7
|
+
@label = "Google"
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should initialize with a link and a label" do
|
11
|
+
rl = Poppins::ReferenceLink.new(@link, @label)
|
12
|
+
rl.url.should == @link
|
13
|
+
rl.link_text.should == @label
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should correctly produce the end reference" do
|
17
|
+
rl = Poppins::ReferenceLink.new(@link, @label)
|
18
|
+
rl.as_end_reference.should == "[Google]: http://google.com"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should correctly produce the in-text version of the label" do
|
22
|
+
rl = Poppins::ReferenceLink.new(@link, @label)
|
23
|
+
rl.as_found_in_text.should == "[Google]"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/spec/poppins_spec.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: poppins
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: guard-rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
30
46
|
description: Poppins is a basic formatter for Markdown files.
|
31
47
|
email:
|
32
48
|
- akmassey@gatech.edu
|
@@ -36,17 +52,28 @@ extensions: []
|
|
36
52
|
extra_rdoc_files: []
|
37
53
|
files:
|
38
54
|
- .gitignore
|
55
|
+
- CHANGES.md
|
39
56
|
- Gemfile
|
57
|
+
- Guardfile
|
40
58
|
- LICENSE
|
41
59
|
- README.md
|
42
60
|
- Rakefile
|
43
61
|
- bin/poppins
|
44
62
|
- lib/poppins.rb
|
45
63
|
- lib/poppins/document.rb
|
64
|
+
- lib/poppins/inline_link.rb
|
65
|
+
- lib/poppins/reference_link.rb
|
46
66
|
- lib/poppins/version.rb
|
47
67
|
- poppins.gemspec
|
68
|
+
- spec/data/clean_formatted_sample.md
|
69
|
+
- spec/data/implicit_references.md
|
70
|
+
- spec/data/inline_choke.md
|
71
|
+
- spec/data/mixed.md
|
48
72
|
- spec/data/sample.md
|
73
|
+
- spec/data/sample_inline.md
|
49
74
|
- spec/lib/document_spec.rb
|
75
|
+
- spec/lib/inline_link_spec.rb
|
76
|
+
- spec/lib/reference_link_spec.rb
|
50
77
|
- spec/poppins_spec.rb
|
51
78
|
- spec/spec_helper.rb
|
52
79
|
homepage: ''
|
@@ -63,7 +90,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
63
90
|
version: '0'
|
64
91
|
segments:
|
65
92
|
- 0
|
66
|
-
hash:
|
93
|
+
hash: 1115316932625370642
|
67
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
95
|
none: false
|
69
96
|
requirements:
|
@@ -72,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
99
|
version: '0'
|
73
100
|
segments:
|
74
101
|
- 0
|
75
|
-
hash:
|
102
|
+
hash: 1115316932625370642
|
76
103
|
requirements: []
|
77
104
|
rubyforge_project:
|
78
105
|
rubygems_version: 1.8.23
|
@@ -81,7 +108,14 @@ specification_version: 3
|
|
81
108
|
summary: Poppins formats Markdown files to ensure that reference links are numbered
|
82
109
|
and appear in numerical order.
|
83
110
|
test_files:
|
111
|
+
- spec/data/clean_formatted_sample.md
|
112
|
+
- spec/data/implicit_references.md
|
113
|
+
- spec/data/inline_choke.md
|
114
|
+
- spec/data/mixed.md
|
84
115
|
- spec/data/sample.md
|
116
|
+
- spec/data/sample_inline.md
|
85
117
|
- spec/lib/document_spec.rb
|
118
|
+
- spec/lib/inline_link_spec.rb
|
119
|
+
- spec/lib/reference_link_spec.rb
|
86
120
|
- spec/poppins_spec.rb
|
87
121
|
- spec/spec_helper.rb
|