diff options
Diffstat (limited to 'src/man.c')
-rw-r--r-- | src/man.c | 250 |
1 files changed, 0 insertions, 250 deletions
diff --git a/src/man.c b/src/man.c deleted file mode 100644 index f57eb75..0000000 --- a/src/man.c +++ /dev/null @@ -1,250 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <assert.h> - -#include "config.h" -#include "cmark.h" -#include "node.h" -#include "buffer.h" - -// Functions to convert cmark_nodes to groff man strings. - -static void escape_man(cmark_strbuf *dest, const unsigned char *source, int length) -{ - int i; - unsigned char c; - bool beginLine = true; - - for (i = 0; i < length; i++) { - c = source[i]; - if (c == '.' && beginLine) { - cmark_strbuf_puts(dest, "\\&."); - } else if (c == '\'' && beginLine) { - cmark_strbuf_puts(dest, "\\&'"); - } else if (c == '-') { - cmark_strbuf_puts(dest, "\\-"); - } else if (c == '\\') { - cmark_strbuf_puts(dest, "\\e"); - } else { - cmark_strbuf_putc(dest, source[i]); - } - beginLine = (c == '\n'); - } -} - -static inline void cr(cmark_strbuf *man) -{ - if (man->size && man->ptr[man->size - 1] != '\n') - cmark_strbuf_putc(man, '\n'); -} - -struct render_state { - cmark_strbuf* man; - cmark_node *plain; -}; - -static int -S_render_node(cmark_node *node, cmark_event_type ev_type, - struct render_state *state) -{ - cmark_node *tmp; - cmark_strbuf *man = state->man; - int list_number; - bool entering = (ev_type == CMARK_EVENT_ENTER); - - if (state->plain == node) { // back at original node - state->plain = NULL; - } - - if (state->plain != NULL) { - switch(node->type) { - case CMARK_NODE_TEXT: - case CMARK_NODE_CODE: - escape_man(man, node->as.literal.data, - node->as.literal.len); - break; - - case CMARK_NODE_LINEBREAK: - case CMARK_NODE_SOFTBREAK: - cmark_strbuf_putc(man, ' '); - break; - - default: - break; - } - return 1; - } - - switch (node->type) { - case CMARK_NODE_DOCUMENT: - break; - - case CMARK_NODE_BLOCK_QUOTE: - if (entering) { - cr(man); - cmark_strbuf_puts(man, ".RS"); - cr(man); - } else { - cr(man); - cmark_strbuf_puts(man, ".RE"); - cr(man); - } - break; - - case CMARK_NODE_LIST: - break; - - case CMARK_NODE_ITEM: - if (entering) { - cr(man); - cmark_strbuf_puts(man, ".IP "); - if (cmark_node_get_list_type(node->parent) == - CMARK_BULLET_LIST) { - cmark_strbuf_puts(man, "\\[bu] 2"); - } else { - list_number = cmark_node_get_list_start(node->parent); - tmp = node; - while (tmp->prev) { - tmp = tmp->prev; - list_number += 1; - } - cmark_strbuf_printf(man, "\"%d.\" 4", list_number); - } - cr(man); - } else { - cr(man); - } - break; - - case CMARK_NODE_HEADER: - if (entering) { - cr(man); - cmark_strbuf_puts(man, - cmark_node_get_header_level(node) == 1 ? - ".SH" : ".SS"); - cr(man); - } else { - cr(man); - } - break; - - case CMARK_NODE_CODE_BLOCK: - cr(man); - cmark_strbuf_puts(man, ".IP\n.nf\n\\f[C]\n"); - escape_man(man, node->as.code.literal.data, - node->as.code.literal.len); - cr(man); - cmark_strbuf_puts(man, "\\f[]\n.fi"); - cr(man); - break; - - case CMARK_NODE_HTML: - break; - - case CMARK_NODE_HRULE: - cr(man); - cmark_strbuf_puts(man, ".PP\n * * * * *"); - cr(man); - break; - - case CMARK_NODE_PARAGRAPH: - if (entering) { - // no blank line if first paragraph in list: - if (node->parent && - node->parent->type == CMARK_NODE_ITEM && - node->prev == NULL) { - // no blank line or .PP - } else { - cr(man); - cmark_strbuf_puts(man, ".PP\n"); - } - } else { - cr(man); - } - break; - - case CMARK_NODE_TEXT: - escape_man(man, node->as.literal.data, - node->as.literal.len); - break; - - case CMARK_NODE_LINEBREAK: - cmark_strbuf_puts(man, ".PD 0\n.P\n.PD"); - cr(man); - break; - - case CMARK_NODE_SOFTBREAK: - cmark_strbuf_putc(man, '\n'); - break; - - case CMARK_NODE_CODE: - cmark_strbuf_puts(man, "\\f[C]"); - escape_man(man, node->as.literal.data, node->as.literal.len); - cmark_strbuf_puts(man, "\\f[]"); - break; - - case CMARK_NODE_INLINE_HTML: - break; - - case CMARK_NODE_STRONG: - if (entering) { - cmark_strbuf_puts(man, "\\f[B]"); - } else { - cmark_strbuf_puts(man, "\\f[]"); - } - break; - - case CMARK_NODE_EMPH: - if (entering) { - cmark_strbuf_puts(man, "\\f[I]"); - } else { - cmark_strbuf_puts(man, "\\f[]"); - } - break; - - case CMARK_NODE_LINK: - if (!entering) { - cmark_strbuf_printf(man, " (%s)", - cmark_node_get_url(node)); - } - break; - - case CMARK_NODE_IMAGE: - if (entering) { - cmark_strbuf_puts(man, "[IMAGE: "); - state->plain = node; - } else { - cmark_strbuf_puts(man, "]"); - } - break; - - default: - assert(false); - break; - } - - // cmark_strbuf_putc(man, 'x'); - return 1; -} - -char *cmark_render_man(cmark_node *root, long options) -{ - char *result; - cmark_strbuf man = GH_BUF_INIT; - struct render_state state = { &man, NULL }; - cmark_node *cur; - cmark_event_type ev_type; - cmark_iter *iter = cmark_iter_new(root); - - if (options == 0) options = 0; // avoid warning about unused parameters - - while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { - cur = cmark_iter_get_node(iter); - S_render_node(cur, ev_type, &state); - } - result = (char *)cmark_strbuf_detach(&man); - - cmark_iter_free(iter); - return result; -} |