diff options
-rw-r--r-- | src/parse/language.c | 38 | ||||
-rw-r--r-- | src/parse/parse.c | 2 | ||||
-rw-r--r-- | src/parse/parse.h | 1 |
3 files changed, 40 insertions, 1 deletions
diff --git a/src/parse/language.c b/src/parse/language.c index 7fbfba7..c2d02d7 100644 --- a/src/parse/language.c +++ b/src/parse/language.c @@ -50,6 +50,8 @@ static css_error handleEndBlock(css_language *c, const parserutils_vector *vector); static css_error handleBlockContent(css_language *c, const parserutils_vector *vector); +static css_error handleEndBlockContent(css_language *c, + const parserutils_vector *vector); static css_error handleDeclaration(css_language *c, const parserutils_vector *vector); @@ -219,6 +221,8 @@ css_error language_handle_event(css_parser_event type, return handleEndBlock(language, tokens); case CSS_PARSER_BLOCK_CONTENT: return handleBlockContent(language, tokens); + case CSS_PARSER_END_BLOCK_CONTENT: + return handleEndBlockContent(language, tokens); case CSS_PARSER_DECLARATION: return handleDeclaration(language, tokens); } @@ -748,6 +752,40 @@ css_error handleBlockContent(css_language *c, const parserutils_vector *vector) return CSS_OK; } +css_error handleEndBlockContent(css_language *c, const parserutils_vector *vector) +{ + context_entry *entry; + parserutils_error perror; + css_error ret; + + /* First we call handleBlockContent() to deal with any intermediate + * tokens we have left + */ + ret = handleBlockContent(c, vector); + if (ret != CSS_OK) { + return ret; + } + + /* Our goal here is to ensure that the language parse stack is in the + * right state. We've encountered the end of a BlockContent such as + * @media ... { ... } + * and we need to ensure that the language stack reflects the end of + * that block, not any unfinished business within it such as + * @media ... { d } + */ + + entry = parserutils_stack_get_current(c->context); + while (entry != NULL && entry->type != CSS_PARSER_START_BLOCK) { + perror = parserutils_stack_pop(c->context, NULL); + if (perror != PARSERUTILS_OK) { + return css_error_from_parserutils_error(perror); + } + entry = parserutils_stack_get_current(c->context); + } + + return CSS_OK; +} + css_error handleDeclaration(css_language *c, const parserutils_vector *vector) { css_error error; diff --git a/src/parse/parse.c b/src/parse/parse.c index cbd8b56..d7cb357 100644 --- a/src/parse/parse.c +++ b/src/parse/parse.c @@ -1388,7 +1388,7 @@ css_error parseBlockContent(css_parser *parser) #endif if (parser->event != NULL) { parser->event( - CSS_PARSER_BLOCK_CONTENT, + CSS_PARSER_END_BLOCK_CONTENT, parser->tokens, parser->event_pw); } diff --git a/src/parse/parse.h b/src/parse/parse.h index e65f055..1e040de 100644 --- a/src/parse/parse.h +++ b/src/parse/parse.h @@ -31,6 +31,7 @@ typedef enum css_parser_event { CSS_PARSER_START_BLOCK, CSS_PARSER_END_BLOCK, CSS_PARSER_BLOCK_CONTENT, + CSS_PARSER_END_BLOCK_CONTENT, CSS_PARSER_DECLARATION } css_parser_event; |