dolist and doparagraph are working better now
This commit is contained in:
parent
53443f1d56
commit
e227c9c980
1 changed files with 26 additions and 16 deletions
42
cmarkdown.c
42
cmarkdown.c
|
@ -186,57 +186,68 @@ dolink(const char *begin, const char *end) {
|
||||||
unsigned int
|
unsigned int
|
||||||
dolist(const char *begin, const char *end) {
|
dolist(const char *begin, const char *end) {
|
||||||
unsigned int i,j,k,indent,run,ul;
|
unsigned int i,j,k,indent,run,ul;
|
||||||
const char *p;
|
const char *p, *q;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
|
||||||
if(*begin != '\n' || !begin[1] || !begin[2])
|
if(*begin != '\n')
|
||||||
return 0;
|
return 0;
|
||||||
p = begin;
|
p = begin;
|
||||||
|
if(p[1] == '\n')
|
||||||
|
p++;
|
||||||
|
q = p;
|
||||||
if(strchr("+-*",p[1]) && p[2] == ' ') {
|
if(strchr("+-*",p[1]) && p[2] == ' ') {
|
||||||
ul = 1;
|
ul = 1;
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for(p = begin + 1; *p && p != end && *p <= '0' && *p >= '9';p++);
|
for(p++; *p && p != end && *p <= '0' && *p >= '9';p++);
|
||||||
p++;
|
p++;
|
||||||
if(!*p || p[0] != '.' || p[1] != ' ')
|
if(!*p || p[0] != '.' || p[1] != ' ')
|
||||||
return 0;
|
return 0;
|
||||||
ul = 0;
|
ul = 0;
|
||||||
}
|
}
|
||||||
for(p++; *p && p != end && *p == ' '; p++);
|
for(p++; *p && p != end && *p == ' '; p++);
|
||||||
indent = p - begin - 1;
|
indent = p - q - 1;
|
||||||
|
|
||||||
if(!(buffer = malloc(end - begin+1)))
|
if(!(buffer = malloc(end - q+1)))
|
||||||
eprint("Malloc failed.");
|
eprint("Malloc failed.");
|
||||||
|
|
||||||
puts(ul ? "<ul>" : "<ol>");
|
puts(ul ? "<ul>" : "<ol>");
|
||||||
run = 1;
|
run = 1;
|
||||||
for(i = 0, p = begin+1+indent; *p && p != end && run; p++) {
|
for(i = 0, p = q+1+indent; *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' && p[2] == '\n') {
|
if(p[1] == '\n') {
|
||||||
run = 0;
|
run = 0;
|
||||||
break;
|
buffer[i++] = '\n';
|
||||||
|
buffer[i++] = '\n';
|
||||||
|
p++;
|
||||||
}
|
}
|
||||||
else if(p[1] == ' ') {
|
if(p[1] == ' ') {
|
||||||
|
run = 1;
|
||||||
p += indent + 1;
|
p += indent + 1;
|
||||||
}
|
}
|
||||||
else if(p[1] >= '0' && p[1] <= '9' || strchr("+-*",p[1])) {
|
else if(p[1] >= '0' && p[1] <= '9' || strchr("+-*",p[1])) {
|
||||||
|
run = 1;
|
||||||
p += indent;
|
p += indent;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
buffer[i++] = '\n';
|
else if(run == 0)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
buffer[i] = *p;
|
buffer[i] = *p;
|
||||||
}
|
}
|
||||||
|
buffer[i] = '\0';
|
||||||
|
while(buffer[--i] == '\n') buffer[i] = '\0';
|
||||||
fputs("<li>",stdout);
|
fputs("<li>",stdout);
|
||||||
process(buffer,buffer+i);
|
process(buffer,i+2+buffer);
|
||||||
fputs("</li>\n",stdout);
|
fputs("</li>\n",stdout);
|
||||||
}
|
}
|
||||||
puts(ul ? "</ul>" : "</ol>");
|
puts(ul ? "</ul>" : "</ol>");
|
||||||
free(buffer);
|
free(buffer);
|
||||||
return p - begin;
|
while(*(--p) == '\n');
|
||||||
|
return p + 1 - begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
|
@ -245,8 +256,8 @@ doparagraph(const char *begin, const char *end) {
|
||||||
|
|
||||||
if(strncmp(begin,"\n\n",2))
|
if(strncmp(begin,"\n\n",2))
|
||||||
return 0;
|
return 0;
|
||||||
if(!(p = strstr(begin+2,"\n\n")))
|
if(!(p = strstr(begin + 2,"\n\n")))
|
||||||
p = end;
|
p = end - 1;
|
||||||
if(p > end)
|
if(p > end)
|
||||||
return 0;
|
return 0;
|
||||||
if(p - begin - 2 <= 0)
|
if(p - begin - 2 <= 0)
|
||||||
|
@ -426,7 +437,6 @@ main(int argc, char *argv[]) {
|
||||||
eprint("Malloc failed.");
|
eprint("Malloc failed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
process(buffer,buffer+strlen(buffer));
|
process(buffer,buffer+strlen(buffer));
|
||||||
free(buffer);
|
free(buffer);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue