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';
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);
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;
my $dom = DOM::Tiny->new('<P ID="greeting">Hi!</P>');
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('<?xml version="1.0"?><P ID="greeting">Hi!</P>');
$dom = $dom->append('<p>I ♥ DOM::Tiny!</p>');
-Append HTML/XML fragment to this node.
+Append HTML/XML fragment to this node (for all node types other than C<root>).
# "<div><h1>Test</h1><h2>123</h2></div>"
$dom->parse('<div><h1>Test</h1></div>')
my $result = $dom->at('div ~ p');
Find first descendant element of this element matching the CSS selector and
-return it as a L<DOM::Tiny> object or return C<undef> if none could be found.
-All selectors listed in L</"SELECTORS"> are supported.
+return it as a L<DOM::Tiny> object, or C<undef> if none could be found. All
+selectors listed in L</"SELECTORS"> are supported.
# Find first element with "svg" namespace definition
my $namespace = $dom->at('[xmlns\:svg]')->{'xmlns:svg'};
my $namespace = $dom->namespace;
-Find this element's namespace or return C<undef> if none could be found.
+Find this element's namespace, or return C<undef> if none could be found.
# Find namespace for an element with namespace prefix
my $namespace = $dom->at('svg > svg\:circle')->namespace;
my $sibling = $dom->next;
-Return L<DOM::Tiny> object for next sibling element or C<undef> if there are no
-more siblings.
+Return L<DOM::Tiny> object for next sibling element, or C<undef> if there are
+no more siblings.
# "<h2>123</h2>"
$dom->parse('<div><h1>Test</h1><h2>123</h2></div>')->at('h1')->next;
my $sibling = $dom->next_node;
-Return L<DOM::Tiny> object for next sibling node or C<undef> if there are no
+Return L<DOM::Tiny> object for next sibling node, or C<undef> if there are no
more siblings.
# "456"
my $parent = $dom->parent;
-Return L<DOM::Tiny> object for parent of this node or C<undef> if this node has
-no parent.
+Return L<DOM::Tiny> object for parent of this node, or C<undef> if this node
+has no parent.
+
+ # "<b><i>Test</i></b>"
+ $dom->parse('<p><b><i>Test</i></b></p>')->at('i')->parent;
=head2 parse
Parse HTML/XML fragment.
# Parse XML
- my $dom = DOM::Tiny->new->xml(1)->parse($xml);
+ my $dom = DOM::Tiny->new->xml(1)->parse('<foo>I ♥ DOM::Tiny!</foo>');
=head2 preceding
$dom = $dom->prepend('<p>I ♥ DOM::Tiny!</p>');
-Prepend HTML/XML fragment to this node.
+Prepend HTML/XML fragment to this node (for all node types other than C<root>).
# "<div><h1>Test</h1><h2>123</h2></div>"
$dom->parse('<div><h2>123</h2></div>')
my $sibling = $dom->previous;
-Return L<DOM::Tiny> object for previous sibling element or C<undef> if there
+Return L<DOM::Tiny> object for previous sibling element, or C<undef> if there
are no more siblings.
# "<h1>Test</h1>"
my $sibling = $dom->previous_node;
-Return L<DOM::Tiny> object for previous sibling node or C<undef> if there are
+Return L<DOM::Tiny> object for previous sibling node, or C<undef> if there are
no more siblings.
# "123"
my $value = $dom->val;
Extract value from form element (such as C<button>, C<input>, C<option>,
-C<select> and C<textarea>) or return C<undef> if this element has no value. In
+C<select> and C<textarea>), or return C<undef> if this element has no value. In
the case of C<select> with C<multiple> attribute, find C<option> elements with
-C<selected> attribute and return an array reference with all values or C<undef>
-if none could be found.
+C<selected> attribute and return an array reference with all values, or
+C<undef> if none could be found.
# "a"
- $dom->parse('<input name="test" value="a">')->at('input')->val;
+ $dom->parse('<input name=test value=a>')->at('input')->val;
# "b"
$dom->parse('<textarea>b</textarea>')->at('textarea')->val;
$dom->parse('<select multiple><option selected>e</option></select>')
->at('select')->val->[0];
+ # "on"
+ $dom->parse('<input name=test type=checkbox>')->at('input')->val;
+
=head2 wrap
$dom = $dom->wrap('<div></div>');
-Wrap HTML/XML fragment around this node, placing it as the last child of the
-first innermost element.
+Wrap HTML/XML fragment around this node (for all node types other than C<root>),
+placing it as the last child of the first innermost element.
# "<p>123<b>Test</b></p>"
$dom->parse('<b>Test</b>')->at('b')->wrap('<p>123</p>')->root;
$dom = $dom->wrap_content('<div></div>');
-Wrap HTML/XML fragment around this node's content, placing it as the last
-children of the first innermost element.
+Wrap HTML/XML fragment around this node's content (for C<root> and C<tag>
+nodes), placing it as the last children of the first innermost element.
# "<p><b>123Test</b></p>"
$dom->parse('<p>Test<p>')->at('p')->wrap_content('<b>123</b>')->root;
$dom = $dom->xml($bool);
Disable HTML semantics in parser and activate case-sensitivity, defaults to
-auto detection based on processing instructions.
+auto detection based on XML declarations.
=head1 COLLECTION METHODS