/* export_node_tree -- given a tree, export as specified format */ char * export_node_tree(node *list, int format, unsigned long extensions) { char *output; char *temp; GString *out = g_string_new(""); scratch_pad *scratch = mk_scratch_pad(extensions); scratch->result_tree = list; /* Pointer to result tree to use later */ #ifdef DEBUG_ON fprintf(stderr, "export_node_tree\n"); #endif #ifdef DEBUG_ON fprintf(stderr, "extract_references\n"); #endif if ((format != OPML_FORMAT) && (format != CRITIC_ACCEPT_FORMAT) && (format != CRITIC_REJECT_FORMAT) && (format != CRITIC_HTML_HIGHLIGHT_FORMAT)) { /* Find defined abbreviations */ extract_abbreviations(list, scratch); /* Apply those abbreviations to source text */ find_abbreviations(list, scratch); /* Parse for link, images, etc reference definitions */ extract_references(list, scratch); } /* Change our desired format based on metadata */ if (format == LATEX_FORMAT) format = find_latex_mode(format, list); switch (format) { case TEXT_FORMAT: print_text_node_tree(out, list, scratch); break; case HTML_FORMAT: if (scratch->extensions & EXT_COMPLETE) { temp = metavalue_for_key("lang", scratch->result_tree); if (temp != NULL) { g_string_append_printf(out, "<!DOCTYPE html>\n<html lang=\"%s\">\n<head>\n\t<meta charset=\"utf-8\"/>\n",temp); free(temp); } else { g_string_append_printf(out, "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\"/>\n"); } } #ifdef DEBUG_ON fprintf(stderr, "print_html output\n"); #endif print_html_node_tree(out, list, scratch); #ifdef DEBUG_ON fprintf(stderr, "print html endnotes\n"); #endif print_html_endnotes(out, scratch); #ifdef DEBUG_ON fprintf(stderr, "finished printing html endnotes\n"); #endif if (scratch->extensions & EXT_COMPLETE) { pad(out,2, scratch); g_string_append_printf(out, "</body>\n</html>"); } #ifdef DEBUG_ON fprintf(stderr, "closed HTML document\n"); #endif break; case LATEX_FORMAT: if ((list != NULL) && (list->key != METADATA)) { print_latex_node_tree(out, scratch->abbreviations, scratch); } print_latex_node_tree(out, list, scratch); break; case MEMOIR_FORMAT: if ((list != NULL) && (list->key != METADATA)) { print_memoir_node_tree(out, scratch->abbreviations, scratch); } print_memoir_node_tree(out, list, scratch); break; case BEAMER_FORMAT: if ((list != NULL) && (list->key != METADATA)) { print_beamer_node_tree(out, scratch->abbreviations, scratch); } print_beamer_node_tree(out, list, scratch); break; case LYX_FORMAT: perform_lyx_output(out,list,scratch); break; case OPML_FORMAT: #ifdef DEBUG_ON fprintf(stderr, "export OPML\n"); #endif begin_opml_output(out, list, scratch); print_opml_node_tree(out, list, scratch); end_opml_output(out, list, scratch); break; case ODF_FORMAT: #ifdef DEBUG_ON fprintf(stderr, "export ODF\n"); #endif begin_odf_output(out, list, scratch); print_odf_node_tree(out, list, scratch); end_odf_output(out, list, scratch); break; case RTF_FORMAT: #ifdef DEBUG_ON fprintf(stderr, "export RTF\n"); #endif if (!(scratch->extensions & EXT_SNIPPET)) begin_rtf_output(out, list, scratch); print_rtf_node_tree(out, list, scratch); if (!(scratch->extensions & EXT_SNIPPET)) end_rtf_output(out, list, scratch); break; case CRITIC_ACCEPT_FORMAT: print_critic_accept_node_tree(out, list, scratch); break; case CRITIC_REJECT_FORMAT: print_critic_reject_node_tree(out, list, scratch); break; case CRITIC_HTML_HIGHLIGHT_FORMAT: print_critic_html_highlight_node_tree(out, list, scratch); break; case TOC_FORMAT: scratch->toc_level = 0; print_toc_node_tree(out,list,scratch); break; default: fprintf(stderr, "Unknown export format = %d\n",format); exit(EXIT_FAILURE); } output = out->str; g_string_free(out, false); free_scratch_pad(scratch); #ifdef DEBUG_ON fprintf(stderr, "finish export_node_tree\n"); #endif return output; }
/* print_toc_node -- convert given node to MultiMarkdown and append */ void print_toc_node(MMD_GString *out, node *n, scratch_pad *scratch) { char *temp; int i; #ifdef DEBUG_ON fprintf(stderr, "print_toc_node: %d\n",n->key); #endif switch (n->key) { case HEADINGSECTION: /* Need to handle "nesting" properly */ for (i = 0; i < scratch->toc_level; ++i) { mmd_g_string_append_printf(out, "\t"); } mmd_g_string_append_printf(out, "* "); /* Print header */ print_toc_node(out, n->children, scratch); break; case H1: case H2: case H3: case H4: case H5: case H6: if ((n->children != NULL) && (n->children->key == AUTOLABEL)) { temp = label_from_string(n->children->str); /* use label for header since one was specified (MMD)*/ mmd_g_string_append_printf(out, "["); print_toc_node_tree(out, n->children, scratch); mmd_g_string_append_printf(out, "][%s]\n", temp); } else { temp = label_from_node_tree(n->children); mmd_g_string_append_printf(out, "["); print_toc_node_tree(out, n->children, scratch); mmd_g_string_append_printf(out, "][%s]\n", temp); } free(temp); break; case STR: print_toc_string(out, n->str); break; case EMPH: mmd_g_string_append_printf(out, "*"); print_toc_node_tree(out, n->children, scratch); mmd_g_string_append_printf(out, "*"); break; case STRONG: mmd_g_string_append_printf(out, "**"); print_toc_node_tree(out, n->children, scratch); mmd_g_string_append_printf(out, "**"); break; case SPACE: mmd_g_string_append_printf(out, "%s", n->str); break; case LINK: print_toc_node_tree(out, n->children, scratch); break; case HTML: break; case LINKREFERENCE: break; case AUTOLABEL: break; case VARIABLE: mmd_g_string_append_printf(out, "[%%%s]",n->str); break; case LIST: print_toc_node_tree(out, n->children, scratch); break; default: fprintf(stderr, "print_toc_node encountered unknown node key = %d\n",n->key); break; } #ifdef DEBUG_ON fprintf(stderr, "finish print_toc_node: %d\n", n->key); #endif }