=================================================================== RCS file: /cvs/mandoc/mdoc_markdown.c,v retrieving revision 1.1 retrieving revision 1.5 diff -u -p -r1.1 -r1.5 --- mandoc/mdoc_markdown.c 2017/03/03 14:23:23 1.1 +++ mandoc/mdoc_markdown.c 2017/03/07 13:09:27 1.5 @@ -1,4 +1,4 @@ -/* $Id: mdoc_markdown.c,v 1.1 2017/03/03 14:23:23 schwarze Exp $ */ +/* $Id: mdoc_markdown.c,v 1.5 2017/03/07 13:09:27 schwarze Exp $ */ /* * Copyright (c) 2017 Ingo Schwarze * @@ -51,6 +51,7 @@ static int md_pre_raw(struct roff_node *); static int md_pre_word(struct roff_node *); static int md_pre_skip(struct roff_node *); static void md_pre_syn(struct roff_node *); +static int md_pre_An(struct roff_node *); static int md_pre_Ap(struct roff_node *); static int md_pre_Bd(struct roff_node *); static int md_pre_Bk(struct roff_node *); @@ -115,7 +116,7 @@ static const struct md_act md_acts[MDOC_MAX + 1] = { { NULL, NULL, NULL, NULL, NULL }, /* El */ { NULL, md_pre_It, md_post_It, NULL, NULL }, /* It */ { NULL, md_pre_raw, md_post_raw, "*", "*" }, /* Ad */ - { NULL, NULL, NULL, NULL, NULL }, /* An */ + { NULL, md_pre_An, NULL, NULL, NULL }, /* An */ { NULL, md_pre_raw, md_post_raw, "*", "*" }, /* Ar */ { NULL, md_pre_raw, md_post_raw, "**", "**" }, /* Cd */ { NULL, md_pre_raw, md_post_raw, "**", "**" }, /* Cm */ @@ -129,7 +130,7 @@ static const struct md_act md_acts[MDOC_MAX + 1] = { { NULL, md_pre_Fn, md_post_Fn, NULL, NULL }, /* Fn */ { NULL, md_pre_Fd, md_post_raw, "*", "*" }, /* Ft */ { NULL, md_pre_raw, md_post_raw, "**", "**" }, /* Ic */ - { NULL, md_pre_In, md_post_In, "*", "*" }, /* In */ + { NULL, md_pre_In, md_post_In, NULL, NULL }, /* In */ { NULL, md_pre_raw, md_post_raw, "`", "`" }, /* Li */ { md_cond_head, md_pre_Nd, NULL, NULL, NULL }, /* Nd */ { NULL, md_pre_Nm, md_post_Nm, "**", "**" }, /* Nm */ @@ -220,7 +221,7 @@ static const struct md_act md_acts[MDOC_MAX + 1] = { { NULL, NULL, md_post_pc, NULL, NULL }, /* %Q */ { NULL, md_pre_br, NULL, NULL, NULL }, /* br */ { NULL, md_pre_Pp, NULL, NULL, NULL }, /* sp */ - { NULL, NULL, md_post_pc, NULL, NULL }, /* %U */ + { NULL, md_pre_Lk, md_post_pc, NULL, NULL }, /* %U */ { NULL, NULL, NULL, NULL, NULL }, /* Ta */ { NULL, NULL, NULL, NULL, NULL }, /* ll */ { NULL, NULL, NULL, NULL, NULL }, /* ROOT */ @@ -235,6 +236,8 @@ static int outflags; #define MD_sp (1 << 5) /* Insert a paragraph break. */ #define MD_Sm (1 << 6) /* Horizontal spacing mode. */ #define MD_Bk (1 << 7) /* Word keep mode. */ +#define MD_An_split (1 << 8) /* Author mode is "split". */ +#define MD_An_nosplit (1 << 9) /* Author mode is "nosplit". */ static int escflags; /* Escape in generated markdown code: */ #define ESC_BOL (1 << 0) /* "#*+-" near the beginning of a line. */ @@ -782,6 +785,28 @@ md_pre_syn(struct roff_node *n) } static int +md_pre_An(struct roff_node *n) +{ + switch (n->norm->An.auth) { + case AUTH_split: + outflags &= ~MD_An_nosplit; + outflags |= MD_An_split; + return 0; + case AUTH_nosplit: + outflags &= ~MD_An_split; + outflags |= MD_An_nosplit; + return 0; + default: + if (outflags & MD_An_split) + outflags |= MD_br; + else if (n->sec == SEC_AUTHORS && + ! (outflags & MD_An_nosplit)) + outflags |= MD_An_split; + return 1; + } +} + +static int md_pre_Ap(struct roff_node *n) { outflags &= ~MD_spc; @@ -1067,16 +1092,15 @@ md_pre_In(struct roff_node *n) { if (n->flags & NODE_SYNPRETTY) { md_pre_syn(n); - md_pre_raw(n); - md_rawword("*"); + md_rawword("**"); outflags &= ~MD_spc; md_word("#include <"); - outflags &= ~MD_spc; } else { md_word("<"); outflags &= ~MD_spc; - md_pre_raw(n); + md_rawword("*"); } + outflags &= ~MD_spc; return 1; } @@ -1085,13 +1109,11 @@ md_post_In(struct roff_node *n) { if (n->flags & NODE_SYNPRETTY) { outflags &= ~MD_spc; - md_rawword(">*"); - md_post_raw(n); + md_rawword(">**"); outflags |= MD_nl; } else { - md_post_raw(n); outflags &= ~MD_spc; - md_rawword(">"); + md_rawword("*>"); } } @@ -1235,6 +1257,7 @@ static int md_pre_Lk(struct roff_node *n) { const struct roff_node *link, *descr; + const unsigned char *s; if ((link = n->child) == NULL) return 0; @@ -1251,9 +1274,17 @@ md_pre_Lk(struct roff_node *n) } else md_rawword("<"); + for (s = link->string; *s != '\0'; s++) { + if (strchr("%)<>", *s) != NULL) { + printf("%%%2.2hhX", *s); + outcount += 3; + } else { + putchar(*s); + outcount++; + } + } + outflags &= ~MD_spc; - md_word(link->string); - outflags &= ~MD_spc; md_rawword(link->next == NULL ? ">" : ")"); return 0; } @@ -1341,6 +1372,10 @@ static int md_pre_Sh(struct roff_node *n) { switch (n->type) { + case ROFFT_BLOCK: + if (n->sec == SEC_AUTHORS) + outflags &= ~(MD_An_split | MD_An_nosplit); + break; case ROFFT_HEAD: outflags |= MD_sp; md_rawword(n->tok == MDOC_Sh ? "#" : "##"); @@ -1419,8 +1454,7 @@ md_pre_Xr(struct roff_node *n) static int md_pre__T(struct roff_node *n) { - if (n->parent != NULL && n->parent->tok == MDOC_Rs && - n->parent->norm->Rs.quote_T) + if (n->parent->tok == MDOC_Rs && n->parent->norm->Rs.quote_T) md_word("\""); else md_rawword("*"); @@ -1432,8 +1466,7 @@ static void md_post__T(struct roff_node *n) { outflags &= ~MD_spc; - if (n->parent != NULL && n->parent->tok == MDOC_Rs && - n->parent->norm->Rs.quote_T) + if (n->parent->tok == MDOC_Rs && n->parent->norm->Rs.quote_T) md_word("\""); else md_rawword("*");