commit 597bf0e64eb5ba07175e3b394ab73c4c2a948882
parent bd936e513cf95d082e0bfc9342301a0463b3677b
Author: gottox@rootkit.lan <gottox@rootkit.lan>
Date:   Mon, 10 Dec 2007 13:44:59 +0100
rearrange functions
Added alternative notation of headings
Diffstat:
| M | cmarkdown.c | | | 139 | ++++++++++++++++++++++++++++++++++++++++++++----------------------------------- | 
1 file changed, 77 insertions(+), 62 deletions(-)
diff --git a/cmarkdown.c b/cmarkdown.c
@@ -22,29 +22,35 @@ struct Tag {
 
 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 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);
 							/* Parser for line prefix tags */
-unsigned int dosurround(const char *begin, const char *end);
-							/* Parser for surrounding tags */
-unsigned int dounderline(const char *begin, const char *end);
-							/* Parser for underline 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 */
-Parser parsers[] = { dounderline, dolineprefix, dosurround, dolink, doshortlink, doreplace };
-							/* list of parsers */
+unsigned int dosurround(const char *begin, const char *end);
+							/* Parser for surrounding tags */
+unsigned int dounderline(const char *begin, const char *end);
+							/* Parser for underline tags */
+void process(const char *begin, const char *end);	/* Processes range between begin and end. */
 
+Parser parsers[] = { dounderline, dolineprefix, dosurround, dolist,
+	dolink, doshortlink, doreplace };		/* list of parsers */
 FILE *source;
 unsigned int bsize = 0, nohtml = 0;
 struct Tag lineprefix[] = {
 	{ "   ",	0,	"pre" },
 	{ "\t",		0,	"pre" },
 	{ "> ",		1,	"blockquote" },
+	{ "####### ",	1,	"h7" },
+	{ "###### ",	1,	"h6" },
+	{ "##### ",	1,	"h5" },
+	{ "#### ",	1,	"h4" },
+	{ "### ",	1,	"h3" },
+	{ "## ",	1,	"h2" },
+	{ "# ",		1,	"h1" },
 };
 struct Tag underline[] = {
 	{ "=",		1,	"h1" },
@@ -61,6 +67,13 @@ struct Tag surround[] = {
 char * replace[][2] = {
 	{ "\n---\n", "\n<hr />\n" },
 	{ "\n\n", "<br />\n<br />\n" },
+	{ " #######\n", "\n" },
+	{ " ######\n", "\n" },
+	{ " #####\n", "\n" },
+	{ " ####\n", "\n" },
+	{ " ###\n", "\n" },
+	{ " ##\n", "\n" },
+	{ " #\n", "\n" },
 };
 
 void
@@ -87,6 +100,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
 dolink(const char *begin, const char *end) {
 	int img;
 	const char *desc, *link, *p;
@@ -122,6 +172,23 @@ dolink(const char *begin, const char *end) {
 	}
 	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
 doshortlink(const char *begin, const char *end) {
 	const char *p, *c;
@@ -190,58 +257,6 @@ dosurround(const char *begin, const char *end) {
 	}
 	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
 dounderline(const char *begin, const char *end) {