reverse_markdown 0.4.7 → 0.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/.gitignore +1 -0
- data/.travis.yml +2 -3
- data/LICENSE +13 -0
- data/README.md +69 -30
- data/bin/reverse_markdown +1 -1
- data/lib/reverse_markdown/cleaner.rb +66 -0
- data/lib/reverse_markdown/config.rb +20 -0
- data/lib/reverse_markdown/converters/a.rb +19 -0
- data/lib/reverse_markdown/converters/base.rb +24 -0
- data/lib/reverse_markdown/converters/blockquote.rb +13 -0
- data/lib/reverse_markdown/converters/br.rb +11 -0
- data/lib/reverse_markdown/converters/code.rb +11 -0
- data/lib/reverse_markdown/converters/div.rb +11 -0
- data/lib/reverse_markdown/converters/dump.rb +9 -0
- data/lib/reverse_markdown/converters/em.rb +21 -0
- data/lib/reverse_markdown/converters/h.rb +17 -0
- data/lib/reverse_markdown/converters/hr.rb +11 -0
- data/lib/reverse_markdown/converters/img.rb +14 -0
- data/lib/reverse_markdown/converters/li.rb +28 -0
- data/lib/reverse_markdown/converters/ol.rb +12 -0
- data/lib/reverse_markdown/converters/p.rb +11 -0
- data/lib/reverse_markdown/converters/pass_through.rb +14 -0
- data/lib/reverse_markdown/converters/pre.rb +17 -0
- data/lib/reverse_markdown/converters/strong.rb +21 -0
- data/lib/reverse_markdown/converters/table.rb +11 -0
- data/lib/reverse_markdown/converters/td.rb +13 -0
- data/lib/reverse_markdown/converters/text.rb +30 -0
- data/lib/reverse_markdown/converters/tr.rb +21 -0
- data/lib/reverse_markdown/converters.rb +22 -0
- data/lib/reverse_markdown/errors.rb +6 -2
- data/lib/reverse_markdown/version.rb +1 -1
- data/lib/reverse_markdown.rb +40 -8
- data/reverse_markdown.gemspec +3 -1
- data/spec/assets/lists.html +24 -0
- data/spec/assets/unknown_tags.html +9 -0
- data/spec/components/anchors_spec.rb +5 -5
- data/spec/components/basic_spec.rb +5 -5
- data/spec/components/code_spec.rb +5 -5
- data/spec/components/escapables_spec.rb +3 -3
- data/spec/components/from_the_wild_spec.rb +5 -5
- data/spec/components/html_fragment_spec.rb +2 -2
- data/spec/components/lists_spec.rb +18 -7
- data/spec/components/paragraphs_spec.rb +2 -2
- data/spec/components/quotation_spec.rb +5 -5
- data/spec/components/tables_spec.rb +2 -2
- data/spec/components/unknown_tags_spec.rb +21 -0
- data/spec/html_to_markdown_to_html_spec.rb +1 -2
- data/spec/lib/reverse_markdown/cleaner_spec.rb +76 -0
- data/spec/lib/reverse_markdown/converters/blockquote_spec.rb +18 -0
- data/spec/lib/reverse_markdown/converters/br_spec.rb +9 -0
- data/spec/lib/reverse_markdown_spec.rb +37 -0
- data/spec/spec_helper.rb +9 -1
- metadata +83 -24
- data/License-MIT +0 -7
- data/lib/reverse_markdown/mapper.rb +0 -241
- data/spec/mapper_spec.rb +0 -63
- data/spec/reverse_markdown_spec.rb +0 -18
metadata
CHANGED
@@ -1,83 +1,111 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reverse_markdown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johannes Opper
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: simplecov
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: redcarpet
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: byebug
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: codeclimate-test-reporter
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: '0'
|
83
111
|
description: Map simple html back into markdown, e.g. if you want to import existing
|
@@ -89,16 +117,39 @@ executables:
|
|
89
117
|
extensions: []
|
90
118
|
extra_rdoc_files: []
|
91
119
|
files:
|
92
|
-
- .gitignore
|
93
|
-
- .travis.yml
|
120
|
+
- ".gitignore"
|
121
|
+
- ".travis.yml"
|
94
122
|
- Gemfile
|
95
|
-
-
|
123
|
+
- LICENSE
|
96
124
|
- README.md
|
97
125
|
- Rakefile
|
98
126
|
- bin/reverse_markdown
|
99
127
|
- lib/reverse_markdown.rb
|
128
|
+
- lib/reverse_markdown/cleaner.rb
|
129
|
+
- lib/reverse_markdown/config.rb
|
130
|
+
- lib/reverse_markdown/converters.rb
|
131
|
+
- lib/reverse_markdown/converters/a.rb
|
132
|
+
- lib/reverse_markdown/converters/base.rb
|
133
|
+
- lib/reverse_markdown/converters/blockquote.rb
|
134
|
+
- lib/reverse_markdown/converters/br.rb
|
135
|
+
- lib/reverse_markdown/converters/code.rb
|
136
|
+
- lib/reverse_markdown/converters/div.rb
|
137
|
+
- lib/reverse_markdown/converters/dump.rb
|
138
|
+
- lib/reverse_markdown/converters/em.rb
|
139
|
+
- lib/reverse_markdown/converters/h.rb
|
140
|
+
- lib/reverse_markdown/converters/hr.rb
|
141
|
+
- lib/reverse_markdown/converters/img.rb
|
142
|
+
- lib/reverse_markdown/converters/li.rb
|
143
|
+
- lib/reverse_markdown/converters/ol.rb
|
144
|
+
- lib/reverse_markdown/converters/p.rb
|
145
|
+
- lib/reverse_markdown/converters/pass_through.rb
|
146
|
+
- lib/reverse_markdown/converters/pre.rb
|
147
|
+
- lib/reverse_markdown/converters/strong.rb
|
148
|
+
- lib/reverse_markdown/converters/table.rb
|
149
|
+
- lib/reverse_markdown/converters/td.rb
|
150
|
+
- lib/reverse_markdown/converters/text.rb
|
151
|
+
- lib/reverse_markdown/converters/tr.rb
|
100
152
|
- lib/reverse_markdown/errors.rb
|
101
|
-
- lib/reverse_markdown/mapper.rb
|
102
153
|
- lib/reverse_markdown/version.rb
|
103
154
|
- reverse_markdown.gemspec
|
104
155
|
- spec/assets/anchors.html
|
@@ -113,6 +164,7 @@ files:
|
|
113
164
|
- spec/assets/paragraphs.html
|
114
165
|
- spec/assets/quotation.html
|
115
166
|
- spec/assets/tables.html
|
167
|
+
- spec/assets/unknown_tags.html
|
116
168
|
- spec/components/anchors_spec.rb
|
117
169
|
- spec/components/basic_spec.rb
|
118
170
|
- spec/components/code_spec.rb
|
@@ -123,9 +175,12 @@ files:
|
|
123
175
|
- spec/components/paragraphs_spec.rb
|
124
176
|
- spec/components/quotation_spec.rb
|
125
177
|
- spec/components/tables_spec.rb
|
178
|
+
- spec/components/unknown_tags_spec.rb
|
126
179
|
- spec/html_to_markdown_to_html_spec.rb
|
127
|
-
- spec/
|
128
|
-
- spec/
|
180
|
+
- spec/lib/reverse_markdown/cleaner_spec.rb
|
181
|
+
- spec/lib/reverse_markdown/converters/blockquote_spec.rb
|
182
|
+
- spec/lib/reverse_markdown/converters/br_spec.rb
|
183
|
+
- spec/lib/reverse_markdown_spec.rb
|
129
184
|
- spec/spec_helper.rb
|
130
185
|
homepage: http://github.com/xijo/reverse_markdown
|
131
186
|
licenses: []
|
@@ -136,20 +191,20 @@ require_paths:
|
|
136
191
|
- lib
|
137
192
|
required_ruby_version: !ruby/object:Gem::Requirement
|
138
193
|
requirements:
|
139
|
-
- -
|
194
|
+
- - ">="
|
140
195
|
- !ruby/object:Gem::Version
|
141
196
|
version: '0'
|
142
197
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
198
|
requirements:
|
144
|
-
- -
|
199
|
+
- - ">="
|
145
200
|
- !ruby/object:Gem::Version
|
146
201
|
version: '0'
|
147
202
|
requirements: []
|
148
203
|
rubyforge_project: reverse_markdown
|
149
|
-
rubygems_version: 2.
|
204
|
+
rubygems_version: 2.2.2
|
150
205
|
signing_key:
|
151
206
|
specification_version: 4
|
152
|
-
summary:
|
207
|
+
summary: Convert html code into markdown.
|
153
208
|
test_files:
|
154
209
|
- spec/assets/anchors.html
|
155
210
|
- spec/assets/basic.html
|
@@ -163,6 +218,7 @@ test_files:
|
|
163
218
|
- spec/assets/paragraphs.html
|
164
219
|
- spec/assets/quotation.html
|
165
220
|
- spec/assets/tables.html
|
221
|
+
- spec/assets/unknown_tags.html
|
166
222
|
- spec/components/anchors_spec.rb
|
167
223
|
- spec/components/basic_spec.rb
|
168
224
|
- spec/components/code_spec.rb
|
@@ -173,7 +229,10 @@ test_files:
|
|
173
229
|
- spec/components/paragraphs_spec.rb
|
174
230
|
- spec/components/quotation_spec.rb
|
175
231
|
- spec/components/tables_spec.rb
|
232
|
+
- spec/components/unknown_tags_spec.rb
|
176
233
|
- spec/html_to_markdown_to_html_spec.rb
|
177
|
-
- spec/
|
178
|
-
- spec/
|
234
|
+
- spec/lib/reverse_markdown/cleaner_spec.rb
|
235
|
+
- spec/lib/reverse_markdown/converters/blockquote_spec.rb
|
236
|
+
- spec/lib/reverse_markdown/converters/br_spec.rb
|
237
|
+
- spec/lib/reverse_markdown_spec.rb
|
179
238
|
- spec/spec_helper.rb
|
data/License-MIT
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
Copyright (c) 2012 Johannes Opper
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
4
|
-
|
5
|
-
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
6
|
-
|
7
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -1,241 +0,0 @@
|
|
1
|
-
module ReverseMarkdown
|
2
|
-
class Mapper
|
3
|
-
attr_accessor :raise_errors
|
4
|
-
attr_accessor :log_enabled, :log_level
|
5
|
-
attr_accessor :li_counter
|
6
|
-
attr_accessor :github_style_code_blocks
|
7
|
-
|
8
|
-
def initialize(opts={})
|
9
|
-
self.log_level = opts.fetch(:log_level) { :info }
|
10
|
-
self.log_enabled = opts.fetch(:log_enabled) { true }
|
11
|
-
self.li_counter = 0
|
12
|
-
self.github_style_code_blocks = opts[:github_style_code_blocks] || false
|
13
|
-
end
|
14
|
-
|
15
|
-
def process_root(element)
|
16
|
-
return '' if element.nil?
|
17
|
-
|
18
|
-
markdown = process_element(element) # recursively process all elements to get full markdown
|
19
|
-
|
20
|
-
# Extract github style code blocks
|
21
|
-
extractions = {}
|
22
|
-
markdown.gsub!(%r{```.*?```}m) do |match|
|
23
|
-
md5 = Digest::MD5.hexdigest(match)
|
24
|
-
extractions[md5] = match
|
25
|
-
"{code-block-extraction-#{md5}}"
|
26
|
-
end
|
27
|
-
|
28
|
-
markdown = markdown.split("\n").map do |line|
|
29
|
-
if line.match(/^( {4}|\t)/)
|
30
|
-
line
|
31
|
-
else
|
32
|
-
"#{ ' ' if line.match(/^ {2,3}/) }" +
|
33
|
-
normalize_whitespace(line).strip +
|
34
|
-
"#{ ' ' if line.match(/ {2}$/) }"
|
35
|
-
end
|
36
|
-
end.join("\n")
|
37
|
-
|
38
|
-
markdown.gsub!(/\n{3,}/, "\n\n")
|
39
|
-
|
40
|
-
# Insert pre block extractions
|
41
|
-
markdown.gsub!(/\{code-block-extraction-([0-9a-f]{32})\}/){ extractions[$1] }
|
42
|
-
|
43
|
-
markdown
|
44
|
-
end
|
45
|
-
|
46
|
-
def process_element(element)
|
47
|
-
output = ''
|
48
|
-
if element.text?
|
49
|
-
text = process_text(element)
|
50
|
-
if output.end_with?(' ') && text.start_with?(' ')
|
51
|
-
output << text.lstrip
|
52
|
-
else
|
53
|
-
output << text
|
54
|
-
end
|
55
|
-
else
|
56
|
-
output << opening(element).to_s
|
57
|
-
|
58
|
-
markdown_chunks = element.children.map { |child| process_element(child) }
|
59
|
-
remove_adjacent_whitespace!(markdown_chunks)
|
60
|
-
output << markdown_chunks.join
|
61
|
-
|
62
|
-
output << ending(element).to_s
|
63
|
-
end
|
64
|
-
output
|
65
|
-
end
|
66
|
-
|
67
|
-
private
|
68
|
-
|
69
|
-
# removes whitespace-only chunk if the previous chunk ends with whitespace
|
70
|
-
def remove_adjacent_whitespace!(chunks)
|
71
|
-
(chunks.size - 1).downto(1).each do |i|
|
72
|
-
chunk = chunks[i]
|
73
|
-
previous_chunk = chunks[i-1]
|
74
|
-
chunks.delete_at(i) if chunk == ' ' && previous_chunk.end_with?(' ')
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def opening(element)
|
79
|
-
parent = element.parent ? element.parent.name.to_sym : nil
|
80
|
-
case element.name.to_sym
|
81
|
-
when :html, :body
|
82
|
-
""
|
83
|
-
when :li
|
84
|
-
indent = ' ' * [(element.ancestors('ol').count + element.ancestors('ul').count - 1), 0].max
|
85
|
-
if parent == :ol
|
86
|
-
"#{indent}#{self.li_counter += 1}. "
|
87
|
-
else
|
88
|
-
"#{indent}- "
|
89
|
-
end
|
90
|
-
when :pre
|
91
|
-
"\n"
|
92
|
-
when :ol
|
93
|
-
self.li_counter = 0
|
94
|
-
"\n"
|
95
|
-
when :ul, :root#, :p
|
96
|
-
"\n"
|
97
|
-
when :div
|
98
|
-
"\n"
|
99
|
-
when :p
|
100
|
-
if element.ancestors.map(&:name).include?('blockquote')
|
101
|
-
"\n\n> "
|
102
|
-
elsif [nil, :body].include? parent
|
103
|
-
is_first = true
|
104
|
-
previous = element.previous
|
105
|
-
while is_first == true and previous do
|
106
|
-
is_first = false unless previous.content.strip == "" || previous.text?
|
107
|
-
previous = previous.previous
|
108
|
-
end
|
109
|
-
is_first ? "" : "\n\n"
|
110
|
-
else
|
111
|
-
"\n\n"
|
112
|
-
end
|
113
|
-
when :h1, :h2, :h3, :h4, :h5, :h6 # /h(\d)/ for 1.9
|
114
|
-
element.name =~ /h(\d)/
|
115
|
-
"\n" + ('#' * $1.to_i) + ' '
|
116
|
-
when :em, :i
|
117
|
-
element.text.strip.empty? ? '' : '_' if (element.ancestors('em') + element.ancestors('i')).empty?
|
118
|
-
when :strong, :b
|
119
|
-
element.text.strip.empty? ? '' : '**' if (element.ancestors('strong') + element.ancestors('b')).empty?
|
120
|
-
when :blockquote
|
121
|
-
"> "
|
122
|
-
when :code
|
123
|
-
if parent == :pre
|
124
|
-
self.github_style_code_blocks ? "\n```\n" : "\n "
|
125
|
-
else
|
126
|
-
" `"
|
127
|
-
end
|
128
|
-
when :a
|
129
|
-
if (!element.text.strip.empty? || element.children.map(&:name).include?('img')) && element['href'] && !element['href'].start_with?('#')
|
130
|
-
" ["
|
131
|
-
else
|
132
|
-
" "
|
133
|
-
end
|
134
|
-
when :img
|
135
|
-
" !["
|
136
|
-
when :hr
|
137
|
-
"\n* * *\n"
|
138
|
-
when :br
|
139
|
-
" \n"
|
140
|
-
when :table
|
141
|
-
"\n\n"
|
142
|
-
when :tr
|
143
|
-
"|"
|
144
|
-
when :th, :td
|
145
|
-
if element == element.parent.first_element_child
|
146
|
-
" "
|
147
|
-
else
|
148
|
-
"| "
|
149
|
-
end
|
150
|
-
else
|
151
|
-
handle_error "unknown start tag: #{element.name.to_s}"
|
152
|
-
""
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def ending(element)
|
157
|
-
parent = element.parent ? element.parent.name.to_sym : nil
|
158
|
-
case element.name.to_sym
|
159
|
-
when :html, :body, :pre, :hr
|
160
|
-
""
|
161
|
-
when :p
|
162
|
-
"\n\n"
|
163
|
-
when :div
|
164
|
-
"\n"
|
165
|
-
when :h1, :h2, :h3, :h4, :h5, :h6 # /h(\d)/ for 1.9
|
166
|
-
"\n"
|
167
|
-
when :em, :i
|
168
|
-
element.text.strip.empty? ? '' : '_' if (element.ancestors('em') + element.ancestors('i')).empty?
|
169
|
-
when :strong, :b
|
170
|
-
element.text.strip.empty? ? '' : '**' if (element.ancestors('strong') + element.ancestors('b')).empty?
|
171
|
-
when :li, :blockquote, :root, :ol, :ul
|
172
|
-
"\n"
|
173
|
-
when :code
|
174
|
-
if parent == :pre
|
175
|
-
self.github_style_code_blocks ? "\n```" : "\n"
|
176
|
-
else
|
177
|
-
'` '
|
178
|
-
end
|
179
|
-
when :a
|
180
|
-
if (!element.text.strip.empty? || element.children.map(&:name).include?('img')) && element['href'] && !element['href'].start_with?('#')
|
181
|
-
"](#{element['href']}#{title_markdown(element)})"
|
182
|
-
else
|
183
|
-
""
|
184
|
-
end
|
185
|
-
when :img
|
186
|
-
"#{element['alt']}](#{element['src']}#{title_markdown(element)}) "
|
187
|
-
when :table
|
188
|
-
"\n"
|
189
|
-
when :tr
|
190
|
-
"|\n" + \
|
191
|
-
if element.element_children.all? {|child| child.name.to_sym == :th}
|
192
|
-
"| " + (['---'] * element.element_children.size).join(' | ') + " |\n"
|
193
|
-
else
|
194
|
-
""
|
195
|
-
end
|
196
|
-
when :th, :td
|
197
|
-
" "
|
198
|
-
else
|
199
|
-
handle_error "unknown end tag: #{element.name}"
|
200
|
-
""
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def title_markdown(element)
|
205
|
-
title = element['title']
|
206
|
-
title ? %[ "#{title}"] : ''
|
207
|
-
end
|
208
|
-
|
209
|
-
def process_text(element)
|
210
|
-
parent = element.parent ? element.parent.name.to_sym : nil
|
211
|
-
case
|
212
|
-
when parent == :code
|
213
|
-
if self.github_style_code_blocks
|
214
|
-
element.text
|
215
|
-
else
|
216
|
-
element.text.strip.gsub(/\n/,"\n ")
|
217
|
-
end
|
218
|
-
else
|
219
|
-
normalize_whitespace(escape_text(element.text))
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
def normalize_whitespace(text)
|
224
|
-
text.tr("\n\t", ' ').squeeze(' ')
|
225
|
-
end
|
226
|
-
|
227
|
-
def escape_text(text)
|
228
|
-
text.
|
229
|
-
gsub('*', '\*').
|
230
|
-
gsub('_', '\_')
|
231
|
-
end
|
232
|
-
|
233
|
-
def handle_error(message)
|
234
|
-
if raise_errors
|
235
|
-
raise ReverseMarkdown::ParserError, message
|
236
|
-
elsif log_enabled && defined?(Rails)
|
237
|
-
Rails.logger.__send__(log_level, message)
|
238
|
-
end
|
239
|
-
end
|
240
|
-
end
|
241
|
-
end
|
data/spec/mapper_spec.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ReverseMarkdown::Mapper do
|
4
|
-
let(:input) { File.read('spec/assets/minimum.html') }
|
5
|
-
let(:document) { Nokogiri::HTML(input) }
|
6
|
-
let(:mapper) { ReverseMarkdown::Mapper.new }
|
7
|
-
|
8
|
-
it "behaves in a sane way when root element is nil" do
|
9
|
-
mapper.process_root(nil).should == ''
|
10
|
-
end
|
11
|
-
|
12
|
-
describe "logging options" do
|
13
|
-
it "has a default log level info" do
|
14
|
-
mapper.log_level.should eq :info
|
15
|
-
end
|
16
|
-
|
17
|
-
it "overwrites log level if option is given" do
|
18
|
-
mapper = ReverseMarkdown::Mapper.new(log_level: :error)
|
19
|
-
mapper.log_level.should eq :error
|
20
|
-
end
|
21
|
-
|
22
|
-
it "enables logging by default" do
|
23
|
-
mapper.log_enabled.should be_true
|
24
|
-
end
|
25
|
-
|
26
|
-
it "disables logging if told to" do
|
27
|
-
mapper = ReverseMarkdown::Mapper.new(log_enabled: false)
|
28
|
-
mapper.log_enabled.should be_false
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
context "error handling" do
|
33
|
-
|
34
|
-
let(:unknown_element) { Nokogiri::XML::Node.new('foo', document) }
|
35
|
-
|
36
|
-
it "raises error if told so" do
|
37
|
-
mapper.raise_errors = true
|
38
|
-
expect {
|
39
|
-
mapper.__send__(:opening, unknown_element)
|
40
|
-
}.to raise_error(ReverseMarkdown::ParserError)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "supresses errors if told so" do
|
44
|
-
mapper.raise_errors = false
|
45
|
-
expect {
|
46
|
-
mapper.__send__(:opening, unknown_element)
|
47
|
-
}.not_to raise_error
|
48
|
-
end
|
49
|
-
|
50
|
-
context "with Rails present" do
|
51
|
-
|
52
|
-
module Rails # Fake Rails for specs
|
53
|
-
def self.logger; @@logger ||= Logger.new; end
|
54
|
-
class Logger; def info(message); end; end
|
55
|
-
end
|
56
|
-
|
57
|
-
it "logs with Rails.logger if present" do
|
58
|
-
Rails.logger.should_receive(:info)
|
59
|
-
mapper.__send__(:ending, unknown_element)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ReverseMarkdown do
|
4
|
-
let(:input) { File.read('spec/assets/minimum.html') }
|
5
|
-
let(:document) { Nokogiri::HTML(input) }
|
6
|
-
|
7
|
-
it "parses nokogiri documents" do
|
8
|
-
lambda { ReverseMarkdown.parse_element(document) }.should_not raise_error
|
9
|
-
end
|
10
|
-
|
11
|
-
it "parses nokogiri elements" do
|
12
|
-
lambda { ReverseMarkdown.parse_element(document.root) }.should_not raise_error
|
13
|
-
end
|
14
|
-
|
15
|
-
it "parses string input" do
|
16
|
-
lambda { ReverseMarkdown.parse_string(input) }.should_not raise_error
|
17
|
-
end
|
18
|
-
end
|