dang 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/Gemfile +2 -0
- data/Gemfile.lock +15 -6
- data/History.md +29 -0
- data/Manifest.txt +24 -3
- data/README.md +5 -5
- data/Rakefile +1 -1
- data/bin/dang +2 -4
- data/dang.gemspec +15 -15
- data/lib/dang/dang.rb +2 -2
- data/lib/dang/parser.kpeg +5 -5
- data/lib/dang/parser.rb +50 -32
- data/spectory/attribute_spec.rb +35 -0
- data/spectory/comment_spec.rb +23 -0
- data/spectory/conditional_comment_spec.rb +56 -0
- data/spectory/data_attribute_spec.rb +11 -0
- data/spectory/doctype_spec.rb +38 -0
- data/spectory/embedded_ruby_spec.rb +33 -0
- data/spectory/file_spec.rb +13 -0
- data/spectory/files/iamshane-com.html +229 -0
- data/spectory/files/iamshane-com.html.dang +231 -0
- data/spectory/filter_spec.rb +27 -0
- data/spectory/helper.rb +5 -0
- data/spectory/sanity_spec.rb +11 -0
- data/spectory/script_spec.rb +32 -0
- data/spectory/selector_spec.rb +26 -0
- data/spectory/style_spec.rb +29 -0
- data/spectory/tag_spec.rb +71 -0
- data/spectory/v2/array_classes_spec.rb +12 -0
- data/spectory/v2/filters/markdown_spec.rb +21 -0
- data/spectory/v2/hash_attribute_spec.rb +20 -0
- data/spectory/v2/interpolation_spec.rb +11 -0
- data/spectory/v2/script_exception_spec.rb +8 -0
- data/spectory/v2/style_exception_spec.rb +8 -0
- data/spectory/well_formedness_spec.rb +15 -0
- data/spectory/whitespace_spec.rb +16 -0
- metadata +48 -30
- data/.autotest +0 -12
- data/.gitignore +0 -9
- data/.travis.yml +0 -9
@@ -0,0 +1,231 @@
|
|
1
|
+
!!!
|
2
|
+
<html[dir=ltr][lang=en-US]
|
3
|
+
|
4
|
+
<head
|
5
|
+
<meta[charset=UTF-8] />
|
6
|
+
<title The Internet Home Site of Shane Becker title>
|
7
|
+
<script[src=/javascripts/html5shiv.js?1293826648] script>
|
8
|
+
<script[src=/javascripts/jquery.js?1293826648] script>
|
9
|
+
<script[src=/javascripts/paging_keys.js?1293826648] script>
|
10
|
+
<link[href=/stylesheets/reset.css?1293826648][media=screen][rel=stylesheet] />
|
11
|
+
<link[href=/stylesheets/application.css?1293826648][media=screen][rel=stylesheet] />
|
12
|
+
<link[href=/feed][rel=alternate][title=I Am Shane Becker][type=application/atom+xml] />
|
13
|
+
<link#short_url[href=http://sbb.me][rel=shorturl][type=text/html] />
|
14
|
+
<meta[name=csrf-param][content=authenticity_token] />
|
15
|
+
<meta[name=csrf-token][content=wPLyoaxee/y1v+3RUGYzcZqH1fbU526Nf7qYYoJakaY=] />
|
16
|
+
|
17
|
+
<style
|
18
|
+
body {
|
19
|
+
background: red;
|
20
|
+
}
|
21
|
+
|
22
|
+
p:after {
|
23
|
+
content: "style>";
|
24
|
+
}
|
25
|
+
style>
|
26
|
+
head>
|
27
|
+
|
28
|
+
<body
|
29
|
+
<header.site
|
30
|
+
<h1 I Am Shane Becker h1>
|
31
|
+
header>
|
32
|
+
|
33
|
+
<h2#callout <a[href=/products/your-slides-suck] NEW <strong $15 Screencast strong> Your Slides Suck a> h2>
|
34
|
+
|
35
|
+
<ol.hfeed
|
36
|
+
|
37
|
+
<: ["thing one", "thing two", "dinosaur"].each do |item| :>
|
38
|
+
<li <| item |> to show non/printing ruby li>
|
39
|
+
<: end :>
|
40
|
+
|
41
|
+
<li
|
42
|
+
<article#status_1191.hentry.status
|
43
|
+
<header
|
44
|
+
<h1.entry-title.entry-content
|
45
|
+
Growing is Forever :
|
46
|
+
<a.link[rel=external][href=http://t.co/qc3LDIN] http://t.co/qc3LDIN a>
|
47
|
+
/cc
|
48
|
+
<a.at_username[rel=external][href=http://twitter.com/tjnelsonjr] @tjnelsonjr a>
|
49
|
+
h1>
|
50
|
+
header>
|
51
|
+
|
52
|
+
<footer
|
53
|
+
<h1.vcard
|
54
|
+
<a.email[href=mailto:veganstraightedge@gmail.com] <span.fn.author Shane Becker span> a>
|
55
|
+
<span.verb published span>
|
56
|
+
<span.preposition this span>
|
57
|
+
<span.object-type status span>
|
58
|
+
<span.preposition on span>
|
59
|
+
|
60
|
+
<time[datetime=2011-02-06T06:02][pubdate]
|
61
|
+
<a.bookmark[href=/statuses/2011/2/5/4][rel=bookmark]
|
62
|
+
February, 06, 2011
|
63
|
+
<span.preposition at span>
|
64
|
+
06:38:40
|
65
|
+
a>
|
66
|
+
time>
|
67
|
+
h1> <! .vcard !>
|
68
|
+
|
69
|
+
<table.urls
|
70
|
+
<tr
|
71
|
+
<th <label.short_url[for=short_url_status_1191] Short URL label> th>
|
72
|
+
<th <label.long_url[for=long_url_status_1191] Long URL label> th>
|
73
|
+
tr>
|
74
|
+
<tr
|
75
|
+
<td <input#short_url_status_1191.short_url[name=name_url][type=url][value=http://sbb.me/s4AA4] /> td>
|
76
|
+
<td <input#long_url_status_1191.long_url[name=long_url][type=url][value=http://iamshane.com/statuses/2011/2/5/4] /> td>
|
77
|
+
tr>
|
78
|
+
table> <! .urls !>
|
79
|
+
|
80
|
+
<h3.redistribution
|
81
|
+
Also published at
|
82
|
+
<a[href=http://twitter.com/veganstraightedge/statuses/34138891636178944][rel=me] http://twitter.com/veganstraightedge/statuses/34138891636178944 a>
|
83
|
+
h3> <! .redistribution !>
|
84
|
+
footer> <! footer !>
|
85
|
+
article> <! article !>
|
86
|
+
li> <! li !>
|
87
|
+
|
88
|
+
<li
|
89
|
+
<article#status_800.hentry.status
|
90
|
+
<header
|
91
|
+
<h1.entry-title.entry-content
|
92
|
+
<a.at_username[rel=external][href=http://twitter.com/gilesgoatboy] @gilesgoatboy a>
|
93
|
+
Oh shit. You're right. It was the jigga man. My bad.
|
94
|
+
h1>
|
95
|
+
header>
|
96
|
+
|
97
|
+
<footer
|
98
|
+
<h1.vcard
|
99
|
+
<a.email[href=mailto:veganstraightedge@gmail.com] <span.fn.author Shane Becker span> a>
|
100
|
+
<span.verb published span>
|
101
|
+
<span.preposition this span>
|
102
|
+
<span.object-type status span>
|
103
|
+
<span.preposition on span>
|
104
|
+
|
105
|
+
<time[datetime=2011-02-06T04:02][pubdate]
|
106
|
+
<a.bookmark[href=/statuses/2011/2/5/3][rel=bookmark]
|
107
|
+
February, 06, 2011
|
108
|
+
<span.preposition at span>
|
109
|
+
04:18:28
|
110
|
+
a>
|
111
|
+
time>
|
112
|
+
h1> <! .vcard !>
|
113
|
+
|
114
|
+
<table.urls
|
115
|
+
<tr
|
116
|
+
<th <label.short_url[for=short_url_status_800] Short URL label> th>
|
117
|
+
<th <label.long_url[for=long_url_status_800] Long URL label> th>
|
118
|
+
tr>
|
119
|
+
<tr
|
120
|
+
<td <input#short_url_status_800.short_url[name=name_url][type=url][value="http://sbb.me/s4AA3] /> td>
|
121
|
+
<td <input#long_url_status_800.long_url[name=long_url][type=url][value="http://iamshane.com/statuses/2011/2/5/3] /> td>
|
122
|
+
tr>
|
123
|
+
table> <! .urls !>
|
124
|
+
|
125
|
+
<h3.redistribution
|
126
|
+
Also published at
|
127
|
+
<a[href=http://twitter.com/veganstraightedge/statuses/34103607427076098][rel=me] http://twitter.com/veganstraightedge/statuses/34103607427076098 a>
|
128
|
+
h3> <! .redistribution !>
|
129
|
+
footer> <! footer !>
|
130
|
+
article> <! article !>
|
131
|
+
li> <! li !>
|
132
|
+
|
133
|
+
ol> <! ol.hfeed !>
|
134
|
+
|
135
|
+
<div.pagination
|
136
|
+
<span.previous_page.disabled ← Previous span>
|
137
|
+
<em 1 em>
|
138
|
+
<a[href=/page/2][rel=next] 2 a>
|
139
|
+
<a[href=/page/3] 3 a>
|
140
|
+
<a[href=/page/4] 4 a>
|
141
|
+
<a[href=/page/5] 5 a>
|
142
|
+
<a[href=/page/6] 6 a>
|
143
|
+
<a[href=/page/7] 7 a>
|
144
|
+
<a[href=/page/8] 8 a>
|
145
|
+
<a[href=/page/9] 9 a>
|
146
|
+
<span.gap … span>
|
147
|
+
<a[href=/page/415] 415 a>
|
148
|
+
<a[href=/page/416] 416 a>
|
149
|
+
<a.next_page[href=/page/2][rel=next] Next → a>
|
150
|
+
div> <! .pagination !>
|
151
|
+
|
152
|
+
<footer#bottom.site
|
153
|
+
<h1 A Bit More About Me… /h1>
|
154
|
+
<p
|
155
|
+
My name is <span.fn <span.given-name Shane span> <span.family-name Becker span> span>.
|
156
|
+
I live in <span.adr <span.locality Los Angeles span>, <span.region CA span> span>.
|
157
|
+
I make websites for fun and for profit.
|
158
|
+
I’m still vegan, still straightedge. I’m an anarchist and an atheist.
|
159
|
+
My <a[href=http://flickr.com/photos/veganstraightedge/tags/civ][rel=me] dog a> is
|
160
|
+
<a[href=http://twitter.com/civthedog][rel=me] Civ a>.
|
161
|
+
p>
|
162
|
+
|
163
|
+
<h2
|
164
|
+
I’ve made some things (sometimes along side
|
165
|
+
<a[href=http://eliduke.com][rel=friend] Eli Duke a> and
|
166
|
+
<a[href=http://iambookis.com][rel=friend] Bookis Smuin a>).
|
167
|
+
h2>
|
168
|
+
<ul
|
169
|
+
<li <a[href=http://zinedistro.org][rel=me] Zine Distro a> li>
|
170
|
+
<li <a[href=http://listyourlist.com][rel=me] ListYourList a> li>
|
171
|
+
<li <a[href=http://theresistancearmy.com][rel=me] The Resistance Army a> li>
|
172
|
+
<li <a[href=http://foodsquatting.com][rel=me] Food Squatting a> li>
|
173
|
+
<li <a[href=http://thegreatamericanaroadtrip.com][rel=me] The Great Americana Road Trip a> li>
|
174
|
+
<li <a[href=http://iamshanebecker.com][rel=me] My Resume a> li>
|
175
|
+
ul>
|
176
|
+
|
177
|
+
<h2 I have profiles on other websites. h2>
|
178
|
+
<ul
|
179
|
+
<li <a[href=http://twitter.com/veganstraightedge][rel=me] Twitter a> li>
|
180
|
+
<li <a[href=http://flickr.com/veganstraightedge][rel=me] Flickr a> li>
|
181
|
+
<li <a[href=http://facebook.com/veganstraightedge][rel=me] Facebook a> li>
|
182
|
+
<li <a[href=http://vimeo.com/veganstraightedg][rel=me] Vimeo a> li>
|
183
|
+
<li <a[href=http://youtube.com/user/veganstraightedge][rel=me] YouTube a> li>
|
184
|
+
<li <a[href=http://dribbble.com/players/veganstraightedge][rel=me] Dribble a> li>
|
185
|
+
<li <a[href=http://foursquare.com/user/veganstraightedge][rel=me] FourSquare a> li>
|
186
|
+
<li <a[href=http://gowalla.com/users/seanbonner][rel=me] Gowalla a> li>
|
187
|
+
<li <a[href=http://last.fm/user/vegansxe][rel=me] Last.FM a> li>
|
188
|
+
<li <a[href=http://listyourlist.com/veganstraightedge][rel=me] ListYourList a> li>
|
189
|
+
<li <a[href=http://github.com/veganstraightedge][rel=me] GitHub a> li>
|
190
|
+
<li <a[href=http://www.google.com/profiles/veganstraightedge][rel=me] Google Profile a> li>
|
191
|
+
<li <a[href=http://del.icio.us/veganstraightedge][rel=me] Delicious a> li>
|
192
|
+
<li <a[href=http://del.icio.us/shaners][rel=me] Delicious a> li>
|
193
|
+
<li <a[href=http://pinboard.in/u:veganstraightedge][rel=me] Pinboard a> li>
|
194
|
+
ul>
|
195
|
+
|
196
|
+
<p#contact
|
197
|
+
You can contact me by email (<a.email[href=mailto:veganstraightedge@gmail.com] veganstraightedge@gmail.com a>)
|
198
|
+
or by phone (<span.tel 801-898-9481 span>). Please, no spam.
|
199
|
+
You can <a[href=http://h2vx.com/vcf/iamshane.com] download my vCard a> for your address book.
|
200
|
+
All content on this site (unless created by someone else) is licensed under
|
201
|
+
<a[href=http://creativecommons.org/licenses/by/2.0/deed.en][rel=license] Creative Commons Attribution License a>
|
202
|
+
which means you can republish whatever you want as long as you attribute me and link back to the original page.
|
203
|
+
p>
|
204
|
+
|
205
|
+
<p#no_comments
|
206
|
+
A quick note about comments on posts. The short and long of it is, I’m over comments.
|
207
|
+
They’re a lot of work for very little benefit. In migrating my blog posts to this version of my site,
|
208
|
+
I threw out most of the comments which were total trash or meaningless drivel.
|
209
|
+
I’ve made a few exceptions where I felt like they added some value.
|
210
|
+
Comments are off and are staying off. If you’ve got something to say to me that’s private,
|
211
|
+
<a[href=mailto:veganstraightedge@gmail.com] email me a>. If you want to say it in the public, a>
|
212
|
+
<a[href=http://twitter.com/home?status=@veganstraightedge%20-] write it on Twitter a>
|
213
|
+
or your own blog (they’re
|
214
|
+
<a[href=http://wordpress.com] free a> and <a[href=http://tumblr.com] easy a>).
|
215
|
+
p>
|
216
|
+
footer> <! footer !>
|
217
|
+
|
218
|
+
<script
|
219
|
+
var _gaq = _gaq || [];
|
220
|
+
_gaq.push(['_setAccount', 'UA-193482-20']);
|
221
|
+
_gaq.push(['_trackPageview']);
|
222
|
+
|
223
|
+
(function() {
|
224
|
+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
225
|
+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
226
|
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
227
|
+
})();
|
228
|
+
script>
|
229
|
+
|
230
|
+
body> <! body !>
|
231
|
+
html> <! html !>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "spectory/helper"
|
2
|
+
|
3
|
+
# filters
|
4
|
+
# <:markdown
|
5
|
+
# # This is a h1 heading
|
6
|
+
# ## h2
|
7
|
+
# *bold text*
|
8
|
+
# * a
|
9
|
+
# * of
|
10
|
+
# * items
|
11
|
+
# markdown:>
|
12
|
+
|
13
|
+
# <:raw <!--[if (gt IE 9)|!(IE)]><!--> raw:><html.no-js[lang=en]<:raw <!--<![endif]--> raw:>
|
14
|
+
|
15
|
+
describe "filters" do
|
16
|
+
it "can parse simple bodies" do
|
17
|
+
Dang.it('<:raw food raw:>').must_equal 'food'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "farms out to raw a filter" do
|
21
|
+
Dang.it('<:raw <!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" dir="ltr" class="no-js"> <!--<![endif]--> raw:>').must_equal '<!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" dir="ltr" class="no-js"> <!--<![endif]-->'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "farms out to 2 raw filters with Dang in between" do
|
25
|
+
Dang.it('<:raw <!--[if (gt IE 9)|!(IE)]><!--> raw:> <html.no-js[lang=en][dir=ltr] <:raw <!--<![endif]--> raw:> html>').must_equal "<!--[if (gt IE 9)|!(IE)]><!--> <html class='no-js' lang='en' dir='ltr'><!--<![endif]--></html>"
|
26
|
+
end
|
27
|
+
end
|
data/spectory/helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require "spectory/helper"
|
2
|
+
|
3
|
+
describe "script tags" do
|
4
|
+
it "treats script tag special" do
|
5
|
+
dang = "
|
6
|
+
<script
|
7
|
+
var _gaq = _gaq || [];
|
8
|
+
_gaq.push(['_setAccount', 'UA-193482-20']);
|
9
|
+
_gaq.push(['_trackPageview']);
|
10
|
+
|
11
|
+
(function() {
|
12
|
+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
13
|
+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
14
|
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
15
|
+
})();
|
16
|
+
script>"
|
17
|
+
|
18
|
+
html = "<script>
|
19
|
+
var _gaq = _gaq || [];
|
20
|
+
_gaq.push(['_setAccount', 'UA-193482-20']);
|
21
|
+
_gaq.push(['_trackPageview']);
|
22
|
+
|
23
|
+
(function() {
|
24
|
+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
25
|
+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
26
|
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
27
|
+
})();
|
28
|
+
</script>"
|
29
|
+
|
30
|
+
Dang.it(dang).must_equal html
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "spectory/helper"
|
2
|
+
|
3
|
+
describe "selectors" do
|
4
|
+
it "transforms Dang tag#id into HTML tag with an id attribute" do
|
5
|
+
Dang.it("<div#awesome lorem and or ipsum div>").must_equal "<div id='awesome'>lorem and or ipsum</div>"
|
6
|
+
end
|
7
|
+
|
8
|
+
it "transforms Dang self closing tag with multiple attributes to HTML" do
|
9
|
+
Dang.it("<link[href=http://sbb.me][rel=shorturl][type=text/html] />").must_equal "<link href='http://sbb.me' rel='shorturl' type='text/html' />"
|
10
|
+
end
|
11
|
+
it "transforms Dang self closing tag with an ID and multiple attributes to HTML" do
|
12
|
+
Dang.it("<link#short_url[href=http://sbb.me][rel=shorturl][type=text/html] />").must_equal "<link id='short_url' href='http://sbb.me' rel='shorturl' type='text/html' />"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "transforms Dang tag.class into HTML tag with a class" do
|
16
|
+
Dang.it("<i.pants party i>").must_equal "<i class='pants'>party</i>"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "transforms Dang tag#id.class into HTML tag with an id and a class" do
|
20
|
+
Dang.it("<s#pants.party woo hoo s>").must_equal "<s class='party' id='pants'>woo hoo</s>"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should merge shorthand and longhand classes" do
|
24
|
+
Dang.it("<html#foo.bar[class=snap crackle pop mitch] things html>").must_equal "<html class='bar snap crackle pop mitch' id='foo'>things</html>"
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "spectory/helper"
|
2
|
+
|
3
|
+
describe "style tags" do
|
4
|
+
it "treats style tags special" do
|
5
|
+
dang = "
|
6
|
+
<style
|
7
|
+
body {
|
8
|
+
background: red;
|
9
|
+
}
|
10
|
+
|
11
|
+
p:after {
|
12
|
+
content: '}';
|
13
|
+
}
|
14
|
+
style>
|
15
|
+
"
|
16
|
+
|
17
|
+
html = "<style>
|
18
|
+
body {
|
19
|
+
background: red;
|
20
|
+
}
|
21
|
+
|
22
|
+
p:after {
|
23
|
+
content: '}';
|
24
|
+
}
|
25
|
+
</style>"
|
26
|
+
|
27
|
+
Dang.it(dang).must_equal html
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require "spectory/helper"
|
2
|
+
|
3
|
+
describe "tags" do
|
4
|
+
it "transforms Dang tag to HTML tag with no content" do
|
5
|
+
Dang.it("<b b>").must_equal "<b></b>"
|
6
|
+
end
|
7
|
+
|
8
|
+
it "transforms Dang tag to HTML tag" do
|
9
|
+
Dang.it("<b BOLD b>").must_equal "<b>BOLD</b>"
|
10
|
+
end
|
11
|
+
|
12
|
+
it "transforms Dang self closing tag to self closing HTML tag" do
|
13
|
+
Dang.it("<img[src=foo.png] />").must_equal "<img src='foo.png' />"
|
14
|
+
end
|
15
|
+
|
16
|
+
it "transforms Dang self closing tag with multiple attributes to HTML" do
|
17
|
+
Dang.it("<img[src=foo.png][alt=rock] />").must_equal "<img src='foo.png' alt='rock' />"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "transforms Dang self closing tag with no attributes to HTML" do
|
21
|
+
Dang.it("<img />").must_equal "<img />"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "transforms Dang self closing tag with an ID to HTML" do
|
25
|
+
Dang.it("<img#id />").must_equal "<img id='id' />"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "transforms Dang empty script tag to HTML" do
|
29
|
+
Dang.it("<script[src=/javascripts/jquery.js?1293826648] script>").must_equal "<script src='/javascripts/jquery.js?1293826648'></script>"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "transforms Dang tags with an attribute and an explicit closer" do
|
33
|
+
Dang.it("<a[href=/] Home a>").must_equal "<a href='/'>Home</a>"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "transforms Dang tags nested inline to inline nested HTML tags" do
|
37
|
+
Dang.it("<h1 <a[href=/] Home a> h1>").must_equal "<h1><a href='/'>Home</a></h1>"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "transforms Dang tags nested inline to inline nested HTML tags wrapped in text" do
|
41
|
+
Dang.it("<h1 STUFF <a[href=/] Home a> MORE STUFF h1>").must_equal "<h1>STUFF <a href='/'>Home</a> MORE STUFF</h1>"
|
42
|
+
end
|
43
|
+
|
44
|
+
it "transforms Dang tags nested multiline to multiline nested HTML tags" do
|
45
|
+
dang = "
|
46
|
+
<header
|
47
|
+
<hgroup
|
48
|
+
<h1 Dang Lang h1>
|
49
|
+
<h2 It's the angle of the dangle h2>
|
50
|
+
hgroup>
|
51
|
+
header>"
|
52
|
+
|
53
|
+
html =
|
54
|
+
"<header>
|
55
|
+
<hgroup>
|
56
|
+
<h1>Dang Lang</h1>
|
57
|
+
<h2>It's the angle of the dangle</h2>
|
58
|
+
</hgroup>
|
59
|
+
</header>"
|
60
|
+
|
61
|
+
Dang.it(dang).must_equal html
|
62
|
+
end
|
63
|
+
|
64
|
+
it "transforms sibling root tags" do
|
65
|
+
Dang.it("<b BOLD b><i ME i>").must_equal "<b>BOLD</b><i>ME</i>"
|
66
|
+
end
|
67
|
+
|
68
|
+
it "transforms sibling root tags with significant whitespace" do
|
69
|
+
Dang.it("<b BOLD b> <i ME i>").must_equal "<b>BOLD</b> <i>ME</i>"
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "spectory/helper"
|
2
|
+
|
3
|
+
# TODO experimental
|
4
|
+
# for v2
|
5
|
+
|
6
|
+
# describe "array classes" do
|
7
|
+
# it "joins an array of items into space separate attribute values" do
|
8
|
+
# classes = %w(snap crackle pop)
|
9
|
+
# Dang.it("<body#mitch[class={ classes }]").must_equal "<body id='mitch' class='snap crackle pop'>"
|
10
|
+
# Dang.it("<body#mitch[class={ %w(a b c) }]").must_equal "<body id='mitch' class='a b c'>"
|
11
|
+
# end
|
12
|
+
# end
|