Commit | Line | Data |
94a3ddd9 |
1 | use strict; |
2 | use warnings FATAL => 'all'; |
3 | |
4 | use HTML::Zoom; |
5 | use Test::More; |
6 | |
7 | ok my $zoom = HTML::Zoom->from_html(<<HTML); |
8 | <html> |
9 | <head> |
10 | <title>Hi!</title> |
11 | </head> |
12 | <body id="content-area"> |
13 | <h1>Test</h1> |
14 | <div> |
15 | <p class="first-para">Some Stuff</p> |
16 | <p class="body-para">More Stuff</p> |
17 | <p class="body-para">Even More Stuff</p> |
18 | <ol> |
19 | <li class="first-item odd">First</li> |
20 | <li class="body-items even">Stuff A</li> |
21 | <li class="body-items odd">Stuff B</li> |
22 | <li class="body-items even">Stuff C</li> |
23 | <li class="last-item odd">Last</li> |
24 | </ol> |
25 | <ul class="items"> |
26 | <li class="first">space</li> |
27 | <li class="second">space</li> |
28 | </ul> |
29 | <p class="body-para">Even More stuff</p> |
30 | <p class="last-para">Some Stuff</p> |
31 | </div> |
32 | <div id="blocks"> |
33 | <h2 class="h2-item">Sub Item</h2> |
34 | </div> |
35 | <ul id="people"> |
36 | <li class="name">name</li> |
37 | <li class="email">email</li> |
38 | </ul> |
39 | <ul id="people2"> |
40 | <li class="name">name</li> |
41 | <li class="email">email</li> |
42 | </ul> |
43 | <ul id="object"> |
44 | <li class="aa">AA</li> |
45 | <li class="bb">BB</li> |
46 | </ul> |
47 | <p id="footer">Copyright 2222</p> |
48 | </body> |
49 | </html> |
50 | HTML |
51 | |
52 | ok ! eval { $zoom->non_method('.first-param' => 'First!'); 1}, |
53 | 'Properly die on bad method'; |
54 | |
55 | ok my $title = sub { |
56 | my ($z, $content) = @_; |
57 | $z = $z->replace_content(title =>$content); |
58 | return $z; |
59 | }; |
60 | |
61 | ok my $dwim = $zoom |
62 | ->$title('Hello NYC') |
63 | ->replace_content('.first-para' => 'First!') |
64 | ->replace_content('.last-para' => 'Last!') |
65 | ->add_to_attribute(p => class => 'para') |
66 | ->prepend_content('.first-item' => [{type=>'TEXT', raw=>'FIRST: '}]) |
67 | ->prepend_content('.last-item' => [{type=>'TEXT', raw=>'LAST: '}]) |
68 | ->replace_content('title' => 'Hello World') |
69 | ->repeat_content( |
70 | '.items' => [ |
71 | map { |
72 | my $v = $_; |
73 | sub { |
74 | $_->replace_content('.first' => $v) |
75 | ->replace_content('.second' => $v); |
76 | }, |
77 | } (111,222) |
78 | ] |
79 | ) |
80 | ->to_html; |
81 | |
82 | like( |
83 | HTML::Zoom |
84 | ->from_html(q[<title>Hi!</title>]) |
85 | ->$title('Hello NYC') |
86 | ->to_html, |
87 | qr/Hello NYC/, |
88 | 'Got correct title(custom subref)' |
89 | ); |
90 | |
91 | like( |
92 | HTML::Zoom |
93 | ->from_html(q[<p>Hi!</p>]) |
94 | ->replace_content(p=>'Ask not what your country can do for you...') |
95 | ->to_html, |
96 | qr/Ask not what your country can do for you\.\.\./, |
97 | 'Got correct from replace_content' |
98 | ); |
99 | |
100 | like( |
101 | HTML::Zoom |
102 | ->from_html(q[<p class="first">Hi!</p>]) |
94a3ddd9 |
103 | ->add_to_attribute('p', class => 'para') |
104 | ->to_html, |
105 | qr/first para/, |
106 | 'Got correct from add_to_attribute' |
107 | ); |
108 | |
109 | like( |
110 | HTML::Zoom |
111 | ->from_html(q[<p class="first">Hi!</p>]) |
112 | ->set_attribute('p', class => 'para') |
113 | ->to_html, |
114 | qr/class="para"/, |
115 | 'Got correct from set_attribute' |
116 | ); |
117 | |
94a3ddd9 |
118 | is( |
119 | HTML::Zoom |
120 | ->from_html(q[<p class="first">Hi!</p>]) |
121 | ->add_before(p=>[{type=>'TEXT', raw=>'added before'}]) |
122 | ->to_html, |
123 | 'added before<p class="first">Hi!</p>', |
124 | 'Got correct from add_before' |
125 | ); |
126 | |
127 | is( |
128 | HTML::Zoom |
129 | ->from_html(q[<p class="first">Hi!</p>]) |
130 | ->add_after(p=>[{type=>'TEXT', raw=>'added after'}]) |
131 | ->to_html, |
132 | '<p class="first">Hi!</p>added after', |
133 | 'Got correct from add_after' |
134 | ); |
135 | |
136 | is( |
137 | HTML::Zoom |
138 | ->from_html(q[<p class="first">Hi!</p>]) |
139 | ->prepend_content(p=>[{type=>'TEXT', raw=>'prepend_content'}]) |
140 | ->to_html, |
141 | '<p class="first">prepend_contentHi!</p>', |
142 | 'Got correct from prepend_content' |
143 | ); |
144 | |
145 | is( |
146 | HTML::Zoom |
147 | ->from_html(q[<p class="first">Hi!</p>]) |
148 | ->append_content(p=>[{type=>'TEXT', raw=>'append_content'}]) |
149 | ->to_html, |
150 | '<p class="first">Hi!append_content</p>', |
151 | 'Got correct from append_content' |
152 | ); |
153 | |
154 | { |
155 | my @body; |
156 | ok my $body = HTML::Zoom |
157 | ->from_html(q[<div>My Stuff Is Here</div>]) |
158 | ->collect_content(div => { into => \@body, passthrough => 1}) |
159 | ->to_html, 'Collected Content'; |
160 | |
161 | is $body, "<div>My Stuff Is Here</div>", "Got expected"; |
162 | |
163 | is( |
164 | HTML::Zoom->from_events(\@body)->to_html, |
165 | 'My Stuff Is Here', |
166 | 'Collected the right stuff', |
167 | ); |
168 | } |
169 | |
170 | like( |
171 | HTML::Zoom |
172 | ->from_html(q[<ul class="items"><li class="first">first</li><li class="second">second</li></ul>]) |
173 | ->repeat_content( |
174 | '.items' => [ |
175 | map { |
176 | my $v = $_; |
177 | sub { |
178 | $_->replace_content('.first' => $v) |
179 | ->replace_content('.second' => $v); |
180 | }, |
181 | } (111,222) |
182 | ] |
183 | ) |
184 | ->to_html, |
185 | qr[<ul class="items"><li class="first">111</li><li class="second">111</li><li class="first">222</li><li class="second">222</li></ul>], |
186 | 'Got correct list' |
187 | ); |
188 | |
189 | { |
190 | ok my $z = HTML::Zoom |
191 | ->from_html(q[<div>Life, whatever</div><p class="first">Hi!</p>]) |
192 | ->add_before(p=>'added before'); |
193 | |
194 | is $z->to_html, '<div>Life, whatever</div>added before<p class="first">Hi!</p>', |
195 | 'Got correct from add_before'; |
196 | } |
197 | |
198 | { |
199 | ok my $z = HTML::Zoom |
200 | ->from_html(q[<div>Life, whatever</div><p class="first">Hi!</p>]) |
201 | ->add_after(p=>'added after'); |
202 | |
203 | is $z->to_html, '<div>Life, whatever</div><p class="first">Hi!</p>added after', |
204 | 'Got correct from add_after'; |
205 | } |
206 | |
207 | { |
208 | ok my $z = HTML::Zoom |
209 | ->from_html(q[<div>Life, whatever</div><p class="first">Hi!</p>]) |
210 | ->append_content(p=>'appended'); |
211 | |
212 | is $z->to_html, '<div>Life, whatever</div><p class="first">Hi!appended</p>', |
213 | 'Got correct from append_content'; |
214 | } |
215 | |
216 | { |
217 | ok my $z = HTML::Zoom |
218 | ->from_html(q[<div>Life, whatever</div><p class="first">Hi!</p>]) |
219 | ->prepend_content(p=>'prepended'); |
220 | |
221 | |
222 | is $z->to_html, '<div>Life, whatever</div><p class="first">prependedHi!</p>', |
223 | 'Got correct from prepend_content'; |
224 | } |
225 | |
226 | { |
227 | ok my $z = HTML::Zoom |
228 | ->from_html(q[<ul><li>Test</li></ul>]) |
229 | ->select('ul') |
230 | ->repeat_content( |
231 | [ |
232 | sub { $_->select('li')->replace_content('Real Life1') }, |
233 | sub { $_->select('li')->replace_content('Real Life2') }, |
234 | sub { $_->select('li')->replace_content('Real Life3') }, |
235 | ], |
236 | ) |
237 | ->to_html; |
238 | |
239 | is $z, '<ul><li>Real Life1</li><li>Real Life2</li><li>Real Life3</li></ul>', |
240 | 'Got correct from repeat_content'; |
241 | } |
242 | |
243 | { |
244 | ok my $z = HTML::Zoom |
245 | ->from_html(q[<ul><li>Test</li></ul>]) |
246 | ->select('ul') |
247 | ->repeat_content([ |
248 | map { my $i = $_; +sub {$_->select('li')->replace_content("Real Life$i")} } (1,2,3) |
249 | ]) |
250 | ->to_html; |
251 | |
252 | is $z, '<ul><li>Real Life1</li><li>Real Life2</li><li>Real Life3</li></ul>', |
253 | 'Got correct from repeat_content'; |
254 | } |
255 | |
256 | |
257 | use HTML::Zoom::CodeStream; |
258 | sub code_stream (&) { |
259 | my $code = shift; |
260 | return sub { |
261 | HTML::Zoom::CodeStream->new({ |
262 | code => $code, |
263 | }); |
264 | } |
265 | } |
266 | |
267 | { |
268 | my @list = qw(foo bar baz); |
269 | ok my $z = HTML::Zoom |
270 | ->from_html(q[<ul><li>Test</li></ul>]) |
271 | ->select('ul') |
272 | ->repeat_content(code_stream { |
273 | if (my $name = shift @list) { |
274 | return sub { $_->select('li')->replace_content($name) }; |
275 | } else { |
276 | return |
277 | } |
278 | }) |
279 | ->to_html; |
280 | |
281 | is $z, '<ul><li>foo</li><li>bar</li><li>baz</li></ul>', |
282 | 'Got correct from repeat_content'; |
283 | } |
284 | |
285 | { |
286 | my @list = qw(foo bar baz); |
287 | ok my $z = HTML::Zoom |
288 | ->from_html(q[<ul><li>Test</li></ul>]) |
289 | ->select('ul') |
290 | ->repeat_content(sub { |
291 | HTML::Zoom::CodeStream->new({ |
292 | code => sub { |
293 | if (my $name = shift @list) { |
294 | return sub { $_->select('li')->replace_content($name) }; |
295 | } else { |
296 | return |
297 | } |
298 | } |
299 | }); |
300 | }) |
301 | ->to_html; |
302 | |
303 | is $z, '<ul><li>foo</li><li>bar</li><li>baz</li></ul>', |
304 | 'Got correct from repeat_content'; |
305 | } |
306 | |
6dc05a36 |
307 | { |
308 | ok my $dwim = HTML::Zoom |
309 | ->from_html(q[<ul><li class="foo"></li><li class="bar"></li></ul>]) |
310 | ->replace_content({ |
311 | 'li.foo' => ['foo'], |
312 | 'li.bar' => ['bar'], |
313 | })->to_html; |
314 | is $dwim, '<ul><li class="foo">foo</li><li class="bar">bar</li></ul>', |
c160b40d |
315 | 'Hashref selectors (via replace_content)'; |
3688f85a |
316 | } |
317 | |
318 | { |
319 | ok my $dwim = HTML::Zoom |
320 | ->from_html(q[<ul><li class="foo"></li><li class="bar"></li></ul>]) |
321 | ->set_attribute({ |
322 | 'li.foo' => [ class => 'baz' ], |
323 | 'li.bar' => [ class => 'qux' ], |
324 | })->to_html; |
325 | is $dwim, '<ul><li class="baz"></li><li class="qux"></li></ul>', |
c160b40d |
326 | 'Hashref selectors (via set_attribute)'; |
327 | } |
328 | |
329 | { |
330 | ok my $dwim = HTML::Zoom |
331 | ->from_html(q[<ul><li class="foo"></li><li class="bar"></li></ul>]) |
332 | ->select('ul')->collect({ |
333 | passthrough => 1, |
334 | filter => sub { |
335 | $_->set_attribute({ |
336 | 'li.foo' => [ class => 'baz' ], |
337 | 'li.bar' => [ class => 'qux' ], |
338 | }); |
339 | } |
340 | })->to_html; |
341 | is $dwim, '<ul><li class="baz"></li><li class="qux"></li></ul>', |
342 | 'Hashref selectors on codestream'; |
6dc05a36 |
343 | } |
344 | |
14e73b84 |
345 | { |
346 | ok my $dwim = HTML::Zoom |
347 | ->from_html(q[<ul><li class="foo" name="bar"></li><li class="bar"></li></ul>]) |
348 | ->select('ul')->collect({ |
349 | passthrough => 1, |
350 | filter => sub { |
351 | $_->set_attribute({ |
352 | 'li.foo' => [{ class => 'baz', name => 'moo', }], |
353 | 'li.bar' => [ class => 'qux' ], |
354 | }); |
355 | } |
356 | })->to_html; |
357 | is $dwim, '<ul><li class="baz" name="moo"></li><li class="qux"></li></ul>', |
358 | 'Hashref selectors with hashref attributes on codestream'; |
359 | } |
360 | |
94a3ddd9 |
361 | done_testing; |