diff options
Diffstat (limited to 'src/parse/language.c')
-rw-r--r-- | src/parse/language.c | 38 |
1 files changed, 38 insertions, 0 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; |