diff options
| author | Karl Bartel <karl42@gmail.com> | 2019-10-02 22:20:02 +0200 |
|---|---|---|
| committer | Enno Boland <g@s01.de> | 2020-07-01 08:56:22 +0200 |
| commit | 23241209f80b4961d706b151d718e1c5b2d5c632 (patch) | |
| tree | 9e5ede5bfe17ab33ce17de943080e749f4fd1a68 /smu.c | |
| parent | 028a8dadd1f61f5b773b773b022ad2ccb86e3ddc (diff) | |
Fix blockquotes
* nesting did not work
* ">" without following space was not recognized as blockquote
Quoting https://spec.commonmark.org/0.29/#example-5:
> Normally the > that begins a block quote may be followed optionally by
a space, which is not considered part of the content.
Diffstat (limited to 'smu.c')
| -rw-r--r-- | smu.c | 22 |
1 files changed, 16 insertions, 6 deletions
@@ -44,7 +44,7 @@ static int nohtml = 0; static Tag lineprefix[] = { { " ", 0, "<pre><code>", "\n</code></pre>" }, { "\t", 0, "<pre><code>", "\n</code></pre>" }, - { "> ", 2, "<blockquote>", "</blockquote>" }, + { ">", 2, "<blockquote>", "</blockquote>" }, { "###### ", 1, "<h6>", "</h6>" }, { "##### ", 1, "<h5>", "</h5>" }, { "#### ", 1, "<h4>", "</h4>" }, @@ -212,12 +212,22 @@ dolineprefix(const char *begin, const char *end, int newblock) { if(!(buffer = malloc(BUFSIZ))) eprint("Malloc failed."); buffer[0] = '\0'; - for(j = 0, p += l; p < end; p++, j++) { - ADDC(buffer, j) = *p; - if(*p == '\n' && p + l < end) { - if(strncmp(lineprefix[i].search, p + 1, l) != 0) + + /* Collect lines into buffer while they start with the prefix */ + j = 0; + while((strncmp(lineprefix[i].search, p, l) == 0) && p + l < end) { + p += l; + + /* Special case for blockquotes: optional space after > */ + if(lineprefix[i].search[0] == '>' && *p == ' ') { + p++; + } + + while(p < end) { + ADDC(buffer, j) = *p; + j++; + if(*(p++) == '\n') break; - p += l; } } |