Skip to content

Commit 0c6f4fd

Browse files
committed
Fix CSS selector parsing with tab characters
1 parent 990d344 commit 0c6f4fd

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

lib/Mojo/DOM/CSS.pm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,13 @@ sub _compile {
9090
if ($css =~ /\G\s*,\s*/gc) { push @$group, [] }
9191

9292
# Combinator
93-
elsif ($css =~ /\G\s*([ >+~])\s*/gc) {
93+
elsif ($css =~ /\G\s*([ \t>+~])\s*/gc) {
9494
push @$last, ['pc', 'scope'] unless @$last;
9595
push @$selectors, $1;
9696
}
9797

9898
# Class or ID
99-
elsif ($css =~ /\G([.#])((?:$ESCAPE_RE\s|\\.|[^,.#:[ >~+])+)/gco) {
99+
elsif ($css =~ /\G([.#])((?:$ESCAPE_RE\s|\\.|[^,.#:[ \t>~+])+)/gco) {
100100
my ($name, $op) = $1 eq '.' ? ('class', '~') : ('id', '');
101101
push @$last, ['attr', _name($name), _value($op, $2)];
102102
}
@@ -124,7 +124,7 @@ sub _compile {
124124
}
125125

126126
# Tag
127-
elsif ($css =~ /\G((?:$ESCAPE_RE\s|\\.|[^,.#:[ >~+])+)/gco) {
127+
elsif ($css =~ /\G((?:$ESCAPE_RE\s|\\.|[^,.#:[ \t>~+])+)/gco) {
128128
my $alias = (my $name = $1) =~ s/^([^|]*)\|// && $1 ne '*' ? $1 : undef;
129129
my $ns = length $alias ? $ns{$alias} // return [['invalid']] : $alias;
130130
push @$last, ['tag', $name eq '*' ? undef : _name($name), _unescape($ns)];

t/mojo/dom.t

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3100,4 +3100,15 @@ subtest 'Unknown CSS selector' => sub {
31003100
like $@, qr/Unknown CSS selector: p\[/, 'right error';
31013101
};
31023102

3103+
subtest 'Handle tab in selector' => sub {
3104+
my $dom = Mojo::DOM->new(<<EOF);
3105+
<!DOCTYPE html>
3106+
<ul> <li>Ax1</li> </ul>
3107+
EOF
3108+
for my $selector ("ul li", "ul\tli", "ul \tli", "ul\t li") {
3109+
is_deeply $dom->find($selector)->map(sub { $_->to_string })->to_array, ['<li>Ax1</li>'],
3110+
'selector "' . $selector =~ s/\t/\\t/r . '"';
3111+
}
3112+
};
3113+
31033114
done_testing();

0 commit comments

Comments
 (0)