From: Vsevolod Stakhov Date: Tue, 26 Jan 2021 15:48:40 +0000 (+0000) Subject: [Project] Css: More meat to the lexer X-Git-Tag: 3.0~728 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3af022430973c47a0f1be61923c27292bc24baae;p=thirdparty%2Frspamd.git [Project] Css: More meat to the lexer --- diff --git a/src/libserver/css/css_tokeniser.cxx b/src/libserver/css/css_tokeniser.cxx index f545af47a7..49032c64f8 100644 --- a/src/libserver/css/css_tokeniser.cxx +++ b/src/libserver/css/css_tokeniser.cxx @@ -546,11 +546,83 @@ auto css_tokeniser::next_token(void) -> struct css_parser_token /* Numeric token */ return consume_number(); } + else { + offset = i + 1; + return make_token(c); + } } /* No other options, a delimiter - */ offset = i + 1; return make_token(c); + break; + case '\\': + if (i + 1 < input.size()) { + if (input[i + 1] == '\n' || input[i + 1] == '\r') { + offset = i + 1; + return make_token(c); + } + else { + /* Valid escape, assume ident */ + return consume_ident(); + } + } + else { + offset = i + 1; + return make_token(c); + } + break; + case '@': + if (i + 3 < input.size()) { + if (is_plain_ident(input[i + 1]) && + is_plain_ident(input[i + 2]) && is_plain_ident(input[i + 3])) { + offset = i + 1; + auto ident_token = consume_ident(); + + if (ident_token.type == css_parser_token::token_type::ident_token) { + /* Update type */ + ident_token.type = css_parser_token::token_type::at_keyword_token; + } + + return ident_token; + } + else { + offset = i + 1; + return make_token(c); + } + } + else { + offset = i + 1; + return make_token(c); + } + break; + case '#': + /* TODO: make it more conformant */ + if (i + 2 < input.size()) { + if (is_plain_ident(input[i + 1]) && + is_plain_ident(input[i + 2])) { + offset = i + 1; + auto ident_token = consume_ident(); + + if (ident_token.type == css_parser_token::token_type::ident_token) { + /* Update type */ + ident_token.type = css_parser_token::token_type::hash_token; + } + + return ident_token; + } + else { + offset = i + 1; + return make_token(c); + } + } + else { + offset = i + 1; + return make_token(c); + } + break; + default: + /* Generic parsing code */ break; } diff --git a/src/libserver/css/css_tokeniser.hxx b/src/libserver/css/css_tokeniser.hxx index 5880241c12..cd9c47cfd4 100644 --- a/src/libserver/css/css_tokeniser.hxx +++ b/src/libserver/css/css_tokeniser.hxx @@ -38,8 +38,6 @@ struct css_parser_token { string_token, number_token, url_token, - dimension_token, - percentage_token, cdo_token, /* xml open comment */ cdc_token, /* xml close comment */ delim_token,