From ceb4c4f50b518e7926bf215681332792b489b08d Mon Sep 17 00:00:00 2001 From: konn Date: Mon, 7 Jul 2008 16:28:50 +0000 Subject: [PATCH] * Added TEXTAREA with -wap-input-format using style attribute and Added test code of it for au XHTML converter. git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/branches/sandbox@2827 1a406e8e-add9-4483-a2c8-d8cac5b7c224 --- src/chxj_xhtml_mobile_1_0.c | 142 ++++++++- test/chxj_xhtml_mobile_1_0/Makefile | 6 +- .../test_chxj_xhtml_mobile_1_0.c | 349 +++++++++++++++++++++ 3 files changed, 482 insertions(+), 15 deletions(-) diff --git a/src/chxj_xhtml_mobile_1_0.c b/src/chxj_xhtml_mobile_1_0.c index 0f3b38a2..96c7418c 100644 --- a/src/chxj_xhtml_mobile_1_0.c +++ b/src/chxj_xhtml_mobile_1_0.c @@ -121,6 +121,9 @@ static char *s_xhtml_1_0_link_tag (void *pdoc, Node *node); static void s_init_xhtml(xhtml_t *xhtml, Doc *doc, request_rec *r, device_table *spec); static int s_xhtml_search_emoji(xhtml_t *xhtml, char *txt, char **rslt); static char *s_xhtml_1_0_text_tag(void *pdoc, Node *child); +static css_prop_list_t *s_xhtml_1_0_nopush_and_get_now_style(void *pdoc, Node *node, const char *style_attr_value); +static css_prop_list_t *s_xhtml_1_0_push_and_get_now_style(void *pdoc, Node *node, const char *style_attr_value); +/* pend */ tag_handler xhtml_handler[] = { @@ -456,6 +459,10 @@ chxj_convert_xhtml_mobile_1_0( memset(ss, 0, srclen + 1); memcpy(ss, src, srclen); + if (IS_CSS_ON(xhtml.entryp)) { + /* current property list */ + xhtml.css_prop_stack = chxj_new_prop_list_stack(&doc); + } #ifdef DUMP_LOG chxj_dump_out("[src] CHTML->XHTML", ss, srclen); #endif @@ -2725,41 +2732,92 @@ s_xhtml_1_0_start_textarea_tag(void *pdoc, Node *node) xhtml_t *xhtml = GET_XHTML(pdoc); Doc *doc = xhtml->doc; Attr *attr; + char *attr_accesskey = NULL; + char *attr_name = NULL; + char *attr_rows = NULL; + char *attr_cols = NULL; + char *attr_istyle = NULL; + char *attr_style = NULL; xhtml->textarea_flag++; - W_L("r,value); W_L(" FORMAT=\"*"); W_V(fmt); W_L("\""); +#endif } else if (STRCASEEQ('a','A',"accesskey",name) && value && *value != 0) { - W_L(" accesskey=\""); - W_V(value); - W_L("\""); + attr_accesskey = value; + } + else if (STRCASEEQ('s','S',"style",name) && value && *value != 0) { + attr_style = value; } } + if (IS_CSS_ON(xhtml->entryp)) { + css_prop_list_t *style = s_xhtml_1_0_nopush_and_get_now_style(pdoc, node, attr_style); + if (style) { + css_property_t *wap_input_format = chxj_css_get_property_value(doc, style, "-wap-input-format"); + css_property_t *cur; + for (cur = wap_input_format->next; cur != wap_input_format; cur = cur->next) { + if (strcasestr(cur->value, "")) { + attr_istyle = "4"; + } + else if (strcasestr(cur->value, "")) { + attr_istyle = "3"; + } + else if (strcasestr(cur->value, "")) { + attr_istyle = "2"; + } + else if (strcasestr(cur->value, "")) { + attr_istyle = "1"; + } + } + } + } + W_L("r, attr_istyle); + W_L(" FORMAT=\"*"); + W_V(fmt); + W_L("\""); + } W_L(">"); return xhtml->out; } @@ -3324,6 +3382,64 @@ s_xhtml_1_0_link_tag(void *pdoc, Node *node) return xhtml->out; } + +static css_prop_list_t * +s_xhtml_1_0_push_and_get_now_style(void *pdoc, Node *node, const char *style_attr_value) +{ + xhtml_t *xhtml = GET_XHTML(pdoc); + Doc *doc = xhtml->doc; + css_prop_list_t *last_css = NULL; + if (IS_CSS_ON(xhtml->entryp)) { + css_prop_list_t *dup_css; + css_selector_t *selector; + + last_css = chxj_css_get_last_prop_list(xhtml->css_prop_stack); + dup_css = chxj_dup_css_prop_list(doc, last_css); + selector = chxj_css_find_selector(doc, xhtml->style, node); + if (selector) { + chxj_css_prop_list_merge_property(doc, dup_css, selector); + } + chxj_css_push_prop_list(xhtml->css_prop_stack, dup_css); + last_css = chxj_css_get_last_prop_list(xhtml->css_prop_stack); + + if (style_attr_value) { + css_stylesheet_t *ssheet = chxj_css_parse_style_attr(doc, NULL, apr_pstrdup(doc->pool, node->name), NULL, NULL, apr_pstrdup(doc->pool, style_attr_value)); + if (ssheet) { + chxj_css_prop_list_merge_property(doc, last_css, ssheet->selector_head.next); + } + } + } + return last_css; +} + + +static css_prop_list_t * +s_xhtml_1_0_nopush_and_get_now_style(void *pdoc, Node *node, const char *style_attr_value) +{ + xhtml_t *xhtml = GET_XHTML(pdoc); + Doc *doc = xhtml->doc; + css_prop_list_t *last_css = NULL; + if (IS_CSS_ON(xhtml->entryp)) { + css_prop_list_t *dup_css; + css_selector_t *selector; + + last_css = chxj_css_get_last_prop_list(xhtml->css_prop_stack); + dup_css = chxj_dup_css_prop_list(doc, last_css); + selector = chxj_css_find_selector(doc, xhtml->style, node); + if (selector) { + chxj_css_prop_list_merge_property(doc, dup_css, selector); + } + last_css = dup_css; + + if (style_attr_value) { + css_stylesheet_t *ssheet = chxj_css_parse_style_attr(doc, NULL, apr_pstrdup(doc->pool, node->name), NULL, NULL, apr_pstrdup(doc->pool, style_attr_value)); + if (ssheet) { + chxj_css_prop_list_merge_property(doc, last_css, ssheet->selector_head.next); + } + } + } + return last_css; +} /* * vim:ts=2 et */ diff --git a/test/chxj_xhtml_mobile_1_0/Makefile b/test/chxj_xhtml_mobile_1_0/Makefile index 7c349731..7380c61a 100644 --- a/test/chxj_xhtml_mobile_1_0/Makefile +++ b/test/chxj_xhtml_mobile_1_0/Makefile @@ -9,7 +9,8 @@ INC_DIR=-I$(TOP_DIR)/include \ -I/usr/include/apache2 \ -I/usr/include/apr-1.0 \ -I$(TOP_DIR)/src \ - -I$(TOP_DIR)/src/serf + -I$(TOP_DIR)/src/serf \ + -I$(TOP_DIR)/src/css/include all:test @@ -19,7 +20,8 @@ test: $(TARGET) ./$(TARGET) $(TARGET): $(TARGET).c - gcc -g -o $@ -Wall -lcunit $< $(INC_DIR) -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -lapr-1 -laprutil-1 `croco-0.6-config --cflags` `croco-0.6-config --libs` $(TOP_DIR)/src/serf/.libs/libserf-0.a -lpcre + gcc -g -o $@ -Wall -lcunit $< $(INC_DIR) -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -lapr-1 -laprutil-1 $(TOP_DIR)/src/serf/.libs/libserf-0.a -lpcre $(TOP_DIR)/src/css/src/.libs/libscss.a + clean: rm -f ./$(TARGET) diff --git a/test/chxj_xhtml_mobile_1_0/test_chxj_xhtml_mobile_1_0.c b/test/chxj_xhtml_mobile_1_0/test_chxj_xhtml_mobile_1_0.c index ec4efc1c..b57036b9 100644 --- a/test/chxj_xhtml_mobile_1_0/test_chxj_xhtml_mobile_1_0.c +++ b/test/chxj_xhtml_mobile_1_0/test_chxj_xhtml_mobile_1_0.c @@ -527,6 +527,16 @@ void test_xhtml_link_009(); void test_xhtml_html_tag_with_css_001(); void test_xhtml_meta_tag_with_css_001(); + +void test_xhtml_textarea_tag_with_css_001(); +void test_xhtml_textarea_tag_with_css_002(); +void test_xhtml_textarea_tag_with_css_003(); +void test_xhtml_textarea_tag_with_css_004(); + +void test_xhtml_textarea_tag_with_css_005(); +void test_xhtml_textarea_tag_with_css_006(); +void test_xhtml_textarea_tag_with_css_007(); +void test_xhtml_textarea_tag_with_css_008(); /* pend */ int @@ -1091,6 +1101,16 @@ main() CU_add_test(xhtml_suite, "test html with css 001", test_xhtml_html_tag_with_css_001); CU_add_test(xhtml_suite, "test meta with css 001", test_xhtml_meta_tag_with_css_001); + + CU_add_test(xhtml_suite, "test textarea with css 001", test_xhtml_textarea_tag_with_css_001); + CU_add_test(xhtml_suite, "test textarea with css 002", test_xhtml_textarea_tag_with_css_002); + CU_add_test(xhtml_suite, "test textarea with css 003", test_xhtml_textarea_tag_with_css_003); + CU_add_test(xhtml_suite, "test textarea with css 004", test_xhtml_textarea_tag_with_css_004); + + CU_add_test(xhtml_suite, "test textarea with css 005", test_xhtml_textarea_tag_with_css_005); + CU_add_test(xhtml_suite, "test textarea with css 006", test_xhtml_textarea_tag_with_css_006); + CU_add_test(xhtml_suite, "test textarea with css 007", test_xhtml_textarea_tag_with_css_007); + CU_add_test(xhtml_suite, "test textarea with css 008", test_xhtml_textarea_tag_with_css_008); /* aend */ CU_basic_run_tests(); @@ -14240,6 +14260,335 @@ void test_xhtml_meta_tag_with_css_001() #undef TEST_STRING #undef RESULT_STRING } + + +/******************************************************************************/ +/* TEXTAREA with CSS */ +/******************************************************************************/ +char *test_chxj_serf_get004(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" + "textarea { -wap-input-format: "*<ja:h>" }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_xhtml_textarea_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_get004; + 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_xhtml_mobile_1_0(&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_get005(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" + "textarea { -wap-input-format: "*<ja:hk>" }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_xhtml_textarea_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_get005; + 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_xhtml_mobile_1_0(&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); + fprintf(stderr, "expect:[%s]\n", RESULT_STRING); + fprintf(stderr, "actual:[%s]\n", ret); + + APR_TERM; +#undef TEST_STRING +#undef RESULT_STRING +} + +char *test_chxj_serf_get006(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" + "textarea { -wap-input-format: "*<ja:en>" }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_xhtml_textarea_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_get006; + 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_xhtml_mobile_1_0(&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_get007(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" + "textarea { -wap-input-format: "*<ja:n>"; }\n" + "br { display: none }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_xhtml_textarea_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_get007; + 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_xhtml_mobile_1_0(&r, &spec, tmp, destlen, &destlen, &entry, &cookie); + ret = chxj_rencoding(&r, ret, &destlen); +fprintf(stderr, "expect:[%s]\n", RESULT_STRING); +fprintf(stderr, "actual:[%s]\n", ret); + 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 +} +/******************************************************************************/ +/* TEXTAREA with style attribute */ +/******************************************************************************/ +void test_xhtml_textarea_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; + 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_xhtml_mobile_1_0(&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_xhtml_textarea_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; + 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_xhtml_mobile_1_0(&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); + fprintf(stderr, "expect:[%s]\n", RESULT_STRING); + fprintf(stderr, "actual:[%s]\n", ret); + + APR_TERM; +#undef TEST_STRING +#undef RESULT_STRING +} + +void test_xhtml_textarea_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; + 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_xhtml_mobile_1_0(&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_xhtml_textarea_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; + 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_xhtml_mobile_1_0(&r, &spec, tmp, destlen, &destlen, &entry, &cookie); + ret = chxj_rencoding(&r, ret, &destlen); +fprintf(stderr, "expect:[%s]\n", RESULT_STRING); +fprintf(stderr, "actual:[%s]\n", ret); + 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