diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2008-11-25 21:19:45 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2008-11-25 21:19:45 +0000 |
commit | 5a20dd39e05239a13f5a1ed0a70678ca7f1afbc3 (patch) | |
tree | 17ef405797e43f83344ba3a51ee34d6c949eb574 | |
parent | 6e1773e224d2a8c99fa1e7e0a37adb0f7973d2d5 (diff) | |
download | libcss-5a20dd39e05239a13f5a1ed0a70678ca7f1afbc3.tar.gz libcss-5a20dd39e05239a13f5a1ed0a70678ca7f1afbc3.tar.bz2 |
page-break-after
svn path=/trunk/libcss/; revision=5776
-rw-r--r-- | src/parse/css21.c | 4 | ||||
-rw-r--r-- | src/parse/css21props.c | 43 |
2 files changed, 42 insertions, 5 deletions
diff --git a/src/parse/css21.c b/src/parse/css21.c index ccf0a10..f4277a6 100644 --- a/src/parse/css21.c +++ b/src/parse/css21.c @@ -62,7 +62,7 @@ enum { LIGHTER, INSIDE, OUTSIDE, DISC, CIRCLE, SQUARE, DECIMAL, DECIMAL_LEADING_ZERO, LOWER_ROMAN, UPPER_ROMAN, LOWER_GREEK, LOWER_LATIN, UPPER_LATIN, ARMENIAN, GEORGIAN, LOWER_ALPHA, UPPER_ALPHA, - INVERT, VISIBLE, + INVERT, VISIBLE, ALWAYS, AVOID, LAST_KNOWN }; @@ -260,6 +260,8 @@ static struct { { "upper-alpha", SLEN("upper-alpha") }, { "invert", SLEN("invert") }, { "visible", SLEN("visible") }, + { "always", SLEN("always") }, + { "avoid", SLEN("avoid") }, }; typedef struct context_entry { diff --git a/src/parse/css21props.c b/src/parse/css21props.c index 5a5c8ca..bb03198 100644 --- a/src/parse/css21props.c +++ b/src/parse/css21props.c @@ -2689,10 +2689,45 @@ css_error parse_page_break_after(css_css21 *c, const parserutils_vector *vector, int *ctx, css_style **result) { - UNUSED(c); - UNUSED(vector); - UNUSED(ctx); - UNUSED(result); + css_error error; + const css_token *ident; + uint8_t flags = 0; + uint16_t value = 0; + uint32_t opv; + + /* IDENT (auto, always, avoid, left, right, inherit) */ + ident = parserutils_vector_iterate(vector, ctx); + if (ident == NULL || ident->type != CSS_TOKEN_IDENT) + return CSS_INVALID; + + error = parse_important(c, vector, ctx, &flags); + if (error != CSS_OK) + return error; + + if (ident->lower.ptr == c->strings[INHERIT]) { + flags |= FLAG_INHERIT; + } else if (ident->lower.ptr == c->strings[AUTO]) { + value = PAGE_BREAK_AFTER_AUTO; + } else if (ident->lower.ptr == c->strings[ALWAYS]) { + value = PAGE_BREAK_AFTER_ALWAYS; + } else if (ident->lower.ptr == c->strings[AVOID]) { + value = PAGE_BREAK_AFTER_AVOID; + } else if (ident->lower.ptr == c->strings[LEFT]) { + value = PAGE_BREAK_AFTER_LEFT; + } else if (ident->lower.ptr == c->strings[RIGHT]) { + value = PAGE_BREAK_AFTER_RIGHT; + } else + return CSS_INVALID; + + opv = buildOPV(OP_PAGE_BREAK_AFTER, flags, value); + + /* Allocate result */ + error = css_stylesheet_style_create(c->sheet, sizeof(opv), result); + if (error != CSS_OK) + return error; + + /* Copy the bytecode to it */ + memcpy((*result)->bytecode, &opv, sizeof(opv)); return CSS_OK; } |