rearrange functions
Added alternative notation of headings
This commit is contained in:
parent
bd936e513c
commit
597bf0e64e
1 changed files with 77 additions and 62 deletions
139
cmarkdown.c
139
cmarkdown.c
|
@ -22,29 +22,35 @@ struct Tag {
|
||||||
|
|
||||||
void eprint(const char *format, ...); /* Prints error and exits */
|
void eprint(const char *format, ...); /* Prints error and exits */
|
||||||
void hprint(const char *begin, const char *end); /* escapes HTML and prints it to stdout*/
|
void hprint(const char *begin, const char *end); /* escapes HTML and prints it to stdout*/
|
||||||
void process(const char *begin, const char *end);
|
|
||||||
/* Processes range between begin and end with parser (NULL = all parsers) */
|
|
||||||
unsigned int doreplace(const char *begin, const char *end);
|
|
||||||
/* Parser for simple replaces */
|
|
||||||
unsigned int dolineprefix(const char *begin, const char *end);
|
unsigned int dolineprefix(const char *begin, const char *end);
|
||||||
/* Parser for line prefix tags */
|
/* Parser for line prefix tags */
|
||||||
|
unsigned int dolink(const char *begin, const char *end);
|
||||||
|
/* Parser for links and images */
|
||||||
|
unsigned int doreplace(const char *begin, const char *end);
|
||||||
|
/* Parser for simple replaces */
|
||||||
|
unsigned int doshortlink(const char *begin, const char *end);
|
||||||
|
/* Parser for links and images */
|
||||||
unsigned int dosurround(const char *begin, const char *end);
|
unsigned int dosurround(const char *begin, const char *end);
|
||||||
/* Parser for surrounding tags */
|
/* Parser for surrounding tags */
|
||||||
unsigned int dounderline(const char *begin, const char *end);
|
unsigned int dounderline(const char *begin, const char *end);
|
||||||
/* Parser for underline tags */
|
/* Parser for underline tags */
|
||||||
unsigned int dolink(const char *begin, const char *end);
|
void process(const char *begin, const char *end); /* Processes range between begin and end. */
|
||||||
/* Parser for links and images */
|
|
||||||
unsigned int doshortlink(const char *begin, const char *end);
|
|
||||||
/* Parser for links and images */
|
|
||||||
Parser parsers[] = { dounderline, dolineprefix, dosurround, dolink, doshortlink, doreplace };
|
|
||||||
/* list of parsers */
|
|
||||||
|
|
||||||
|
Parser parsers[] = { dounderline, dolineprefix, dosurround, dolist,
|
||||||
|
dolink, doshortlink, doreplace }; /* list of parsers */
|
||||||
FILE *source;
|
FILE *source;
|
||||||
unsigned int bsize = 0, nohtml = 0;
|
unsigned int bsize = 0, nohtml = 0;
|
||||||
struct Tag lineprefix[] = {
|
struct Tag lineprefix[] = {
|
||||||
{ " ", 0, "pre" },
|
{ " ", 0, "pre" },
|
||||||
{ "\t", 0, "pre" },
|
{ "\t", 0, "pre" },
|
||||||
{ "> ", 1, "blockquote" },
|
{ "> ", 1, "blockquote" },
|
||||||
|
{ "####### ", 1, "h7" },
|
||||||
|
{ "###### ", 1, "h6" },
|
||||||
|
{ "##### ", 1, "h5" },
|
||||||
|
{ "#### ", 1, "h4" },
|
||||||
|
{ "### ", 1, "h3" },
|
||||||
|
{ "## ", 1, "h2" },
|
||||||
|
{ "# ", 1, "h1" },
|
||||||
};
|
};
|
||||||
struct Tag underline[] = {
|
struct Tag underline[] = {
|
||||||
{ "=", 1, "h1" },
|
{ "=", 1, "h1" },
|
||||||
|
@ -61,6 +67,13 @@ struct Tag surround[] = {
|
||||||
char * replace[][2] = {
|
char * replace[][2] = {
|
||||||
{ "\n---\n", "\n<hr />\n" },
|
{ "\n---\n", "\n<hr />\n" },
|
||||||
{ "\n\n", "<br />\n<br />\n" },
|
{ "\n\n", "<br />\n<br />\n" },
|
||||||
|
{ " #######\n", "\n" },
|
||||||
|
{ " ######\n", "\n" },
|
||||||
|
{ " #####\n", "\n" },
|
||||||
|
{ " ####\n", "\n" },
|
||||||
|
{ " ###\n", "\n" },
|
||||||
|
{ " ##\n", "\n" },
|
||||||
|
{ " #\n", "\n" },
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -86,6 +99,43 @@ hprint(const char *begin, const char *end) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
dolineprefix(const char *begin, const char *end) {
|
||||||
|
unsigned int i, j, l;
|
||||||
|
char *buffer;
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
if(*begin != '\n' && *begin != '\0')
|
||||||
|
return 0;
|
||||||
|
for(i = 0; i < LENGTH(lineprefix); i++) {
|
||||||
|
l = strlen(lineprefix[i].search);
|
||||||
|
if(end - begin+1 < l)
|
||||||
|
continue;
|
||||||
|
if(strncmp(lineprefix[i].search,begin+1,l))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(!(buffer = malloc(end - begin+1)))
|
||||||
|
ERRMALLOC;
|
||||||
|
printf("<%s>",lineprefix[i].tag);
|
||||||
|
for(p = begin, j = 0; p != end; p++, j++) {
|
||||||
|
buffer[j] = *p;
|
||||||
|
if(*p == '\n') {
|
||||||
|
if(strncmp(lineprefix[i].search,p+1,l) != 0)
|
||||||
|
break;
|
||||||
|
p += l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(lineprefix[i].process)
|
||||||
|
process(buffer,buffer+strlen(buffer));
|
||||||
|
else
|
||||||
|
hprint(buffer,buffer+strlen(buffer));
|
||||||
|
printf("</%s>",lineprefix[i].tag);
|
||||||
|
free(buffer);
|
||||||
|
return p - begin;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
dolink(const char *begin, const char *end) {
|
dolink(const char *begin, const char *end) {
|
||||||
int img;
|
int img;
|
||||||
|
@ -122,6 +172,23 @@ dolink(const char *begin, const char *end) {
|
||||||
}
|
}
|
||||||
return p + 1 - begin;
|
return p + 1 - begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
doreplace(const char *begin, const char *end) {
|
||||||
|
unsigned int i, l;
|
||||||
|
|
||||||
|
for(i = 0; i < LENGTH(replace); i++) {
|
||||||
|
l = strlen(replace[i][0]);
|
||||||
|
if(end - begin < l)
|
||||||
|
continue;
|
||||||
|
if(strncmp(replace[i][0],begin,l) == 0) {
|
||||||
|
fputs(replace[i][1], stdout);
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
doshortlink(const char *begin, const char *end) {
|
doshortlink(const char *begin, const char *end) {
|
||||||
const char *p, *c;
|
const char *p, *c;
|
||||||
|
@ -190,58 +257,6 @@ dosurround(const char *begin, const char *end) {
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
unsigned int
|
|
||||||
doreplace(const char *begin, const char *end) {
|
|
||||||
unsigned int i, l;
|
|
||||||
|
|
||||||
for(i = 0; i < LENGTH(replace); i++) {
|
|
||||||
l = strlen(replace[i][0]);
|
|
||||||
if(end - begin < l)
|
|
||||||
continue;
|
|
||||||
if(strncmp(replace[i][0],begin,l) == 0) {
|
|
||||||
fputs(replace[i][1], stdout);
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int
|
|
||||||
dolineprefix(const char *begin, const char *end) {
|
|
||||||
unsigned int i, j, l;
|
|
||||||
char *buffer;
|
|
||||||
const char *p;
|
|
||||||
|
|
||||||
if(*begin != '\n' && *begin != '\0')
|
|
||||||
return 0;
|
|
||||||
for(i = 0; i < LENGTH(lineprefix); i++) {
|
|
||||||
l = strlen(lineprefix[i].search);
|
|
||||||
if(end - begin+1 < l)
|
|
||||||
continue;
|
|
||||||
if(strncmp(lineprefix[i].search,begin+1,l))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if(!(buffer = malloc(end - begin+1)))
|
|
||||||
ERRMALLOC;
|
|
||||||
printf("<%s>",lineprefix[i].tag);
|
|
||||||
for(p = begin, j = 0; p != end; p++, j++) {
|
|
||||||
buffer[j] = *p;
|
|
||||||
if(*p == '\n') {
|
|
||||||
if(strncmp(lineprefix[i].search,p+1,l) != 0)
|
|
||||||
break;
|
|
||||||
p += l;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(lineprefix[i].process)
|
|
||||||
process(buffer,buffer+strlen(buffer));
|
|
||||||
else
|
|
||||||
hprint(buffer,buffer+strlen(buffer));
|
|
||||||
printf("</%s>",lineprefix[i].tag);
|
|
||||||
free(buffer);
|
|
||||||
return p - begin;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
dounderline(const char *begin, const char *end) {
|
dounderline(const char *begin, const char *end) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue