From: Ingo Schwarze <schwarze@usta.de>
To: "Anthony J. Bentley" <anthony@anjbe.name>
Cc: tech@mdocml.bsd.lv
Subject: Re: MT and ME macros
Date: Fri, 23 Jun 2017 15:44:18 +0200 [thread overview]
Message-ID: <20170623134418.GA89450@athene.usta.de> (raw)
In-Reply-To: <81293.1498196746@cathet.us>
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
next prev parent reply other threads:[~2017-06-23 13:44 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-23 5:45 Anthony J. Bentley
2017-06-23 13:44 ` Ingo Schwarze [this message]
2017-06-24 7:31 ` Anthony J. Bentley
2017-06-24 15:06 ` Ingo Schwarze
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170623134418.GA89450@athene.usta.de \
--to=schwarze@usta.de \
--cc=anthony@anjbe.name \
--cc=tech@mdocml.bsd.lv \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).