X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDOM%2FTiny.pm;h=0eecb5e7b8d2b90060e3f332af8ea5e22ba7d7d0;hb=4b5e2513f7ea1ac132c1bb5c6732516d6cb1b917;hp=b2b789cdaa75fd12fe2f0b3749328cf10e587a41;hpb=3187745294af04bb4f3ece751c5d947f373039e5;p=catagits%2FDOM-Tiny.git diff --git a/lib/DOM/Tiny.pm b/lib/DOM/Tiny.pm index b2b789c..0eecb5e 100644 --- a/lib/DOM/Tiny.pm +++ b/lib/DOM/Tiny.pm @@ -16,7 +16,7 @@ use DOM::Tiny::_CSS; use DOM::Tiny::_HTML; use Scalar::Util qw(blessed weaken); -our $VERSION = '0.001'; +our $VERSION = '0.003'; sub new { my $class = shift; @@ -153,7 +153,7 @@ sub tag { return $self; } -sub tap { shift->DOM::Tiny::_Collection::tap(@_) } +sub tap { DOM::Tiny::_Collection::tap(@_) } sub text { shift->_all_text(0, @_) } @@ -167,7 +167,13 @@ sub val { my $self = shift; # "option" - return $self->{value} // $self->text if (my $tag = $self->tag) eq 'option'; + return defined($self->{value}) ? $self->{value} : $self->text + if (my $tag = $self->tag) eq 'option'; + + # "input" ("type=checkbox" and "type=radio") + my $type = $self->{type} || ''; + return defined $self->{value} ? $self->{value} : 'on' + if $tag eq 'input' && ($type eq 'radio' || $type eq 'checkbox'); # "textarea", "input" or "button" return $tag eq 'textarea' ? $self->text : $self->{value} if $tag ne 'select'; @@ -234,7 +240,7 @@ sub _content { my $tree = $self->tree; unless ($tree->[0] eq 'root' || $tree->[0] eq 'tag') { my $old = $self->content; - return $self->content($start ? "$old$new" : "$new$old"); + return $self->content($start ? $old . $new : $new . $old); } $start = $start ? ($#$tree + 1) : _start($tree); @@ -363,8 +369,8 @@ sub _text { sub _wrap { my ($self, $content, $new) = @_; - $content = 1 if (my $tree = $self->tree)->[0] eq 'root'; - $content = 0 if $tree->[0] ne 'root' && $tree->[0] ne 'tag'; + return $self if (my $tree = $self->tree)->[0] eq 'root' && !$content; + return $self if $tree->[0] ne 'root' && $tree->[0] ne 'tag' && $content; # Find innermost tag my $current; @@ -464,8 +470,8 @@ names are lowercased and selectors need to be lowercase as well. my $dom = DOM::Tiny->new('

Hi!

'); say $dom->at('p[id]')->text; -If XML processing instructions are found, the parser will automatically switch -into XML mode and everything becomes case-sensitive. +If an XML declaration is found, the parser will automatically switch into XML +mode and everything becomes case-sensitive. # XML semantics my $dom = DOM::Tiny->new('

Hi!

'); @@ -486,32 +492,34 @@ XML detection can also be disabled with the L method. L uses a CSS selector engine based on L. All CSS selectors that make sense for a standalone parser are supported. -=head2 * +=over + +=item Z<>* Any element. my $all = $dom->find('*'); -=head2 E +=item E An element of type C. my $title = $dom->at('title'); -=head2 E[foo] +=item E[foo] An C element with a C attribute. my $links = $dom->find('a[href]'); -=head2 E[foo="bar"] +=item E[foo="bar"] An C element whose C attribute value is exactly equal to C. my $case_sensitive = $dom->find('input[type="hidden"]'); my $case_sensitive = $dom->find('input[type=hidden]'); -=head2 E[foo="bar" i] +=item E[foo="bar" i] An C element whose C attribute value is exactly equal to any (ASCII-range) case-permutation of C. Note that this selector is @@ -525,7 +533,7 @@ This selector is part of L, which is still a work in progress. -=head2 E[foo~="bar"] +=item E[foo~="bar"] An C element whose C attribute value is a list of whitespace-separated values, one of which is exactly equal to C. @@ -533,7 +541,7 @@ values, one of which is exactly equal to C. my $foo = $dom->find('input[class~="foo"]'); my $foo = $dom->find('input[class~=foo]'); -=head2 E[foo^="bar"] +=item E[foo^="bar"] An C element whose C attribute value begins exactly with the string C. @@ -541,7 +549,7 @@ C. my $begins_with = $dom->find('input[name^="f"]'); my $begins_with = $dom->find('input[name^=f]'); -=head2 E[foo$="bar"] +=item E[foo$="bar"] An C element whose C attribute value ends exactly with the string C. @@ -549,20 +557,20 @@ C. my $ends_with = $dom->find('input[name$="o"]'); my $ends_with = $dom->find('input[name$=o]'); -=head2 E[foo*="bar"] +=item E[foo*="bar"] An C element whose C attribute value contains the substring C. my $contains = $dom->find('input[name*="fo"]'); my $contains = $dom->find('input[name*=fo]'); -=head2 E:root +=item E:root An C element, root of the document. my $root = $dom->at(':root'); -=head2 E:nth-child(n) +=item E:nth-child(n) An C element, the C child of its parent. @@ -571,7 +579,7 @@ An C element, the C child of its parent. my $even = $dom->find('div:nth-child(even)'); my $top3 = $dom->find('div:nth-child(-n+3)'); -=head2 E:nth-last-child(n) +=item E:nth-last-child(n) An C element, the C child of its parent, counting from the last one. @@ -580,7 +588,7 @@ An C element, the C child of its parent, counting from the last one. my $even = $dom->find('div:nth-last-child(even)'); my $bottom3 = $dom->find('div:nth-last-child(-n+3)'); -=head2 E:nth-of-type(n) +=item E:nth-of-type(n) An C element, the C sibling of its type. @@ -589,7 +597,7 @@ An C element, the C sibling of its type. my $even = $dom->find('div:nth-of-type(even)'); my $top3 = $dom->find('div:nth-of-type(-n+3)'); -=head2 E:nth-last-of-type(n) +=item E:nth-last-of-type(n) An C element, the C sibling of its type, counting from the last one. @@ -598,109 +606,111 @@ An C element, the C sibling of its type, counting from the last one. my $even = $dom->find('div:nth-last-of-type(even)'); my $bottom3 = $dom->find('div:nth-last-of-type(-n+3)'); -=head2 E:first-child +=item E:first-child An C element, first child of its parent. my $first = $dom->find('div p:first-child'); -=head2 E:last-child +=item E:last-child An C element, last child of its parent. my $last = $dom->find('div p:last-child'); -=head2 E:first-of-type +=item E:first-of-type An C element, first sibling of its type. my $first = $dom->find('div p:first-of-type'); -=head2 E:last-of-type +=item E:last-of-type An C element, last sibling of its type. my $last = $dom->find('div p:last-of-type'); -=head2 E:only-child +=item E:only-child An C element, only child of its parent. my $lonely = $dom->find('div p:only-child'); -=head2 E:only-of-type +=item E:only-of-type An C element, only sibling of its type. my $lonely = $dom->find('div p:only-of-type'); -=head2 E:empty +=item E:empty An C element that has no children (including text nodes). my $empty = $dom->find(':empty'); -=head2 E:checked +=item E:checked A user interface element C which is checked (for instance a radio-button or checkbox). my $input = $dom->find(':checked'); -=head2 E.warning +=item E.warning An C element whose class is "warning". my $warning = $dom->find('div.warning'); -=head2 E#myid +=item E#myid An C element with C equal to "myid". my $foo = $dom->at('div#foo'); -=head2 E:not(s) +=item E:not(s) An C element that does not match simple selector C. my $others = $dom->find('div p:not(:first-child)'); -=head2 E F +=item E F An C element descendant of an C element. my $headlines = $dom->find('div h1'); -=head2 E E F +=item E E F An C element child of an C element. my $headlines = $dom->find('html > body > div > h1'); -=head2 E + F +=item E + F An C element immediately preceded by an C element. my $second = $dom->find('h1 + h2'); -=head2 E ~ F +=item E ~ F An C element preceded by an C element. my $second = $dom->find('h1 ~ h2'); -=head2 E, F, G +=item E, F, G Elements of type C, C and C. my $headlines = $dom->find('h1, h2, h3'); -=head2 E[foo=bar][bar=baz] +=item E[foo=bar][bar=baz] An C element whose attributes match all following attribute selectors. my $links = $dom->find('a[foo^=b][foo$=ar]'); +=back + =head1 OPERATORS L overloads the following operators. @@ -777,7 +787,7 @@ objects. All selectors listed in L are supported. $dom = $dom->append('

I ♥ DOM::Tiny!

'); -Append HTML/XML fragment to this node. +Append HTML/XML fragment to this node (for all node types other than C). # "

Test

123

" $dom->parse('

Test

') @@ -810,8 +820,8 @@ node's content. my $result = $dom->at('div ~ p'); Find first descendant element of this element matching the CSS selector and -return it as a L object or return C if none could be found. -All selectors listed in L are supported. +return it as a L object, or C if none could be found. All +selectors listed in L are supported. # Find first element with "svg" namespace definition my $namespace = $dom->at('[xmlns\:svg]')->{'xmlns:svg'}; @@ -967,7 +977,7 @@ L are supported. my $namespace = $dom->namespace; -Find this element's namespace or return C if none could be found. +Find this element's namespace, or return C if none could be found. # Find namespace for an element with namespace prefix my $namespace = $dom->at('svg > svg\:circle')->namespace; @@ -979,8 +989,8 @@ Find this element's namespace or return C if none could be found. my $sibling = $dom->next; -Return L object for next sibling element or C if there are no -more siblings. +Return L object for next sibling element, or C if there are +no more siblings. # "

123

" $dom->parse('

Test

123

')->at('h1')->next; @@ -989,7 +999,7 @@ more siblings. my $sibling = $dom->next_node; -Return L object for next sibling node or C if there are no +Return L object for next sibling node, or C if there are no more siblings. # "456" @@ -1004,8 +1014,11 @@ more siblings. my $parent = $dom->parent; -Return L object for parent of this node or C if this node has -no parent. +Return L object for parent of this node, or C if this node +has no parent. + + # "Test" + $dom->parse('

Test

')->at('i')->parent; =head2 parse @@ -1014,7 +1027,7 @@ no parent. Parse HTML/XML fragment. # Parse XML - my $dom = DOM::Tiny->new->xml(1)->parse($xml); + my $dom = DOM::Tiny->new->xml(1)->parse('I ♥ DOM::Tiny!'); =head2 preceding @@ -1042,7 +1055,7 @@ before this node as L objects. $dom = $dom->prepend('

I ♥ DOM::Tiny!

'); -Prepend HTML/XML fragment to this node. +Prepend HTML/XML fragment to this node (for all node types other than C). # "

Test

123

" $dom->parse('

123

') @@ -1074,7 +1087,7 @@ node's content. my $sibling = $dom->previous; -Return L object for previous sibling element or C if there +Return L object for previous sibling element, or C if there are no more siblings. # "

Test

" @@ -1084,7 +1097,7 @@ are no more siblings. my $sibling = $dom->previous_node; -Return L object for previous sibling node or C if there are +Return L object for previous sibling node, or C if there are no more siblings. # "123" @@ -1220,13 +1233,13 @@ C, C or C. my $value = $dom->val; Extract value from form element (such as C