tech@mandoc.bsd.lv
 help / color / mirror / Atom feed
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

  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).