2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Copyright  ( c )  2022 - 2023 ,  Sam  Atkins  < atkinssj @ serenityos . org > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  SPDX - License - Identifier :  BSD - 2 - Clause 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "GeneratorUtil.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/SourceGenerator.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <LibCore/ArgsParser.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <LibMain/Main.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ErrorOr < void >  generate_header_file ( JsonObject &  pseudo_classes_data ,  Core : : File &  file ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ErrorOr < void >  generate_implementation_file ( JsonObject &  pseudo_classes_data ,  Core : : File &  file ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ErrorOr < int >  serenity_main ( Main : : Arguments  arguments )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringView  generated_header_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringView  generated_implementation_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringView  identifiers_json_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Core : : ArgsParser  args_parser ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    args_parser . add_option ( generated_header_path ,  " Path to the PseudoClasses header file to generate " ,  " generated-header-path " ,  ' h ' ,  " generated-header-path " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    args_parser . add_option ( generated_implementation_path ,  " Path to the PseudoClasses implementation file to generate " ,  " generated-implementation-path " ,  ' c ' ,  " generated-implementation-path " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    args_parser . add_option ( identifiers_json_path ,  " Path to the JSON file to read from " ,  " json-path " ,  ' j ' ,  " json-path " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    args_parser . parse ( arguments ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  json  =  TRY ( read_entire_file_as_json ( identifiers_json_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    VERIFY ( json . is_object ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  data  =  json . as_object ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  generated_header_file  =  TRY ( Core : : File : : open ( generated_header_path ,  Core : : File : : OpenMode : : Write ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  generated_implementation_file  =  TRY ( Core : : File : : open ( generated_implementation_path ,  Core : : File : : OpenMode : : Write ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TRY ( generate_header_file ( data ,  * generated_header_file ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TRY ( generate_implementation_file ( data ,  * generated_implementation_file ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ErrorOr < void >  generate_header_file ( JsonObject &  pseudo_classes_data ,  Core : : File &  file )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringBuilder  builder ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SourceGenerator  generator  {  builder  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# pragma once 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/Optional.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/StringView.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								namespace  Web : : CSS  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								enum  class  PseudoClass  {  
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-22 09:09:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    pseudo_classes_data . for_each_member ( [ & ] ( auto &  name ,  auto & )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:42:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  member_generator  =  generator . fork ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:59:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        member_generator . set ( " name:titlecase " ,  title_casify ( name ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:06:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        member_generator . appendln ( "     @name:titlecase@, " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-22 09:09:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Optional < PseudoClass >  pseudo_class_from_string ( StringView ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								StringView  pseudo_class_name ( PseudoClass ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  PseudoClassMetadata  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    enum  class  ParameterType  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        None , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ANPlusB , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ANPlusBOf , 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:47:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        CompoundSelector , 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ForgivingSelectorList , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-13 09:19:30 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ForgivingRelativeSelectorList , 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 18:11:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        Ident , 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        LanguageRanges , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SelectorList , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  parameter_type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  is_valid_as_function ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  is_valid_as_identifier ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PseudoClassMetadata  pseudo_class_metadata ( PseudoClass ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TRY ( file . write_until_depleted ( generator . as_string_view ( ) . bytes ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ErrorOr < void >  generate_implementation_file ( JsonObject &  pseudo_classes_data ,  Core : : File &  file )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringBuilder  builder ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SourceGenerator  generator  {  builder  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  <LibWeb/CSS/PseudoClass.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								namespace  Web : : CSS  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Optional < PseudoClass >  pseudo_class_from_string ( StringView  string )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-22 09:09:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    pseudo_classes_data . for_each_member ( [ & ] ( auto &  name ,  auto & )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:42:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  member_generator  =  generator . fork ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-22 09:09:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        member_generator . set ( " name " ,  name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:59:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        member_generator . set ( " name:titlecase " ,  title_casify ( name ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        member_generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  ( string . equals_ignoring_ascii_case ( " @name@ " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  PseudoClass : : @ name : titlecase @ ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
									
										
										
										
											2023-08-22 09:09:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								StringView  pseudo_class_name ( PseudoClass  pseudo_class )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    switch  ( pseudo_class )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-22 09:09:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    pseudo_classes_data . for_each_member ( [ & ] ( auto &  name ,  auto & )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:42:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  member_generator  =  generator . fork ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-22 09:09:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        member_generator . set ( " name " ,  name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:59:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        member_generator . set ( " name:titlecase " ,  title_casify ( name ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        member_generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    case  PseudoClass : : @ name : titlecase @ : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  " @name@ " sv ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
									
										
										
										
											2023-08-22 09:09:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    VERIFY_NOT_REACHED ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PseudoClassMetadata  pseudo_class_metadata ( PseudoClass  pseudo_class )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    switch  ( pseudo_class )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-22 09:09:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    pseudo_classes_data . for_each_member ( [ & ] ( auto &  name ,  JsonValue  const &  value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:42:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  member_generator  =  generator . fork ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        auto &  pseudo_class  =  value . as_object ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-16 17:49:34 +03:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  argument_string  =  pseudo_class . get_byte_string ( " argument " sv ) . value ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        bool  is_valid_as_identifier  =  argument_string . is_empty ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        bool  is_valid_as_function  =  ! argument_string . is_empty ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( argument_string . ends_with ( ' ? ' ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            is_valid_as_identifier  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            argument_string  =  argument_string . substring ( 0 ,  argument_string . length ( )  -  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        String  parameter_type  =  " None " _string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( is_valid_as_function )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( argument_string  = =  " <an+b> " sv )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                parameter_type  =  " ANPlusB " _string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            }  else  if  ( argument_string  = =  " <an+b-of> " sv )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                parameter_type  =  " ANPlusBOf " _string ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:47:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            }  else  if  ( argument_string  = =  " <compound-selector> " sv )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                parameter_type  =  " CompoundSelector " _string ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            }  else  if  ( argument_string  = =  " <forgiving-selector-list> " sv )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                parameter_type  =  " ForgivingSelectorList " _string ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-13 09:19:30 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            }  else  if  ( argument_string  = =  " <forgiving-relative-selector-list> " sv )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                parameter_type  =  " ForgivingRelativeSelectorList " _string ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 18:11:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            }  else  if  ( argument_string  = =  " <ident> " sv )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                parameter_type  =  " Ident " _string ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            }  else  if  ( argument_string  = =  " <language-ranges> " sv )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                parameter_type  =  " LanguageRanges " _string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            }  else  if  ( argument_string  = =  " <selector-list> " sv )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                parameter_type  =  " SelectorList " _string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                warnln ( " Unrecognized pseudo-class argument type: `{}` " ,  argument_string ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                VERIFY_NOT_REACHED ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:59:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        member_generator . set ( " name:titlecase " ,  title_casify ( name ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 14:38:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        member_generator . set ( " parameter_type " ,  parameter_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        member_generator . set ( " is_valid_as_function " ,  is_valid_as_function  ?  " true " _string  :  " false " _string ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        member_generator . set ( " is_valid_as_identifier " ,  is_valid_as_identifier  ?  " true " _string  :  " false " _string ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        member_generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    case  PseudoClass : : @ name : titlecase @ : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . parameter_type  =  PseudoClassMetadata : : ParameterType : : @ parameter_type @ , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . is_valid_as_function  =  @ is_valid_as_function @ , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . is_valid_as_identifier  =  @ is_valid_as_identifier @ , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
									
										
										
										
											2023-08-22 09:09:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    VERIFY_NOT_REACHED ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2023-08-21 16:39:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
									
										
										
										
											2023-08-12 13:27:24 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TRY ( file . write_until_depleted ( generator . as_string_view ( ) . bytes ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}