", out);
+ writeescaped(data + start, end - start, out);
+ fputs("", out);
+ return end + ticklen;
+}
+
+static void writeescaped(char *data, size_t len, FILE *out) {
+ int i;
+ for (i = 0; i < len; ++i)
+ writechescape(data[i], out);
+}
+
+static void writechescape(char c, FILE *out) {
+ int i;
+ for (i = 0; i < sizeof escapes / sizeof *escapes; ++i) {
+ if (escapes[i].c == c) {
+ fputs(escapes[i].code, out);
+ return;
+ }
+ }
+ fputc(c, out);
+}
diff --git a/src/template.c b/src/template.c
index 25f20a7..39e9b94 100644
--- a/src/template.c
+++ b/src/template.c
@@ -23,6 +23,7 @@
#include ", out);
+ fputs("", out);
currstate->prev.type = FENCECODE;
currstate->isfirst = 1;
currstate->intensity = type.data.intensity;
@@ -186,10 +185,9 @@ static int parseline(char *line, struct parsestate *currstate, FILE *out) {
break;
case HEADER:
endpara(currstate, out);
- fprintf(out, "%s ",
- type.data.intensity,
- realcontent(line, &type),
- type.data.intensity);
+ fprintf(out, "", type.data.intensity);
+ writeline(realcontent(line, &type), out);
+ fprintf(out, " ", type.data.intensity);
currstate->prev.type = EMPTY;
break;
case HTMLCONCRETE:
@@ -225,7 +223,7 @@ static int endpara(struct parsestate *state, FILE *out) {
return 0;
case PLAIN:
fputs("", out);
- fwrite(state->para->data, 1, state->para->len, out);
+ writedata(state->para->data, state->para->len, out);
fputs("
", out);
resetstring(state->para);
return 0;