diff --git a/objs.mk b/objs.mk
index fc8adf4..0fd5856 100644
--- a/objs.mk
+++ b/objs.mk
@@ -17,6 +17,9 @@ src/external_xemil_src_util.o: external/xemil/src/util.c
OBJS += src/src_classic.o
src/src_classic.o: src/classic.c
$(CC) $(CFLAGS) -c -o $@ src/classic.c
+OBJS += src/src_default.o
+src/src_default.o: src/default.c
+ $(CC) $(CFLAGS) -c -o $@ src/default.c
OBJS += src/src_help.o
src/src_help.o: src/help.c
$(CC) $(CFLAGS) -c -o $@ src/help.c
diff --git a/src/classic.c b/src/classic.c
index 03882dc..fcfa29b 100644
--- a/src/classic.c
+++ b/src/classic.c
@@ -151,114 +151,6 @@ void classic_head(FILE* out, const char* top, xl_node_t* header) {
fprintf(out, " \n", top);
}
-static void print(FILE* out, const char* txt, int indent) {
- int i;
-
- for(i = 0;; i++) {
- if(i == 0 || txt[i] == '\n' || txt[i] == 0) {
- int j;
- if(i > 0) fprintf(out, "\n");
- if(txt[i] == 0) break;
- for(j = 0; j < indent; j++) fprintf(out, "\t");
- }
-
- if(txt[i] != '\n') fprintf(out, "%c", txt[i]);
- }
-}
-
-static void recursive(FILE* out, const char* top, xl_node_t* element, int indent) {
- xl_node_t* child;
- char tag[2048]; /* enough for most cases... :) */
- char end[128];
- int add = 0;
-
- tag[0] = end[0] = 0;
-
- if(element->name == NULL) return;
-
- if(strcmp(element->name, "section") == 0) {
- char* title = xl_get_attribute(element, "title");
-
- sprintf(tag, "
%s
", title);
- } else if(strcmp(element->name, "fixme") == 0 || /**/
- strcmp(element->name, "warning") == 0 || /**/
- strcmp(element->name, "note") == 0) {
- char* text = "";
-
- if(strcmp(element->name, "fixme") == 0) {
- text = "Fixme";
- } else if(strcmp(element->name, "warning") == 0) {
- text = "Warning";
- } else if(strcmp(element->name, "note") == 0) {
- text = "Note";
- }
-
- sprintf(tag + strlen(tag), "\n", element->name);
- sprintf(tag + strlen(tag), "
\n");
- sprintf(tag + strlen(tag), " \n");
- sprintf(tag + strlen(tag), " \n");
- sprintf(tag + strlen(tag), " \n", top, element->name);
- sprintf(tag + strlen(tag), " | \n");
- sprintf(tag + strlen(tag), " \n");
- sprintf(tag + strlen(tag), " %s\n", text);
- sprintf(tag + strlen(tag), " | \n");
- sprintf(tag + strlen(tag), "
\n");
- sprintf(tag + strlen(tag), " \n");
- sprintf(tag + strlen(tag), " | ");
-
- sprintf(end + strlen(end), " | \n");
- sprintf(end + strlen(end), "
\n");
- sprintf(end + strlen(end), "
\n");
- sprintf(end + strlen(end), "
", element->name);
-
- add = 3;
- } else if(strcmp(element->name, "p") == 0 || /**/
- strcmp(element->name, "code") == 0 || /**/
- strcmp(element->name, "blockquote") == 0 || /**/
- strcmp(element->name, "ul") == 0 || /**/
- strcmp(element->name, "ol") == 0 || /**/
- strcmp(element->name, "li") == 0) {
- sprintf(tag, "<%s>", element->name);
-
- sprintf(end, "%s>", element->name);
- } else if(strcmp(element->name, "a") == 0) {
- char text[2048];
- xl_attribute_t* attr = element->first_attribute;
-
- text[0] = 0;
- while(attr != NULL) {
- if(attr->value == NULL) {
- sprintf(text + strlen(text), " %s", attr->key);
- } else {
- sprintf(text + strlen(text), " %s=\"%s\"", attr->key, attr->value);
- }
-
- attr = attr->next;
- }
-
- sprintf(tag, "<%s%s>", element->name, text);
-
- sprintf(end, "%s>", element->name);
- } else if(strcmp(element->name, "hr") == 0) {
- sprintf(tag, "<%s>", element->name);
- }
-
- if(tag[0] != 0) print(out, tag, indent + 6);
-
- child = element->first_child;
- while(child != NULL) {
- if(child->type == XL_NODE_NODE && child->name != NULL) {
- recursive(out, top, child, indent + 1 + add);
- } else if(child->type == XL_NODE_TEXT && child->text != NULL) {
- print(out, child->text, indent + 7 + add);
- }
-
- child = child->next;
- }
-
- if(end[0] != 0) print(out, end, indent + 6);
-}
-
void classic_body(FILE* out, const char* top, const char* title, xl_node_t* body) {
char year[4 + 1 + 4 + 1]; /* no one would use our software in year 10000... right? :) */
char* holder = "Unknown people";
@@ -340,7 +232,7 @@ void classic_body(FILE* out, const char* top, const char* title, xl_node_t* body
child = body->first_child;
while(child != NULL) {
- recursive(out, top, child, 0);
+ default_node(out, top, child, 0);
child = child->next;
}
diff --git a/src/default.c b/src/default.c
new file mode 100644
index 0000000..225a9d8
--- /dev/null
+++ b/src/default.c
@@ -0,0 +1,149 @@
+#include
+
+static void print(FILE* out, const char* txt, int indent) {
+ int i;
+
+ for(i = 0;; i++) {
+ if(i == 0 || txt[i] == '\n' || txt[i] == 0) {
+ int j;
+ if(i > 0) fprintf(out, "\n");
+ if(txt[i] == 0) break;
+ for(j = 0; j < indent; j++) fprintf(out, "\t");
+ }
+
+ if(txt[i] != '\n') fprintf(out, "%c", txt[i]);
+ }
+}
+
+static void accept_attr(char* text, xl_node_t* element, ...) {
+ xl_attribute_t* attr = element->first_attribute;
+
+ text[0] = 0;
+ while(attr != NULL) {
+ va_list va;
+ const char* s;
+
+ va_start(va, element);
+ while((s = va_arg(va, const char*)) != NULL) {
+ if(strcmp(attr->key, s) != 0) continue;
+ if(attr->value == NULL) {
+ sprintf(text + strlen(text), " %s", attr->key);
+ } else {
+ sprintf(text + strlen(text), " %s=\"%s\"", attr->key, attr->value);
+ }
+ }
+ va_end(va);
+
+ attr = attr->next;
+ }
+}
+
+void default_node(FILE* out, const char* top, xl_node_t* element, int indent) {
+ xl_node_t* child;
+ char tag[2048]; /* enough for most cases... :) */
+ char end[128];
+ int add = 0;
+
+ tag[0] = end[0] = 0;
+
+ if(element->name == NULL) return;
+
+ if(strcmp(element->name, "section") == 0) {
+ char* title = xl_get_attribute(element, "title");
+
+ sprintf(tag, "%s
", title);
+ } else if(strcmp(element->name, "fixme") == 0 || /**/
+ strcmp(element->name, "warning") == 0 || /**/
+ strcmp(element->name, "note") == 0) {
+ char* text = "";
+
+ if(strcmp(element->name, "fixme") == 0) {
+ text = "Fixme";
+ } else if(strcmp(element->name, "warning") == 0) {
+ text = "Warning";
+ } else if(strcmp(element->name, "note") == 0) {
+ text = "Note";
+ }
+
+ sprintf(tag + strlen(tag), "\n", element->name);
+ sprintf(tag + strlen(tag), "
\n");
+ sprintf(tag + strlen(tag), " \n");
+ sprintf(tag + strlen(tag), " \n");
+ sprintf(tag + strlen(tag), " \n", top, element->name);
+ sprintf(tag + strlen(tag), " | \n");
+ sprintf(tag + strlen(tag), " \n");
+ sprintf(tag + strlen(tag), " %s\n", text);
+ sprintf(tag + strlen(tag), " | \n");
+ sprintf(tag + strlen(tag), "
\n");
+ sprintf(tag + strlen(tag), " \n");
+ sprintf(tag + strlen(tag), " | ");
+
+ sprintf(end + strlen(end), " | \n");
+ sprintf(end + strlen(end), "
\n");
+ sprintf(end + strlen(end), "
\n");
+ sprintf(end + strlen(end), "
", element->name);
+
+ add = 3;
+ } else if(strcmp(element->name, "p") == 0 || /**/
+ strcmp(element->name, "code") == 0 || /**/
+ strcmp(element->name, "blockquote") == 0 || /**/
+ strcmp(element->name, "ul") == 0 || /**/
+ strcmp(element->name, "ol") == 0 || /**/
+ strcmp(element->name, "li") == 0 || /**/
+ strcmp(element->name, "dt") == 0 || /**/
+ strcmp(element->name, "dd") == 0 || /**/
+ strcmp(element->name, "strong") == 0 || /**/
+ strcmp(element->name, "sub") == 0 || /**/
+ strcmp(element->name, "sup") == 0 || /**/
+ strcmp(element->name, "tr") == 0) {
+ sprintf(tag, "<%s>", element->name);
+
+ sprintf(end, "%s>", element->name);
+ } else if(strcmp(element->name, "a") == 0) {
+ char text[2048];
+
+ accept_attr(text, element, "href", NULL);
+
+ sprintf(tag, "<%s%s>", element->name, text);
+
+ sprintf(end, "%s>", element->name);
+ } else if(strcmp(element->name, "td") == 0 || /**/
+ strcmp(element->name, "th") == 0) {
+ char text[2048];
+
+ accept_attr(text, element, "rowspan", "colspan", NULL);
+
+ sprintf(tag, "<%s%s>", element->name, text);
+
+ sprintf(end, "%s>", element->name);
+ } else if(strcmp(element->name, "img") == 0) {
+ char text[2048];
+
+ accept_attr(text, element, "src", NULL);
+
+ sprintf(tag, "<%s%s>", element->name, text);
+
+ sprintf(end, "%s>", element->name);
+ } else if(strcmp(element->name, "table") == 0) {
+ sprintf(tag, "<%s>", element->name);
+
+ sprintf(end, "%s>", element->name);
+ } else if(strcmp(element->name, "hr") == 0) {
+ sprintf(tag, "<%s>", element->name);
+ }
+
+ if(tag[0] != 0) print(out, tag, indent + 6);
+
+ child = element->first_child;
+ while(child != NULL) {
+ if(child->type == XL_NODE_NODE && child->name != NULL) {
+ default_node(out, top, child, indent + 1 + add);
+ } else if(child->type == XL_NODE_TEXT && child->text != NULL) {
+ print(out, child->text, indent + 7 + add);
+ }
+
+ child = child->next;
+ }
+
+ if(end[0] != 0) print(out, end, indent + 6);
+}
diff --git a/src/taiga.h b/src/taiga.h
index 42648b0..3cc5103 100644
--- a/src/taiga.h
+++ b/src/taiga.h
@@ -61,4 +61,7 @@ void classic_stylesheet(FILE* out, const char* top); /* also create files here i
void classic_head(FILE* out, const char* top, xl_node_t* header);
void classic_body(FILE* out, const char* top, const char* title, xl_node_t* body);
+/* default.c */
+void default_node(FILE* out, const char* top, xl_node_t* element, int indent);
+
#endif