From 29dc47355dad18581bf6f6b9d56dcd562ac028dd Mon Sep 17 00:00:00 2001 From: konn Date: Tue, 15 Jul 2008 07:44:12 +0000 Subject: [PATCH] * Added body tag with CSS for SoftBank HTML converter. git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/branches/sandbox@2938 1a406e8e-add9-4483-a2c8-d8cac5b7c224 --- src/chxj_chtml20.c | 3 + src/chxj_chtml30.c | 3 + src/chxj_chtml40.c | 5 + src/chxj_chtml50.c | 5 + src/chxj_jhtml.c | 108 ++++++++++++--- test/chxj_jhtml/test_chxj_jhtml.c | 276 +++++++++++++++++++++++++++++++++++++- 6 files changed, 383 insertions(+), 17 deletions(-) diff --git a/src/chxj_chtml20.c b/src/chxj_chtml20.c index 3883219b..6815aa86 100644 --- a/src/chxj_chtml20.c +++ b/src/chxj_chtml20.c @@ -1042,16 +1042,19 @@ s_chtml20_start_body_tag(void *pdoc, Node *node) } W_L("pool, attr_bgcolor); W_L(" bgcolor=\""); W_V(attr_bgcolor); W_L("\""); } if (attr_text) { + attr_text = chxj_css_rgb_func_to_value(doc->pool, attr_text); W_L(" text=\""); W_V(attr_text); W_L("\""); } if (attr_link) { + attr_link = chxj_css_rgb_func_to_value(doc->pool, attr_link); W_L(" link=\""); W_V(attr_link); W_L("\""); diff --git a/src/chxj_chtml30.c b/src/chxj_chtml30.c index d1b49186..081e43fa 100644 --- a/src/chxj_chtml30.c +++ b/src/chxj_chtml30.c @@ -1008,16 +1008,19 @@ s_chtml30_start_body_tag(void *pdoc, Node *node) } W_L("pool, attr_bgcolor); W_L(" bgcolor=\""); W_V(attr_bgcolor); W_L("\""); } if (attr_text) { + attr_text = chxj_css_rgb_func_to_value(doc->pool, attr_text); W_L(" text=\""); W_V(attr_text); W_L("\""); } if (attr_link) { + attr_link = chxj_css_rgb_func_to_value(doc->pool, attr_link); W_L(" link=\""); W_V(attr_link); W_L("\""); diff --git a/src/chxj_chtml40.c b/src/chxj_chtml40.c index 1c7f24c4..51358e9b 100644 --- a/src/chxj_chtml40.c +++ b/src/chxj_chtml40.c @@ -1001,26 +1001,31 @@ s_chtml40_start_body_tag(void *pdoc, Node *node) W_L("pool, attr_bgcolor); W_L(" bgcolor=\""); W_V(attr_bgcolor); W_L("\""); } if (attr_text) { + attr_text = chxj_css_rgb_func_to_value(doc->pool, attr_text); W_L(" text=\""); W_V(attr_text); W_L("\""); } if (attr_link) { + attr_link = chxj_css_rgb_func_to_value(doc->pool, attr_link); W_L(" link=\""); W_V(attr_link); W_L("\""); } if (attr_alink) { + attr_alink = chxj_css_rgb_func_to_value(doc->pool, attr_alink); W_L(" alink=\""); W_V(attr_alink); W_L("\""); } if (attr_vlink) { + attr_vlink = chxj_css_rgb_func_to_value(doc->pool, attr_vlink); W_L(" vlink=\""); W_V(attr_vlink); W_L("\""); diff --git a/src/chxj_chtml50.c b/src/chxj_chtml50.c index bcd3dffb..6151d5d1 100644 --- a/src/chxj_chtml50.c +++ b/src/chxj_chtml50.c @@ -1002,26 +1002,31 @@ s_chtml50_start_body_tag(void *pdoc, Node *node) W_L("pool, attr_bgcolor); W_L(" bgcolor=\""); W_V(attr_bgcolor); W_L("\""); } if (attr_text) { + attr_text = chxj_css_rgb_func_to_value(doc->pool, attr_text); W_L(" text=\""); W_V(attr_text); W_L("\""); } if (attr_link) { + attr_link = chxj_css_rgb_func_to_value(doc->pool, attr_link); W_L(" link=\""); W_V(attr_link); W_L("\""); } if (attr_alink) { + attr_alink = chxj_css_rgb_func_to_value(doc->pool, attr_alink); W_L(" alink=\""); W_V(attr_alink); W_L("\""); } if (attr_vlink) { + attr_vlink = chxj_css_rgb_func_to_value(doc->pool, attr_vlink); W_L(" vlink=\""); W_V(attr_vlink); W_L("\""); diff --git a/src/chxj_jhtml.c b/src/chxj_jhtml.c index b4743045..4920dfa0 100644 --- a/src/chxj_jhtml.c +++ b/src/chxj_jhtml.c @@ -940,16 +940,20 @@ s_jhtml_end_base_tag(void *pdoc, Node *UNUSED(child)) static char * s_jhtml_start_body_tag(void *pdoc, Node *node) { - jhtml_t *jhtml; - Doc *doc; - request_rec *r; - Attr *attr; + jhtml_t *jhtml; + Doc *doc; + request_rec *r; + Attr *attr; + char *attr_bgcolor = NULL; + char *attr_text = NULL; + char *attr_link = NULL; + char *attr_style = NULL; + char *attr_vlink = NULL; jhtml = GET_JHTML(pdoc); doc = jhtml->doc; r = doc->r; - W_L("entryp)) { + css_prop_list_t *style = s_jhtml_push_and_get_now_style(pdoc, node, attr_style); + if (style) { + css_property_t *color_prop = chxj_css_get_property_value(doc, style, "color"); + css_property_t *bgcolor_prop = chxj_css_get_property_value(doc, style, "background-color"); + css_property_t *cur; + for (cur = color_prop->next; cur != color_prop; cur = cur->next) { + if (cur->value && *cur->value) { + attr_text = apr_pstrdup(doc->pool, cur->value); + } + } + for (cur = bgcolor_prop->next; cur != bgcolor_prop; cur = cur->next) { + if (cur->value && *cur->value) { + attr_bgcolor = apr_pstrdup(doc->pool, cur->value); + } + } + } + if (jhtml->style) { + css_stylesheet_t *pseudos = chxj_find_pseudo_selectors(doc, jhtml->style); + css_selector_t *cur_sel; + for (cur_sel = pseudos->selector_head.next; cur_sel != &pseudos->selector_head; cur_sel = cur_sel->next) { + if (cur_sel->name && strcasecmp(cur_sel->name, "a:link") == 0) { + css_property_t *cur; + for (cur = cur_sel->property_head.next; cur != &cur_sel->property_head; cur = cur->next) { + if (cur->name && strcasecmp(cur->name, "color") == 0) { + attr_link = apr_pstrdup(doc->pool, cur->value); + } + } + } + else if (cur_sel->name && strcasecmp(cur_sel->name, "a:visited") == 0) { + css_property_t *cur; + for (cur = cur_sel->property_head.next; cur != &cur_sel->property_head; cur = cur->next) { + if (cur->name && strcasecmp(cur->name, "color") == 0) { + attr_vlink = apr_pstrdup(doc->pool, cur->value); + } + } + } + } } } + + W_L("pool, attr_bgcolor); + W_L(" bgcolor=\""); + W_V(attr_bgcolor); + W_L("\""); + } + if (attr_text) { + attr_text = chxj_css_rgb_func_to_value(doc->pool, attr_text); + W_L(" text=\""); + W_V(attr_text); + W_L("\""); + } + if (attr_link) { + attr_link = chxj_css_rgb_func_to_value(doc->pool, attr_link); + W_L(" link=\""); + W_V(attr_link); + W_L("\""); + } + if (attr_vlink) { + attr_vlink = chxj_css_rgb_func_to_value(doc->pool, attr_vlink); + W_L(" vlink=\""); + W_V(attr_vlink); + W_L("\""); + } W_L(">"); + return jhtml->out; } @@ -1020,6 +1092,10 @@ s_jhtml_end_body_tag(void *pdoc, Node *UNUSED(child)) r = doc->r; W_L(""); + if (IS_CSS_ON(jhtml->entryp)) { + chxj_css_pop_prop_list(jhtml->css_prop_stack); + } + return jhtml->out; } diff --git a/test/chxj_jhtml/test_chxj_jhtml.c b/test/chxj_jhtml/test_chxj_jhtml.c index 5092c5d5..d3f2895d 100644 --- a/test/chxj_jhtml/test_chxj_jhtml.c +++ b/test/chxj_jhtml/test_chxj_jhtml.c @@ -577,6 +577,13 @@ void test_jhtml_h6_tag_with_css_003(); void test_jhtml_h6_tag_with_css_004(); void test_jhtml_h6_tag_with_css_005(); void test_jhtml_h6_tag_with_css_006(); + +void test_jhtml_body_tag_with_css_001(); +void test_jhtml_body_tag_with_css_002(); +void test_jhtml_body_tag_with_css_003(); +void test_jhtml_body_tag_with_css_004(); +void test_jhtml_body_tag_with_css_005(); +void test_jhtml_body_tag_with_css_006(); /* pend */ int @@ -1232,6 +1239,13 @@ main() CU_add_test(jhtml_suite, "test h6 with css 004", test_jhtml_h6_tag_with_css_004); CU_add_test(jhtml_suite, "test h6 with css 005", test_jhtml_h6_tag_with_css_005); CU_add_test(jhtml_suite, "test h6 with css 006", test_jhtml_h6_tag_with_css_006); + + CU_add_test(jhtml_suite, "test body with css 001", test_jhtml_body_tag_with_css_001); + CU_add_test(jhtml_suite, "test body with css 002", test_jhtml_body_tag_with_css_002); + CU_add_test(jhtml_suite, "test body with css 003", test_jhtml_body_tag_with_css_003); + CU_add_test(jhtml_suite, "test body with css 004", test_jhtml_body_tag_with_css_004); + CU_add_test(jhtml_suite, "test body with css 005", test_jhtml_body_tag_with_css_005); + CU_add_test(jhtml_suite, "test body with css 006", test_jhtml_body_tag_with_css_006); /* aend */ CU_basic_run_tests(); @@ -2428,7 +2442,7 @@ void test_jhtml_body_tag_012() void test_jhtml_body_tag_013() { #define TEST_STRING "" -#define RESULT_STRING "" +#define RESULT_STRING "" char *ret; char *tmp; device_table spec; @@ -16691,6 +16705,266 @@ void test_jhtml_h6_tag_with_css_006() #undef TEST_STRING #undef RESULT_STRING } + + + + +/*===========================================================================*/ +/* body tag with CSS */ +/*===========================================================================*/ +char *test_chxj_serf_get058(request_rec *r, apr_pool_t *ppool, const char *uri_path, int ss, apr_size_t *len) +{ + static char *css = "a:focus { display: none }\n" + "a:link { display: none }\n" + "a { display: none }\n" + "hr { display: none }\n" + "a:visited { display:none }\n" + "body { color:#ff0000 }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_jhtml_body_tag_with_css_001() +{ +#define TEST_STRING "" \ + "あいう" +#define RESULT_STRING "あいう" + char *ret; + char *tmp; + device_table spec; + chxjconvrule_entry entry; + cookie_t cookie; + apr_size_t destlen; + APR_INIT; + chxj_serf_get = test_chxj_serf_get058; + call_check = 0; + + COOKIE_INIT(cookie); + + SPEC_INIT(spec); + destlen = sizeof(TEST_STRING)-1; + entry.action |= CONVRULE_CSS_ON_BIT; + + tmp = chxj_encoding(&r, TEST_STRING, &destlen); + ret = chxj_convert_jhtml(&r, &spec, tmp, destlen, &destlen, &entry, &cookie); + ret = chxj_rencoding(&r, ret, &destlen); + CU_ASSERT(ret != NULL); + CU_ASSERT(strcmp(RESULT_STRING, ret) == 0); + CU_ASSERT(destlen == sizeof(RESULT_STRING)-1); + CU_ASSERT(call_check == 1); + + APR_TERM; +#undef TEST_STRING +#undef RESULT_STRING +} + + +char *test_chxj_serf_get059(request_rec *r, apr_pool_t *ppool, const char *uri_path, int ss, apr_size_t *len) +{ + static char *css = "a:focus { display: none }\n" + "a:link { display: none }\n" + "a { display: none }\n" + "hr { display: none }\n" + "a:visited { display:none }\n" + "body { background-color:#ff0000 }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_jhtml_body_tag_with_css_002() +{ +#define TEST_STRING "" \ + "あいう" +#define RESULT_STRING "あいう" + char *ret; + char *tmp; + device_table spec; + chxjconvrule_entry entry; + cookie_t cookie; + apr_size_t destlen; + APR_INIT; + chxj_serf_get = test_chxj_serf_get059; + call_check = 0; + + COOKIE_INIT(cookie); + + SPEC_INIT(spec); + destlen = sizeof(TEST_STRING)-1; + entry.action |= CONVRULE_CSS_ON_BIT; + + tmp = chxj_encoding(&r, TEST_STRING, &destlen); + ret = chxj_convert_jhtml(&r, &spec, tmp, destlen, &destlen, &entry, &cookie); + ret = chxj_rencoding(&r, ret, &destlen); + CU_ASSERT(ret != NULL); + CU_ASSERT(strcmp(RESULT_STRING, ret) == 0); + CU_ASSERT(destlen == sizeof(RESULT_STRING)-1); + CU_ASSERT(call_check == 1); + + APR_TERM; +#undef TEST_STRING +#undef RESULT_STRING +} + +void test_jhtml_body_tag_with_css_003() +{ +#define TEST_STRING "" \ + "あいう" +#define RESULT_STRING "あいう" + char *ret; + char *tmp; + device_table spec; + chxjconvrule_entry entry; + cookie_t cookie; + apr_size_t destlen; + APR_INIT; + chxj_serf_get = test_chxj_serf_get059; + call_check = 0; + + COOKIE_INIT(cookie); + + SPEC_INIT(spec); + destlen = sizeof(TEST_STRING)-1; + entry.action |= CONVRULE_CSS_ON_BIT; + + tmp = chxj_encoding(&r, TEST_STRING, &destlen); + ret = chxj_convert_jhtml(&r, &spec, tmp, destlen, &destlen, &entry, &cookie); + ret = chxj_rencoding(&r, ret, &destlen); + CU_ASSERT(ret != NULL); + CU_ASSERT(strcmp(RESULT_STRING, ret) == 0); + CU_ASSERT(destlen == sizeof(RESULT_STRING)-1); + CU_ASSERT(call_check == 0); + + APR_TERM; +#undef TEST_STRING +#undef RESULT_STRING +} +void test_jhtml_body_tag_with_css_004() +{ +#define TEST_STRING "" \ + "あいう" +#define RESULT_STRING "あいう" + char *ret; + char *tmp; + device_table spec; + chxjconvrule_entry entry; + cookie_t cookie; + apr_size_t destlen; + APR_INIT; + chxj_serf_get = test_chxj_serf_get059; + call_check = 0; + + COOKIE_INIT(cookie); + + SPEC_INIT(spec); + destlen = sizeof(TEST_STRING)-1; + entry.action |= CONVRULE_CSS_ON_BIT; + + tmp = chxj_encoding(&r, TEST_STRING, &destlen); + ret = chxj_convert_jhtml(&r, &spec, tmp, destlen, &destlen, &entry, &cookie); + ret = chxj_rencoding(&r, ret, &destlen); + fprintf(stderr, "actual:[%s]\n", ret); + fprintf(stderr, "expect:[%s]\n", RESULT_STRING); + CU_ASSERT(ret != NULL); + CU_ASSERT(strcmp(RESULT_STRING, ret) == 0); + CU_ASSERT(destlen == sizeof(RESULT_STRING)-1); + CU_ASSERT(call_check == 0); + + APR_TERM; +#undef TEST_STRING +#undef RESULT_STRING +} +char *test_chxj_serf_get060(request_rec *r, apr_pool_t *ppool, const char *uri_path, int ss, apr_size_t *len) +{ + static char *css = "a:focus { display: none }\n" + "a:link { display: none }\n" + "a { display: none }\n" + "hr { display: none }\n" + "a:link { color:#ff0000 }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_jhtml_body_tag_with_css_005() +{ +#define TEST_STRING "" \ + "あいう" +#define RESULT_STRING "あいう" + char *ret; + char *tmp; + device_table spec; + chxjconvrule_entry entry; + cookie_t cookie; + apr_size_t destlen; + APR_INIT; + chxj_serf_get = test_chxj_serf_get060; + call_check = 0; + + COOKIE_INIT(cookie); + + SPEC_INIT(spec); + destlen = sizeof(TEST_STRING)-1; + entry.action |= CONVRULE_CSS_ON_BIT; + + tmp = chxj_encoding(&r, TEST_STRING, &destlen); + ret = chxj_convert_jhtml(&r, &spec, tmp, destlen, &destlen, &entry, &cookie); + ret = chxj_rencoding(&r, ret, &destlen); + fprintf(stderr, "actual:[%s]\n", ret); + fprintf(stderr, "expect:[%s]\n", RESULT_STRING); + CU_ASSERT(ret != NULL); + CU_ASSERT(strcmp(RESULT_STRING, ret) == 0); + CU_ASSERT(destlen == sizeof(RESULT_STRING)-1); + CU_ASSERT(call_check == 1); + + APR_TERM; +#undef TEST_STRING +#undef RESULT_STRING +} +char *test_chxj_serf_get062(request_rec *r, apr_pool_t *ppool, const char *uri_path, int ss, apr_size_t *len) +{ + static char *css = "a:focus { display: none }\n" + "a:link { display: none }\n" + "a { display: none }\n" + "hr { display: none }\n" + "a:visited { color:#ff0000 }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_jhtml_body_tag_with_css_006() +{ +#define TEST_STRING "" \ + "あいう" +#define RESULT_STRING "あいう" + char *ret; + char *tmp; + device_table spec; + chxjconvrule_entry entry; + cookie_t cookie; + apr_size_t destlen; + APR_INIT; + chxj_serf_get = test_chxj_serf_get062; + call_check = 0; + + COOKIE_INIT(cookie); + + SPEC_INIT(spec); + destlen = sizeof(TEST_STRING)-1; + entry.action |= CONVRULE_CSS_ON_BIT; + + tmp = chxj_encoding(&r, TEST_STRING, &destlen); + ret = chxj_convert_jhtml(&r, &spec, tmp, destlen, &destlen, &entry, &cookie); + ret = chxj_rencoding(&r, ret, &destlen); + fprintf(stderr, "actual:[%s]\n", ret); + fprintf(stderr, "expect:[%s]\n", RESULT_STRING); + CU_ASSERT(ret != NULL); + CU_ASSERT(strcmp(RESULT_STRING, ret) == 0); + CU_ASSERT(destlen == sizeof(RESULT_STRING)-1); + CU_ASSERT(call_check == 1); + + APR_TERM; +#undef TEST_STRING +#undef RESULT_STRING +} /* * vim:ts=2 et */ -- 2.11.0