Fixed dolist bug reported by Szabolcs
New handling of newlines.
This commit is contained in:
parent
9abf009d2e
commit
4fce2bfe47
1 changed files with 35 additions and 21 deletions
56
cmarkdown.c
56
cmarkdown.c
|
@ -244,16 +244,15 @@ dolist(const char *begin, const char *end) {
|
||||||
if(p[1] == '\n')
|
if(p[1] == '\n')
|
||||||
p++;
|
p++;
|
||||||
q = p;
|
q = p;
|
||||||
if(strchr("+-*",p[1]) && p[2] == ' ') {
|
if((p[1] == '-' || p[1] == '*' || p[1] == '+') && p[2] == ' ') {
|
||||||
ul = 1;
|
ul = 1;
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for(p++; *p && p != end && *p <= '0' && *p >= '9';p++);
|
ul = 0;
|
||||||
p++;
|
for(p++; *p && p != end && *p >= '0' && *p <= '9';p++);
|
||||||
if(!*p || p[0] != '.' || p[1] != ' ')
|
if(!*p || p[0] != '.' || p[1] != ' ')
|
||||||
return 0;
|
return 0;
|
||||||
ul = 0;
|
|
||||||
}
|
}
|
||||||
for(p++; *p && p != end && *p == ' '; p++);
|
for(p++; *p && p != end && *p == ' '; p++);
|
||||||
indent = p - q - 1;
|
indent = p - q - 1;
|
||||||
|
@ -263,40 +262,51 @@ dolist(const char *begin, const char *end) {
|
||||||
|
|
||||||
puts(ul ? "<ul>" : "<ol>");
|
puts(ul ? "<ul>" : "<ol>");
|
||||||
run = 1;
|
run = 1;
|
||||||
for(i = 0, p = q+1+indent; *p && p < end && run; p++) {
|
for(i = 0; *p && p < end && run; p++) {
|
||||||
buffer[0] = '\0';
|
buffer[0] = '\0';
|
||||||
for(i = 0; *p && p < end && run; p++,i++) {
|
for(i = 0; *p && p < end && run; p++,i++) {
|
||||||
if(*p == '\n') {
|
if(*p == '\n') {
|
||||||
if(p[1] == '\n') {
|
if(p[1] == '\n') {
|
||||||
run = 0;
|
|
||||||
ADDC(buffer,i) = '\n';
|
|
||||||
i++;
|
|
||||||
p++;
|
p++;
|
||||||
|
run = 0;
|
||||||
}
|
}
|
||||||
if(p[1] == ' ') {
|
q = p + 1;
|
||||||
|
if(ul && (*q == '-' || *q == '*' || *q == '+'))
|
||||||
|
j = 1;
|
||||||
|
else {
|
||||||
|
for(j = 0; q[j] >= '0' && q[j] <= '9' && j < indent; j++);
|
||||||
|
if(j > 0 && q[j] == '.')
|
||||||
|
j++;
|
||||||
|
else
|
||||||
|
j = 0;
|
||||||
|
}
|
||||||
|
for(;q[j] == ' ' && j < indent; j++);
|
||||||
|
if(j == indent) {
|
||||||
|
p += indent;
|
||||||
run = 1;
|
run = 1;
|
||||||
|
if(q[1] == ' ')
|
||||||
|
p++;
|
||||||
|
else
|
||||||
|
break;
|
||||||
ADDC(buffer,i) = '\n';
|
ADDC(buffer,i) = '\n';
|
||||||
i++;
|
i++;
|
||||||
p += indent + 1;
|
|
||||||
}
|
}
|
||||||
else if(p[1] >= '0' && p[1] <= '9' || strchr("+-*",p[1])) {
|
ADDC(buffer,i) = '\n';
|
||||||
run = 1;
|
i++;
|
||||||
p += indent;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if(run == 0)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
ADDC(buffer,i) = *p;
|
ADDC(buffer,i) = *p;
|
||||||
}
|
}
|
||||||
ADDC(buffer,i) = '\0';
|
ADDC(buffer,i) = '\0';
|
||||||
while(buffer[--i] == '\n') buffer[i] = '\0';
|
if(run == 0)
|
||||||
|
while(buffer[--i] == '\n')
|
||||||
|
buffer[i] = '\0';
|
||||||
fputs("<li>",stdout);
|
fputs("<li>",stdout);
|
||||||
process(buffer,i+2+buffer);
|
process(buffer,buffer+i+1);
|
||||||
fputs("</li>\n",stdout);
|
fputs("</li>\n",stdout);
|
||||||
}
|
}
|
||||||
puts(ul ? "</ul>" : "</ol>");
|
puts(ul ? "</ul>" : "</ol>");
|
||||||
free(buffer);
|
free(buffer);
|
||||||
|
p--;
|
||||||
while(*(--p) == '\n');
|
while(*(--p) == '\n');
|
||||||
return p + 1 - begin;
|
return p + 1 - begin;
|
||||||
}
|
}
|
||||||
|
@ -445,7 +455,7 @@ dounderline(const char *begin, const char *end) {
|
||||||
|
|
||||||
void
|
void
|
||||||
process(const char *begin, const char *end) {
|
process(const char *begin, const char *end) {
|
||||||
const char *p;
|
const char *p, *q;
|
||||||
int affected;
|
int affected;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
@ -456,7 +466,10 @@ process(const char *begin, const char *end) {
|
||||||
if(affected)
|
if(affected)
|
||||||
p += affected;
|
p += affected;
|
||||||
else {
|
else {
|
||||||
if(nohtml)
|
for(q = p; *q == '\n' && q != end; q++);
|
||||||
|
if(q == end)
|
||||||
|
return;
|
||||||
|
else if(nohtml)
|
||||||
hprint(p,p+1);
|
hprint(p,p+1);
|
||||||
else
|
else
|
||||||
putchar(*p);
|
putchar(*p);
|
||||||
|
@ -496,5 +509,6 @@ main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
process(buffer,buffer+strlen(buffer));
|
process(buffer,buffer+strlen(buffer));
|
||||||
|
putchar('\n');
|
||||||
free(buffer);
|
free(buffer);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue