/* print_opml_node -- convert given node to OPML and append */ void print_opml_node(GString *out, node *n, scratch_pad *scratch) { #ifdef DEBUG_ON fprintf(stderr, "print_opml_node: %d\n",n->key); #endif switch (n->key) { case METADATA: /* Metadata is present, so will need to be appended later */ break; case METAKEY: g_string_append_printf(out, "<outline text=\""); print_opml_string(out, n->str); g_string_append_printf(out, "\" _note=\""); trim_trailing_newlines(n->children->str); print_opml_string(out, n->children->str); g_string_append_printf(out, "\"/>"); break; case HEADINGSECTION: /* Need to handle "nesting" properly */ g_string_append_printf(out, "<outline "); /* Print header */ print_opml_node(out, n->children, scratch); /* print remainder of paragraphs as note */ g_string_append_printf(out, " _note=\""); print_opml_node_tree(out, n->children->next, scratch); g_string_append_printf(out, "\">"); break; case H1: case H2: case H3: case H4: case H5: case H6: g_string_append_printf(out, "text=\""); print_opml_string(out, n->str); g_string_append_printf(out,"\""); break; case VERBATIM: case VERBATIMFENCE: print_opml_string(out, n->str); break; case SPACE: print_opml_string(out, n->str); break; case STR: print_opml_string(out, n->str); break; case LINEBREAK: g_string_append_printf(out, " "); break; case PLAIN: print_opml_node_tree(out, n->children, scratch); if ((n->next != NULL) && (n->next->key == PLAIN)) { g_string_append_printf(out, " "); } break; default: fprintf(stderr, "print_opml_node encountered unknown element key = %d\n", n->key); exit(EXIT_FAILURE); } #ifdef DEBUG_ON fprintf(stderr, "finish print_opml_node: %d\n", n->key); #endif }
/* end_opml_output -- close the document */ void end_opml_output(GString *out, node* list, scratch_pad *scratch) { #ifdef DEBUG_ON fprintf(stderr, "end_opml_output\n"); #endif if (tree_contains_key(list, METAKEY)) { g_string_append_printf(out, "<outline text=\"Metadata\">\n"); print_opml_node_tree(out, list->children, scratch); g_string_append_printf(out, "</outline>"); } g_string_append_printf(out, "</body>\n</opml>"); }
/* 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; }
/* export_node_tree -- given a tree, export as specified format */ char * export_node_tree(node *list, int format, int extensions) { char *output; GString *out = g_string_new(""); scratch_pad *scratch = mk_scratch_pad(extensions); #ifdef DEBUG_ON fprintf(stderr, "export_node_tree\n"); #endif #ifdef DEBUG_ON fprintf(stderr, "extract_references\n"); #endif /* Parse for link, images, etc reference definitions */ if ((format != OPML_FORMAT) && (format != CRITIC_ACCEPT_FORMAT) && (format != CRITIC_REJECT_FORMAT) && (format != CRITIC_HTML_HIGHLIGHT_FORMAT)) 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) { 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: print_latex_node_tree(out, list, scratch); break; case MEMOIR_FORMAT: print_memoir_node_tree(out, list, scratch); break; case BEAMER_FORMAT: print_beamer_node_tree(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 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; 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; }