BEGIN { use_ok(
'HTML::Manipulator'
) };
my
(
$before
,
$after
,
$testname
,
$data
,
$one
,
$two
,
$link
);
my
(
@list
);
$testname
=
'replace a simple div without nested tags'
;
$before
=
<<HTML;
<html>
<body>
<div id=simple>
XXXXXXX
</div>
</body>
</html>
HTML
$after
=
<<HTML;
<html>
<body>
<div id=simple>$testname</div>
</body>
</html>
HTML
is ( HTML::Manipulator::replace(
$before
,
simple
=>
$testname
),
$after
,
$testname
);
$testname
=
'remove a simple div without nested tags'
;
$after
=
<<HTML;
<html>
<body>
</body>
</html>
HTML
is ( HTML::Manipulator::remove(
$before
,
qw[ simple ]
),
$after
,
$testname
);
$testname
=
'insert_before_begin with a simple div without nested tags'
;
$after
=
<<HTML;
<html>
<body>
$testname<div id=simple>
XXXXXXX
</div>
</body>
</html>
HTML
is ( HTML::Manipulator::insert_before_begin(
$before
,
simple
=>
$testname
),
$after
,
$testname
);
$testname
=
'insert_after_end with a simple div without nested tags'
;
$after
=
<<HTML;
<html>
<body>
<div id=simple>
XXXXXXX
</div>$testname
</body>
</html>
HTML
is ( HTML::Manipulator::insert_after_end(
$before
,
simple
=>
$testname
),
$after
,
$testname
);
$testname
=
'insert_before_end with a simple div without nested tags'
;
$after
=
<<HTML;
<html>
<body>
<div id=simple>
XXXXXXX
$testname</div>
</body>
</html>
HTML
is ( HTML::Manipulator::insert_before_end(
$before
,
simple
=>
$testname
),
$after
,
$testname
);
$testname
=
'insert_after_begin with a simple div without nested tags'
;
$after
=
<<HTML;
<html>
<body>
<div id=simple>$testname
XXXXXXX
</div>
</body>
</html>
HTML
is ( HTML::Manipulator::insert_after_begin(
$before
,
simple
=>
$testname
),
$after
,
$testname
);
$testname
=
'replace a div with nested tags (but no divs) and uppercase tags'
;
$before
=
<<HTML;
<html>
<body>
<div id=simple>
<a href='link'>link</a><b>text<i>yyy</b>
</div>
</body>
</html>
HTML
$after
=
<<HTML;
<html>
<body>
<div id=simple>$testname</div>
</body>
</html>
HTML
is ( HTML::Manipulator::replace(
uc
$before
,
SIMPLE
=>
uc
$testname
),
uc
$after
,
$testname
);
$testname
=
'remove a div with nested tags (but no divs) and uppercase tags'
;
$after
=
<<HTML;
<html>
<body>
</body>
</html>
HTML
is ( HTML::Manipulator::remove(
uc
$before
,
qw[ SIMPLE ]
),
uc
(
$after
),
$testname
);
$testname
=
'replace a link href and text'
;
$before
=
<<HTML;
<html>
<body>
<div id=simple>
<a Href='link' id=link>link</a><b>text<i>yyy</b>
</div>
</body>
</html>
HTML
$after
=
<<HTML;
<html>
<body>
<div id=simple>
<a href='new href' id='link'>$testname</a><b>text<i>yyy</b>
</div>
</body>
</html>
HTML
is ( HTML::Manipulator::replace(
$before
,
link
=> {
HREF
=>
'new href'
,
_content
=>
$testname
}
),
$after
,
$testname
);
$testname
=
'replace two divs and a nested link'
;
$before
=
<<HTML;
<html>
<body>
<div id=one>
<a href='link' id=link>link</a><b>text<i>yyy</b>
</div>
<div id=two>
<a href='link' id=link>link</a><b>text<i>yyy</b>
</div>
</body>
</html>
HTML
$after
=
<<HTML;
<html>
<body>
<div id=one>$testname</div>
<div id=two>$testname$testname</div>
</body>
</html>
HTML
is ( HTML::Manipulator::replace(
$before
,
link
=> {
href
=>
'new href'
,
_content
=>
$testname
},
one
=>
$testname
,
two
=>
$testname
.
$testname
),
$after
,
$testname
);
$testname
=
'remove two divs and a nested link'
;
$after
=
<<HTML;
<html>
<body>
</body>
</html>
HTML
is ( HTML::Manipulator::remove(
$before
,
qw[ link one two ]
),
$after
,
$testname
);
$testname
=
'insert_before_begin with two divs and a nested link'
;
$after
=
<<HTML;
<html>
<body>
$testname one<div id=one>
$testname link<a href='link' id=link>link</a><b>text<i>yyy</b>
</div>
$testname two<div id=two>
<a href='link' id=link>link</a><b>text<i>yyy</b>
</div>
</body>
</html>
HTML
is ( HTML::Manipulator::insert_before_begin(
$before
,
link
=>
"$testname link"
,
one
=>
"$testname one"
,
two
=>
"$testname two"
),
$after
,
$testname
);
$testname
=
'insert_after_end with two divs and a nested link'
;
$after
=
<<HTML;
<html>
<body>
<div id=one>
<a href='link' id=link>link</a>$testname link<b>text<i>yyy</b>
</div>$testname one
<div id=two>
<a href='link' id=link>link</a><b>text<i>yyy</b>
</div>$testname two
</body>
</html>
HTML
is ( HTML::Manipulator::insert_after_end(
$before
,
link
=>
"$testname link"
,
one
=>
"$testname one"
,
two
=>
"$testname two"
),
$after
,
$testname
);
$testname
=
'insert_before_end with two divs and a nested link'
;
$after
=
<<HTML;
<html>
<body>
<div id=one>
<a href='link' id=link>link$testname link</a><b>text<i>yyy</b>
$testname one</div>
<div id=two>
<a href='link' id=link>link</a><b>text<i>yyy</b>
$testname two</div>
</body>
</html>
HTML
is ( HTML::Manipulator::insert_before_end(
$before
,
link
=>
"$testname link"
,
one
=>
"$testname one"
,
two
=>
"$testname two"
),
$after
,
$testname
);
$testname
=
'insert_after_begin with two divs and a nested link'
;
$after
=
<<HTML;
<html>
<body>
<div id=one>$testname one
<a href='link' id=link>$testname linklink</a><b>text<i>yyy</b>
</div>
<div id=two>$testname two
<a href='link' id=link>link</a><b>text<i>yyy</b>
</div>
</body>
</html>
HTML
is ( HTML::Manipulator::insert_after_begin(
$before
,
link
=>
"$testname link"
,
one
=>
"$testname one"
,
two
=>
"$testname two"
),
$after
,
$testname
);
$testname
=
'replace a div with a nested div'
;
$before
=
<<HTML;
<html>
<body>
<div id=one>
<!-- a comment -->
<div id=two>
<a href='link' id=link>link</a><b>text<i>yyy</b>
</div>
blah blah blah
</div>
</body>
</html>
HTML
$after
=
<<HTML;
<html>
<body>
<div id=one>$testname</div>
</body>
</html>
HTML
is ( HTML::Manipulator::replace(
$before
,
link
=> {
href
=>
'new href'
,
_content
=>
$testname
},
one
=>
$testname
,
two
=>
$testname
.
$testname
),
$after
,
$testname
);
is ( HTML::Manipulator::extract_content(
$after
,
'one'
)
,
$testname
,
'extract a div content'
);
$testname
=
'extract a link with attributes'
;
$data
= HTML::Manipulator::extract(
$before
,
'link'
);
ok ( (
ref
$data
and (
$data
->{href} eq
'link'
)
and (
$data
->{_content} eq
'link'
))
,
$testname
);
$testname
=
'extract all element IDs'
;
$data
= HTML::Manipulator::extract_all_ids(
$before
);
ok ( (
ref
$data
and (
delete
$data
->{
link
} eq
'a'
)
and (
delete
$data
->{one} eq
'div'
)
and (
delete
$data
->{two} eq
'div'
)
and not
keys
%$data
)
,
$testname
);
$testname
=
'extract the content of all IDs'
;
$data
= HTML::Manipulator::extract_all_content(
$before
);
$two
=
"\n<a href='link' id=link>link</a><b>text<i>yyy</b>\n"
;
$one
=
"\n<!-- a comment -->\n<div id=two>$two</div>\nblah blah blah\n"
;
ok ( (
ref
$data
and (
delete
$data
->{
link
} eq
'link'
)
and (
delete
$data
->{one} eq
$one
)
and (
delete
$data
->{two} eq
$two
)
and not
keys
%$data
)
,
$testname
);
$testname
=
'extract contents from HTML without IDs'
;
$data
= HTML::Manipulator::extract_all(
'not really HTML'
);
is (
keys
%$data
, 0,
$testname
);
$testname
=
'extract the content of all IDs from a file'
;
open
IN,
't/1.html'
or
die
"could not open t/1.html: $!"
;
$data
= HTML::Manipulator::extract_all_content(
*IN
);
close
IN;
$two
=
"\n<a href='link' id=link>link</a><b>text<i>yyy</b>\n"
;
$one
=
"\n<div id=two>$two</div>\nblah blah blah\n"
;
ok ( (
ref
$data
and (
delete
$data
->{
link
} eq
'link'
)
and (
delete
$data
->{one} eq
$one
)
and (
delete
$data
->{two} eq
$two
)
and not
keys
%$data
)
,
$testname
);
$testname
=
'handle quotation marks in attributes'
;
$before
=
<<HTML;
<a href='link' id=link>link</a><b>text<i>yyy</b>
HTML
$after
=
<<HTML;
<a href="new 'href" id='link'>$testname</a><b>text<i>yyy</b>
HTML
is ( HTML::Manipulator::replace(
$before
,
link
=> {
href
=>
"new 'href"
,
_content
=>
$testname
}
),
$after
,
$testname
);
$testname
=
'extract the document title'
;
$before
=
<<HTML;
<title>$testname</title>
HTML
is ( HTML::Manipulator::extract_title(
$before
),
$testname
,
$testname
);
$testname
=
'replace the document title'
;
$after
=
<<HTML;
<title>$testname</title>
HTML
is ( HTML::Manipulator::replace_title(
$before
,
$testname
),
$after
,
$testname
);
$testname
=
'extract some element IDs using regular expressions'
;
$before
=
<<HTML;
<html>
<body>
<div id=one>
<div id=two>
<a href='link' id=link>link</a><b>text<i>yyy</b>
</div>
blah blah blah
</div>
</body>
</html>
HTML
$data
= HTML::Manipulator::extract_all_ids(
$before
,
qr/LINK/
i,
qr/no match/
,
'one'
);
ok ( (
ref
$data
and (
delete
$data
->{
link
} eq
'a'
)
and (
delete
$data
->{one} eq
'div'
)
and not
keys
%$data
)
,
$testname
);
$testname
=
'extract some elements matched by regular expressions'
;
$data
= HTML::Manipulator::extract_all_content(
$before
,
qr/o../
,
qr/LINK/
i);
$two
=
"\n<a href='link' id=link>link</a><b>text<i>yyy</b>\n"
;
$one
=
"\n<div id=two>$two</div>\nblah blah blah\n"
;
ok ( (
ref
$data
and (
delete
$data
->{
link
} eq
'link'
)
and (
delete
$data
->{one} eq
$one
)
and not
keys
%$data
)
,
$testname
);
$testname
=
'extract a section marked by comments'
;
$two
=
'This region is editable'
;
$one
=
"<b id=check>$two</b>"
;
$before
=
<<HTML;
<p id=test>
<!-- #BeginEditable "content" -->$one<!-- #EndEditable -->
</p>
<!-- another comment -->
HTML
$data
= HTML::Manipulator::extract_content(
$before
,
'<!-- #BeginEditable "content" -->'
);
is (
$data
,
$one
,
$testname
);
$testname
=
'extract a section marked by comments with nesting'
;
$data
= HTML::Manipulator::extract_all_content(
$before
,
'<!--#BEGINEDITABLE"content"-->'
,
'test'
,
'check'
);
ok ( (
ref
$data
and (
delete
$data
->{test} eq
qq{\n<!-- #BeginEditable "content" -->$one<!-- #EndEditable -->\n}
)
and (
delete
$data
->{check} eq
$two
)
and (
delete
$data
->{
'<!--#BEGINEDITABLE"content"-->'
} eq
$one
)
and not
keys
%$data
)
,
$testname
);
$testname
=
'extract all comments'
;
@list
= HTML::Manipulator::extract_all_comments(
$before
);
ok (
((
$list
[0] eq
'<!-- #BeginEditable "content" -->'
)
and (
$list
[1] eq
'<!-- #EndEditable -->'
)
and (
$list
[2] eq
'<!-- another comment -->'
)
and
@list
== 3),
$testname
);
$testname
=
'extract all comments (with filter)'
;
@list
= HTML::Manipulator::extract_all_comments(
$before
,
'#BEGINEDITABLE "CONTENT"'
,
qr/Another/
i);
ok (((
$list
[0] eq
'<!-- #BeginEditable "content" -->'
)
and (
$list
[1] eq
'<!-- another comment -->'
)
and
@list
== 2),
$testname
);
$testname
=
'replace a section marked by comments'
;
$after
=
$before
;
$after
=~ s/
$one
/
$testname
/;
$data
= HTML::Manipulator::replace(
$before
,
'<!-- #BeginEditable "content" -->'
=>
$testname
);
is (
$data
,
$after
,
$testname
);
$testname
=
'remove a section marked by comments'
;
$after
=
<<HTML;
<p id=test>
</p>
<!-- another comment -->
HTML
$data
= HTML::Manipulator::remove(
$before
,
'<!-- #BeginEditable "content" -->'
);
is (
$data
,
$after
,
$testname
);
$testname
=
'insert_before_begin with a section marked by comments and a nested div'
;
$before
=
<<HTML;
<p id=test>
<!-- #BeginEditable "content" --><p>blah</p>
<div id='nested'><i>$testname</i></div><!-- #EndEditable -->
</p>
<!-- another comment -->
<div id='three'>hey</div>
HTML
$after
=
<<HTML;
<p id=test>
ONE<!-- #BeginEditable "content" --><p>blah</p>
TWO<div id='nested'><i>$testname</i></div><!-- #EndEditable -->
</p>
<!-- another comment -->
THREE<div id='three'>hey</div>
HTML
$data
= HTML::Manipulator::insert_before_begin(
$before
,
'<!-- #BeginEditable "content" -->'
=>
'ONE'
,
nested
=>
'TWO'
,
three
=>
'THREE'
);
is (
$data
,
$after
,
$testname
);
$testname
=
'insert_after_end with a section marked by comments and a nested div'
;
$before
=
<<HTML;
<p id=test>
<!-- #BeginEditable "content" --><p>blah</p>
<div id='nested'><i>$testname</i></div><!-- #EndEditable -->
</p>
<!-- another comment -->
<div id='three'>hey</div>
HTML
$after
=
<<HTML;
<p id=test>
<!-- #BeginEditable "content" --><p>blah</p>
<div id='nested'><i>$testname</i></div>TWO<!-- #EndEditable -->ONE
</p>
<!-- another comment -->
<div id='three'>hey</div>THREE
HTML
$data
= HTML::Manipulator::insert_after_end(
$before
,
'<!-- #BeginEditable "content" -->'
=>
'ONE'
,
nested
=>
'TWO'
,
three
=>
'THREE'
);
is (
$data
,
$after
,
$testname
);
$testname
=
'insert_before_end with a section marked by comments and a nested div'
;
$before
=
<<HTML;
<p id=test>
<!-- #BeginEditable "content" --><p>blah</p>
<div id='nested'><i>$testname</i></div><!-- #EndEditable -->
</p>
<!-- another comment -->
<div id='three'>hey</div>
HTML
$after
=
<<HTML;
<p id=test>
<!-- #BeginEditable "content" --><p>blah</p>
<div id='nested'><i>$testname</i>TWO</div>ONE<!-- #EndEditable -->
</p>
<!-- another comment -->
<div id='three'>heyTHREE</div>
HTML
$data
= HTML::Manipulator::insert_before_end(
$before
,
'<!-- #BeginEditable "content" -->'
=>
'ONE'
,
nested
=>
'TWO'
,
three
=>
'THREE'
);
is (
$data
,
$after
,
$testname
);
$testname
=
'insert_before_end with a section marked by comments'
;
$before
=
<<HTML;
<p id=test>
<!-- #BeginEditable "content" -->$one<!-- #EndEditable -->
</p>
<!-- another comment -->
HTML
$after
=
<<HTML;
<p id=test>
<!-- #BeginEditable "content" -->${one}BEFORE_END<!-- #EndEditable -->
BEFORE_END</p>
<!-- another comment -->
HTML
$data
= HTML::Manipulator::insert_before_end(
$before
,
test
=>
'BEFORE_END'
,
'<!-- #BeginEditable "CONtent" -->'
=>
'BEFORE_END'
);
is (
$data
,
$after
,
$testname
);
$testname
=
'insert_after_begin with a section marked by comments and a nested div'
;
$before
=
<<HTML;
<p id=test>
<!-- #BeginEditable "content" --><p>blah</p>
<div id='nested'><i>$testname</i></div><!-- #EndEditable -->
</p>
<!-- another comment -->
<div id='three'>hey</div>
HTML
$after
=
<<HTML;
<p id=test>
<!-- #BeginEditable "content" -->ONE<p>blah</p>
<div id='nested'>TWO<i>$testname</i></div><!-- #EndEditable -->
</p>
<!-- another comment -->
<div id='three'>THREEhey</div>
HTML
$data
= HTML::Manipulator::insert_after_begin(
$before
,
'<!-- #BeginEditable "content" -->'
=>
'ONE'
,
nested
=>
'TWO'
,
three
=>
'THREE'
);
is (
$data
,
$after
,
$testname
);
$testname
=
'insert adjacent'
;
$before
=
<<HTML;
<p id=test>
<!-- #BeginEditable "content" -->$one<!-- #EndEditable -->
</p>
<!-- another comment -->
HTML
$after
=
<<HTML;
BEFORE_BEGIN<p id=test>AFTER_BEGIN
BEFORE_BEGIN<!-- #BeginEditable "content" -->AFTER_BEGIN${one}BEFORE_END<!-- #EndEditable -->AFTER_END
BEFORE_END</p>AFTER_END
<!-- another comment -->
HTML
$before
= HTML::Manipulator::insert_before_begin(
$before
,
test
=>
'BEFORE_BEGIN'
,
'<!-- #BeginEditable "content" -->'
=>
'BEFORE_BEGIN'
);
$before
= HTML::Manipulator::insert_after_begin(
$before
,
test
=>
'AFTER_BEGIN'
,
'<!-- #BeginEditable "content"-->'
=>
'AFTER_BEGIN'
);
$before
= HTML::Manipulator::insert_before_end(
$before
,
test
=>
'BEFORE_END'
,
'<!-- #BeginEditable "CONtent" -->'
=>
'BEFORE_END'
);
is ( HTML::Manipulator::insert_after_end(
$before
,
test
=>
'AFTER_END'
,
'<!-- # Begineditable "content"-->'
=>
'AFTER_END'
) ,
$after
,
$testname
);