From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from scc-mailout-kit-01.scc.kit.edu (scc-mailout-kit-01.scc.kit.edu [129.13.231.81]) by fantadrom.bsd.lv (OpenSMTPD) with ESMTP id 5b58e92b for ; Fri, 23 Jun 2017 08:44:25 -0500 (EST) Received: from asta-nat.asta.uni-karlsruhe.de ([172.22.63.82] helo=hekate.usta.de) by scc-mailout-kit-01.scc.kit.edu with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (envelope-from ) id 1dOOsm-0000mp-8L; Fri, 23 Jun 2017 15:44:24 +0200 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.77) (envelope-from ) id 1dOOsk-0001MR-KL; Fri, 23 Jun 2017 15:44:18 +0200 Received: from athene.usta.de ([172.24.96.10]) by donnerwolke.usta.de with esmtp (Exim 4.84_2) (envelope-from ) id 1dOOsk-000452-CH; Fri, 23 Jun 2017 15:44:18 +0200 Received: from localhost (athene.usta.de [local]) by athene.usta.de (OpenSMTPD) with ESMTPA id f92d815f; Fri, 23 Jun 2017 15:44:18 +0200 (CEST) Date: Fri, 23 Jun 2017 15:44:18 +0200 From: Ingo Schwarze To: "Anthony J. Bentley" Cc: tech@mdocml.bsd.lv Subject: Re: MT and ME macros Message-ID: <20170623134418.GA89450@athene.usta.de> References: <81293.1498196746@cathet.us> X-Mailinglist: mdocml-tech Reply-To: tech@mdocml.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <81293.1498196746@cathet.us> User-Agent: Mutt/1.6.2 (2016-07-01) Hi Anthony, you have OpenBSD but not bsd.lv commit access, right? So you should better send patches against OpenBSD, such that i can provide proper OKs. Anthony J. Bentley wrote on Thu, Jun 22, 2017 at 11:45:46PM -0600: > - MT and ME are not supported. Since you have found the first real page using it and since it has long been documented in groff_man(7), i agree with adding it. > - UR prints < >, not \(la \(ra. (Sigh...) Admittedly, groff prints \(la and \(ra for both .UR and .MT. For .MT, that is clearly wrong. The SMTP RFC syntax for the SMTP From:, To:, etc. lines requires the ASCII characters for enclosing the email address. So we should send a patch to groff. Do you agree? Regarding .UR, i'm on the fence. The is no formal syntax of any kind for enclosing URIs in angle brackets, or is there? If there isn't, then maybe typographic angle brackets look nicer than ASCII ones. Then again, i tend to value consistency with .MT more than that, so maybe i'd rather move .UR to ASCII delimiters in groff. But that should be a separate patch sent to groff because it's maybe more contentious. Do you agree? > - The trailing period after UE is not displayed. Yes, that looks like a missing feature. It is not even parsed. > Here's a diff that attempts to fix the first two points, Please do not mix the two, do only the first point, and drop the second for now. > although maybe it contains needless duplication? Yes it does, see below. Do you want to rework your patch according to the hints below, in order to ultimately commit it yourself? Yours, Ingo > Index: man_html.c > =================================================================== > RCS file: /cvs/mdocml/man_html.c,v > retrieving revision 1.143 > diff -u -p -r1.143 man_html.c > --- man_html.c 8 Jun 2017 12:54:58 -0000 1.143 > +++ man_html.c 23 Jun 2017 05:42:49 -0000 > @@ -57,6 +57,7 @@ static int man_B_pre(MAN_ARGS); > static int man_HP_pre(MAN_ARGS); > static int man_IP_pre(MAN_ARGS); > static int man_I_pre(MAN_ARGS); > +static int man_MT_pre(MAN_ARGS); > static int man_OP_pre(MAN_ARGS); > static int man_PP_pre(MAN_ARGS); > static int man_RS_pre(MAN_ARGS); > @@ -105,6 +106,8 @@ static const struct htmlman __mans[MAN_M > { NULL, NULL }, /* EE */ > { man_UR_pre, NULL }, /* UR */ > { NULL, NULL }, /* UE */ > + { man_MT_pre, NULL }, /* MT */ > + { NULL, NULL }, /* ME */ > }; > static const struct htmlman *const mans = __mans - MAN_TH; > > @@ -229,6 +232,7 @@ print_man_node(MAN_ARGS) > case MAN_P: /* reopen .nf in the body. */ > case MAN_RS: > case MAN_UR: > + case MAN_MT: > fillmode(h, MAN_fi); > break; > default: > @@ -648,6 +652,28 @@ man_UR_pre(MAN_ARGS) > if (n->child != NULL) { > assert(n->child->type == ROFFT_TEXT); > print_otag(h, TAG_A, "cTh", "Lk", n->child->string); > + } > + > + assert(n->next->type == ROFFT_BODY); > + if (n->next->child != NULL) > + n = n->next; > + > + print_man_nodelist(man, n->child, h); > + > + return 0; > +} > + > +static int > +man_MT_pre(MAN_ARGS) > +{ > + char *cp; > + n = n->child; > + assert(n->type == ROFFT_HEAD); > + if (n->child != NULL) { > + assert(n->child->type == ROFFT_TEXT); > + mandoc_asprintf(&cp, "mailto:%s", n->child->string); > + print_otag(h, TAG_A, "cTh", "Mt", cp); > + free(cp); Please use the existing man_UR_pre() rather than writing a duplicate man_MT_pre(). All you need is one "if (n->tok == MAN_MT)" controlling the last three lines above vs. the existing: print_otag(h, TAG_A, "cTh", "Lk", n->child->string); [...] > Index: man_term.c > =================================================================== > RCS file: /cvs/mdocml/man_term.c,v > retrieving revision 1.207 > diff -u -p -r1.207 man_term.c > --- man_term.c 17 Jun 2017 13:06:16 -0000 1.207 > +++ man_term.c 23 Jun 2017 05:42:50 -0000 > @@ -72,6 +72,7 @@ static int pre_DT(DECL_ARGS); > static int pre_HP(DECL_ARGS); > static int pre_I(DECL_ARGS); > static int pre_IP(DECL_ARGS); > +static int pre_MT(DECL_ARGS); > static int pre_OP(DECL_ARGS); > static int pre_PD(DECL_ARGS); > static int pre_PP(DECL_ARGS); > @@ -87,6 +88,7 @@ static int pre_literal(DECL_ARGS); > > static void post_IP(DECL_ARGS); > static void post_HP(DECL_ARGS); > +static void post_MT(DECL_ARGS); > static void post_RS(DECL_ARGS); > static void post_SH(DECL_ARGS); > static void post_SS(DECL_ARGS); > @@ -128,6 +130,8 @@ static const struct termact __termacts[M > { pre_literal, NULL, 0 }, /* EE */ > { pre_UR, post_UR, 0 }, /* UR */ > { NULL, NULL, 0 }, /* UE */ > + { pre_MT, post_MT, 0 }, /* MT */ > + { NULL, NULL, 0 }, /* ME */ > }; > static const struct termact *termacts = __termacts - MAN_TH; > > @@ -842,6 +846,13 @@ pre_UR(DECL_ARGS) > return n->type != ROFFT_HEAD; > } > > +static int > +pre_MT(DECL_ARGS) > +{ > + > + return n->type != ROFFT_HEAD; > +} > + Really, no need to have two identical functions. Just use the existing pre_UR(). > static void > post_UR(DECL_ARGS) > { > @@ -849,14 +860,31 @@ post_UR(DECL_ARGS) > if (n->type != ROFFT_BLOCK) > return; > > - term_word(p, "<"); > + term_word(p, "\\(la"); No, don't mix that in here. > + p->flags |= TERMP_NOSPACE; > + > + if (NULL != n->child->child) > + print_man_node(p, mt, n->child->child, meta); > + > + p->flags |= TERMP_NOSPACE; > + term_word(p, "\\(ra"); > +} > + > +static void > +post_MT(DECL_ARGS) > +{ The two functions look identical as well, so just using post_UR instead of defining post_MT may work. > + > + if (n->type != ROFFT_BLOCK) > + return; > + > + term_word(p, "\\(la"); > p->flags |= TERMP_NOSPACE; > > if (NULL != n->child->child) > print_man_node(p, mt, n->child->child, meta); > > p->flags |= TERMP_NOSPACE; > - term_word(p, ">"); > + term_word(p, "\\(ra"); > } > > static void > Index: man_validate.c > =================================================================== > RCS file: /cvs/mdocml/man_validate.c,v > retrieving revision 1.130 > diff -u -p -r1.130 man_validate.c > --- man_validate.c 17 Jun 2017 22:43:14 -0000 1.130 > +++ man_validate.c 23 Jun 2017 05:42:50 -0000 > @@ -47,6 +47,7 @@ static void check_text(CHKARGS); > > static void post_AT(CHKARGS); > static void post_IP(CHKARGS); > +static void post_MT(CHKARGS); > static void post_OP(CHKARGS); > static void post_TH(CHKARGS); > static void post_UC(CHKARGS); > @@ -89,6 +90,8 @@ static const v_check __man_valids[MAN_MA > NULL, /* EE */ > post_UR, /* UR */ > NULL, /* UE */ > + post_MT, /* MT */ > + NULL, /* ME */ > }; > static const v_check *man_valids = __man_valids - MAN_TH; > > @@ -211,6 +214,16 @@ post_UR(CHKARGS) > if (n->type == ROFFT_HEAD && n->child == NULL) > mandoc_vmsg(MANDOCERR_UR_NOHEAD, man->parse, > n->line, n->pos, "UR"); > + check_part(man, n); > +} > + > +static void > +post_MT(CHKARGS) > +{ > + > + if (n->type == ROFFT_HEAD && n->child == NULL) > + mandoc_vmsg(MANDOCERR_MT_NOHEAD, man->parse, > + n->line, n->pos, "MT"); Just use the existing post_UR. You don't even need a separate MANDOCERR. Just use roff_name[n->tok] for the final argment. > check_part(man, n); > } > > Index: mandoc.1 > =================================================================== > RCS file: /cvs/mdocml/mandoc.1,v > retrieving revision 1.201 > diff -u -p -r1.201 mandoc.1 > --- mandoc.1 17 Jun 2017 23:07:00 -0000 1.201 > +++ mandoc.1 23 Jun 2017 05:42:50 -0000 > @@ -1225,6 +1225,7 @@ A > .Ic \&Bl , > .Ic \&D1 , > .Ic \&Dl , > +.Ic \&MT , > .Ic \&RS , > or > .Ic \&UR > @@ -1363,6 +1364,12 @@ The > .Ic \&UR > macro is invoked without any argument. > An empty pair of angle brackets is shown. > +.It Sy "missing address, using \(dq\(dq" > +.Pq man > +The > +.Ic \&MT > +macro is invoked without any argument. > +An empty pair of angle brackets is shown. No different message needed, just mention with the existing message that .MT can also cause it. > .It Sy "missing eqn box, using \(dq\(dq" > .Pq eqn > A diacritic mark or a binary operator is found, > @@ -1712,7 +1719,7 @@ An > .Xr mdoc 7 > block closing macro, a > .Xr man 7 > -.Ic \&RE > +.Ic \&MT , \&RE > or > .Ic \&UE > macro, an > @@ -1746,7 +1753,7 @@ At the end of the document, an explicit > block, a > .Xr man 7 > next-line scope or > -.Ic \&RS > +.Ic \&MT , \&RS > or > .Ic \&UR > block, an equation, table, or > @@ -1918,6 +1925,7 @@ A macro or request is invoked with too m > .Bl -dash -offset 2n -width 2n -compact > .It > .Ic \&Fo , > +.Ic \&MT , > .Ic \&PD , > .Ic \&RS , > .Ic \&UR , > Index: mandoc.h > =================================================================== > RCS file: /cvs/mdocml/mandoc.h,v > retrieving revision 1.232 > diff -u -p -r1.232 mandoc.h > --- mandoc.h 17 Jun 2017 23:07:00 -0000 1.232 > +++ mandoc.h 23 Jun 2017 05:42:50 -0000 > @@ -129,6 +129,7 @@ enum mandocerr { > MANDOCERR_ARG_STD, /* missing -std argument, adding it: macro */ > MANDOCERR_OP_EMPTY, /* missing option string, using "": OP */ > MANDOCERR_UR_NOHEAD, /* missing resource identifier, using "": UR */ > + MANDOCERR_MT_NOHEAD, /* missing address, using "": MT */ > MANDOCERR_EQN_NOBOX, /* missing eqn box, using "": op */ > > /* related to bad arguments */ No change needed to this file. > Index: read.c > =================================================================== > RCS file: /cvs/mdocml/read.c,v > retrieving revision 1.178 > diff -u -p -r1.178 read.c > --- read.c 17 Jun 2017 23:07:00 -0000 1.178 > +++ read.c 23 Jun 2017 05:42:50 -0000 > @@ -171,6 +171,7 @@ static const char * const mandocerrs[MAN > "missing -std argument, adding it", > "missing option string, using \"\"", > "missing resource identifier, using \"\"", > + "missing address, using \"\"", > "missing eqn box, using \"\"", > > /* related to bad macro arguments */ No change needed to this file. > Index: roff.c > =================================================================== > RCS file: /cvs/mdocml/roff.c,v > retrieving revision 1.315 > diff -u -p -r1.315 roff.c > --- roff.c 18 Jun 2017 17:36:03 -0000 1.315 > +++ roff.c 23 Jun 2017 05:42:50 -0000 > @@ -330,7 +330,7 @@ const char *__roff_name[MAN_MAX + 1] = { > "RE", "RS", "DT", "UC", > "PD", "AT", "in", > "OP", "EX", "EE", "UR", > - "UE", NULL > + "UE", "MT", "ME", NULL > }; > const char *const *roff_name = __roff_name; > > Index: roff.h > =================================================================== > RCS file: /cvs/mdocml/roff.h,v > retrieving revision 1.55 > diff -u -p -r1.55 roff.h > --- roff.h 17 Jun 2017 22:43:15 -0000 1.55 > +++ roff.h 23 Jun 2017 05:42:50 -0000 > @@ -473,6 +473,8 @@ enum roff_tok { > MAN_EE, > MAN_UR, > MAN_UE, > + MAN_MT, > + MAN_ME, > MAN_MAX > }; -- To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv