md4c

C Markdown parser. Fast. SAX-like interface. Compliant to CommonMark specification.
git clone https://noulin.net/git/md4c.git
Log | Files | Refs | README | LICENSE

commit 279ec8f6d52e9edc4b608cc694edf2ad7e69cc33
parent bf62fdfce00cc6214a920f10f801db45cb21f11c
Author: Martin Mitas <mity@morous.org>
Date:   Tue,  4 Oct 2016 20:46:10 +0200

Implement soft and hard line breaks.

Diffstat:
MREADME.md | 4++--
Mmd2html/md2html.c | 2++
Mmd4c/md4c.c | 13++++++++++++-
Mmd4c/md4c.h | 5+++++
4 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md @@ -105,8 +105,8 @@ more or less forms our to do list. - [ ] 6.6 Images - [ ] 6.7 Autolinks - [ ] 6.8 Raw HTML - - [ ] 6.9 Hard line breaks - - [ ] 6.10 Soft line breaks + - [x] 6.9 Hard line breaks + - [x] 6.10 Soft line breaks - [x] 6.11 Textual content diff --git a/md2html/md2html.c b/md2html/md2html.c @@ -194,6 +194,8 @@ text_callback(MD_TEXTTYPE type, const MD_CHAR* text, MD_SIZE size, void* userdat struct membuffer* out = (struct membuffer*) userdata; switch(type) { + case MD_TEXT_BR: MEMBUF_APPEND_LITERAL(out, "<br>\n"); break; + case MD_TEXT_SOFTBR: MEMBUF_APPEND_LITERAL(out, "\n"); break; case MD_TEXT_HTML: membuf_append(out, text, size); break; default: membuf_append_escaped(out, text, size); break; } diff --git a/md4c/md4c.c b/md4c/md4c.c @@ -289,7 +289,18 @@ md_process_normal_block(MD_CTX* ctx, const MD_LINE* lines, int n_lines) for(i = 0; i < n_lines; i++) { MD_TEXT(MD_TEXT_NORMAL, STR(lines[i].beg), lines[i].end - lines[i].beg); - MD_TEXT(MD_TEXT_NORMAL, _T("\n"), 1); + + /* Output soft or hard line break. */ + if(i + 1 < n_lines) { + MD_TEXTTYPE break_type; + + if(CH(lines[i].end) == _T(' ') && CH(lines[i].end+1) == _T(' ')) + break_type = MD_TEXT_BR; + else + break_type = MD_TEXT_SOFTBR; + + MD_TEXT(break_type, _T("\n"), 1); + } } abort: diff --git a/md4c/md4c.h b/md4c/md4c.h @@ -95,6 +95,11 @@ enum MD_TEXTTYPE_tag { /* Normal text. */ MD_TEXT_NORMAL = 0, + /* Line breaks. + * Note these are only sent within MD_BLOCK_CODE or MD_BLOCK_HTML. */ + MD_TEXT_BR, /* <br> (hard break) */ + MD_TEXT_SOFTBR, /* '\n' in source text where it is not semantically meaningful (soft break) */ + /* Text in a code block (inside MD_BLOCK_CODE) or inlined code (`code`). * If it is inside MD_BLOCK_CODE, it includes spaces for indentation and * '\n' for new lines. MD_TEXT_BR and MD_TEXT_SOFTBR are not sent for this