diff --git a/lib/Mojo/DOM/CSS.pm b/lib/Mojo/DOM/CSS.pm index 5c5669adc7..d1bd7e6c9b 100644 --- a/lib/Mojo/DOM/CSS.pm +++ b/lib/Mojo/DOM/CSS.pm @@ -90,13 +90,13 @@ sub _compile { if ($css =~ /\G\s*,\s*/gc) { push @$group, [] } # Combinator - elsif ($css =~ /\G\s*([ >+~])\s*/gc) { + elsif ($css =~ /\G\s*([ \t>+~])\s*/gc) { push @$last, ['pc', 'scope'] unless @$last; push @$selectors, $1; } # Class or ID - elsif ($css =~ /\G([.#])((?:$ESCAPE_RE\s|\\.|[^,.#:[ >~+])+)/gco) { + elsif ($css =~ /\G([.#])((?:$ESCAPE_RE\s|\\.|[^,.#:[ \t>~+])+)/gco) { my ($name, $op) = $1 eq '.' ? ('class', '~') : ('id', ''); push @$last, ['attr', _name($name), _value($op, $2)]; } @@ -124,7 +124,7 @@ sub _compile { } # Tag - elsif ($css =~ /\G((?:$ESCAPE_RE\s|\\.|[^,.#:[ >~+])+)/gco) { + elsif ($css =~ /\G((?:$ESCAPE_RE\s|\\.|[^,.#:[ \t>~+])+)/gco) { my $alias = (my $name = $1) =~ s/^([^|]*)\|// && $1 ne '*' ? $1 : undef; my $ns = length $alias ? $ns{$alias} // return [['invalid']] : $alias; push @$last, ['tag', $name eq '*' ? undef : _name($name), _unescape($ns)]; diff --git a/t/mojo/dom.t b/t/mojo/dom.t index 151c4dfdf6..ca90b6337e 100644 --- a/t/mojo/dom.t +++ b/t/mojo/dom.t @@ -3100,4 +3100,15 @@ subtest 'Unknown CSS selector' => sub { like $@, qr/Unknown CSS selector: p\[/, 'right error'; }; +subtest 'Handle tab in selector' => sub { + my $dom = Mojo::DOM->new(< + +EOF + for my $selector ("ul li", "ul\tli", "ul \tli", "ul\t li") { + is_deeply $dom->find($selector)->map(sub { $_->to_string })->to_array, ['
  • Ax1
  • '], + 'selector "' . $selector =~ s/\t/\\t/r . '"'; + } +}; + done_testing();