From 8a484961bade4bffcfa399b058d1b10bfea7bdb9 Mon Sep 17 00:00:00 2001 From: konn Date: Wed, 16 Jul 2008 10:47:18 +0000 Subject: [PATCH] * Added form tag with CSS for CHTML4.0 converter. git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/branches/sandbox@2958 1a406e8e-add9-4483-a2c8-d8cac5b7c224 --- include/chxj_chtml40.h | 1 + src/chxj_chtml40.c | 144 +++++++++++--- test/chxj_chtml40/test_chxj_chtml40.c | 352 +++++++++++++++++++++++++++++++++- 3 files changed, 467 insertions(+), 30 deletions(-) diff --git a/include/chxj_chtml40.h b/include/chxj_chtml40.h index c2278538..74ef963e 100644 --- a/include/chxj_chtml40.h +++ b/include/chxj_chtml40.h @@ -49,6 +49,7 @@ typedef struct _chtml40_flags_t chtml40_flags_t; struct _chtml40_flags_t { int with_font_flag; int with_blink_flag; + int with_div_flag; }; /*----------------------------------------------------------------------------*/ diff --git a/src/chxj_chtml40.c b/src/chxj_chtml40.c index 43d221b4..97d37a65 100644 --- a/src/chxj_chtml40.c +++ b/src/chxj_chtml40.c @@ -1437,16 +1437,21 @@ s_chtml40_end_font_tag(void *pdoc, Node *node) static char * s_chtml40_start_form_tag(void *pdoc, Node *node) { - chtml40_t *chtml40; - Doc *doc; - request_rec *r; - Attr *attr; + chtml40_t *chtml40; + Doc *doc; + request_rec *r; + Attr *attr; + char *attr_action = NULL; + char *attr_method = NULL; + char *attr_style = NULL; + char *attr_color = NULL; + char *attr_align = NULL; + char *attr_utn = NULL; chtml40 = GET_CHTML40(pdoc); doc = chtml40->doc; r = doc->r; - W_L("cookie); - W_L(" action=\""); - W_V(value); - W_L("\""); - } - else if (STRCASEEQ('m','M',"method", name)) { - /*----------------------------------------------------------------------*/ - /* CHTML 1.0 */ - /*----------------------------------------------------------------------*/ - W_L(" method=\""); - W_V(value); - W_L("\""); + switch(*name) { + case 'a': + case 'A': + if (strcasecmp(name, "action") == 0) { + /*--------------------------------------------------------------------*/ + /* CHTML 1.0 */ + /*--------------------------------------------------------------------*/ + attr_action = value; + } + break; + + case 'm': + case 'M': + if (strcasecmp(name, "method") == 0) { + /*--------------------------------------------------------------------*/ + /* CHTML 1.0 */ + /*--------------------------------------------------------------------*/ + attr_method = value; + } + break; + + case 'u': + case 'U': + if (strcasecmp(name, "utn") == 0) { + /*--------------------------------------------------------------------*/ + /* CHTML 3.0 */ + /*--------------------------------------------------------------------*/ + attr_utn = value; + } + break; + + case 's': + case 'S': + if (strcasecmp(name, "style") == 0) { + attr_style = value; + } + break; + + default: + break; } - else if (STRCASEEQ('u','U',"utn", name)) { - /*----------------------------------------------------------------------*/ - /* CHTML 3.0 */ - /* It is special only for CHTML. */ - /*----------------------------------------------------------------------*/ - W_L(" utn"); + } + if (IS_CSS_ON(chtml40->entryp)) { + css_prop_list_t *style = s_chtml40_push_and_get_now_style(pdoc, node, attr_style); + if (style) { + css_property_t *text_align_prop = chxj_css_get_property_value(doc, style, "text-align"); + css_property_t *color_prop = chxj_css_get_property_value(doc, style, "color"); + css_property_t *cur; + for (cur = text_align_prop->next; cur != text_align_prop; cur = cur->next) { + if (STRCASEEQ('l','L',"left", cur->value)) { + attr_align = apr_pstrdup(doc->pool, "left"); + } + else if (STRCASEEQ('c','C',"center",cur->value)) { + attr_align = apr_pstrdup(doc->pool, "center"); + } + else if (STRCASEEQ('r','R',"right",cur->value)) { + attr_align = apr_pstrdup(doc->pool, "right"); + } + } + for (cur = color_prop->next; cur != color_prop; cur = cur->next) { + attr_color = apr_pstrdup(doc->pool, cur->value); + } } } + W_L("cookie); + W_L(" action=\""); + W_V(attr_action); + W_L("\""); + } + if (attr_method) { + W_L(" method=\""); + W_V(attr_method); + W_L("\""); + } + if (attr_utn) { + W_L(" utn"); + } W_L(">"); + chtml40_flags_t *flg = (chtml40_flags_t *)apr_palloc(doc->pool, sizeof(chtml40_flags_t)); + memset(flg, 0, sizeof(*flg)); + if (attr_color) { + attr_color = chxj_css_rgb_func_to_value(doc->pool, attr_color); + W_L(""); + flg->with_font_flag = 1; + } + if (attr_align) { + W_L("
"); + flg->with_div_flag = 1; + } + node->userData = flg; + return chtml40->out; } @@ -1496,7 +1572,7 @@ s_chtml40_start_form_tag(void *pdoc, Node *node) * @return The conversion result is returned. */ static char * -s_chtml40_end_form_tag(void *pdoc, Node *UNUSED(child)) +s_chtml40_end_form_tag(void *pdoc, Node *node) { chtml40_t *chtml40; Doc *doc; @@ -1504,7 +1580,17 @@ s_chtml40_end_form_tag(void *pdoc, Node *UNUSED(child)) chtml40 = GET_CHTML40(pdoc); doc = chtml40->doc; + chtml40_flags_t *flg = (chtml40_flags_t *)node->userData; + if (flg && flg->with_div_flag) { + W_L("
"); + } + if (flg && flg->with_font_flag) { + W_L("
"); + } W_L(""); + if (IS_CSS_ON(chtml40->entryp)) { + chxj_css_pop_prop_list(chtml40->css_prop_stack); + } return chtml40->out; } diff --git a/test/chxj_chtml40/test_chxj_chtml40.c b/test/chxj_chtml40/test_chxj_chtml40.c index 7118f3ee..f3d7fcf5 100644 --- a/test/chxj_chtml40/test_chxj_chtml40.c +++ b/test/chxj_chtml40/test_chxj_chtml40.c @@ -606,6 +606,15 @@ void test_chtml40_body_tag_with_css_007(); void test_chtml40_font_tag_with_css_001(); void test_chtml40_font_tag_with_css_002(); + +void test_chtml40_form_tag_with_css_001(); +void test_chtml40_form_tag_with_css_002(); +void test_chtml40_form_tag_with_css_003(); +void test_chtml40_form_tag_with_css_004(); +void test_chtml40_form_tag_with_css_005(); +void test_chtml40_form_tag_with_css_006(); +void test_chtml40_form_tag_with_css_007(); +void test_chtml40_form_tag_with_css_008(); /* pend */ int @@ -1174,6 +1183,15 @@ main() CU_add_test(chtml40_suite, "test font with css 001", test_chtml40_font_tag_with_css_001); CU_add_test(chtml40_suite, "test font with css 002", test_chtml40_font_tag_with_css_002); + + CU_add_test(chtml40_suite, "test form with css 001", test_chtml40_form_tag_with_css_001); + CU_add_test(chtml40_suite, "test form with css 002", test_chtml40_form_tag_with_css_002); + CU_add_test(chtml40_suite, "test form with css 003", test_chtml40_form_tag_with_css_003); + CU_add_test(chtml40_suite, "test form with css 004", test_chtml40_form_tag_with_css_004); + CU_add_test(chtml40_suite, "test form with css 005", test_chtml40_form_tag_with_css_005); + CU_add_test(chtml40_suite, "test form with css 006", test_chtml40_form_tag_with_css_006); + CU_add_test(chtml40_suite, "test form with css 007", test_chtml40_form_tag_with_css_007); + CU_add_test(chtml40_suite, "test form with css 008", test_chtml40_form_tag_with_css_008); /* aend */ CU_basic_run_tests(); @@ -3454,7 +3472,7 @@ void test_chtml40_form_tag_008() void test_chtml40_form_tag_009() { #define TEST_STRING "
" -#define RESULT_STRING "
" +#define RESULT_STRING "
" char *ret; char *tmp; device_table spec; @@ -16970,6 +16988,338 @@ void test_chtml40_font_tag_with_css_002() #undef TEST_STRING #undef RESULT_STRING } + + +/*===========================================================================*/ +/* form tag with CSS */ +/*===========================================================================*/ +char *test_chxj_serf_get066(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" + "form { color:#ff0000 }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_chtml40_form_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_get066; + 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_chtml40(&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 +} +void test_chtml40_form_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_get066; + 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_chtml40(&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_get067(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" + "form { text-align:left }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_chtml40_form_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_get067; + 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_chtml40(&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 +} +void test_chtml40_form_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_get067; + 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_chtml40(&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_get068(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" + "form { text-align:center }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_chtml40_form_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_get068; + 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_chtml40(&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 +} +void test_chtml40_form_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_get068; + 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_chtml40(&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_get069(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" + "form { text-align:right }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_chtml40_form_tag_with_css_007() +{ +#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_get069; + 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_chtml40(&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 +} +void test_chtml40_form_tag_with_css_008() +{ +#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_get068; + 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_chtml40(&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 +} /* * vim:ts=2 et */ -- 2.11.0