From e4eac77887cd9c1dd010057d441691d030a851df Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Wed, 10 Jun 2015 23:14:50 -0300 Subject: content-parser: added "automatic" links --- src/content-parser.c | 44 +++++++++++++++++++++++++++++--------------- 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, "%s", 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](http://google.com/lol.png) **lol** " - "\\[asd\\]\\(qwe\\)](http://google.com) ``chunda``"); + "\\[asd\\]\\(qwe\\)](http://google.com) ``chunda`` [[bola]]"); assert_non_null(html); assert_string_equal(html, "bolaasd " " lol [asd](qwe) " - "chunda"); + "chunda bola"); free(html); html = blogc_content_parse_inline("*bola*"); assert_non_null(html); @@ -780,6 +780,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, "guda"); + free(html); + html = blogc_content_parse_inline("[[guda]]\n"); + assert_non_null(html); + assert_string_equal(html, "guda\n"); + free(html); + html = blogc_content_parse_inline("[[guda]asd]"); + assert_non_null(html); + assert_string_equal(html, "guda"); + free(html); + html = blogc_content_parse_inline("[[guda]asd]\n"); + assert_non_null(html); + assert_string_equal(html, "guda\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) { @@ -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), }; -- cgit v1.2.3-18-g5258