=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_markdown.c,v retrieving revision 1.14 retrieving revision 1.15 diff -c -r1.14 -r1.15 *** src/usr.bin/mandoc/mdoc_markdown.c 2017/03/08 19:23:23 1.14 --- src/usr.bin/mandoc/mdoc_markdown.c 2017/03/11 12:35:40 1.15 *************** *** 1,4 **** ! /* $OpenBSD: mdoc_markdown.c,v 1.14 2017/03/08 19:23:23 schwarze Exp $ */ /* * Copyright (c) 2017 Ingo Schwarze * --- 1,4 ---- ! /* $OpenBSD: mdoc_markdown.c,v 1.15 2017/03/11 12:35:40 schwarze Exp $ */ /* * Copyright (c) 2017 Ingo Schwarze * *************** *** 43,48 **** --- 43,49 ---- static void md_word(const char *); static void md_named(const char *); static void md_char(unsigned char); + static void md_uri(const char *); static int md_cond_head(struct roff_node *); static int md_cond_body(struct roff_node *); *************** *** 67,72 **** --- 68,74 ---- static int md_pre_In(struct roff_node *); static int md_pre_It(struct roff_node *); static int md_pre_Lk(struct roff_node *); + static int md_pre_Mt(struct roff_node *); static int md_pre_Nd(struct roff_node *); static int md_pre_Nm(struct roff_node *); static int md_pre_No(struct roff_node *); *************** *** 211,217 **** { NULL, NULL, md_post_Lb, NULL, NULL }, /* Lb */ { NULL, md_pre_Pp, NULL, NULL, NULL }, /* Lp */ { NULL, md_pre_Lk, NULL, NULL, NULL }, /* Lk */ ! { NULL, md_pre_raw, md_post_raw, "<", ">" }, /* Mt */ { md_cond_body, md_pre_word, md_post_word, "{", "}" }, /* Brq */ { md_cond_body, md_pre_word, md_post_word, "{", "}" }, /* Bro */ { NULL, NULL, NULL, NULL, NULL }, /* Brc */ --- 213,219 ---- { NULL, NULL, md_post_Lb, NULL, NULL }, /* Lb */ { NULL, md_pre_Pp, NULL, NULL, NULL }, /* Lp */ { NULL, md_pre_Lk, NULL, NULL, NULL }, /* Lk */ ! { NULL, md_pre_Mt, NULL, NULL, NULL }, /* Mt */ { md_cond_body, md_pre_word, md_post_word, "{", "}" }, /* Brq */ { md_cond_body, md_pre_word, md_post_word, "{", "}" }, /* Bro */ { NULL, NULL, NULL, NULL, NULL }, /* Brc */ *************** *** 1279,1317 **** outflags |= MD_br; } 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; ! if ((descr = link->next) != NULL) { ! md_rawword("["); ! outflags &= ~MD_spc; ! while (descr != NULL) { ! md_word(descr->string); ! descr = descr->next; ! } ! outflags &= ~MD_spc; ! md_rawword("]("); ! } 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_rawword(link->next == NULL ? ">" : ")"); return 0; } --- 1281,1344 ---- outflags |= MD_br; } + static void + md_uri(const char *s) + { + while (*s != '\0') { + if (strchr("%()<>", *s) != NULL) { + printf("%%%2.2hhX", *s); + outcount += 3; + } else { + putchar(*s); + outcount++; + } + s++; + } + } + static int md_pre_Lk(struct roff_node *n) { const struct roff_node *link, *descr; if ((link = n->child) == NULL) return 0; ! descr = link->next == NULL ? link : link->next; ! md_rawword("["); ! outflags &= ~MD_spc; ! do { ! md_word(descr->string); ! descr = link->next == NULL ? NULL : descr->next; ! } while (descr != NULL); ! outflags &= ~MD_spc; ! md_rawword("]("); ! md_uri(link->string); ! outflags &= ~MD_spc; ! md_rawword(")"); ! return 0; ! } ! static int ! md_pre_Mt(struct roff_node *n) ! { ! const struct roff_node *nch; ! ! md_rawword("["); ! outflags &= ~MD_spc; ! for (nch = n->child; nch != NULL; nch = nch->next) ! md_word(nch->string); ! outflags &= ~MD_spc; ! md_rawword("](mailto:"); ! for (nch = n->child; nch != NULL; nch = nch->next) { ! md_uri(nch->string); ! if (nch->next != NULL) { ! putchar(' '); outcount++; } } outflags &= ~MD_spc; ! md_rawword(")"); return 0; }