merge allocate
Simon Elliott [Wed, 20 Feb 2013 14:51:45 +0000 (14:51 +0000)]
lib/HTML/Zoom.pm
maint/Makefile.PL.include
t/bugs/void.t [new file with mode: 0644]
t/parse_cdata.t [new file with mode: 0644]
t/selectors.t

index 26ad101..208bf77 100644 (file)
@@ -8,7 +8,7 @@ use HTML::Zoom::Transform;
 use HTML::Zoom::TransformBuilder;
 use Scalar::Util ();
 
-our $VERSION = '0.009005';
+our $VERSION = '0.009007_1';
 
 $VERSION = eval $VERSION;
 
@@ -643,6 +643,12 @@ zoom instance with that as the source HTML to be transformed.
 
 Convenience method - slurps the contents of $file and calls from_html with it.
 
+=head2 from_events
+
+  my $zoom = HTML::Zoom->from_events($evt);
+
+Create a new Zoom object from collected events
+
 =head2 to_stream
 
   my $stream = $zoom->to_stream;
@@ -691,6 +697,14 @@ sugar, the following is entirely equivalent:
 
   my $z2 = $sub->($z1);
 
+=head2 apply_if
+
+  my $z2 = $z1->apply_if($cond, sub {
+    $_->select('div')->replace_content('I AM A DIV!') })
+  });
+
+->apply but will only run the tranform if $cond is true
+
 =head2 to_html
 
   my $html = $zoom->to_html;
@@ -775,6 +789,8 @@ John Napiorkowski
 
 Robert Buels
 
+David Dorward
+
 =head1 COPYRIGHT
 
 Copyright (c) 2010-2011 the HTML::Zoom L</AUTHOR> and L</CONTRIBUTORS>
index f991a7a..3f4e47a 100644 (file)
@@ -1,3 +1,5 @@
+BEGIN { -e 'Distar' or system("git clone git://git.shadowcat.co.uk/p5sagit/Distar.git") }
+use lib 'Distar/lib';
 use Distar;
 
 author 'mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>';
diff --git a/t/bugs/void.t b/t/bugs/void.t
new file mode 100644 (file)
index 0000000..520f15c
--- /dev/null
@@ -0,0 +1,34 @@
+use strictures 1;
+use Test::More skip_all => 'TODO test';
+
+use HTML::Zoom;
+
+my $tmpl = <<END;
+<body>
+  <input class="main"/>
+</body>
+END
+
+my $tmpl2 = <<END;
+<body>
+  <div>cluck</div><input class="main"/>
+</body>
+END
+
+my $z = HTML::Zoom->from_html($tmpl);
+
+my $count = 0;
+$z->select('input')->collect({
+  filter => sub { $count++; $_ },
+  passthrough => 1,
+})->run;
+
+is($count, 1,"collect on void");
+
+is(
+  $z->select('input')
+  ->add_before(\"<div>cluck</div>")
+  ->to_html, $tmpl2,
+"added before void");
+
+done_testing;
diff --git a/t/parse_cdata.t b/t/parse_cdata.t
new file mode 100644 (file)
index 0000000..9ad76ca
--- /dev/null
@@ -0,0 +1,97 @@
+use strictures 1;
+use HTML::Zoom;
+use Test::More skip_all => "Totally doesn't work yet";
+
+# Test that contant of elements defined as containing intrinsic CDATA are not
+# selected as elements
+
+# NB: This tests HTML parsing rules. XHTML is different.
+
+my $template = <<HTML;
+<!DOCTYPE html>
+<html lang=en-gb>
+    <meta charset=utf-8>
+    <title>Test</title>
+    <style>
+        /* <textarea>Unmodified</textarea> */
+    </style>
+    </head>
+    <body>
+        <p>Unmodified</p>
+        <textarea>Unmodified</textarea>
+        <script>
+            if (1) {
+                document.write('<p>');
+            } else {
+                document.write('<div>');
+            }
+            document.write('hello, world');
+            if (1) {
+                document.write('</p>');
+            } else {
+                document.write('</div>');
+            }
+        </script>
+HTML
+
+my $expected_p = <<HTML;
+<!DOCTYPE html>
+<html lang=en-gb>
+    <meta charset=utf-8>
+    <title>Test</title>
+    <style>
+        /* <textarea>Unmodified</textarea> */
+    </style>
+    </head>
+    <body>
+        <p>Unmodified</p>
+        <textarea>Unmodified</textarea>
+        <script>
+            if (1) {
+                document.write('<p>');
+            } else {
+                document.write('<div>');
+            }
+            document.write('hello, world');
+            if (1) {
+                document.write('</p>');
+            } else {
+                document.write('</div>');
+            }
+        </script>
+HTML
+
+my $expected_t = <<HTML;
+<!DOCTYPE html>
+<html lang=en-gb>
+    <meta charset=utf-8>
+    <title>Test</title>
+    <style>
+        /* <textarea>Unmodified</textarea> */
+    </style>
+    </head>
+    <body>
+        <p>Unmodified</p>
+        <textarea>Replaced</textarea>
+        <script>
+            if (1) {
+                document.write('<p>');
+            } else {
+                document.write('<div>');
+            }
+            document.write('hello, world');
+            if (1) {
+                document.write('</p>');
+            } else {
+                document.write('</div>');
+            }
+        </script>
+HTML
+
+my $replaced_p = HTML::Zoom->from_html($template)->select('p')->replace_content('Replaced')->to_html;
+is($replaced_p, $expected_p, "Script element parsed as CDATA");
+
+my $replaced_t = HTML::Zoom->from_html($template)->select('textarea')->replace_content('Replaced')->to_html;
+is($replaced_t, $expected_t, "Style element parsed as CDATA");
+
+done_testing;
index 5b6a60a..c8b5b11 100644 (file)
@@ -72,6 +72,17 @@ is( HTML::Zoom->from_html('<div frew="yo"></div>'.$stub)
     '<div frew="yo">grg</div>'.$stub,
     'E[attr=val] works' );
 
+{
+    local $TODO = 'mixed-case attribute names are broken';
+    # el[Attr=foo]
+    is( HTML::Zoom->from_html('<div FreW="yo"></div>'.$stub)
+        ->select('div[FreW=yo]')
+        ->replace_content('grg')
+        ->to_html,
+        '<div FreW="yo">grg</div>'.$stub,
+        'E[attr=val] works with mixed-case attribute names' );
+}
+
 # el[attr=foo\.bar]
 is( HTML::Zoom->from_html('<div frew="yo.yo"></div>'.$stub)
     ->select('div[frew=yo\.yo]')