From 1851274f9524c462806d6ab64e024effb0392231 Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Thu, 11 Jun 2015 03:24:12 -0300 Subject: added content excerpt support --- src/source-parser.c | 57 ++++++++++++++++++++++++++++- tests/check_loader.c | 2 +- tests/check_source_parser.c | 89 ++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 140 insertions(+), 8 deletions(-) diff --git a/src/source-parser.c b/src/source-parser.c index f0fca29..9e1f01d 100644 --- a/src/source-parser.c +++ b/src/source-parser.c @@ -27,6 +27,9 @@ typedef enum { SOURCE_SEPARATOR, SOURCE_CONTENT_START, SOURCE_CONTENT, + SOURCE_EXCERPT_SEPARATOR, + SOURCE_CONTENT2_START, + SOURCE_CONTENT2, } blogc_source_parser_state_t; @@ -41,6 +44,7 @@ blogc_source_parse(const char *src, size_t src_len, blogc_error_t **err) char *key = NULL; char *tmp = NULL; + char *tmp2 = NULL; b_trie_t *rv = b_trie_new(free); blogc_source_parser_state_t state = SOURCE_START; @@ -145,10 +149,53 @@ blogc_source_parse(const char *src, size_t src_len, blogc_error_t **err) break; case SOURCE_CONTENT: + if (c == '.') { + state = SOURCE_EXCERPT_SEPARATOR; + tmp = b_strndup(src + start, current - start); + b_trie_insert(rv, "EXCERPT", blogc_content_parse(tmp)); + free(tmp); + tmp = NULL; + break; + } if (current == (src_len - 1)) { tmp = b_strndup(src + start, src_len - start); - b_trie_insert(rv, "RAW_CONTENT", tmp); - b_trie_insert(rv, "CONTENT", blogc_content_parse(tmp)); + b_trie_insert(rv, "EXCERPT", blogc_content_parse(tmp)); + free(tmp); + tmp = NULL; + } + break; + + case SOURCE_EXCERPT_SEPARATOR: + if (c == '.') + break; + if (c == '\n' || c == '\r') { + state = SOURCE_CONTENT2_START; + break; + } + *err = blogc_error_parser(BLOGC_ERROR_SOURCE_PARSER, src, src_len, + current, + "Invalid excerpt separator. Must be more than one '.' characters."); + break; + + case SOURCE_CONTENT2_START: + start = current; + state = SOURCE_CONTENT2; + break; + + case SOURCE_CONTENT2: + if (current == (src_len - 1)) { + tmp = b_strndup(src + start, src_len - start); + tmp2 = b_strdup_printf("%s\n%s", + b_trie_lookup(rv, "EXCERPT"), tmp); + free(tmp); + tmp = NULL; + b_trie_insert(rv, "CONTENT", blogc_content_parse(tmp2)); + free(tmp2); + tmp2 = NULL; + } + if (c == '.') { + state = SOURCE_EXCERPT_SEPARATOR; + break; } break; } @@ -159,6 +206,9 @@ blogc_source_parse(const char *src, size_t src_len, blogc_error_t **err) current++; } + if (b_trie_lookup(rv, "CONTENT") == NULL) + b_trie_insert(rv, "CONTENT", b_strdup(b_trie_lookup(rv, "EXCERPT"))); + if (*err == NULL && b_trie_size(rv) == 0) { // ok, nothing found in the config trie, but no error set either. @@ -187,6 +237,9 @@ blogc_source_parse(const char *src, size_t src_len, blogc_error_t **err) case SOURCE_SEPARATOR: case SOURCE_CONTENT_START: case SOURCE_CONTENT: + case SOURCE_EXCERPT_SEPARATOR: + case SOURCE_CONTENT2_START: + case SOURCE_CONTENT2: break; // won't happen, and if even happen, shouldn't be fatal } } diff --git a/tests/check_loader.c b/tests/check_loader.c index 865d598..2d16dba 100644 --- a/tests/check_loader.c +++ b/tests/check_loader.c @@ -117,7 +117,7 @@ test_source_parse_from_file(void **state) assert_string_equal(b_trie_lookup(t, "ASD"), "123"); assert_string_equal(b_trie_lookup(t, "FILENAME"), "bola"); assert_string_equal(b_trie_lookup(t, "CONTENT"), "

bola

\n"); - assert_string_equal(b_trie_lookup(t, "RAW_CONTENT"), "bola"); + assert_string_equal(b_trie_lookup(t, "EXCERPT"), "

bola

\n"); b_trie_free(t); } diff --git a/tests/check_source_parser.c b/tests/check_source_parser.c index 0cec364..c33b4c1 100644 --- a/tests/check_source_parser.c +++ b/tests/check_source_parser.c @@ -40,10 +40,42 @@ test_source_parse(void **state) assert_string_equal(b_trie_lookup(source, "CONTENT"), "

This is a test

\n" "

bola

\n"); - assert_string_equal(b_trie_lookup(source, "RAW_CONTENT"), + assert_string_equal(b_trie_lookup(source, "EXCERPT"), + "

This is a test

\n" + "

bola

\n"); + b_trie_free(source); +} + + +static void +test_source_parse_with_excerpt(void **state) +{ + const char *a = + "VAR1: asd asd\n" + "VAR2: 123chunda\n" + "----------\n" "# This is a test\n" "\n" - "bola\n"); + "bola\n" + "\n" + "...\n" + "guda\n" + "bola\n"; + blogc_error_t *err = NULL; + b_trie_t *source = blogc_source_parse(a, strlen(a), &err); + assert_null(err); + assert_non_null(source); + assert_int_equal(b_trie_size(source), 4); + assert_string_equal(b_trie_lookup(source, "VAR1"), "asd asd"); + assert_string_equal(b_trie_lookup(source, "VAR2"), "123chunda"); + assert_string_equal(b_trie_lookup(source, "CONTENT"), + "

This is a test

\n" + "

bola

\n" + "

guda\n" + "bola

\n"); + assert_string_equal(b_trie_lookup(source, "EXCERPT"), + "

This is a test

\n" + "

bola

\n"); b_trie_free(source); } @@ -70,10 +102,37 @@ test_source_parse_with_spaces(void **state) assert_string_equal(b_trie_lookup(source, "CONTENT"), "

This is a test

\n" "

bola

\n"); - assert_string_equal(b_trie_lookup(source, "RAW_CONTENT"), + assert_string_equal(b_trie_lookup(source, "EXCERPT"), + "

This is a test

\n" + "

bola

\n"); + b_trie_free(source); +} + + +static void +test_source_parse_with_spaces_and_excerpt(void **state) +{ + const char *a = + "\n \n" + "VAR1: chunda \t \n" + "\n\n" + "BOLA: guda\n" + "----------\n" "# This is a test\n" - "\n" - "bola\n"); + "..\n" + "bola\n"; + blogc_error_t *err = NULL; + b_trie_t *source = blogc_source_parse(a, strlen(a), &err); + assert_null(err); + assert_non_null(source); + assert_int_equal(b_trie_size(source), 4); + assert_string_equal(b_trie_lookup(source, "VAR1"), "chunda"); + assert_string_equal(b_trie_lookup(source, "BOLA"), "guda"); + assert_string_equal(b_trie_lookup(source, "CONTENT"), + "

This is a test

\n" + "

bola

\n"); + assert_string_equal(b_trie_lookup(source, "EXCERPT"), + "

This is a test

\n"); b_trie_free(source); } @@ -375,12 +434,31 @@ test_source_parse_invalid_separator(void **state) } +static void +test_source_parse_invalid_excerpt_separator(void **state) +{ + const char *a = "BOLA: asd\n---\nbola\n...#"; + blogc_error_t *err = NULL; + b_trie_t *source = blogc_source_parse(a, strlen(a), &err); + assert_null(source); + assert_non_null(err); + assert_int_equal(err->type, BLOGC_ERROR_SOURCE_PARSER); + assert_string_equal(err->msg, + "Invalid excerpt separator. Must be more than one '.' characters.\n" + "Error occurred near to '#'"); + blogc_error_free(err); + b_trie_free(source); +} + + int main(void) { const UnitTest tests[] = { unit_test(test_source_parse), + unit_test(test_source_parse_with_excerpt), unit_test(test_source_parse_with_spaces), + unit_test(test_source_parse_with_spaces_and_excerpt), unit_test(test_source_parse_config_empty), unit_test(test_source_parse_config_invalid_key), unit_test(test_source_parse_config_no_key), @@ -399,6 +477,7 @@ main(void) unit_test(test_source_parse_config_reserved_name10), unit_test(test_source_parse_config_value_no_line_ending), unit_test(test_source_parse_invalid_separator), + unit_test(test_source_parse_invalid_excerpt_separator), }; return run_tests(tests); } -- cgit v1.2.3-18-g5258