(semi-)proper HTML-escaping; some cleanups
This commit is contained in:
parent
e227c9c980
commit
7f666f693c
1 changed files with 22 additions and 5 deletions
27
cmarkdown.c
27
cmarkdown.c
|
@ -21,6 +21,7 @@ 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*/
|
||||||
|
unsigned int doamp(const char *begin, const char *end); /* Parser for & */
|
||||||
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);
|
unsigned int dolink(const char *begin, const char *end);
|
||||||
|
@ -40,7 +41,7 @@ unsigned int dounderline(const char *begin, const char *end);
|
||||||
void process(const char *begin, const char *end); /* Processes range between begin and end. */
|
void process(const char *begin, const char *end); /* Processes range between begin and end. */
|
||||||
|
|
||||||
Parser parsers[] = { dounderline, dolineprefix, dolist, doparagraph,
|
Parser parsers[] = { dounderline, dolineprefix, dolist, doparagraph,
|
||||||
dosurround, dolink, doshortlink, doreplace }; /* list of parsers */
|
dosurround, dolink, doshortlink, doamp, 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[] = {
|
||||||
|
@ -77,6 +78,8 @@ char * replace[][2] = {
|
||||||
{ " ###\n", "\n" },
|
{ " ###\n", "\n" },
|
||||||
{ " ##\n", "\n" },
|
{ " ##\n", "\n" },
|
||||||
{ " #\n", "\n" },
|
{ " #\n", "\n" },
|
||||||
|
{ " >", ">" },
|
||||||
|
{ "< ", "<" },
|
||||||
};
|
};
|
||||||
char * insert[][2] = {
|
char * insert[][2] = {
|
||||||
{ " \n", "<br />" },
|
{ " \n", "<br />" },
|
||||||
|
@ -105,6 +108,20 @@ hprint(const char *begin, const char *end) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
doamp(const char *begin, const char *end) {
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
if(*begin != '&')
|
||||||
|
return 0;
|
||||||
|
if(!nohtml) {
|
||||||
|
for(p = begin + 1; !strchr("; \\\n\t",*p); p++);
|
||||||
|
if(*p == ';')
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
fputs("&",stdout);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
unsigned int
|
unsigned int
|
||||||
dolineprefix(const char *begin, const char *end) {
|
dolineprefix(const char *begin, const char *end) {
|
||||||
unsigned int i, j, l;
|
unsigned int i, j, l;
|
||||||
|
@ -395,15 +412,15 @@ process(const char *begin, const char *end) {
|
||||||
affected = 0;
|
affected = 0;
|
||||||
for(i = 0; i < LENGTH(parsers) && affected == 0; i++)
|
for(i = 0; i < LENGTH(parsers) && affected == 0; i++)
|
||||||
affected = parsers[i](p, end);
|
affected = parsers[i](p, end);
|
||||||
if(affected == 0) {
|
if(affected)
|
||||||
|
p += affected;
|
||||||
|
else {
|
||||||
if(nohtml)
|
if(nohtml)
|
||||||
hprint(p,p+1);
|
hprint(p,p+1);
|
||||||
else
|
else
|
||||||
putchar(*p);
|
putchar(*p);
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
p += affected;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,7 +442,7 @@ main(int argc, char *argv[]) {
|
||||||
eprint("Malloc failed.");
|
eprint("Malloc failed.");
|
||||||
bsize = BUFFERSIZE;
|
bsize = BUFFERSIZE;
|
||||||
/* needed to properly process first line */
|
/* needed to properly process first line */
|
||||||
strcpy(buffer,"\n");
|
strcpy(buffer,"\n\n");
|
||||||
|
|
||||||
p = buffer+strlen(buffer);
|
p = buffer+strlen(buffer);
|
||||||
while(s = fread(p, sizeof(char),BUFFERSIZE, source)) {
|
while(s = fread(p, sizeof(char),BUFFERSIZE, source)) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue