From b0f127aa2c6b166572999c3eda46e74c845aec19 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Fri, 21 Aug 2009 17:05:22 +0000 Subject: Support HTML alignment hints. svn path=/trunk/netsurf/; revision=9381 --- css/dump.c | 22 +++++ css/select.c | 297 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 304 insertions(+), 15 deletions(-) (limited to 'css') diff --git a/css/dump.c b/css/dump.c index 430471382..9b1080233 100644 --- a/css/dump.c +++ b/css/dump.c @@ -1688,6 +1688,28 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style) break; } + /* -libcss-align */ + val = css_computed_libcss_align(style); + switch (val) { + case CSS_LIBCSS_ALIGN_LEFT: + fprintf(stream, "-libcss-align: left "); + break; + case CSS_LIBCSS_ALIGN_RIGHT: + fprintf(stream, "-libcss-align: right "); + break; + case CSS_LIBCSS_ALIGN_CENTER: + fprintf(stream, "-libcss-align: center "); + break; + case CSS_LIBCSS_ALIGN_JUSTIFY: + fprintf(stream, "-libcss-align: justify "); + break; + case CSS_LIBCSS_ALIGN_DEFAULT: + fprintf(stream, "-libcss-align: default "); + break; + default: + break; + } + fprintf(stream, "}"); } diff --git a/css/select.c b/css/select.c index 3f3f297f9..12e25d536 100644 --- a/css/select.c +++ b/css/select.c @@ -1306,6 +1306,25 @@ css_error node_presentational_hint(void *pw, void *node, xmlFree(bgcol); + return CSS_OK; + } else if (property == CSS_PROP_CAPTION_SIDE) { + xmlChar *align = NULL; + + if (strcmp((const char *) n->name, "caption") == 0) + align = xmlGetProp(n, (const xmlChar *) "align"); + + if (align == NULL) + return CSS_PROPERTY_NOT_SET; + + if (strcmp((const char *) align, "bottom") == 0) { + hint->status = CSS_CAPTION_SIDE_BOTTOM; + } else { + xmlFree(align); + return CSS_PROPERTY_NOT_SET; + } + + xmlFree(align); + return CSS_OK; } else if (property == CSS_PROP_COLOR) { xmlChar *col; @@ -1353,6 +1372,33 @@ css_error node_presentational_hint(void *pw, void *node, xmlFree(col); + return CSS_OK; + } else if (property == CSS_PROP_FLOAT) { + xmlChar *align = NULL; + + /** \todo input[type=image][align=*] - $11.3.3 */ + if (strcmp((const char *) n->name, "table") == 0 || + strcmp((const char *) n->name, "applet") == 0 || + strcmp((const char *) n->name, "embed") == 0 || + strcmp((const char *) n->name, "iframe") == 0 || + strcmp((const char *) n->name, "img") == 0 || + strcmp((const char *) n->name, "object") == 0) + align = xmlGetProp(n, (const xmlChar *) "align"); + + if (align == NULL) + return CSS_PROPERTY_NOT_SET; + + if (strcmp((const char *) align, "left") == 0) { + hint->status = CSS_FLOAT_LEFT; + } else if (strcmp((const char *) align, "right") == 0) { + hint->status = CSS_FLOAT_RIGHT; + } else { + xmlFree(align); + return CSS_PROPERTY_NOT_SET; + } + + xmlFree(align); + return CSS_OK; } else if (property == CSS_PROP_HEIGHT) { xmlChar *height; @@ -1592,29 +1638,84 @@ css_error node_presentational_hint(void *pw, void *node, return CSS_OK; } else if (property == CSS_PROP_MARGIN_RIGHT || property == CSS_PROP_MARGIN_LEFT) { - xmlChar *hspace; + xmlChar *hspace = NULL; + xmlChar *align = NULL; if (strcmp((const char *) n->name, "img") == 0 || - strcmp((const char *) n->name, "applet") == 0) + strcmp((const char *) n->name, "applet") == 0) { hspace = xmlGetProp(n, (const xmlChar *) "hspace"); - else - hspace = NULL; - if (hspace == NULL) - return CSS_PROPERTY_NOT_SET; + if (hspace == NULL) + return CSS_PROPERTY_NOT_SET; + + if (parse_dimension((const char *) hspace, false, + &hint->data.length.value, + &hint->data.length.unit)) { + hint->status = CSS_MARGIN_SET; + } else { + xmlFree(hspace); + return CSS_PROPERTY_NOT_SET; + } - if (parse_dimension((const char *) hspace, false, - &hint->data.length.value, - &hint->data.length.unit)) { - hint->status = CSS_MARGIN_SET; - } else { xmlFree(hspace); - return CSS_PROPERTY_NOT_SET; - } - xmlFree(hspace); + return CSS_OK; + } else if (strcmp((const char *) n->name, "table") == 0) { + align = xmlGetProp(n, (const xmlChar *) "align"); - return CSS_OK; + if (align == NULL) + return CSS_PROPERTY_NOT_SET; + + if (strcmp((const char *) align, "center") == 0 || + strcmp((const char *) align, + "abscenter") == 0 || + strcmp((const char *) align, + "middle") == 0 || + strcmp((const char *) align, + "absmiddle") == 0) { + hint->status = CSS_MARGIN_AUTO; + } else { + xmlFree(align); + return CSS_PROPERTY_NOT_SET; + } + + xmlFree(align); + + return CSS_OK; + } else if (strcmp((const char *) n->name, "hr") == 0) { + align = xmlGetProp(n, (const xmlChar *) "align"); + + if (align == NULL) + return CSS_PROPERTY_NOT_SET; + + if (strcmp((const char *) align, "left") == 0) { + if (property == CSS_PROP_MARGIN_LEFT) { + hint->data.length.value = 0; + hint->data.length.unit = CSS_UNIT_PX; + hint->status = CSS_MARGIN_SET; + } else { + hint->status = CSS_MARGIN_AUTO; + } + } else if (strcmp((const char *) align, + "center") == 0) { + hint->status = CSS_MARGIN_AUTO; + } else if (strcmp((const char *) align, "right") == 0) { + if (property == CSS_PROP_MARGIN_RIGHT) { + hint->data.length.value = 0; + hint->data.length.unit = CSS_UNIT_PX; + hint->status = CSS_MARGIN_SET; + } else { + hint->status = CSS_MARGIN_AUTO; + } + } else { + xmlFree(align); + return CSS_PROPERTY_NOT_SET; + } + + xmlFree(align); + + return CSS_OK; + } } else if (property == CSS_PROP_PADDING_TOP || property == CSS_PROP_PADDING_RIGHT || property == CSS_PROP_PADDING_BOTTOM || @@ -1652,6 +1753,172 @@ css_error node_presentational_hint(void *pw, void *node, xmlFree(cellpadding); return CSS_OK; + } else if (property == CSS_PROP_TEXT_ALIGN) { + xmlChar *align = NULL; + + if (strcmp((const char *) n->name, "p") == 0 || + strcmp((const char *) n->name, "h1") == 0 || + strcmp((const char *) n->name, "h2") == 0 || + strcmp((const char *) n->name, "h3") == 0 || + strcmp((const char *) n->name, "h4") == 0 || + strcmp((const char *) n->name, "h5") == 0 || + strcmp((const char *) n->name, "h6") == 0) + align = xmlGetProp(n, (const xmlChar *) "align"); + + if (align == NULL) + return CSS_PROPERTY_NOT_SET; + + if (strcmp((const char *) align, "left") == 0) { + hint->status = CSS_TEXT_ALIGN_LEFT; + } else if (strcmp((const char *) align, "center") == 0) { + hint->status = CSS_TEXT_ALIGN_CENTER; + } else if (strcmp((const char *) align, "right") == 0) { + hint->status = CSS_TEXT_ALIGN_RIGHT; + } else if (strcmp((const char *) align, "justify") == 0) { + hint->status = CSS_TEXT_ALIGN_JUSTIFY; + } else { + xmlFree(align); + return CSS_PROPERTY_NOT_SET; + } + + xmlFree(align); + + return CSS_OK; + } else if (property == CSS_PROP_VERTICAL_ALIGN) { + xmlChar *valign = NULL; + + if (strcmp((const char *) n->name, "col") == 0 || + strcmp((const char *) n->name, "thead") == 0 || + strcmp((const char *) n->name, "tbody") == 0 || + strcmp((const char *) n->name, "tfoot") == 0 || + strcmp((const char *) n->name, "tr") == 0 || + strcmp((const char *) n->name, "td") == 0 || + strcmp((const char *) n->name, "th") == 0) { + valign = xmlGetProp(n, (const xmlChar *) "valign"); + + if (valign == NULL) + return CSS_PROPERTY_NOT_SET; + + if (strcmp((const char *) valign, "top") == 0) { + hint->status = CSS_VERTICAL_ALIGN_TOP; + } else if (strcmp((const char *) valign, + "middle") == 0) { + hint->status = CSS_VERTICAL_ALIGN_MIDDLE; + } else if (strcmp((const char *) valign, + "bottom") == 0) { + hint->status = CSS_VERTICAL_ALIGN_BOTTOM; + } else if (strcmp((const char *) valign, + "baseline") == 0) { + hint->status = CSS_VERTICAL_ALIGN_BASELINE; + } else { + xmlFree(valign); + return CSS_PROPERTY_NOT_SET; + } + + xmlFree(valign); + + return CSS_OK; + } else if (strcmp((const char *) n->name, "applet") == 0 || + strcmp((const char *) n->name, "embed") == 0 || + strcmp((const char *) n->name, "iframe") == 0 || + strcmp((const char *) n->name, "img") == 0 || + strcmp((const char *) n->name, "object") == 0) { + /** \todo input[type=image][align=*] - $11.3.3 */ + valign = xmlGetProp(n, (const xmlChar *) "align"); + + if (valign == NULL) + return CSS_PROPERTY_NOT_SET; + + if (strcmp((const char *) valign, "top") == 0) { + hint->status = CSS_VERTICAL_ALIGN_TOP; + } else if (strcmp((const char *) valign, + "bottom") == 0 || + strcmp((const char *) valign, + "baseline") == 0) { + hint->status = CSS_VERTICAL_ALIGN_BASELINE; + } else if (strcmp((const char *) valign, + "texttop") == 0) { + hint->status = CSS_VERTICAL_ALIGN_TEXT_TOP; + } else if (strcmp((const char *) valign, + "absmiddle") == 0 || + strcmp((const char *) valign, + "abscenter") == 0) { + hint->status = CSS_VERTICAL_ALIGN_MIDDLE; + } else { + xmlFree(valign); + return CSS_PROPERTY_NOT_SET; + } + + xmlFree(valign); + + return CSS_OK; + } + } else if (property == CSS_PROP_LIBCSS_ALIGN) { + xmlChar *align = NULL; + + if (strcmp((const char *) n->name, "center") == 0) { + hint->status = CSS_LIBCSS_ALIGN_CENTER; + + return CSS_OK; + } else if (strcmp((const char *) n->name, "caption") == 0) { + align = xmlGetProp(n, (const xmlChar *) "align"); + + if (align == NULL || strcmp((const char *) align, + "center") == 0) { + hint->status = CSS_LIBCSS_ALIGN_CENTER; + } else if (strcmp((const char *) align, "left") == 0) { + hint->status = CSS_LIBCSS_ALIGN_LEFT; + } else if (strcmp((const char *) align, "right") == 0) { + hint->status = CSS_LIBCSS_ALIGN_RIGHT; + } else if (strcmp((const char *) align, + "justify") == 0) { + hint->status = CSS_LIBCSS_ALIGN_JUSTIFY; + } else { + xmlFree(align); + return CSS_PROPERTY_NOT_SET; + } + + if (align != NULL) + xmlFree(align); + + return CSS_OK; + } else if (strcmp((const char *) n->name, "div") == 0 || + strcmp((const char *) n->name, "thead") == 0 || + strcmp((const char *) n->name, "tbody") == 0 || + strcmp((const char *) n->name, "tfoot") == 0 || + strcmp((const char *) n->name, "tr") == 0 || + strcmp((const char *) n->name, "td") == 0 || + strcmp((const char *) n->name, "th") == 0) { + align = xmlGetProp(n, (const xmlChar *) "align"); + + if (align == NULL) + return CSS_PROPERTY_NOT_SET; + + if (strcmp((const char *) align, "center") == 0) { + hint->status = CSS_LIBCSS_ALIGN_CENTER; + } else if (strcmp((const char *) align, "left") == 0) { + hint->status = CSS_LIBCSS_ALIGN_LEFT; + } else if (strcmp((const char *) align, "right") == 0) { + hint->status = CSS_LIBCSS_ALIGN_RIGHT; + } else if (strcmp((const char *) align, + "justify") == 0) { + hint->status = CSS_LIBCSS_ALIGN_JUSTIFY; + } else { + xmlFree(align); + return CSS_PROPERTY_NOT_SET; + } + + xmlFree(align); + + return CSS_OK; + } else if (strcmp((const char *) n->name, "table") == 0) { + /* Tables reset HTML alignment */ + hint->status = CSS_LIBCSS_ALIGN_DEFAULT; + + return CSS_OK; + } else { + return CSS_PROPERTY_NOT_SET; + } } return CSS_PROPERTY_NOT_SET; -- cgit v1.2.3