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"); - sprintf(tag + strlen(tag), " \n"); - sprintf(tag + strlen(tag), " \n"); - sprintf(tag + strlen(tag), " \n"); - sprintf(end + strlen(end), " \n"); - sprintf(end + strlen(end), "
\n"); - sprintf(tag + strlen(tag), " \n", top, element->name); - sprintf(tag + strlen(tag), " \n"); - sprintf(tag + strlen(tag), " %s\n", text); - sprintf(tag + strlen(tag), "
"); - - 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, "", 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, "", 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"); + sprintf(tag + strlen(tag), " \n"); + sprintf(tag + strlen(tag), " \n"); + sprintf(tag + strlen(tag), " \n"); + sprintf(end + strlen(end), " \n"); + sprintf(end + strlen(end), "
\n"); + sprintf(tag + strlen(tag), " \n", top, element->name); + sprintf(tag + strlen(tag), " \n"); + sprintf(tag + strlen(tag), " %s\n", text); + sprintf(tag + strlen(tag), "
"); + + 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, "", 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, "", 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, "", 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, "", element->name); + } else if(strcmp(element->name, "table") == 0) { + sprintf(tag, "<%s>", element->name); + + sprintf(end, "", 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