diff options
| -rw-r--r-- | src/content-parser.c | 44 | ||||
| -rw-r--r-- | tests/check_content_parser.c | 35 | 
2 files changed, 62 insertions, 17 deletions
| diff --git a/src/content-parser.c b/src/content-parser.c index 111109e..aa76777 100644 --- a/src/content-parser.c +++ b/src/content-parser.c @@ -51,7 +51,9 @@ typedef enum {      LINK_IMAGE,      LINK_TEXT,      LINK_TEXT_CLOSE, -    LINK_URL +    LINK_URL, +    LINK_AUTO, +    LINK_AUTO_CLOSE,  } blogc_content_parser_link_state_t; @@ -65,6 +67,7 @@ blogc_content_parse_inline(const char *src)      size_t current = 0;      size_t start = 0;      size_t start_state = 0; +    size_t end = 0;      b_string_t *rv = b_string_new(); @@ -196,6 +199,11 @@ blogc_content_parse_inline(const char *src)                      break;                  }                  if (state == LINK_TEXT) { +                    if (current == start) { +                        start = current + 1; +                        state = LINK_AUTO; +                        break; +                    }                      open_bracket++;                      break;                  } @@ -206,6 +214,21 @@ blogc_content_parse_inline(const char *src)                      b_string_append_c(rv, c);                      break;                  } +                if (state == LINK_AUTO) { +                    end = current; +                    state = LINK_AUTO_CLOSE; +                    break; +                } +                if (state == LINK_AUTO_CLOSE) { +                    state = LINK_CLOSED; +                    tmp = b_strndup(src + start, end - start); +                    b_string_append_printf(rv, "<a href=\"%s\">%s</a>", tmp, tmp); +                    end = 0; +                    free(tmp); +                    tmp = NULL; +                    is_image = false; +                    break; +                }                  if (state == LINK_TEXT) {                      if (open_bracket-- == 0) {                          state = LINK_TEXT_CLOSE; @@ -315,20 +338,11 @@ blogc_content_parse_inline(const char *src)          }          if (is_last && state != LINK_CLOSED) { -            if (is_image) { -                b_string_append_c(rv, src[start_state]); -                if (start_state < (src_len - 1)) -                    b_string_append_c(rv, src[start_state + 1]); -                current = start_state + 2; -                is_image = false; -            } -            else { -                b_string_append_c(rv, src[start_state]); -                current = start_state + 1; -            } -            state = LINK_CLOSED; -            start_state = 0; -            continue; +            b_string_append_c(rv, src[start_state]); +            tmp = blogc_content_parse_inline(src + start_state + 1); +            b_string_append(rv, tmp); +            free(tmp); +            tmp = NULL;          }          current++;      } diff --git a/tests/check_content_parser.c b/tests/check_content_parser.c index d549de9..9b1d318 100644 --- a/tests/check_content_parser.c +++ b/tests/check_content_parser.c @@ -609,13 +609,13 @@ test_content_parse_inline(void **state)  {      char *html = blogc_content_parse_inline(          "**bola***asd* [ **lol** " -        "\\[asd\\]\\(qwe\\)](http://google.com) ``chunda``"); +        "\\[asd\\]\\(qwe\\)](http://google.com) ``chunda`` [[bola]]");      assert_non_null(html);      assert_string_equal(html,          "<strong>bola</strong><em>asd</em> "          "<a href=\"http://google.com\"><img src=\"http://google.com/lol.png\" "          "alt=\"lol\"> <strong>lol</strong> [asd](qwe)</a> " -        "<code>chunda</code>"); +        "<code>chunda</code> <a href=\"bola\">bola</a>");      free(html);      html = blogc_content_parse_inline("*bola*");      assert_non_null(html); @@ -781,6 +781,36 @@ test_content_parse_inline_link(void **state)  void +test_content_parse_inline_link_auto(void **state) +{ +    char *html = blogc_content_parse_inline("[[guda]]"); +    assert_non_null(html); +    assert_string_equal(html, "<a href=\"guda\">guda</a>"); +    free(html); +    html = blogc_content_parse_inline("[[guda]]\n"); +    assert_non_null(html); +    assert_string_equal(html, "<a href=\"guda\">guda</a>\n"); +    free(html); +    html = blogc_content_parse_inline("[[guda]asd]"); +    assert_non_null(html); +    assert_string_equal(html, "<a href=\"guda\">guda</a>"); +    free(html); +    html = blogc_content_parse_inline("[[guda]asd]\n"); +    assert_non_null(html); +    assert_string_equal(html, "<a href=\"guda\">guda</a>\n"); +    free(html); +    html = blogc_content_parse_inline("[[guda]asd"); +    assert_non_null(html); +    assert_string_equal(html, "[[guda]asd"); +    free(html); +    html = blogc_content_parse_inline("[[guda]asd\n"); +    assert_non_null(html); +    assert_string_equal(html, "[[guda]asd\n"); +    free(html); +} + + +void  test_content_parse_inline_image(void **state)  {      char *html = blogc_content_parse_inline(""); @@ -902,6 +932,7 @@ main(void)          unit_test(test_content_parse_inline_strong),          unit_test(test_content_parse_inline_code),          unit_test(test_content_parse_inline_link), +        unit_test(test_content_parse_inline_link_auto),          unit_test(test_content_parse_inline_image),          unit_test(test_content_parse_inline_line_break),      }; | 
