mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-05 08:31:51 +00:00
LibWeb/CSS: Make @page
selector parsing accessible
Mostly minor changes - the code has moved, and has to support Token or ComponentValue TokenStreams, but otherwise it's the same.
This commit is contained in:
parent
107b47f884
commit
d852ae17e8
Notes:
github-actions[bot]
2025-05-16 15:45:11 +00:00
Author: https://github.com/AtkinsSJ
Commit: d852ae17e8
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4771
4 changed files with 87 additions and 64 deletions
|
@ -1147,4 +1147,76 @@ Optional<Selector::SimpleSelector::ANPlusBPattern> Parser::parse_a_n_plus_b_patt
|
|||
return syntax_error();
|
||||
}
|
||||
|
||||
Optional<PageSelectorList> Parser::parse_as_page_selector_list()
|
||||
{
|
||||
auto selector_list = parse_a_page_selector_list(m_token_stream);
|
||||
if (!selector_list.is_error())
|
||||
return selector_list.release_value();
|
||||
return {};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Parser::ParseErrorOr<PageSelectorList> Parser::parse_a_page_selector_list(TokenStream<T>& tokens)
|
||||
{
|
||||
// https://drafts.csswg.org/css-page-3/#syntax-page-selector
|
||||
// <page-selector-list> = <page-selector>#
|
||||
// <page-selector> = [ <ident-token>? <pseudo-page>* ]!
|
||||
// <pseudo-page> = : [ left | right | first | blank ]
|
||||
|
||||
PageSelectorList selector_list;
|
||||
|
||||
tokens.discard_whitespace();
|
||||
|
||||
while (tokens.has_next_token()) {
|
||||
// First optional ident
|
||||
Optional<FlyString> maybe_ident;
|
||||
if (tokens.next_token().is(Token::Type::Ident))
|
||||
maybe_ident = static_cast<Token>(tokens.consume_a_token()).ident();
|
||||
|
||||
// Then an optional series of pseudo-classes
|
||||
Vector<PagePseudoClass> pseudo_classes;
|
||||
while (tokens.next_token().is(Token::Type::Colon)) {
|
||||
tokens.discard_a_token(); // :
|
||||
if (!tokens.next_token().is(Token::Type::Ident)) {
|
||||
dbgln_if(CSS_PARSER_DEBUG, "Invalid @page selector: pseudo-class is not an ident: `{}`", tokens.next_token().to_debug_string());
|
||||
return ParseError::SyntaxError;
|
||||
}
|
||||
auto pseudo_class_name = static_cast<Token>(tokens.consume_a_token()).ident();
|
||||
if (auto pseudo_class = page_pseudo_class_from_string(pseudo_class_name); pseudo_class.has_value()) {
|
||||
pseudo_classes.append(*pseudo_class);
|
||||
} else {
|
||||
dbgln_if(CSS_PARSER_DEBUG, "Invalid @page selector: unrecognized pseudo-class `:{}`", pseudo_class_name);
|
||||
return ParseError::SyntaxError;
|
||||
}
|
||||
}
|
||||
|
||||
if (!maybe_ident.has_value() && pseudo_classes.is_empty()) {
|
||||
// Nothing parsed
|
||||
dbgln_if(CSS_PARSER_DEBUG, "Invalid @page selector: is empty");
|
||||
return ParseError::SyntaxError;
|
||||
}
|
||||
|
||||
selector_list.empend(move(maybe_ident), move(pseudo_classes));
|
||||
|
||||
tokens.discard_whitespace();
|
||||
|
||||
if (tokens.next_token().is(Token::Type::Comma)) {
|
||||
tokens.discard_a_token(); // ,
|
||||
tokens.discard_whitespace();
|
||||
if (!tokens.has_next_token()) {
|
||||
dbgln_if(CSS_PARSER_DEBUG, "Invalid @page selector: trailing comma");
|
||||
return ParseError::SyntaxError;
|
||||
}
|
||||
|
||||
} else if (tokens.has_next_token()) {
|
||||
dbgln_if(CSS_PARSER_DEBUG, "Invalid @page selector: trailing token `{}`", tokens.next_token().to_debug_string());
|
||||
return ParseError::SyntaxError;
|
||||
}
|
||||
}
|
||||
|
||||
return selector_list;
|
||||
}
|
||||
template Parser::ParseErrorOr<PageSelectorList> Parser::parse_a_page_selector_list(TokenStream<ComponentValue>&);
|
||||
template Parser::ParseErrorOr<PageSelectorList> Parser::parse_a_page_selector_list(TokenStream<Token>&);
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue