summaryrefslogtreecommitdiff
path: root/src/parse
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse')
-rw-r--r--src/parse/language.c38
-rw-r--r--src/parse/parse.c2
-rw-r--r--src/parse/parse.h1
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;