From 7dcf93f6773b135ca6033955537a7672f9b74dd4 Mon Sep 17 00:00:00 2001 From: konn Date: Sat, 12 Jul 2008 16:24:54 +0000 Subject: [PATCH] * Added h2 tag with CSS for SoftBank HTML converter. git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/branches/sandbox@2891 1a406e8e-add9-4483-a2c8-d8cac5b7c224 --- src/chxj_jhtml.c | 72 +++++++---- test/chxj_jhtml/test_chxj_jhtml.c | 253 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 304 insertions(+), 21 deletions(-) diff --git a/src/chxj_jhtml.c b/src/chxj_jhtml.c index 7fb3635b..5e2c8fd5 100644 --- a/src/chxj_jhtml.c +++ b/src/chxj_jhtml.c @@ -3089,11 +3089,12 @@ s_jhtml_end_h1_tag(void *pdoc, Node *node) static char * s_jhtml_start_h2_tag(void *pdoc, Node *node) { - jhtml_t *jhtml; - Doc *doc; - request_rec *r; - Attr *attr; - char *align = NULL; + jhtml_t *jhtml; + Doc *doc; + request_rec *r; + Attr *attr; + char *attr_style = NULL; + char *attr_align = NULL; jhtml = GET_JHTML(pdoc); doc = jhtml->doc; @@ -3102,23 +3103,48 @@ s_jhtml_start_h2_tag(void *pdoc, Node *node) for (attr = qs_get_attr(doc,node); attr; attr = qs_get_next_attr(doc,attr)) { - char* name; - char* value; - name = qs_get_attr_name(doc,attr); - value = qs_get_attr_value(doc,attr); + char *name = qs_get_attr_name(doc,attr); + char *value = qs_get_attr_value(doc,attr); if (STRCASEEQ('a','A',"align", name)) { if (value && (STRCASEEQ('l','L',"left",value) || STRCASEEQ('r','R',"right",value) || STRCASEEQ('c','C',"center",value))) { - jhtml->h2_align_flag++; - align = apr_pstrdup(doc->buf.pool, value); - break; + attr_align = value; } } + else if (STRCASEEQ('s','S',"style",name) && value && *value) { + attr_style = value; + } } - if (align) { + if (IS_CSS_ON(jhtml->entryp)) { + css_prop_list_t *style = s_jhtml_push_and_get_now_style(pdoc, node, attr_style); + if (style) { + css_property_t *list_style_type_prop = chxj_css_get_property_value(doc, style, "text-align"); + css_property_t *cur; + for (cur = list_style_type_prop->next; cur != list_style_type_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"); + } + } + } + } + if (attr_align) { W_L("
"); + jhtml_flags_t *flg = apr_palloc(doc->pool, sizeof(*flg)); + memset(flg, 0, sizeof(*flg)); + flg->with_div_align_flag = 1; + node->userData = (void *)flg; } + else { + node->userData = NULL; + } + return jhtml->out; } @@ -3132,19 +3158,23 @@ s_jhtml_start_h2_tag(void *pdoc, Node *node) * @return The conversion result is returned. */ static char * -s_jhtml_end_h2_tag(void *pdoc, Node *UNUSED(child)) +s_jhtml_end_h2_tag(void *pdoc, Node *node) { - jhtml_t* jhtml; - Doc* doc; - request_rec* r; + jhtml_t *jhtml; + Doc *doc; + request_rec *r; jhtml = GET_JHTML(pdoc); doc = jhtml->doc; r = doc->r; - - if (jhtml->h2_align_flag) { - jhtml->h2_align_flag--; + + jhtml_flags_t *flg = node->userData; + if (flg && flg->with_div_align_flag) { W_L("
"); + node->userData = NULL; + } + 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 fa15e154..dfae3d57 100644 --- a/test/chxj_jhtml/test_chxj_jhtml.c +++ b/test/chxj_jhtml/test_chxj_jhtml.c @@ -542,6 +542,13 @@ void test_jhtml_h1_tag_with_css_003(); void test_jhtml_h1_tag_with_css_004(); void test_jhtml_h1_tag_with_css_005(); void test_jhtml_h1_tag_with_css_006(); + +void test_jhtml_h2_tag_with_css_001(); +void test_jhtml_h2_tag_with_css_002(); +void test_jhtml_h2_tag_with_css_003(); +void test_jhtml_h2_tag_with_css_004(); +void test_jhtml_h2_tag_with_css_005(); +void test_jhtml_h2_tag_with_css_006(); /* pend */ int @@ -1162,6 +1169,13 @@ main() CU_add_test(jhtml_suite, "test h1 with css 004", test_jhtml_h1_tag_with_css_004); CU_add_test(jhtml_suite, "test h1 with css 005", test_jhtml_h1_tag_with_css_005); CU_add_test(jhtml_suite, "test h1 with css 006", test_jhtml_h1_tag_with_css_006); + + CU_add_test(jhtml_suite, "test h2 with css 001", test_jhtml_h2_tag_with_css_001); + CU_add_test(jhtml_suite, "test h2 with css 002", test_jhtml_h2_tag_with_css_002); + CU_add_test(jhtml_suite, "test h2 with css 003", test_jhtml_h2_tag_with_css_003); + CU_add_test(jhtml_suite, "test h2 with css 004", test_jhtml_h2_tag_with_css_004); + CU_add_test(jhtml_suite, "test h2 with css 005", test_jhtml_h2_tag_with_css_005); + CU_add_test(jhtml_suite, "test h2 with css 006", test_jhtml_h2_tag_with_css_006); /* aend */ CU_basic_run_tests(); @@ -15422,6 +15436,245 @@ void test_jhtml_h1_tag_with_css_006() #undef TEST_STRING #undef RESULT_STRING } + + +/*===========================================================================*/ +/* h2 tag with CSS */ +/*===========================================================================*/ +char *test_chxj_serf_get043(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" + "h2 { text-align: right }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_jhtml_h2_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_get043; + 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_get044(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" + "h2 { text-align: center }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_jhtml_h2_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_get044; + 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_get045(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" + "h2 { text-align: right }\n"; + *len = strlen(css); + call_check = 1; + return css; +} +void test_jhtml_h2_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_get045; + 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_h2_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_get042; + 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_h2_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_get042; + 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_h2_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_get042; + 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 +} /* * vim:ts=2 et */ -- 2.11.0