diff --git a/sefht.geany b/sefht.geany index bdd43c43e58c71c0b2e92b61432e27572d1fd64c..2c9723dfb85983583541373c8911e3bd807a3944 100644 --- a/sefht.geany +++ b/sefht.geany @@ -28,7 +28,7 @@ long_line_behaviour=1 long_line_column=72 [files] -current_page=35 +current_page=34 FILE_NAME_0=139;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2FREADME;0;8 FILE_NAME_1=134;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2F.gitignore;0;8 FILE_NAME_2=1751;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fconfigure.ac;0;8 @@ -43,7 +43,7 @@ FILE_NAME_10=1550;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fp FILE_NAME_11=1562;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ffragment.h;0;8 FILE_NAME_12=2022;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ffragment_data.c;0;8 FILE_NAME_13=2558;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Ffragment_class.c;0;8 -FILE_NAME_14=36155;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fnode_fragment.c;0;8 +FILE_NAME_14=20340;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fnode_fragment.c;0;8 FILE_NAME_15=6811;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fnode_fragment.h;0;8 FILE_NAME_16=4906;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fattr.c;0;8 FILE_NAME_17=2956;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fattr.h;0;8 @@ -63,7 +63,7 @@ FILE_NAME_30=555;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2 FILE_NAME_31=218;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Fno_test.sh.in;0;8 FILE_NAME_32=1085;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_cms.c;0;8 FILE_NAME_33=3283;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_data.c;0;8 -FILE_NAME_34=114262;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_node_fragment.c;0;8 +FILE_NAME_34=110781;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_node_fragment.c;0;8 FILE_NAME_35=11319;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_attr.c;0;8 FILE_NAME_36=11068;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_text.c;0;8 FILE_NAME_37=5744;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator.c;0;8 diff --git a/src/lib/sefht/node_fragment.c b/src/lib/sefht/node_fragment.c index a6c5752bf7757c1ca9afb76d644a3b57102a22e8..595db618269c7e577612a0d3863914a90d8c074a 100644 --- a/src/lib/sefht/node_fragment.c +++ b/src/lib/sefht/node_fragment.c @@ -67,6 +67,11 @@ struct SH_NodeFragment #define CLOSE_TAG_BEGIN "</" #define CLOSE_TAG_END ">" +#define ATTR_NAME_DELIMITER " " +#define ATTR_VALUE_DELIMITER "=" +#define ATTR_VALUE_QUOTE_BEGIN "\"" +#define ATTR_VALUE_QUOTE_END "\"" + #define NEWLINE "\n" @@ -1566,6 +1571,47 @@ SH_NodeFragment_to_html (const struct SH_NodeFragment * fragment, goto fail_autoclean; } + for (index = 0; index < fragment->attr_n; index++) + { + #define add(TEXT) SH_Text_append_string (html, (TEXT), status) + #define attr &(fragment->attrs[index]) + + if (!add (ATTR_NAME_DELIMITER)) + { + goto fail_autoclean; + } + + if (!add (Attr_get_name (attr))) + { + goto fail_autoclean; + } + + if (Attr_has_value (attr)) + { + if (!add (ATTR_VALUE_DELIMITER)) + { + goto fail_autoclean; + } + + if (!add (ATTR_VALUE_QUOTE_BEGIN)) + { + goto fail_autoclean; + } + + if (!add (Attr_get_value (attr))) + { + goto fail_autoclean; + } + + if (!add (ATTR_VALUE_QUOTE_END)) + { + goto fail_autoclean; + } + } + #undef attr + #undef add + } + if (!SH_Text_append_string (html, OPEN_TAG_END, status)) { goto fail_autoclean; diff --git a/tests/test_node_fragment.c b/tests/test_node_fragment.c index be89c290d4b344c9cc0281067690d7cf8c430bc8..048ce6aff05f8ad5bf3f67e513e6af3107c7f0fe 100644 --- a/tests/test_node_fragment.c +++ b/tests/test_node_fragment.c @@ -3655,9 +3655,26 @@ START_TEST(test_node_fragment_html_inline_no_status) NULL); ck_assert_ptr_ne (NULL, fragment); + result = SH_NodeFragment_append_attr_new (fragment, + strdup ("lang"), + strdup ("de"), + NULL); + ck_assert_int_eq (TRUE, result); + child = SH_NodeFragment_new ("body", data, NULL); ck_assert_ptr_ne (NULL, child); + result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child, + strdup ("id"), + strdup ("body"), + NULL); + ck_assert_int_eq (TRUE, result); + + result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child, + strdup ("attr"), + NULL, NULL); + ck_assert_int_eq (TRUE, result); + result = SH_NodeFragment_append_child (fragment, child, NULL); ck_assert_int_eq (TRUE, result); @@ -3668,7 +3685,10 @@ START_TEST(test_node_fragment_html_inline_no_status) ck_assert_ptr_ne (NULL, text); string = SH_Text_get_string (text, 0, SIZE_MAX, &length, NULL); - ck_assert_str_eq (string, "<html><body></body></html>"); + ck_assert_str_eq (string, "<html lang=\"de\">" + "<body id=\"body\" attr>" + "</body>" + "</html>"); /* cleanup */ free (string); @@ -3697,9 +3717,26 @@ START_TEST(test_node_fragment_html_inline_with_status) NULL); ck_assert_ptr_ne (NULL, fragment); + result = SH_NodeFragment_append_attr_new (fragment, + strdup ("lang"), + strdup ("de"), + NULL); + ck_assert_int_eq (TRUE, result); + child = SH_NodeFragment_new ("body", data, NULL); ck_assert_ptr_ne (NULL, child); + result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child, + strdup ("id"), + strdup ("body"), + NULL); + ck_assert_int_eq (TRUE, result); + + result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child, + strdup ("attr"), + NULL, NULL); + ck_assert_int_eq (TRUE, result); + result = SH_NodeFragment_append_child (fragment, child, NULL); ck_assert_int_eq (TRUE, result); @@ -3712,7 +3749,10 @@ START_TEST(test_node_fragment_html_inline_with_status) ck_assert_int_eq (status.status, SUCCESS); string = SH_Text_get_string (text, 0, SIZE_MAX, &length, NULL); - ck_assert_str_eq (string, "<html><body></body></html>"); + ck_assert_str_eq (string, "<html lang=\"de\">" + "<body id=\"body\" attr>" + "</body>" + "</html>"); /* cleanup */ free (string); @@ -3740,9 +3780,26 @@ START_TEST(test_node_fragment_html_wrap_no_status) NULL); ck_assert_ptr_ne (NULL, fragment); + result = SH_NodeFragment_append_attr_new (fragment, + strdup ("lang"), + strdup ("de"), + NULL); + ck_assert_int_eq (TRUE, result); + child = SH_NodeFragment_new ("body", data, NULL); ck_assert_ptr_ne (NULL, child); + result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child, + strdup ("id"), + strdup ("body"), + NULL); + ck_assert_int_eq (TRUE, result); + + result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child, + strdup ("attr"), + NULL, NULL); + ck_assert_int_eq (TRUE, result); + result = SH_NodeFragment_append_child (fragment, child, NULL); ck_assert_int_eq (TRUE, result); @@ -3753,8 +3810,8 @@ START_TEST(test_node_fragment_html_wrap_no_status) ck_assert_ptr_ne (NULL, text); string = SH_Text_get_string (text, 0, SIZE_MAX, &length, NULL); - ck_assert_str_eq (string, "<html>\n" - "\t<body>\n" + ck_assert_str_eq (string, "<html lang=\"de\">\n" + "\t<body id=\"body\" attr>\n" "\t</body>\n" "</html>\n"); @@ -3785,9 +3842,26 @@ START_TEST(test_node_fragment_html_wrap_with_status) NULL); ck_assert_ptr_ne (NULL, fragment); + result = SH_NodeFragment_append_attr_new (fragment, + strdup ("lang"), + strdup ("de"), + NULL); + ck_assert_int_eq (TRUE, result); + child = SH_NodeFragment_new ("body", data, NULL); ck_assert_ptr_ne (NULL, child); + result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child, + strdup ("id"), + strdup ("body"), + NULL); + ck_assert_int_eq (TRUE, result); + + result = SH_NodeFragment_append_attr_new ((SH_NodeFragment *)child, + strdup ("attr"), + NULL, NULL); + ck_assert_int_eq (TRUE, result); + result = SH_NodeFragment_append_child (fragment, child, NULL); ck_assert_int_eq (TRUE, result); @@ -3800,8 +3874,8 @@ START_TEST(test_node_fragment_html_wrap_with_status) ck_assert_int_eq (status.status, SUCCESS); string = SH_Text_get_string (text, 0, SIZE_MAX, &length, NULL); - ck_assert_str_eq (string, "<html>\n" - "\t<body>\n" + ck_assert_str_eq (string, "<html lang=\"de\">\n" + "\t<body id=\"body\" attr>\n" "\t</body>\n" "</html>\n");