]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_markdown.c
Massively reduce the amount of text, cutting it down to what is needed
[mandoc.git] / mdoc_markdown.c
index 15430c44de6a46a13e601e78ec458e6ad9015efd..301b71c724600de9aae5a17eb9e617b79fb36417 100644 (file)
@@ -1,6 +1,6 @@
-/*     $Id: mdoc_markdown.c,v 1.19 2017/05/05 02:06:19 schwarze Exp $ */
+/*     $Id: mdoc_markdown.c,v 1.26 2018/08/17 20:33:38 schwarze Exp $ */
 /*
- * Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -19,7 +19,6 @@
 #include <assert.h>
 #include <ctype.h>
 #include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
 
 #include "mandoc_aux.h"
@@ -104,7 +103,7 @@ static      void     md_post_Pf(struct roff_node *);
 static void     md_post_Vt(struct roff_node *);
 static void     md_post__T(struct roff_node *);
 
-static const struct md_act __md_acts[MDOC_MAX - MDOC_Dd] = {
+static const struct md_act md_acts[MDOC_MAX - MDOC_Dd] = {
        { NULL, NULL, NULL, NULL, NULL }, /* Dd */
        { NULL, NULL, NULL, NULL, NULL }, /* Dt */
        { NULL, NULL, NULL, NULL, NULL }, /* Os */
@@ -223,12 +222,10 @@ static    const struct md_act __md_acts[MDOC_MAX - MDOC_Dd] = {
        { md_cond_body, md_pre_En, md_post_En, NULL, NULL }, /* En */
        { NULL, NULL, NULL, NULL, NULL }, /* Dx */
        { NULL, NULL, md_post_pc, NULL, NULL }, /* %Q */
-       { NULL, md_pre_Pp, NULL, NULL, NULL }, /* sp */
        { NULL, md_pre_Lk, md_post_pc, NULL, NULL }, /* %U */
        { NULL, NULL, NULL, NULL, NULL }, /* Ta */
-       { NULL, NULL, NULL, NULL, NULL }, /* ll */
 };
-static const struct md_act *const md_acts = __md_acts - MDOC_Dd;
+static const struct md_act *md_act(enum roff_tok);
 
 static int      outflags;
 #define        MD_spc           (1 << 0)  /* Blank character before next word. */
@@ -253,6 +250,14 @@ static     int      escflags; /* Escape in generated markdown code: */
 static int      code_blocks, quote_blocks, list_blocks;
 static int      outcount;
 
+
+static const struct md_act *
+md_act(enum roff_tok tok)
+{
+       assert(tok >= MDOC_Dd && tok <= MDOC_MAX);
+       return md_acts + (tok - MDOC_Dd);
+}
+
 void
 markdown_mdoc(void *arg, const struct roff_man *mdoc)
 {
@@ -297,7 +302,7 @@ md_node(struct roff_node *n)
        const struct md_act     *act;
        int                      cond, process_children;
 
-       if (n->flags & NODE_NOPRT)
+       if (n->type == ROFFT_COMMENT || n->flags & NODE_NOPRT)
                return;
 
        if (outflags & MD_nonl)
@@ -325,15 +330,15 @@ md_node(struct roff_node *n)
                case ROFF_br:
                        process_children = md_pre_br(n);
                        break;
-               case ROFF_ft:
-                       process_children = 0;
+               case ROFF_sp:
+                       process_children = md_pre_Pp(n);
                        break;
                default:
-                       abort();
+                       process_children = 0;
+                       break;
                }
        } else {
-               assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX);
-               act = md_acts + n->tok;
+               act = md_act(n->tok);
                cond = act->cond == NULL || (*act->cond)(n);
                if (cond && act->pre != NULL &&
                    (n->end == ENDBODY_NOT || n->child != NULL))
@@ -495,7 +500,7 @@ md_word(const char *s)
 {
        const char      *seq, *prevfont, *currfont, *nextfont;
        char             c;
-       int              bs, sz, uc;
+       int              bs, sz, uc, breakline;
 
        /* No spacing before closing delimiters. */
        if (s[0] != '\0' && s[1] == '\0' &&
@@ -512,6 +517,7 @@ md_word(const char *s)
        if ((s[0] == '(' || s[0] == '[') && s[1] == '\0')
                outflags &= ~MD_spc;
 
+       breakline = 0;
        prevfont = currfont = "";
        while ((c = *s++) != '\0') {
                bs = 0;
@@ -581,6 +587,9 @@ md_word(const char *s)
                        case ESCAPE_SPECIAL:
                                uc = mchars_spec2cp(seq, sz);
                                break;
+                       case ESCAPE_DEVICE:
+                               md_rawword("markdown");
+                               continue;
                        case ESCAPE_FONTBOLD:
                                nextfont = "**";
                                break;
@@ -597,6 +606,9 @@ md_word(const char *s)
                        case ESCAPE_FONTPREV:
                                nextfont = prevfont;
                                break;
+                       case ESCAPE_BREAK:
+                               breakline = 1;
+                               break;
                        case ESCAPE_NOSPACE:
                        case ESCAPE_SKIPCHAR:
                        case ESCAPE_OVERSTRIKE:
@@ -644,6 +656,13 @@ md_word(const char *s)
                if (bs)
                        putchar('\\');
                md_char(c);
+               if (breakline &&
+                   (*s == '\0' || *s == ' ' || *s == ASCII_NBRSP)) {
+                       printf("  \n");
+                       breakline = 0;
+                       while (*s == ' ' || *s == ASCII_NBRSP)
+                               s++;
+               }
        }
        if (*currfont != '\0') {
                outflags &= ~MD_spc;
@@ -707,7 +726,7 @@ md_pre_raw(struct roff_node *n)
 {
        const char      *prefix;
 
-       if ((prefix = md_acts[n->tok].prefix) != NULL) {
+       if ((prefix = md_act(n->tok)->prefix) != NULL) {
                md_rawword(prefix);
                outflags &= ~MD_spc;
                if (*prefix == '`')
@@ -721,7 +740,7 @@ md_post_raw(struct roff_node *n)
 {
        const char      *suffix;
 
-       if ((suffix = md_acts[n->tok].suffix) != NULL) {
+       if ((suffix = md_act(n->tok)->suffix) != NULL) {
                outflags &= ~(MD_spc | MD_nl);
                md_rawword(suffix);
                if (*suffix == '`')
@@ -734,7 +753,7 @@ md_pre_word(struct roff_node *n)
 {
        const char      *prefix;
 
-       if ((prefix = md_acts[n->tok].prefix) != NULL) {
+       if ((prefix = md_act(n->tok)->prefix) != NULL) {
                md_word(prefix);
                outflags &= ~MD_spc;
        }
@@ -746,7 +765,7 @@ md_post_word(struct roff_node *n)
 {
        const char      *suffix;
 
-       if ((suffix = md_acts[n->tok].suffix) != NULL) {
+       if ((suffix = md_act(n->tok)->suffix) != NULL) {
                outflags &= ~(MD_spc | MD_nl);
                md_word(suffix);
        }
@@ -1308,21 +1327,27 @@ md_uri(const char *s)
 static int
 md_pre_Lk(struct roff_node *n)
 {
-       const struct roff_node *link, *descr;
+       const struct roff_node *link, *descr, *punct;
 
        if ((link = n->child) == NULL)
                return 0;
 
+       /* Find beginning of trailing punctuation. */
+       punct = n->last;
+       while (punct != link && punct->flags & NODE_DELIMC)
+               punct = punct->prev;
+       punct = punct->next;
+
        /* Link text. */
        descr = link->next;
-       if (descr == NULL || descr->flags & NODE_DELIMC)
+       if (descr == punct)
                descr = link;  /* no text */
        md_rawword("[");
        outflags &= ~MD_spc;
        do {
                md_word(descr->string);
                descr = descr->next;
-       } while (descr != NULL && !(descr->flags & NODE_DELIMC));
+       } while (descr != punct);
        outflags &= ~MD_spc;
 
        /* Link target. */
@@ -1332,9 +1357,9 @@ md_pre_Lk(struct roff_node *n)
        md_rawword(")");
 
        /* Trailing punctuation. */
-       while (descr != NULL) {
-               md_word(descr->string);
-               descr = descr->next;
+       while (punct != NULL) {
+               md_word(punct->string);
+               punct = punct->next;
        }
        return 0;
 }