You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

183 lines
5.0 KiB

/*****************************************************************************
* css_parser.h : CSS parser interface
*****************************************************************************
* Copyright (C) 2017 VideoLabs, VLC authors and VideoLAN
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef CSS_PARSER_H
#define CSS_PARSER_H
//#define YYDEBUG 1
//#define CSS_PARSER_DEBUG
#define YYSTYPE CSSSTYPE
typedef struct vlc_css_parser_t vlc_css_parser_t;
typedef struct vlc_css_selector_t vlc_css_selector_t;
typedef struct vlc_css_declaration_t vlc_css_declaration_t;
typedef struct vlc_css_rule_t vlc_css_rule_t;
typedef struct vlc_css_expr_t vlc_css_expr_t;
typedef struct
{
float val;
char *psz;
vlc_css_expr_t *function;
enum
{
TYPE_NONE = 0,
TYPE_EMS,
TYPE_EXS,
TYPE_PIXELS,
TYPE_POINTS,
TYPE_MILLIMETERS,
TYPE_PERCENT,
TYPE_MILLISECONDS,
TYPE_HERTZ,
TYPE_DEGREES,
TYPE_DIMENSION,
TYPE_STRING = 0x20,
TYPE_FUNCTION,
TYPE_IDENTIFIER,
TYPE_HEXCOLOR,
TYPE_UNICODERANGE,
TYPE_URI,
} type;
} vlc_css_term_t;
struct vlc_css_expr_t
{
struct
{
char op;
vlc_css_term_t term;
} *seq;
size_t i_alloc;
size_t i_count;
};
struct vlc_css_declaration_t
{
char *psz_property;
vlc_css_expr_t *expr;
vlc_css_declaration_t *p_next;
};
enum vlc_css_match_e
{
MATCH_EQUALS,
MATCH_INCLUDES,
MATCH_DASHMATCH,
MATCH_BEGINSWITH,
MATCH_ENDSWITH,
MATCH_CONTAINS,
};
enum vlc_css_relation_e
{
RELATION_SELF = 0,
RELATION_DESCENDENT = ' ',
RELATION_DIRECTADJACENT = '+',
RELATION_INDIRECTADJACENT = '~',
RELATION_CHILD = '>',
};
struct vlc_css_selector_t
{
char *psz_name;
enum
{
SELECTOR_SIMPLE = 0,
SELECTOR_PSEUDOCLASS,
SELECTOR_PSEUDOELEMENT,
/* SELECTOR_PSEUDONTHCHILD,
SELECTOR_PSEUDONTHTYPE,
SELECTOR_PSEUDONTHLASTCHILD,
SELECTOR_PSEUDONTHLASTTYPE,*/
SPECIFIER_ID,
SPECIFIER_CLASS,
SPECIFIER_ATTRIB,
} type;
struct
{
vlc_css_selector_t *p_first;
vlc_css_selector_t **pp_append;
} specifiers;
enum vlc_css_match_e match;
vlc_css_selector_t *p_matchsel;
enum vlc_css_relation_e combinator;
vlc_css_selector_t *p_next;
};
struct vlc_css_rule_t
{
bool b_valid;
vlc_css_selector_t *p_selectors;
vlc_css_declaration_t *p_declarations;
vlc_css_rule_t *p_next;
};
struct vlc_css_parser_t
{
struct
{
vlc_css_rule_t *p_first;
vlc_css_rule_t **pp_append;
} rules;
};
#define CHAIN_APPEND_DECL(n, t) void n( t *p_a, t *p_b )
void vlc_css_term_Clean( vlc_css_term_t a );
bool vlc_css_expression_AddTerm( vlc_css_expr_t *p_expr, char op, vlc_css_term_t a );
void vlc_css_expression_Delete( vlc_css_expr_t *p_expr );
vlc_css_expr_t * vlc_css_expression_New( vlc_css_term_t term );
CHAIN_APPEND_DECL(vlc_css_declarations_Append, vlc_css_declaration_t);
void vlc_css_declarations_Delete( vlc_css_declaration_t *p_decl );
vlc_css_declaration_t * vlc_css_declaration_New( const char *psz );
CHAIN_APPEND_DECL(vlc_css_selector_Append, vlc_css_selector_t);
void vlc_css_selector_AddSpecifier( vlc_css_selector_t *p_sel, vlc_css_selector_t *p_spec );
void vlc_css_selectors_Delete( vlc_css_selector_t *p_sel );
vlc_css_selector_t * vlc_css_selector_New( int type, const char *psz );
void vlc_css_rules_Delete( vlc_css_rule_t *p_rule );
vlc_css_rule_t * vlc_css_rule_New( void );
void vlc_css_parser_AddRule( vlc_css_parser_t *p_parser, vlc_css_rule_t *p_rule );
void vlc_css_parser_Debug( const vlc_css_parser_t *p_parser );
void vlc_css_parser_Clean( vlc_css_parser_t *p_parser );
void vlc_css_parser_Init( vlc_css_parser_t *p_parser );
bool vlc_css_parser_ParseBytes( vlc_css_parser_t *p_parser, const uint8_t *, size_t );
bool vlc_css_parser_ParseString( vlc_css_parser_t *p_parser, const char * );
void vlc_css_unescape( char *psz );
char * vlc_css_unquoted( const char *psz );
char * vlc_css_unescaped( const char *psz );
char * vlc_css_unquotedunescaped( const char *psz );
# ifdef CSS_PARSER_DEBUG
void css_selector_Debug( const vlc_css_selector_t *p_sel );
void css_rule_Debug( const vlc_css_rule_t *p_rule );
# endif
#endif