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"xml"> 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"SELECTORS"> are supported.
$dom = $dom->append('