2021-03-22 17:41:47 +01:00
/*
2021-04-28 22:46:44 +02:00
* Copyright ( c ) 2020 - 2021 , the SerenityOS developers .
2021-06-29 17:03:25 +01:00
* Copyright ( c ) 2021 , Sam Atkins < atkinssj @ gmail . com >
2021-03-22 17:41:47 +01:00
*
2021-04-22 01:24:48 -07:00
* SPDX - License - Identifier : BSD - 2 - Clause
2021-03-22 17:41:47 +01:00
*/
# pragma once
# include <AK/NonnullOwnPtrVector.h>
2021-07-12 17:30:40 +01:00
# include <AK/NonnullRefPtrVector.h>
# include <AK/RefPtr.h>
2021-03-22 17:41:47 +01:00
# include <AK/Vector.h>
# include <LibWeb/CSS/Parser/DeclarationOrAtRule.h>
# include <LibWeb/CSS/Parser/StyleBlockRule.h>
# include <LibWeb/CSS/Parser/StyleComponentValueRule.h>
# include <LibWeb/CSS/Parser/StyleDeclarationRule.h>
# include <LibWeb/CSS/Parser/StyleFunctionRule.h>
2021-07-03 13:36:33 +01:00
# include <LibWeb/CSS/Parser/StyleRule.h>
2021-03-22 17:41:47 +01:00
# include <LibWeb/CSS/Parser/Tokenizer.h>
# include <LibWeb/CSS/Selector.h>
namespace Web : : CSS {
2021-07-09 16:34:29 +01:00
class CSSStyleSheet ;
class CSSRule ;
class CSSStyleRule ;
struct StyleProperty ;
2021-07-08 21:53:22 +01:00
class StyleValue ;
enum class PropertyID ;
2021-07-09 16:34:29 +01:00
2021-07-02 20:25:13 +01:00
class ParsingContext {
public :
ParsingContext ( ) ;
explicit ParsingContext ( DOM : : Document const & ) ;
explicit ParsingContext ( DOM : : ParentNode const & ) ;
bool in_quirks_mode ( ) const ;
URL complete_url ( String const & ) const ;
private :
const DOM : : Document * m_document { nullptr } ;
} ;
2021-07-03 14:00:41 +01:00
template < typename T >
class TokenStream {
public :
explicit TokenStream ( Vector < T > const & ) ;
~ TokenStream ( ) ;
bool has_next_token ( ) ;
T const & next_token ( ) ;
T const & peek_token ( ) ;
T const & current_token ( ) ;
void reconsume_current_input_token ( ) ;
void skip_whitespace ( ) ;
void dump_all_tokens ( ) ;
private :
Vector < T > const & m_tokens ;
int m_iterator_offset { - 1 } ;
T make_eof ( ) ;
T m_eof ;
} ;
2021-03-22 17:41:47 +01:00
class Parser {
public :
2021-07-02 20:25:13 +01:00
Parser ( ParsingContext const & , StringView const & input , String const & encoding = " utf-8 " ) ;
2021-03-22 17:41:47 +01:00
~ Parser ( ) ;
// The normal parser entry point, for parsing stylesheets.
2021-07-09 16:34:29 +01:00
NonnullRefPtr < CSSStyleSheet > parse_as_stylesheet ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
NonnullRefPtr < CSSStyleSheet > parse_as_stylesheet ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
// For the content of at-rules such as @media. It differs from "Parse a stylesheet" in the handling of <CDO-token> and <CDC-token>.
2021-07-09 16:34:29 +01:00
NonnullRefPtrVector < CSSRule > parse_as_list_of_rules ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
NonnullRefPtrVector < CSSRule > parse_as_list_of_rules ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
// For use by the CSSStyleSheet#insertRule method, and similar functions which might exist, which parse text into a single rule.
2021-07-09 16:34:29 +01:00
RefPtr < CSSRule > parse_as_rule ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
RefPtr < CSSRule > parse_as_rule ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
// Used in @supports conditions. [CSS3-CONDITIONAL]
2021-07-09 16:34:29 +01:00
Optional < StyleProperty > parse_as_declaration ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
Optional < StyleProperty > parse_as_declaration ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
// For the contents of a style attribute, which parses text into the contents of a single style rule.
2021-07-03 15:40:06 +01:00
RefPtr < CSSStyleDeclaration > parse_as_list_of_declarations ( ) ;
template < typename T >
RefPtr < CSSStyleDeclaration > parse_as_list_of_declarations ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
// For things that need to consume a single value, like the parsing rules for attr().
Optional < StyleComponentValueRule > parse_as_component_value ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
Optional < StyleComponentValueRule > parse_as_component_value ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
// For the contents of presentational attributes, which parse text into a single declaration’ s value, or for parsing a stand-alone selector [SELECT] or list of Media Queries [MEDIAQ], as in Selectors API or the media HTML attribute.
Vector < StyleComponentValueRule > parse_as_list_of_component_values ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
Vector < StyleComponentValueRule > parse_as_list_of_component_values ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
2021-07-02 19:52:07 +01:00
Vector < Vector < StyleComponentValueRule > > parse_as_comma_separated_list_of_component_values ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
Vector < Vector < StyleComponentValueRule > > parse_as_comma_separated_list_of_component_values ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
2021-07-03 15:40:06 +01:00
template < typename T >
2021-07-12 17:30:40 +01:00
RefPtr < Selector > parse_single_selector ( TokenStream < T > & , bool is_relative = false ) ;
2021-03-22 17:41:47 +01:00
2021-07-08 13:44:01 +01:00
Optional < Selector : : SimpleSelector : : NthChildPattern > parse_nth_child_pattern ( TokenStream < StyleComponentValueRule > & ) ;
2021-03-22 17:41:47 +01:00
// FIXME: https://www.w3.org/TR/selectors-4/
2021-07-03 12:34:25 +01:00
// Contrary to the name, these parse a comma-separated list of selectors, according to the spec.
2021-07-12 17:30:40 +01:00
NonnullRefPtrVector < Selector > parse_a_selector ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2021-07-12 17:30:40 +01:00
NonnullRefPtrVector < Selector > parse_a_selector ( TokenStream < T > & ) ;
2021-07-03 15:40:06 +01:00
2021-07-12 17:30:40 +01:00
NonnullRefPtrVector < Selector > parse_a_relative_selector ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2021-07-12 17:30:40 +01:00
NonnullRefPtrVector < Selector > parse_a_relative_selector ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
2021-07-09 21:04:34 +01:00
RefPtr < StyleValue > parse_css_value ( PropertyID , TokenStream < StyleComponentValueRule > & ) ;
2021-07-08 21:53:22 +01:00
2021-03-22 17:41:47 +01:00
// FIXME: https://drafts.csswg.org/css-backgrounds-3/
static Optional < String > as_valid_background_repeat ( String input ) { return input ; }
static Optional < String > as_valid_background_attachment ( String input ) { return input ; }
static Optional < String > as_valid_background_position ( String input ) { return input ; }
static Optional < String > as_valid_background_clip ( String input ) { return input ; }
static Optional < String > as_valid_background_origin ( String input ) { return input ; }
static Optional < String > as_valid_background_size ( String input ) { return input ; }
static Optional < String > as_valid_border_style ( String input ) { return input ; }
static Optional < String > as_valid_border_image_repeat ( String input ) { return input ; }
private :
2021-07-03 15:40:06 +01:00
[ [ nodiscard ] ] NonnullRefPtrVector < StyleRule > consume_a_list_of_rules ( bool top_level ) ;
template < typename T >
[ [ nodiscard ] ] NonnullRefPtrVector < StyleRule > consume_a_list_of_rules ( TokenStream < T > & , bool top_level ) ;
[ [ nodiscard ] ] NonnullRefPtr < StyleRule > consume_an_at_rule ( ) ;
template < typename T >
[ [ nodiscard ] ] NonnullRefPtr < StyleRule > consume_an_at_rule ( TokenStream < T > & ) ;
[ [ nodiscard ] ] RefPtr < StyleRule > consume_a_qualified_rule ( ) ;
template < typename T >
[ [ nodiscard ] ] RefPtr < StyleRule > consume_a_qualified_rule ( TokenStream < T > & ) ;
[ [ nodiscard ] ] Vector < DeclarationOrAtRule > consume_a_list_of_declarations ( ) ;
template < typename T >
[ [ nodiscard ] ] Vector < DeclarationOrAtRule > consume_a_list_of_declarations ( TokenStream < T > & ) ;
2021-07-08 21:53:22 +01:00
[ [ nodiscard ] ] Optional < StyleDeclarationRule > consume_a_declaration ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2021-07-08 21:53:22 +01:00
[ [ nodiscard ] ] Optional < StyleDeclarationRule > consume_a_declaration ( TokenStream < T > & ) ;
2021-07-03 15:40:06 +01:00
2021-07-08 21:53:22 +01:00
[ [ nodiscard ] ] StyleComponentValueRule consume_a_component_value ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2021-07-08 21:53:22 +01:00
[ [ nodiscard ] ] StyleComponentValueRule consume_a_component_value ( TokenStream < T > & ) ;
2021-07-03 15:40:06 +01:00
2021-07-08 21:53:22 +01:00
[ [ nodiscard ] ] NonnullRefPtr < StyleBlockRule > consume_a_simple_block ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2021-07-08 21:53:22 +01:00
[ [ nodiscard ] ] NonnullRefPtr < StyleBlockRule > consume_a_simple_block ( TokenStream < T > & ) ;
2021-07-03 15:40:06 +01:00
2021-07-08 21:53:22 +01:00
[ [ nodiscard ] ] NonnullRefPtr < StyleFunctionRule > consume_a_function ( ) ;
2021-07-03 15:40:06 +01:00
template < typename T >
2021-07-08 21:53:22 +01:00
[ [ nodiscard ] ] NonnullRefPtr < StyleFunctionRule > consume_a_function ( TokenStream < T > & ) ;
2021-03-22 17:41:47 +01:00
2021-07-08 21:53:22 +01:00
[ [ nodiscard ] ] RefPtr < CSSRule > convert_to_rule ( NonnullRefPtr < StyleRule > ) ;
[ [ nodiscard ] ] RefPtr < CSSStyleDeclaration > convert_to_declaration ( NonnullRefPtr < StyleBlockRule > ) ;
2021-07-06 16:32:18 +01:00
[ [ nodiscard ] ] Optional < StyleProperty > convert_to_style_property ( StyleDeclarationRule & ) ;
2021-07-09 16:34:29 +01:00
2021-07-09 21:04:34 +01:00
static Optional < float > try_parse_float ( StringView string ) ;
2021-07-02 20:25:13 +01:00
ParsingContext m_context ;
2021-03-22 17:41:47 +01:00
Tokenizer m_tokenizer ;
Vector < Token > m_tokens ;
2021-07-03 14:00:41 +01:00
TokenStream < Token > m_token_stream ;
2021-03-22 17:41:47 +01:00
} ;
}