summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Bartel <karl42@gmail.com>2019-10-02 22:20:02 +0200
committerEnno Boland <g@s01.de>2020-07-01 08:56:22 +0200
commit23241209f80b4961d706b151d718e1c5b2d5c632 (patch)
tree9e5ede5bfe17ab33ce17de943080e749f4fd1a68
parent028a8dadd1f61f5b773b773b022ad2ccb86e3ddc (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.
-rw-r--r--smu.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/smu.c b/smu.c
index 8194591..50727f4 100644
--- a/smu.c
+++ b/smu.c
@@ -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;
}
}