diff options
| -rw-r--r-- | src/content-parser.c | 32 | ||||
| -rw-r--r-- | src/content-parser.h | 1 | ||||
| -rw-r--r-- | tests/check_content_parser.c | 62 | ||||
| -rw-r--r-- | tests/check_source_parser.c | 12 | 
4 files changed, 82 insertions, 25 deletions
| diff --git a/src/content-parser.c b/src/content-parser.c index 511d09e..3b661a8 100644 --- a/src/content-parser.c +++ b/src/content-parser.c @@ -20,6 +20,27 @@  // expected. feel free to improve the parser and add new features. +char* +blogc_slugify(const char *str) +{ +    if (str == NULL) +        return NULL; +    char *new_str = b_strdup(str); +    int diff = 'a' - 'A';  // just to avoid magic numbers +    for (unsigned int i = 0; new_str[i] != '\0'; i++) { +        if (new_str[i] >= 'a' && new_str[i] <= 'z') +            continue; +        if (new_str[i] >= '0' && new_str[i] <= '9') +            continue; +        if (new_str[i] >= 'A' && new_str[i] <= 'Z') +            new_str[i] += diff; +        else +            new_str[i] = '-'; +    } +    return new_str; +} + +  typedef enum {      CONTENT_START_LINE = 1,      CONTENT_EXCERPT, @@ -389,6 +410,7 @@ blogc_content_parse(const char *src, size_t *end_excerpt)      char *tmp = NULL;      char *tmp2 = NULL;      char *parsed = NULL; +    char *slug = NULL;      char d = '\0'; @@ -501,8 +523,14 @@ blogc_content_parse(const char *src, size_t *end_excerpt)                      end = is_last && c != '\n' && c != '\r' ? src_len : current;                      tmp = b_strndup(src + start, end - start);                      parsed = blogc_content_parse_inline(tmp); -                    b_string_append_printf(rv, "<h%d>%s</h%d>\n", header_level, -                        parsed, header_level); +                    slug = blogc_slugify(tmp); +                    if (slug == NULL) +                        b_string_append_printf(rv, "<h%d>%s</h%d>\n", +                            header_level, parsed, header_level); +                    else +                        b_string_append_printf(rv, "<h%d id=\"%s\">%s</h%d>\n", +                            header_level, slug, parsed, header_level); +                    free(slug);                      free(parsed);                      parsed = NULL;                      free(tmp); diff --git a/src/content-parser.h b/src/content-parser.h index 4579719..2f6b8b9 100644 --- a/src/content-parser.h +++ b/src/content-parser.h @@ -12,6 +12,7 @@  #include <stdlib.h>  #include <stdbool.h> +char* blogc_slugify(const char *str);  char* blogc_content_parse_inline(const char *src);  bool blogc_is_ordered_list_item(const char *str, size_t prefix_len);  char* blogc_content_parse(const char *src, size_t *end_excerpt); diff --git a/tests/check_content_parser.c b/tests/check_content_parser.c index b9f83b0..f1430ac 100644 --- a/tests/check_content_parser.c +++ b/tests/check_content_parser.c @@ -20,6 +20,33 @@  static void +test_slugify(void **state) +{ +    char *s = blogc_slugify("bola"); +    assert_string_equal(s, "bola"); +    free(s); +    s = blogc_slugify("bola o"); +    assert_string_equal(s, "bola-o"); +    free(s); +    s = blogc_slugify("Bola O"); +    assert_string_equal(s, "bola-o"); +    free(s); +    s = blogc_slugify("bola 0"); +    assert_string_equal(s, "bola-0"); +    free(s); +    s = blogc_slugify("bola  () o"); +    assert_string_equal(s, "bola-----o"); +    free(s); +    s = blogc_slugify("Bola O"); +    assert_string_equal(s, "bola-o"); +    free(s); +    s = blogc_slugify("bolaço"); +    assert_string_equal(s, "bola--o"); +    free(s); +} + + +static void  test_is_ordered_list_item(void **state)  {      assert_true(blogc_is_ordered_list_item("1.bola", 2)); @@ -80,12 +107,12 @@ test_content_parse(void **state)      assert_non_null(html);      assert_int_equal(l, 0);      assert_string_equal(html, -        "<h1>um</h1>\n" -        "<h2>dois</h2>\n" -        "<h3>tres</h3>\n" -        "<h4>quatro</h4>\n" -        "<h5>cinco</h5>\n" -        "<h6>seis</h6>\n" +        "<h1 id=\"um\">um</h1>\n" +        "<h2 id=\"dois\">dois</h2>\n" +        "<h3 id=\"tres\">tres</h3>\n" +        "<h4 id=\"quatro\">quatro</h4>\n" +        "<h5 id=\"cinco\">cinco</h5>\n" +        "<h6 id=\"seis\">seis</h6>\n"          "<p>bola\n"          "chunda</p>\n"          "<blockquote><p>bola  <br />\n" @@ -129,9 +156,9 @@ test_content_parse_with_excerpt(void **state)          "guda\n"          "lol", &l);      assert_non_null(html); -    assert_int_equal(l, 28); +    assert_int_equal(l, 38);      assert_string_equal(html, -        "<h1>test</h1>\n" +        "<h1 id=\"test\">test</h1>\n"          "<p>chunda</p>\n"          "<p>guda\n"          "lol</p>\n"); @@ -147,9 +174,9 @@ test_content_parse_with_excerpt(void **state)          "guda\n"          "lol", &l);      assert_non_null(html); -    assert_int_equal(l, 28); +    assert_int_equal(l, 38);      assert_string_equal(html, -        "<h1>test</h1>\n" +        "<h1 id=\"test\">test</h1>\n"          "<p>chunda</p>\n"          "<p>guda\n"          "lol</p>\n"); @@ -162,11 +189,11 @@ test_content_parse_header(void **state)  {      char *html = blogc_content_parse("## bola", NULL);      assert_non_null(html); -    assert_string_equal(html, "<h2>bola</h2>\n"); +    assert_string_equal(html, "<h2 id=\"bola\">bola</h2>\n");      free(html);      html = blogc_content_parse("## bola\n", NULL);      assert_non_null(html); -    assert_string_equal(html, "<h2>bola</h2>\n"); +    assert_string_equal(html, "<h2 id=\"bola\">bola</h2>\n");      free(html);      html = blogc_content_parse(          "bola\n" @@ -177,7 +204,7 @@ test_content_parse_header(void **state)      assert_non_null(html);      assert_string_equal(html,          "<p>bola</p>\n" -        "<h2>bola</h2>\n" +        "<h2 id=\"bola\">bola</h2>\n"          "<p>guda</p>\n");      free(html);  } @@ -526,7 +553,7 @@ test_content_parse_invalid_excerpt(void **state)      assert_non_null(html);      assert_int_equal(l, 0);      assert_string_equal(html, -        "<h1>test</h1>\n" +        "<h1 id=\"test\">test</h1>\n"          "<p>chunda\n"          "..</p>\n"          "<p>guda\n" @@ -544,7 +571,7 @@ test_content_parse_invalid_excerpt(void **state)      assert_non_null(html);      assert_int_equal(l, 0);      assert_string_equal(html, -        "<h1>test</h1>\n" +        "<h1 id=\"test\">test</h1>\n"          "<p>chunda</p>\n"          "<p>...\n"          "guda\n" @@ -561,7 +588,7 @@ test_content_parse_invalid_excerpt(void **state)      assert_non_null(html);      assert_int_equal(l, 0);      assert_string_equal(html, -        "<h1>test</h1>\n" +        "<h1 id=\"test\">test</h1>\n"          "<p>chunda..</p>\n"          "<p>guda\n"          "lol</p>\n"); @@ -577,7 +604,7 @@ test_content_parse_invalid_excerpt(void **state)      assert_non_null(html);      assert_int_equal(l, 0);      assert_string_equal(html, -        "<h1>test</h1>\n" +        "<h1 id=\"test\">test</h1>\n"          "<p>chunda</p>\n"          "<p>...guda\n"          "lol</p>\n"); @@ -1119,6 +1146,7 @@ int  main(void)  {      const UnitTest tests[] = { +        unit_test(test_slugify),          unit_test(test_is_ordered_list_item),          unit_test(test_content_parse),          unit_test(test_content_parse_with_excerpt), diff --git a/tests/check_source_parser.c b/tests/check_source_parser.c index 94f75c9..145ba30 100644 --- a/tests/check_source_parser.c +++ b/tests/check_source_parser.c @@ -38,10 +38,10 @@ test_source_parse(void **state)      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, "EXCERPT"), -        "<h1>This is a test</h1>\n" +        "<h1 id=\"this-is-a-test\">This is a test</h1>\n"          "<p>bola</p>\n");      assert_string_equal(b_trie_lookup(source, "CONTENT"), -        "<h1>This is a test</h1>\n" +        "<h1 id=\"this-is-a-test\">This is a test</h1>\n"          "<p>bola</p>\n");      assert_string_equal(b_trie_lookup(source, "RAW_CONTENT"),          "# This is a test\n" @@ -71,10 +71,10 @@ test_source_parse_with_spaces(void **state)      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, "EXCERPT"), -        "<h1>This is a test</h1>\n" +        "<h1 id=\"this-is-a-test\">This is a test</h1>\n"          "<p>bola</p>\n");      assert_string_equal(b_trie_lookup(source, "CONTENT"), -        "<h1>This is a test</h1>\n" +        "<h1 id=\"this-is-a-test\">This is a test</h1>\n"          "<p>bola</p>\n");      assert_string_equal(b_trie_lookup(source, "RAW_CONTENT"),          "# This is a test\n" @@ -107,10 +107,10 @@ test_source_parse_with_excerpt(void **state)      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, "EXCERPT"), -        "<h1>This is a test</h1>\n" +        "<h1 id=\"this-is-a-test\">This is a test</h1>\n"          "<p>bola</p>\n");      assert_string_equal(b_trie_lookup(source, "CONTENT"), -        "<h1>This is a test</h1>\n" +        "<h1 id=\"this-is-a-test\">This is a test</h1>\n"          "<p>bola</p>\n"          "<p>guda\n"          "yay</p>\n"); | 
