0
@@ -27,570 +27,6 @@ static int extensions;
0
/**********************************************************************
0
- Utility functions for printing
0
- ***********************************************************************/
0
-static int padded = 2; /* Number of newlines after last output.
0
- Starts at 2 so no newlines are needed at start.
0
-/* pad - add newlines if needed */
0
- while (num-- > padded)
0
-/**********************************************************************
0
- Functions for printing Elements as HTML
0
- ***********************************************************************/
0
-/* print_html_string - print string, escaping for HTML
0
- * If obfuscate selected, convert characters to hex or decimal entities at random */
0
-void print_html_string(char *str, bool obfuscate) {
0
- while (*str != '\0') {
0
- printf("&#%d;", *str);
0
- printf("&#x%x;", *str);
0
-void print_html_element(element elt, bool obfuscate);
0
-/* print_html_element_list - print a list of elements as HTML */
0
-void print_html_element_list(item *list, bool obfuscate) {
0
- while (list != NULL) {
0
- print_html_element((*list).val, obfuscate);
0
-/* print_html_element - print an element as HTML */
0
-void print_html_element(element elt, bool obfuscate) {
0
- printf("%s", elt.contents.str);
0
- print_html_string(elt.contents.str, obfuscate);
0
- print_html_string(elt.contents.str, obfuscate);
0
- printf(elt.contents.str);
0
- if (strstr(elt.contents.link.url, "mailto:") == elt.contents.link.url)
0
- obfuscate = true; /* obfuscate mailto: links */
0
- print_html_string(elt.contents.link.url, obfuscate);
0
- if (strlen(elt.contents.link.title) > 0) {
0
- print_html_string(elt.contents.link.title, obfuscate);
0
- print_html_element_list(elt.contents.link.label, obfuscate);
0
- printf("<img src=\"");
0
- print_html_string(elt.contents.link.url, obfuscate);
0
- print_html_element_list(elt.contents.link.label, obfuscate);
0
- if (strlen(elt.contents.link.title) > 0) {
0
- print_html_string(elt.contents.link.title, obfuscate);
0
- print_html_element_list(elt.contents.list, obfuscate);
0
- print_html_element_list(elt.contents.list, obfuscate);
0
- print_html_element_list(elt.contents.list, obfuscate);
0
- case H1: case H2: case H3: case H4: case H5: case H6:
0
- lev = elt.key - H1 + 1; /* assumes H1 ... H6 are in order */
0
- printf("<h%1d>", lev);
0
- print_html_element_list(elt.contents.list, obfuscate);
0
- printf("</h%1d>", lev);
0
- print_html_element_list(elt.contents.list, obfuscate);
0
- print_html_element_list(elt.contents.list, obfuscate);
0
- printf(elt.contents.str);
0
- printf("<pre><code>");
0
- print_html_string(elt.contents.str, obfuscate);
0
- printf("</code></pre>");
0
- print_html_element_list(elt.contents.list, obfuscate);
0
- print_html_element_list(elt.contents.list, obfuscate);
0
- /* \001 is used to indicate boundaries between nested lists when there
0
- * is no blank line. We split the string by \001 and parse
0
- * each chunk separately. */
0
- contents = strtok(elt.contents.str, "\001");
0
- print_html_element(markdown(contents, extensions), obfuscate);
0
- while ((contents = strtok(NULL, "\001")))
0
- print_html_element(markdown(contents, extensions), obfuscate);
0
- printf("<blockquote>");
0
- print_html_element(markdown(elt.contents.str, extensions), obfuscate);
0
- printf("</blockquote>");
0
- fprintf(stderr, "print_html_element encountered unknown element key = %d\n", elt.key);
0
-/**********************************************************************
0
- Functions for printing Elements as LaTeX
0
- ***********************************************************************/
0
-/* print_latex_string - print string, escaping for LaTeX */
0
-void print_latex_string(char *str) {
0
- while (*str != '\0') {
0
- case '{': case '}': case '$': case '%':
0
- case '&': case '_': case '#':
0
- printf("\\textbackslash{}");
0
- printf("\\ensuremath{\\sim}");
0
- printf("\\textbar{}");
0
- printf("\\textless{}");
0
- printf("\\textgreater{}");
0
-void print_latex_element(element elt);
0
-/* print_latex_element_list - print a list of elements as LaTeX */
0
-void print_latex_element_list(item *list) {
0
- while (list != NULL) {
0
- print_latex_element((*list).val);
0
-/* print_latex_element - print an element as LaTeX */
0
-void print_latex_element(element elt) {
0
- printf("%s", elt.contents.str);
0
- print_latex_string(elt.contents.str);
0
- print_latex_string(elt.contents.str);
0
- /* don't print HTML */
0
- printf("\\href{%s}{", elt.contents.link.url);
0
- print_latex_element_list(elt.contents.link.label);
0
- printf("\\includegraphics{%s}", elt.contents.link.url);
0
- print_latex_element_list(elt.contents.list);
0
- print_latex_element_list(elt.contents.list);
0
- print_latex_element_list(elt.contents.list);
0
- case H1: case H2: case H3:
0
- lev = elt.key - H1 + 1; /* assumes H1 ... H6 are in order */
0
- for (i = elt.key; i > H1; i--)
0
- print_latex_element_list(elt.contents.list);
0
- case H4: case H5: case H6:
0
- printf("\\noindent\\textbf{");
0
- print_latex_element_list(elt.contents.list);
0
- print_latex_element_list(elt.contents.list);
0
- print_latex_element_list(elt.contents.list);
0
- printf("\\begin{center}\\rule{3in}{0.4pt}\\end{center}\n");
0
- /* don't print HTML block */
0
- printf("\\begin{verbatim}\n");
0
- print_latex_string(elt.contents.str);
0
- printf("\n\\end{verbatim}\n");
0
- printf("\\begin{itemize}\n");
0
- print_latex_element_list(elt.contents.list);
0
- printf("\\end{itemize}\n\n");
0
- printf("\\begin{enumerate}\n");
0
- print_latex_element_list(elt.contents.list);
0
- printf("\\end{enumerate}\n\n");
0
- /* \001 is used to indicate boundaries between nested lists when there
0
- * is no blank line. We split the string by \001 and parse
0
- * each chunk separately. */
0
- contents = strtok(elt.contents.str, "\001");
0
- print_latex_element(markdown(contents, extensions));
0
- while ((contents = strtok(NULL, "\001")))
0
- print_latex_element(markdown(contents, extensions));
0
- printf("\\begin{quote}");
0
- print_latex_element(markdown(elt.contents.str, extensions));
0
- printf("\\end{quote}\n\n");
0
- fprintf(stderr, "print_latex_element encountered unknown element key = %d\n", elt.key);
0
-/**********************************************************************
0
- Functions for printing Elements as groff (mm macros)
0
- ***********************************************************************/
0
-static bool in_list_item = false; /* True if we're parsing contents of a list item. */
0
-/* print_groff_string - print string, escaping for groff */
0
-void print_groff_string(char *str) {
0
- while (*str != '\0') {
0
-void print_groff_mm_element(element elt, int count);
0
-/* print_groff_mm_element_list - print a list of elements as groff ms */
0
-void print_groff_mm_element_list(item *list) {
0
- while (list != NULL) {
0
- print_groff_mm_element((*list).val, count);
0
-/* print_groff_mm_element - print an element as groff ms */
0
-void print_groff_mm_element(element elt, int count) {
0
- printf("%s", elt.contents.str);
0
- print_groff_string(elt.contents.str);
0
- print_groff_string(elt.contents.str);
0
- /* don't print HTML */
0
- print_groff_mm_element_list(elt.contents.link.label);
0
- printf(" (%s)", elt.contents.link.url);
0
- print_groff_mm_element_list(elt.contents.link.label);
0
- print_groff_mm_element_list(elt.contents.list);
0
- print_groff_mm_element_list(elt.contents.list);
0
- print_groff_mm_element_list(elt.contents.list);
0
- case H1: case H2: case H3: case H4: case H5: case H6:
0
- lev = elt.key - H1 + 1;
0
- printf(".H %d \"", lev);
0
- print_groff_mm_element_list(elt.contents.list);
0
- print_groff_mm_element_list(elt.contents.list);
0
- if (!in_list_item || count != 1)
0
- print_groff_mm_element_list(elt.contents.list);
0
- printf("\\l'\\n(.lu*8u/10u'");
0
- /* don't print HTML block */
0
- printf(".VERBON 2\n");
0
- print_groff_string(elt.contents.str);
0
- print_groff_mm_element_list(elt.contents.list);
0
- print_groff_mm_element_list(elt.contents.list);
0
- /* \001 is used to indicate boundaries between nested lists when there
0
- * is no blank line. We split the string by \001 and parse
0
- * each chunk separately. */
0
- contents = strtok(elt.contents.str, "\001");
0
- print_groff_mm_element(markdown(contents, extensions), 1);
0
- while ((contents = strtok(NULL, "\001"))) {
0
- print_groff_mm_element(markdown(contents, extensions), 1);
0
- print_groff_mm_element(markdown(elt.contents.str, extensions), 1);
0
- fprintf(stderr, "print_groff_mm_element encountered unknown element key = %d\n", elt.key);
0
-/**********************************************************************
0
Main program and auxiliary functions.
0
Reads input from files on command line, or from stdin
0
@@ -653,13 +89,6 @@ int main(int argc, char * argv[]) {
0
- enum formats { HTML_FORMAT,
0
int output_format = HTML_FORMAT;
0
char *shortopts = "Vhx::o:t:";
0
@@ -799,21 +228,7 @@ int main(int argc, char * argv[]) {
0
element parsed_input = markdown(inputbuf, extensions);
0
- switch (output_format) {
0
- print_html_element(parsed_input, false);
0
- print_latex_element(parsed_input);
0
- print_groff_mm_element(parsed_input, 1);
0
- fprintf(stderr, "print_element - unknown format = %d\n", output_format);
0
+ print_element(parsed_input, output_format);