version 1.33, 2020/02/20 00:29:16 |
version 1.35, 2020/04/03 11:35:01 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2017, 2018, 2020 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
* |
|
* Markdown formatter for mdoc(7) used by mandoc(1). |
*/ |
*/ |
#include <sys/types.h> |
#include <sys/types.h> |
|
|
|
|
#include "main.h" |
#include "main.h" |
|
|
struct md_act { |
struct md_act { |
int (*cond)(struct roff_node *n); |
int (*cond)(struct roff_node *); |
int (*pre)(struct roff_node *n); |
int (*pre)(struct roff_node *); |
void (*post)(struct roff_node *n); |
void (*post)(struct roff_node *); |
const char *prefix; /* pre-node string constant */ |
const char *prefix; /* pre-node string constant */ |
const char *suffix; /* post-node string constant */ |
const char *suffix; /* post-node string constant */ |
}; |
}; |
|
|
static void md_nodelist(struct roff_node *); |
static void md_nodelist(struct roff_node *); |
static void md_node(struct roff_node *); |
static void md_node(struct roff_node *); |
static const char *md_stack(char c); |
static const char *md_stack(char); |
static void md_preword(void); |
static void md_preword(void); |
static void md_rawword(const char *); |
static void md_rawword(const char *); |
static void md_word(const char *); |
static void md_word(const char *); |
Line 310 md_node(struct roff_node *n) |
|
Line 312 md_node(struct roff_node *n) |
|
|
|
if (outflags & MD_nonl) |
if (outflags & MD_nonl) |
outflags &= ~(MD_nl | MD_sp); |
outflags &= ~(MD_nl | MD_sp); |
else if (outflags & MD_spc && n->flags & NODE_LINE) |
else if (outflags & MD_spc && |
|
n->flags & NODE_LINE && |
|
!roff_node_transparent(n)) |
outflags |= MD_nl; |
outflags |= MD_nl; |
|
|
act = NULL; |
act = NULL; |
Line 787 md_post_word(struct roff_node *n) |
|
Line 791 md_post_word(struct roff_node *n) |
|
static void |
static void |
md_post_pc(struct roff_node *n) |
md_post_pc(struct roff_node *n) |
{ |
{ |
|
struct roff_node *nn; |
|
|
md_post_raw(n); |
md_post_raw(n); |
if (n->parent->tok != MDOC_Rs) |
if (n->parent->tok != MDOC_Rs) |
return; |
return; |
if (n->next != NULL) { |
|
|
if ((nn = roff_node_next(n)) != NULL) { |
md_word(","); |
md_word(","); |
if (n->prev != NULL && |
if (nn->tok == n->tok && |
n->prev->tok == n->tok && |
(nn = roff_node_prev(n)) != NULL && |
n->next->tok == n->tok) |
nn->tok == n->tok) |
md_word("and"); |
md_word("and"); |
} else { |
} else { |
md_word("."); |
md_word("."); |
Line 811 md_pre_skip(struct roff_node *n) |
|
Line 818 md_pre_skip(struct roff_node *n) |
|
static void |
static void |
md_pre_syn(struct roff_node *n) |
md_pre_syn(struct roff_node *n) |
{ |
{ |
if (n->prev == NULL || ! (n->flags & NODE_SYNPRETTY)) |
struct roff_node *np; |
|
|
|
if ((n->flags & NODE_SYNPRETTY) == 0 || |
|
(np = roff_node_prev(n)) == NULL) |
return; |
return; |
|
|
if (n->prev->tok == n->tok && |
if (np->tok == n->tok && |
n->tok != MDOC_Ft && |
n->tok != MDOC_Ft && |
n->tok != MDOC_Fo && |
n->tok != MDOC_Fo && |
n->tok != MDOC_Fn) { |
n->tok != MDOC_Fn) { |
Line 822 md_pre_syn(struct roff_node *n) |
|
Line 832 md_pre_syn(struct roff_node *n) |
|
return; |
return; |
} |
} |
|
|
switch (n->prev->tok) { |
switch (np->tok) { |
case MDOC_Fd: |
case MDOC_Fd: |
case MDOC_Fn: |
case MDOC_Fn: |
case MDOC_Fo: |
case MDOC_Fo: |
Line 1053 md_pre_Fa(struct roff_node *n) |
|
Line 1063 md_pre_Fa(struct roff_node *n) |
|
static void |
static void |
md_post_Fa(struct roff_node *n) |
md_post_Fa(struct roff_node *n) |
{ |
{ |
if (n->next != NULL && n->next->tok == MDOC_Fa) |
struct roff_node *nn; |
|
|
|
if ((nn = roff_node_next(n)) != NULL && nn->tok == MDOC_Fa) |
md_word(","); |
md_word(","); |
} |
} |
|
|
Line 1075 md_post_Fd(struct roff_node *n) |
|
Line 1087 md_post_Fd(struct roff_node *n) |
|
static void |
static void |
md_post_Fl(struct roff_node *n) |
md_post_Fl(struct roff_node *n) |
{ |
{ |
|
struct roff_node *nn; |
|
|
md_post_raw(n); |
md_post_raw(n); |
if (n->child == NULL && n->next != NULL && |
if (n->child == NULL && (nn = roff_node_next(n)) != NULL && |
n->next->type != ROFFT_TEXT && !(n->next->flags & NODE_LINE)) |
nn->type != ROFFT_TEXT && (nn->flags & NODE_LINE) == 0) |
outflags &= ~MD_spc; |
outflags &= ~MD_spc; |
} |
} |
|
|