From 90ede21f0cdd7ac926a3a5470240643bb7906200 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 2 Jun 2017 17:39:18 -0700 Subject: [PATCH] Parse nth-child(-/*comment*/n+b) (fixes #153) --- src/css-parsing-tests/An+B.json | 2 ++ src/nth.rs | 23 ++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/css-parsing-tests/An+B.json b/src/css-parsing-tests/An+B.json index f17849ea..6ecdb83c 100644 --- a/src/css-parsing-tests/An+B.json +++ b/src/css-parsing-tests/An+B.json @@ -80,6 +80,8 @@ " -n +1", [-1, 1], "+ n +1", null, "- N +1", null, +"+/**/n +1", [1, 1], +"-/**/N +1", [-1, 1], "3N -1", [3, -1], "+2n -1 ", [2, -1], diff --git a/src/nth.rs b/src/nth.rs index ec735bc2..b1767e32 100644 --- a/src/nth.rs +++ b/src/nth.rs @@ -12,7 +12,7 @@ use super::{Token, Parser}; /// in which case the caller needs to check if the arguments’ parser is exhausted. /// Return `Ok((A, B))`, or `Err(())` for a syntax error. pub fn parse_nth(input: &mut Parser) -> Result<(i32, i32), ()> { - match try!(input.next()) { + match input.next()? { Token::Number(value) => Ok((0, try!(value.int_value.ok_or(())) as i32)), Token::Dimension(value, unit) => { let a = try!(value.int_value.ok_or(())) as i32; @@ -37,15 +37,20 @@ pub fn parse_nth(input: &mut Parser) -> Result<(i32, i32), ()> { } } } - Token::Delim('+') => match try!(input.next_including_whitespace()) { - Token::Ident(value) => { - match_ignore_ascii_case! { &value, - "n" => parse_b(input, 1), - "n-" => parse_signless_b(input, 1, -1), - _ => Ok((1, try!(parse_n_dash_digits(&*value)))) - } + Token::Delim(delim) => { + let val = match delim { + '+' => 1, + '-' => -1, + _ => return Err(()), + }; + match input.next_including_whitespace()? { + Token::Ident(n) => match_ignore_ascii_case! { &n, + "n" => parse_b(input, val), + "n-" => parse_signless_b(input, val, -1), + _ => Ok((1, try!(parse_n_dash_digits(&*n)))) + }, + _ => Err(()) } - _ => Err(()) }, _ => Err(()) }