diff options
Diffstat (limited to 'src/creole.c')
-rw-r--r-- | src/creole.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/creole.c b/src/creole.c index 462dc50..9331bcb 100644 --- a/src/creole.c +++ b/src/creole.c @@ -18,6 +18,7 @@ int do_paragraph(const char *begin, const char *end, bool new_block, FILE *out); int do_replacements(const char *begin, const char *end, bool new_block, FILE *out); int do_link(const char *begin, const char *end, bool new_block, FILE *out); int do_raw_url(const char *begin, const char *end, bool new_block, FILE *out); +int do_emphasis(const char *begin, const char *end, bool new_block, FILE *out); // Prints string escaped. void hprint(FILE *out, const char *begin, const char *end) { @@ -42,7 +43,7 @@ void hprint(FILE *out, const char *begin, const char *end) { // The sign of the return value determines whether a new block should begin, after the consumed text. typedef int (* parser_t)(const char *begin, const char *end, bool new_block, FILE *out); -static parser_t parsers[] = { do_headers, do_paragraph, do_link, do_raw_url, do_replacements }; +static parser_t parsers[] = { do_headers, do_paragraph, do_emphasis, do_link, do_raw_url, do_replacements }; int do_headers(const char *begin, const char *end, bool new_block, FILE *out) { if (!new_block) { // Headers are block-level elements. @@ -245,6 +246,27 @@ end_url: return q - begin; } +int do_emphasis(const char *begin, const char *end, bool new_block, FILE *out) { + if (begin + 2 >= end || begin[0] != '/' || begin[1] != '/') { + return 0; + } + const char *start = begin + 2; /* // */ + + const char *stop = start; + do { + stop = strnstr(stop + 1, "//", end - (stop + 1)); + } while (stop != NULL && stop[-1] == '~' && stop[-1] == ':'); + if (stop == NULL) { + return 0; + } + + fputs("<em>", out); + process(start, stop, false, out); + fputs("</em>", out); + + return stop - start + 4; /* //...// */ +} + void process(const char *begin, const char *end, bool new_block, FILE *out) { const char *p = begin; while (p < end) { |