upmark 0.0.1 → 0.1.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.
- data/lib/upmark/parser/xml.rb +3 -3
- data/lib/upmark/transform/ignore.rb +19 -0
- data/lib/upmark/transform/markdown.rb +39 -44
- data/lib/upmark/transform/pass_through.rb +20 -0
- data/lib/upmark/transform/preprocess.rb +21 -8
- data/lib/upmark/transform_helpers.rb +35 -0
- data/lib/upmark/version.rb +1 -1
- data/lib/upmark.rb +7 -3
- data/spec/acceptance/upmark_spec.rb +136 -34
- data/spec/unit/lib/upmark/parser/xml_spec.rb +35 -19
- data/spec/unit/lib/upmark/transform/markdown_spec.rb +35 -29
- metadata +9 -6
data/lib/upmark/parser/xml.rb
CHANGED
@@ -8,9 +8,9 @@ module Upmark
|
|
8
8
|
# http://www.w3.org/TR/2000/REC-xml-20001006
|
9
9
|
#
|
10
10
|
class XML < Parslet::Parser
|
11
|
-
root(:
|
11
|
+
root(:node)
|
12
12
|
|
13
|
-
rule(:
|
13
|
+
rule(:node) {
|
14
14
|
(
|
15
15
|
element.as(:element) |
|
16
16
|
text.as(:text)
|
@@ -20,7 +20,7 @@ module Upmark
|
|
20
20
|
rule(:element) {
|
21
21
|
(
|
22
22
|
start_tag.as(:start_tag) >>
|
23
|
-
|
23
|
+
node.as(:children) >>
|
24
24
|
end_tag.as(:end_tag)
|
25
25
|
) |
|
26
26
|
empty_tag.as(:empty_tag)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Upmark
|
2
|
+
module Transform
|
3
|
+
# A transform class which marks all elements in a subtree as ignored.
|
4
|
+
class Ignore < Parslet::Transform
|
5
|
+
include TransformHelpers
|
6
|
+
|
7
|
+
element(:*) do |element|
|
8
|
+
{
|
9
|
+
element: {
|
10
|
+
name: element[:name],
|
11
|
+
attributes: element[:attributes],
|
12
|
+
children: element[:children],
|
13
|
+
ignore: true
|
14
|
+
}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -5,55 +5,37 @@ module Upmark
|
|
5
5
|
# Transforms an abstract syntax tree (AST) into a Markdown document.
|
6
6
|
#
|
7
7
|
class Markdown < Parslet::Transform
|
8
|
-
|
9
|
-
tag_name = tag_name.to_s.downcase
|
10
|
-
{
|
11
|
-
tag: {name: tag_name, attributes: subtree(:attributes)},
|
12
|
-
content: sequence(:values)
|
13
|
-
}
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.map_attributes_subtree(ast)
|
17
|
-
ast.inject({}) do |hash, attribute|
|
18
|
-
hash[attribute[:name].to_sym] = attribute[:value]
|
19
|
-
hash
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
rule(element: subtree(:values)) { values }
|
8
|
+
include TransformHelpers
|
24
9
|
|
25
10
|
rule(text: simple(:value)) { value.to_s }
|
26
11
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
rule(tag(:h2)) { "## #{values.join}" }
|
33
|
-
rule(tag(:h3)) { "### #{values.join}" }
|
34
|
-
rule(tag(:br)) { "\n" }
|
12
|
+
element(:p) {|element| "#{element[:children].join}\n\n" }
|
13
|
+
element(:h1) {|element| "# #{element[:children].join}" }
|
14
|
+
element(:h2) {|element| "## #{element[:children].join}" }
|
15
|
+
element(:h3) {|element| "### #{element[:children].join}" }
|
16
|
+
element(:li) {|element| "#{element[:children].join}" }
|
35
17
|
|
36
|
-
|
37
|
-
|
38
|
-
|
18
|
+
element(:ul) do |element|
|
19
|
+
children = element[:children].map {|value| value.strip != "" ? value : nil }.compact
|
20
|
+
children.map {|value| "* #{value}\n" }
|
39
21
|
end
|
40
22
|
|
41
|
-
|
42
|
-
|
43
|
-
|
23
|
+
element(:ol) do |element|
|
24
|
+
children = element[:children].map {|value| value.strip != "" ? value : nil }.compact
|
25
|
+
children.map_with_index {|value, i| "#{i + 1}. #{value}\n" }
|
44
26
|
end
|
45
27
|
|
46
|
-
|
47
|
-
attributes = map_attributes_subtree(
|
28
|
+
element(:a) do |element|
|
29
|
+
attributes = map_attributes_subtree(element[:attributes])
|
48
30
|
href = attributes[:href]
|
49
31
|
title = attributes[:title]
|
50
|
-
|
32
|
+
children = element[:children].join
|
51
33
|
|
52
|
-
%Q{[#{
|
34
|
+
%Q{[#{children}](#{href} "#{title}")}
|
53
35
|
end
|
54
36
|
|
55
|
-
|
56
|
-
attributes = map_attributes_subtree(
|
37
|
+
element(:img) do |element|
|
38
|
+
attributes = map_attributes_subtree(element[:attributes])
|
57
39
|
href = attributes[:src]
|
58
40
|
title = attributes[:title]
|
59
41
|
alt_text = attributes[:alt]
|
@@ -61,14 +43,23 @@ module Upmark
|
|
61
43
|
%Q{}
|
62
44
|
end
|
63
45
|
|
64
|
-
|
46
|
+
element(:b, :strong) {|element| "**#{element[:children].join}**" }
|
47
|
+
element(:i, :em) {|element| "*#{element[:children].join}*" }
|
48
|
+
|
49
|
+
element(:br) { "\n" }
|
50
|
+
|
51
|
+
# Pass all unmatched elements through.
|
65
52
|
rule(
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
53
|
+
element: {
|
54
|
+
name: simple(:name),
|
55
|
+
attributes: subtree(:attributes),
|
56
|
+
children: sequence(:children),
|
57
|
+
ignore: simple(:ignore)
|
58
|
+
}
|
59
|
+
) do |element|
|
60
|
+
attributes = map_attributes_subtree(element[:attributes])
|
61
|
+
children = element[:children].join
|
62
|
+
name = element[:name]
|
72
63
|
|
73
64
|
attributes_list =
|
74
65
|
if attributes.any?
|
@@ -77,7 +68,11 @@ module Upmark
|
|
77
68
|
""
|
78
69
|
end
|
79
70
|
|
80
|
-
|
71
|
+
if children.empty?
|
72
|
+
%Q{<#{name}#{attributes_list} />}
|
73
|
+
else
|
74
|
+
%Q{<#{name}#{attributes_list}>#{children}</#{name}>}
|
75
|
+
end
|
81
76
|
end
|
82
77
|
end
|
83
78
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "upmark/transform/ignore"
|
2
|
+
|
3
|
+
module Upmark
|
4
|
+
module Transform
|
5
|
+
class PassThrough < Parslet::Transform
|
6
|
+
include TransformHelpers
|
7
|
+
|
8
|
+
element(:div, :table, :pre) do |element|
|
9
|
+
{
|
10
|
+
element: {
|
11
|
+
name: element[:name],
|
12
|
+
attributes: element[:attributes],
|
13
|
+
children: Ignore.new.apply(element[:children]),
|
14
|
+
ignore: true
|
15
|
+
}
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,23 +1,36 @@
|
|
1
1
|
module Upmark
|
2
2
|
module Transform
|
3
|
+
# A preprocess transform which normalises start/end/empty tags into the same structure.
|
3
4
|
class Preprocess < Parslet::Transform
|
4
5
|
rule(
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
element: {
|
7
|
+
start_tag: {name: simple(:name), attributes: subtree(:attributes)},
|
8
|
+
end_tag: {name: simple(:name)},
|
9
|
+
children: subtree(:children)
|
10
|
+
}
|
8
11
|
) do
|
9
12
|
{
|
10
|
-
|
11
|
-
|
13
|
+
element: {
|
14
|
+
name: name,
|
15
|
+
attributes: attributes,
|
16
|
+
children: children,
|
17
|
+
ignore: false
|
18
|
+
}
|
12
19
|
}
|
13
20
|
end
|
14
21
|
|
15
22
|
rule(
|
16
|
-
|
23
|
+
element: {
|
24
|
+
empty_tag: {name: simple(:name), attributes: subtree(:attributes)}
|
25
|
+
}
|
17
26
|
) do
|
18
27
|
{
|
19
|
-
|
20
|
-
|
28
|
+
element: {
|
29
|
+
name: name,
|
30
|
+
attributes: attributes,
|
31
|
+
children: [],
|
32
|
+
ignore: false
|
33
|
+
}
|
21
34
|
}
|
22
35
|
end
|
23
36
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Upmark
|
2
|
+
module TransformHelpers
|
3
|
+
def self.included(base)
|
4
|
+
base.send :extend, ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def element(*names, &block)
|
9
|
+
names.each do |name|
|
10
|
+
name = name.to_s.downcase
|
11
|
+
rule(
|
12
|
+
{
|
13
|
+
element: {
|
14
|
+
name: (name != "*" ? name : simple(:name)),
|
15
|
+
attributes: subtree(:attributes),
|
16
|
+
children: subtree(:children),
|
17
|
+
ignore: false
|
18
|
+
}
|
19
|
+
}
|
20
|
+
) do |element|
|
21
|
+
element[:name] ||= name
|
22
|
+
block.call(element)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def map_attributes_subtree(ast)
|
28
|
+
ast.inject({}) do |hash, attribute|
|
29
|
+
hash[attribute[:name].to_sym] = attribute[:value]
|
30
|
+
hash
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/upmark/version.rb
CHANGED
data/lib/upmark.rb
CHANGED
@@ -3,18 +3,22 @@ require "parslet"
|
|
3
3
|
require "core_ext/array"
|
4
4
|
|
5
5
|
require "upmark/parser/xml"
|
6
|
+
require 'upmark/transform_helpers'
|
6
7
|
require "upmark/transform/markdown"
|
8
|
+
require "upmark/transform/pass_through"
|
7
9
|
require "upmark/transform/preprocess"
|
8
10
|
require "upmark/version"
|
9
11
|
|
10
12
|
module Upmark
|
11
13
|
def self.convert(html)
|
12
|
-
xml
|
13
|
-
preprocess
|
14
|
-
|
14
|
+
xml = Parser::XML.new
|
15
|
+
preprocess = Transform::Preprocess.new
|
16
|
+
pass_through = Transform::PassThrough.new
|
17
|
+
markdown = Transform::Markdown.new
|
15
18
|
|
16
19
|
ast = xml.parse(html.strip)
|
17
20
|
ast = preprocess.apply(ast)
|
21
|
+
ast = pass_through.apply(ast)
|
18
22
|
ast = markdown.apply(ast)
|
19
23
|
|
20
24
|
# The result is either a String or an Array.
|
@@ -3,17 +3,44 @@ require "spec_helper"
|
|
3
3
|
describe Upmark, ".convert" do
|
4
4
|
subject { Upmark.convert(html) }
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
context "<a>" do
|
7
|
+
let(:html) { <<-HTML.strip }
|
8
|
+
<p><a href="http://helvetica.com/" title="art party organic">messenger <strong>bag</strong> skateboard</a></p>
|
9
|
+
HTML
|
8
10
|
|
9
|
-
|
11
|
+
it { should == <<-MD.strip }
|
12
|
+
[messenger **bag** skateboard](http://helvetica.com/ "art party organic")
|
13
|
+
MD
|
14
|
+
end
|
10
15
|
|
11
|
-
|
16
|
+
context "<img>" do
|
17
|
+
let(:html) { <<-HTML.strip }
|
18
|
+
<img src="http://helvetica.com/image.gif" title="art party organic" alt="messenger bag skateboard" />
|
12
19
|
|
13
|
-
|
20
|
+
HTML
|
14
21
|
|
15
|
-
|
22
|
+
it { should == <<-MD.strip }
|
23
|
+

|
24
|
+
MD
|
25
|
+
end
|
16
26
|
|
27
|
+
context "<p>" do
|
28
|
+
let(:html) { <<-HTML.strip }
|
29
|
+
<p>messenger <strong>bag</strong> skateboard</p>
|
30
|
+
|
31
|
+
<p>art party<br />organic</p>
|
32
|
+
HTML
|
33
|
+
|
34
|
+
it { should == <<-MD.strip }
|
35
|
+
messenger **bag** skateboard
|
36
|
+
|
37
|
+
art party
|
38
|
+
organic
|
39
|
+
MD
|
40
|
+
end
|
41
|
+
|
42
|
+
context "<ul>" do
|
43
|
+
let(:html) { <<-HTML.strip }
|
17
44
|
<ul>
|
18
45
|
<li>messenger</li>
|
19
46
|
<li><strong>bag</strong></li>
|
@@ -25,7 +52,23 @@ describe Upmark, ".convert" do
|
|
25
52
|
<li><p><strong>bag</strong></p></li>
|
26
53
|
<li><p>skateboard</p></li>
|
27
54
|
</ul>
|
55
|
+
HTML
|
56
|
+
|
57
|
+
it { should == <<-MD.strip }
|
58
|
+
* messenger
|
59
|
+
* **bag**
|
60
|
+
* skateboard
|
61
|
+
|
62
|
+
* messenger
|
28
63
|
|
64
|
+
* **bag**
|
65
|
+
|
66
|
+
* skateboard
|
67
|
+
MD
|
68
|
+
end
|
69
|
+
|
70
|
+
context "<ol>" do
|
71
|
+
let(:html) { <<-HTML.strip }
|
29
72
|
<ol>
|
30
73
|
<li>messenger</li>
|
31
74
|
<li><strong>bag</strong></li>
|
@@ -37,32 +80,9 @@ describe Upmark, ".convert" do
|
|
37
80
|
<li><p><strong>bag</strong></p></li>
|
38
81
|
<li><p>skateboard</p></li>
|
39
82
|
</ol>
|
83
|
+
HTML
|
40
84
|
|
41
|
-
|
42
|
-
<div id="tofu" class="art party">messenger <strong>bag</strong> skateboard</div>
|
43
|
-
HTML
|
44
|
-
|
45
|
-
it { should == <<-MD.strip }
|
46
|
-
# messenger bag skateboard
|
47
|
-
|
48
|
-
messenger bag skateboard
|
49
|
-
|
50
|
-
messenger *bag* **skateboard**
|
51
|
-
|
52
|
-
[messenger **bag** skateboard](http://helvetica.com/ "art party organic")
|
53
|
-
|
54
|
-

|
55
|
-
|
56
|
-
* messenger
|
57
|
-
* **bag**
|
58
|
-
* skateboard
|
59
|
-
|
60
|
-
* messenger
|
61
|
-
|
62
|
-
* **bag**
|
63
|
-
|
64
|
-
* skateboard
|
65
|
-
|
85
|
+
it { should == <<-MD.strip }
|
66
86
|
1. messenger
|
67
87
|
2. **bag**
|
68
88
|
3. skateboard
|
@@ -72,8 +92,90 @@ messenger *bag* **skateboard**
|
|
72
92
|
2. **bag**
|
73
93
|
|
74
94
|
3. skateboard
|
95
|
+
MD
|
96
|
+
end
|
97
|
+
|
98
|
+
context "<h1>" do
|
99
|
+
let(:html) { <<-HTML.strip }
|
100
|
+
<h1>messenger bag skateboard</h1>
|
101
|
+
<h2>messenger bag skateboard</h2>
|
102
|
+
<h3>messenger bag skateboard</h3>
|
103
|
+
HTML
|
104
|
+
|
105
|
+
it { should == <<-MD.strip }
|
106
|
+
# messenger bag skateboard
|
107
|
+
## messenger bag skateboard
|
108
|
+
### messenger bag skateboard
|
109
|
+
MD
|
110
|
+
end
|
111
|
+
|
112
|
+
context "<div>" do
|
113
|
+
let(:html) { <<-HTML.strip }
|
114
|
+
<div>messenger <strong>bag</strong> skateboard</div>
|
115
|
+
<div id="tofu" class="art party">messenger <strong>bag</strong> skateboard</div>
|
116
|
+
HTML
|
75
117
|
|
76
|
-
|
77
|
-
<div
|
78
|
-
|
118
|
+
it { should == <<-MD.strip }
|
119
|
+
<div>messenger <strong>bag</strong> skateboard</div>
|
120
|
+
<div id="tofu" class="art party">messenger <strong>bag</strong> skateboard</div>
|
121
|
+
MD
|
122
|
+
end
|
123
|
+
|
124
|
+
context "<table>" do
|
125
|
+
let(:html) { <<-HTML.strip }
|
126
|
+
<table>
|
127
|
+
<tr>
|
128
|
+
<td>messenger</td>
|
129
|
+
</tr>
|
130
|
+
<tr>
|
131
|
+
<td><strong>bag</strong></td>
|
132
|
+
</tr>
|
133
|
+
<tr>
|
134
|
+
<td>skateboard</td>
|
135
|
+
</tr>
|
136
|
+
</table>
|
137
|
+
HTML
|
138
|
+
|
139
|
+
it { should == <<-MD.strip }
|
140
|
+
<table>
|
141
|
+
<tr>
|
142
|
+
<td>messenger</td>
|
143
|
+
</tr>
|
144
|
+
<tr>
|
145
|
+
<td><strong>bag</strong></td>
|
146
|
+
</tr>
|
147
|
+
<tr>
|
148
|
+
<td>skateboard</td>
|
149
|
+
</tr>
|
150
|
+
</table>
|
151
|
+
MD
|
152
|
+
end
|
153
|
+
|
154
|
+
context "<pre>" do
|
155
|
+
let(:html) { <<-HTML.strip }
|
156
|
+
<pre>
|
157
|
+
<code>
|
158
|
+
messenger bag skateboard
|
159
|
+
</code>
|
160
|
+
</pre>
|
161
|
+
HTML
|
162
|
+
|
163
|
+
it { should == <<-MD.strip }
|
164
|
+
<pre>
|
165
|
+
<code>
|
166
|
+
messenger bag skateboard
|
167
|
+
</code>
|
168
|
+
</pre>
|
169
|
+
MD
|
170
|
+
end
|
171
|
+
|
172
|
+
context "<span>" do
|
173
|
+
let(:html) { <<-HTML.strip }
|
174
|
+
<span>messenger <strong>bag</strong> skateboard</span>
|
175
|
+
HTML
|
176
|
+
|
177
|
+
it { should == <<-MD.strip }
|
178
|
+
<span>messenger **bag** skateboard</span>
|
179
|
+
MD
|
180
|
+
end
|
79
181
|
end
|
@@ -3,8 +3,8 @@ require "spec_helper"
|
|
3
3
|
describe Upmark::Parser::XML do
|
4
4
|
let(:parser) { Upmark::Parser::XML.new }
|
5
5
|
|
6
|
-
context "#
|
7
|
-
subject { parser.
|
6
|
+
context "#node" do
|
7
|
+
subject { parser.node }
|
8
8
|
|
9
9
|
it { should parse "" }
|
10
10
|
it { should parse "messenger bag skateboard" }
|
@@ -58,6 +58,7 @@ describe Upmark::Parser::XML do
|
|
58
58
|
context "#empty_tag" do
|
59
59
|
subject { parser.empty_tag }
|
60
60
|
|
61
|
+
it { should parse %q{<tofu />} }
|
61
62
|
it { should parse %q{<tofu art="party" />} }
|
62
63
|
it { should parse %q{<tofu art="party" synth="letterpress" />} }
|
63
64
|
it { should_not parse "<tofu>" }
|
@@ -91,7 +92,7 @@ describe Upmark::Parser::XML do
|
|
91
92
|
context "#parse" do
|
92
93
|
subject { parser.parse(html) }
|
93
94
|
|
94
|
-
context "single
|
95
|
+
context "single tag" do
|
95
96
|
let(:html) { "<p>messenger</p>" }
|
96
97
|
|
97
98
|
it do
|
@@ -100,14 +101,28 @@ describe Upmark::Parser::XML do
|
|
100
101
|
element: {
|
101
102
|
start_tag: {name: "p", attributes: []},
|
102
103
|
end_tag: {name: "p"},
|
103
|
-
|
104
|
+
children: [{text: "messenger"}]
|
104
105
|
}
|
105
106
|
}
|
106
107
|
]
|
107
108
|
end
|
108
109
|
end
|
109
110
|
|
110
|
-
context "
|
111
|
+
context "empty tag" do
|
112
|
+
let(:html) { "<br />" }
|
113
|
+
|
114
|
+
it do
|
115
|
+
should == [
|
116
|
+
{
|
117
|
+
element: {
|
118
|
+
empty_tag: {name: "br", attributes: []}
|
119
|
+
}
|
120
|
+
}
|
121
|
+
]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
context "single tag with attributes" do
|
111
126
|
let(:html) { %q{<a href="http://helvetica.com/" title="art party organic">messenger bag skateboard</a>} }
|
112
127
|
|
113
128
|
it do
|
@@ -121,15 +136,15 @@ describe Upmark::Parser::XML do
|
|
121
136
|
{name: "title", value: "art party organic"}
|
122
137
|
]
|
123
138
|
},
|
124
|
-
end_tag:
|
125
|
-
|
139
|
+
end_tag: {name: "a"},
|
140
|
+
children: [{text: "messenger bag skateboard"}]
|
126
141
|
}
|
127
142
|
}
|
128
143
|
]
|
129
144
|
end
|
130
145
|
end
|
131
146
|
|
132
|
-
context "multiple inline
|
147
|
+
context "multiple inline tags" do
|
133
148
|
let(:html) { "<p>messenger</p><p>bag</p><p>skateboard</p>" }
|
134
149
|
|
135
150
|
it do
|
@@ -138,26 +153,26 @@ describe Upmark::Parser::XML do
|
|
138
153
|
element: {
|
139
154
|
start_tag: {name: "p", attributes: []},
|
140
155
|
end_tag: {name: "p"},
|
141
|
-
|
156
|
+
children: [{text: "messenger"}]
|
142
157
|
}
|
143
158
|
}, {
|
144
159
|
element: {
|
145
160
|
start_tag: {name: "p", attributes: []},
|
146
161
|
end_tag: {name: "p"},
|
147
|
-
|
162
|
+
children: [{text: "bag"}]
|
148
163
|
}
|
149
164
|
}, {
|
150
165
|
element: {
|
151
166
|
start_tag: {name: "p", attributes: []},
|
152
167
|
end_tag: {name: "p"},
|
153
|
-
|
168
|
+
children: [{text: "skateboard"}]
|
154
169
|
}
|
155
170
|
}
|
156
171
|
]
|
157
172
|
end
|
158
173
|
end
|
159
174
|
|
160
|
-
context "multiple
|
175
|
+
context "multiple tags" do
|
161
176
|
let(:html) { "<p>messenger</p>\n<p>bag</p>\n<p>skateboard</p>" }
|
162
177
|
|
163
178
|
it do
|
@@ -166,7 +181,7 @@ describe Upmark::Parser::XML do
|
|
166
181
|
element: {
|
167
182
|
start_tag: {name: "p", attributes: []},
|
168
183
|
end_tag: {name: "p"},
|
169
|
-
|
184
|
+
children: [{text: "messenger"}]
|
170
185
|
}
|
171
186
|
}, {
|
172
187
|
text: "\n"
|
@@ -174,7 +189,7 @@ describe Upmark::Parser::XML do
|
|
174
189
|
element: {
|
175
190
|
start_tag: {name: "p", attributes: []},
|
176
191
|
end_tag: {name: "p"},
|
177
|
-
|
192
|
+
children: [{text: "bag"}]
|
178
193
|
}
|
179
194
|
}, {
|
180
195
|
text: "\n"
|
@@ -182,14 +197,14 @@ describe Upmark::Parser::XML do
|
|
182
197
|
element: {
|
183
198
|
start_tag: {name: "p", attributes: []},
|
184
199
|
end_tag: {name: "p"},
|
185
|
-
|
200
|
+
children: [{text: "skateboard"}]
|
186
201
|
}
|
187
202
|
}
|
188
203
|
]
|
189
204
|
end
|
190
205
|
end
|
191
206
|
|
192
|
-
context "nested
|
207
|
+
context "nested tags" do
|
193
208
|
let(:html) { "<p>messenger <strong>bag</strong> skateboard</p>" }
|
194
209
|
|
195
210
|
it do
|
@@ -198,12 +213,13 @@ describe Upmark::Parser::XML do
|
|
198
213
|
element: {
|
199
214
|
start_tag: {name: "p", attributes: []},
|
200
215
|
end_tag: {name: "p"},
|
201
|
-
|
202
|
-
{text: "messenger "},
|
216
|
+
children: [
|
203
217
|
{
|
218
|
+
text: "messenger "
|
219
|
+
}, {
|
204
220
|
element: {
|
205
221
|
start_tag: {name: "strong", attributes: []},
|
206
|
-
|
222
|
+
children: [{text: "bag"}],
|
207
223
|
end_tag: {name: "strong"}
|
208
224
|
}
|
209
225
|
}, {
|
@@ -7,13 +7,15 @@ describe Upmark::Transform::Markdown do
|
|
7
7
|
subject { transform.apply(ast) }
|
8
8
|
|
9
9
|
context "<p>" do
|
10
|
-
context "single
|
10
|
+
context "single tag" do
|
11
11
|
let(:ast) do
|
12
12
|
[
|
13
13
|
{
|
14
14
|
element: {
|
15
|
-
|
16
|
-
|
15
|
+
name: "p",
|
16
|
+
attributes: [],
|
17
|
+
children: [{text: "messenger bag skateboard"}],
|
18
|
+
ignore: false
|
17
19
|
}
|
18
20
|
}
|
19
21
|
]
|
@@ -22,23 +24,29 @@ describe Upmark::Transform::Markdown do
|
|
22
24
|
it { should == ["messenger bag skateboard\n\n"] }
|
23
25
|
end
|
24
26
|
|
25
|
-
context "multiple
|
27
|
+
context "multiple tags" do
|
26
28
|
let(:ast) do
|
27
29
|
[
|
28
30
|
{
|
29
31
|
element: {
|
30
|
-
|
31
|
-
|
32
|
+
name: "p",
|
33
|
+
attributes: [],
|
34
|
+
children: [{text: "messenger"}],
|
35
|
+
ignore: false
|
32
36
|
}
|
33
37
|
}, {
|
34
38
|
element: {
|
35
|
-
|
36
|
-
|
39
|
+
name: "p",
|
40
|
+
attributes: [],
|
41
|
+
children: [{text: "bag"}],
|
42
|
+
ignore: false
|
37
43
|
}
|
38
44
|
}, {
|
39
45
|
element: {
|
40
|
-
|
41
|
-
|
46
|
+
name: "p",
|
47
|
+
attributes: [],
|
48
|
+
children: [{text: "skateboard"}],
|
49
|
+
ignore: false
|
42
50
|
}
|
43
51
|
}
|
44
52
|
]
|
@@ -49,19 +57,18 @@ describe Upmark::Transform::Markdown do
|
|
49
57
|
end
|
50
58
|
|
51
59
|
context "<a>" do
|
52
|
-
context "single
|
60
|
+
context "single tag" do
|
53
61
|
let(:ast) do
|
54
62
|
[
|
55
63
|
{
|
56
64
|
element: {
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
content: [{text: "messenger bag skateboard"}]
|
65
|
+
name: "a",
|
66
|
+
attributes: [
|
67
|
+
{name: "href", value: "http://helvetica.com/"},
|
68
|
+
{name: "title", value: "art party organic"}
|
69
|
+
],
|
70
|
+
children: [{text: "messenger bag skateboard"}],
|
71
|
+
ignore: false
|
65
72
|
}
|
66
73
|
}
|
67
74
|
]
|
@@ -72,20 +79,19 @@ describe Upmark::Transform::Markdown do
|
|
72
79
|
end
|
73
80
|
|
74
81
|
context "<img>" do
|
75
|
-
context "empty
|
82
|
+
context "empty tag" do
|
76
83
|
let(:ast) do
|
77
84
|
[
|
78
85
|
{
|
79
86
|
element: {
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
content: []
|
87
|
+
name: "img",
|
88
|
+
attributes: [
|
89
|
+
{name: "src", value: "http://helvetica.com/image.gif"},
|
90
|
+
{name: "title", value: "art party organic"},
|
91
|
+
{name: "alt", value: "messenger bag skateboard"}
|
92
|
+
],
|
93
|
+
children: [],
|
94
|
+
ignore: false
|
89
95
|
}
|
90
96
|
}
|
91
97
|
]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: upmark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2011-09-
|
13
|
+
date: 2011-09-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
17
|
-
requirement: &
|
17
|
+
requirement: &70218294771840 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70218294771840
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: parslet
|
28
|
-
requirement: &
|
28
|
+
requirement: &70218294771320 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,7 +33,7 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70218294771320
|
37
37
|
description: Upmark has the skills to convert your HTML to Markdown.
|
38
38
|
email: dev@theconversation.edu.au
|
39
39
|
executables:
|
@@ -51,8 +51,11 @@ files:
|
|
51
51
|
- lib/core_ext/array.rb
|
52
52
|
- lib/upmark.rb
|
53
53
|
- lib/upmark/parser/xml.rb
|
54
|
+
- lib/upmark/transform/ignore.rb
|
54
55
|
- lib/upmark/transform/markdown.rb
|
56
|
+
- lib/upmark/transform/pass_through.rb
|
55
57
|
- lib/upmark/transform/preprocess.rb
|
58
|
+
- lib/upmark/transform_helpers.rb
|
56
59
|
- lib/upmark/version.rb
|
57
60
|
- spec/acceptance/upmark_spec.rb
|
58
61
|
- spec/spec_helper.rb
|