L<DOM::Tiny> uses a CSS selector engine based on L<Mojo::DOM::CSS>. 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<E>.
my $title = $dom->at('title');
-=head2 E[foo]
+=item E[foo]
An C<E> element with a C<foo> attribute.
my $links = $dom->find('a[href]');
-=head2 E[foo="bar"]
+=item E[foo="bar"]
An C<E> element whose C<foo> attribute value is exactly equal to C<bar>.
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<E> element whose C<foo> attribute value is exactly equal to any
(ASCII-range) case-permutation of C<bar>. Note that this selector is
L<Selectors Level 4|http://dev.w3.org/csswg/selectors-4>, which is still a work
in progress.
-=head2 E[foo~="bar"]
+=item E[foo~="bar"]
An C<E> element whose C<foo> attribute value is a list of whitespace-separated
values, one of which is exactly equal to C<bar>.
my $foo = $dom->find('input[class~="foo"]');
my $foo = $dom->find('input[class~=foo]');
-=head2 E[foo^="bar"]
+=item E[foo^="bar"]
An C<E> element whose C<foo> attribute value begins exactly with the string
C<bar>.
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<E> element whose C<foo> attribute value ends exactly with the string
C<bar>.
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<E> element whose C<foo> attribute value contains the substring C<bar>.
my $contains = $dom->find('input[name*="fo"]');
my $contains = $dom->find('input[name*=fo]');
-=head2 E:root
+=item E:root
An C<E> element, root of the document.
my $root = $dom->at(':root');
-=head2 E:nth-child(n)
+=item E:nth-child(n)
An C<E> element, the C<n-th> 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<E> element, the C<n-th> 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<E> element, the C<n-th> 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<E> element, the C<n-th> 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<E> element, first child of its parent.
my $first = $dom->find('div p:first-child');
-=head2 E:last-child
+=item E:last-child
An C<E> 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<E> 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<E> 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<E> 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<E> element, only sibling of its type.
my $lonely = $dom->find('div p:only-of-type');
-=head2 E:empty
+=item E:empty
An C<E> element that has no children (including text nodes).
my $empty = $dom->find(':empty');
-=head2 E:checked
+=item E:checked
A user interface element C<E> which is checked (for instance a radio-button or
checkbox).
my $input = $dom->find(':checked');
-=head2 E.warning
+=item E.warning
An C<E> element whose class is "warning".
my $warning = $dom->find('div.warning');
-=head2 E#myid
+=item E#myid
An C<E> element with C<ID> equal to "myid".
my $foo = $dom->at('div#foo');
-=head2 E:not(s)
+=item E:not(s)
An C<E> element that does not match simple selector C<s>.
my $others = $dom->find('div p:not(:first-child)');
-=head2 E F
+=item E F
An C<F> element descendant of an C<E> element.
my $headlines = $dom->find('div h1');
-=head2 E E<gt> F
+=item E E<gt> F
An C<F> element child of an C<E> element.
my $headlines = $dom->find('html > body > div > h1');
-=head2 E + F
+=item E + F
An C<F> element immediately preceded by an C<E> element.
my $second = $dom->find('h1 + h2');
-=head2 E ~ F
+=item E ~ F
An C<F> element preceded by an C<E> element.
my $second = $dom->find('h1 ~ h2');
-=head2 E, F, G
+=item E, F, G
Elements of type C<E>, C<F> and C<G>.
my $headlines = $dom->find('h1, h2, h3');
-=head2 E[foo=bar][bar=baz]
+=item E[foo=bar][bar=baz]
An C<E> element whose attributes match all following attribute selectors.
my $links = $dom->find('a[foo^=b][foo$=ar]');
+=back
+
=head1 OPERATORS
L<DOM::Tiny> overloads the following operators.
# Longer version
my $first = $collection->first(sub { $_->$method(@args) });
- # Find first value that contains the word "dom"
- my $interesting = $collection->first(qr/dom/i);
+ # Find first value that contains the word "tiny"
+ my $interesting = $collection->first(qr/tiny/i);
# Find first value that is greater than 5
my $greater = $collection->first(sub { $_ > 5 });
# Longer version
my $new = $collection->grep(sub { $_->$method(@args) });
- # Find all values that contain the word "dom"
- my $interesting = $collection->grep(qr/dom/i);
+ # Find all values that contain the word "tiny"
+ my $interesting = $collection->grep(qr/tiny/i);
# Find all values that are greater than 5
my $greater = $collection->grep(sub { $_ > 5 });
# Longer version
my $new = $collection->map(sub { $_->$method(@args) });
- # Append the word "dom" to all values
- my $domified = $collection->map(sub { $_ . 'dom' });
+ # Append the word "tiny" to all values
+ my $domified = $collection->map(sub { $_ . 'tiny' });
=head2 reduce