summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-05-29 18:47:54 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-05-29 18:47:54 +0000
commit9556337196fc2bcc77b1327d58828a073ca49879 (patch)
tree137bbeeb6c506d7ff53fd9c4c8f6901e5e3c0cac
parentb3536e4d2b9fcb0daf7141c545883a7d2b442e33 (diff)
downloadmandoc-9556337196fc2bcc77b1327d58828a073ca49879.tar.gz
Commit of patch floated on discuss@ a few days ago: if an in_line scope
has not been opened and closing punctuation is encountered AND the macro is marked as accepting no-content (or `Li'), then open an empty scope. Added regression tests for `Fl' and `Li' testing this behaviour. Also, squeeze hyph0.in tests into the last characters of each line so that groff doesn't hyphenate and break the test.
-rw-r--r--mdoc_html.c2
-rw-r--r--mdoc_macro.c43
-rw-r--r--mdoc_term.c2
-rw-r--r--regress/mdoc/Fl/empty.in15
-rw-r--r--regress/mdoc/Li/empty.in14
-rw-r--r--regress/mdoc/Li/empty2.in40
-rw-r--r--regress/mdoc/punct/hyph0.in8
7 files changed, 108 insertions, 16 deletions
diff --git a/mdoc_html.c b/mdoc_html.c
index 22011403..e0db3832 100644
--- a/mdoc_html.c
+++ b/mdoc_html.c
@@ -2091,6 +2091,8 @@ mdoc_li_pre(MDOC_ARGS)
PAIR_CLASS_INIT(&tag, "lit");
print_otag(h, TAG_SPAN, 1, &tag);
+ if (NULL == n->child)
+ print_text(h, "");
return(1);
}
diff --git a/mdoc_macro.c b/mdoc_macro.c
index f091a015..bb89b25a 100644
--- a/mdoc_macro.c
+++ b/mdoc_macro.c
@@ -754,7 +754,7 @@ blk_exp_close(MACRO_PROT_ARGS)
static int
in_line(MACRO_PROT_ARGS)
{
- int la, lastpunct, cnt, nc, nl;
+ int la, scope, cnt, nc, nl;
enum margverr av;
enum mdoct ntok;
enum margserr ac;
@@ -805,7 +805,7 @@ in_line(MACRO_PROT_ARGS)
return(0);
}
- for (cnt = 0, lastpunct = 1;; ) {
+ for (cnt = scope = 0;; ) {
la = *pos;
ac = mdoc_args(m, line, pos, buf, tok, &p);
@@ -826,7 +826,7 @@ in_line(MACRO_PROT_ARGS)
*/
if (MDOC_MAX != ntok) {
- if (0 == lastpunct && ! rew_elem(m, tok))
+ if (scope && ! rew_elem(m, tok))
return(0);
if (nc && 0 == cnt) {
if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg))
@@ -853,14 +853,35 @@ in_line(MACRO_PROT_ARGS)
d = ARGS_QWORD == ac ? DELIM_NONE : mdoc_isdelim(p);
- if (ARGS_QWORD != ac && DELIM_NONE != d) {
- if (0 == lastpunct && ! rew_elem(m, tok))
+ if (DELIM_NONE != d) {
+ /*
+ * If we encounter closing punctuation, no word
+ * has been omitted, no scope is open, and we're
+ * allowed to have an empty element, then start
+ * a new scope. `Ar', `Fl', and `Li', only do
+ * this once per invocation. There may be more
+ * of these (all of them?).
+ */
+ if (0 == cnt && (nc || MDOC_Li == tok) &&
+ DELIM_CLOSE == d && ! scope) {
+ if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg))
+ return(0);
+ if (MDOC_Ar == tok || MDOC_Li == tok ||
+ MDOC_Fl == tok)
+ cnt++;
+ scope = 1;
+ }
+ /*
+ * Close out our scope, if one is open, before
+ * any punctuation.
+ */
+ if (scope && ! rew_elem(m, tok))
return(0);
- lastpunct = 1;
- } else if (lastpunct) {
+ scope = 0;
+ } else if ( ! scope) {
if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg))
return(0);
- lastpunct = 0;
+ scope = 1;
}
if (DELIM_NONE == d)
@@ -873,14 +894,14 @@ in_line(MACRO_PROT_ARGS)
* word so that the `-' can be added to each one without
* having to parse out spaces.
*/
- if (0 == lastpunct && MDOC_Fl == tok) {
+ if (scope && MDOC_Fl == tok) {
if ( ! rew_elem(m, tok))
return(0);
- lastpunct = 1;
+ scope = 0;
}
}
- if (0 == lastpunct && ! rew_elem(m, tok))
+ if (scope && ! rew_elem(m, tok))
return(0);
/*
diff --git a/mdoc_term.c b/mdoc_term.c
index 943a880d..65c39277 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -2098,6 +2098,8 @@ termp_li_pre(DECL_ARGS)
{
term_fontpush(p, TERMFONT_NONE);
+ if (NULL == n->child)
+ term_word(p, "");
return(1);
}
diff --git a/regress/mdoc/Fl/empty.in b/regress/mdoc/Fl/empty.in
new file mode 100644
index 00000000..bfda2dcb
--- /dev/null
+++ b/regress/mdoc/Fl/empty.in
@@ -0,0 +1,15 @@
+.Dd May 16, 2010
+.Dt FOO 1
+.Os
+.Sh NAME
+.Nm foo
+.Nd bar
+.Sh DESCRIPTION
+.Fl . a
+.Pp
+.Fl ;
+.Pp
+.Ar expr1 Fl : expr2
+.Pp
+.Ar expr1 Fl . ; expr2 ( expr3 )
+.Ar expr1 Fl . ; ) ( expr3 )
diff --git a/regress/mdoc/Li/empty.in b/regress/mdoc/Li/empty.in
new file mode 100644
index 00000000..64fa6add
--- /dev/null
+++ b/regress/mdoc/Li/empty.in
@@ -0,0 +1,14 @@
+.Dd May 16, 2010
+.Dt FOO 1
+.Os
+.Sh NAME
+.Nm foo
+.Nd bar
+.Sh DESCRIPTION
+.Li . a
+.Pp
+.Li ;
+.Pp
+.Ar expr1 Li : expr2
+.Pp
+.Ar expr1 Li . ; expr2 ( expr3 )
diff --git a/regress/mdoc/Li/empty2.in b/regress/mdoc/Li/empty2.in
new file mode 100644
index 00000000..2986f0f6
--- /dev/null
+++ b/regress/mdoc/Li/empty2.in
@@ -0,0 +1,40 @@
+.\" $OpenBSD: bgpd.conf.5,v 1.88 2008/03/22 08:38:38 claudio Exp $
+.\"
+.\" Copyright (c) 2004 Claudio Jeker <claudio@openbsd.org>
+.\" Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
+.\" Copyright (c) 2002 Daniel Hartmeier <dhartmei@openbsd.org>
+.\"
+.\" Permission to use, copy, modify, and distribute this software for any
+.\" purpose with or without fee is hereby granted, provided that the above
+.\" copyright notice and this permission notice appear in all copies.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.\"
+.Dd $Mdocdate$
+.Dt BGPD.CONF 5
+.Os
+.Sh NAME
+.Nm bgpd.conf
+.Nd Border Gateway Protocol daemon configuration file
+.Sh DESCRIPTION
+The
+.Ar address Ns Li / Ns Ar prefix
+.Pp
+.Ar as-number Ns Li \&: Ns Ar local
+.Pp
+.Ar as-number Ns Li : Ns Ar local ,
+.Pp
+.Ar address Ns Li / Ns Ar len
+.Pp
+.Ar address Ns Li / Ns Ar len
+.Pp
+.Ar as-number Ns Li : Ns Ar local
+.Pp
+.Ar as-number Ns Li : Ns Ar local ,
+where
diff --git a/regress/mdoc/punct/hyph0.in b/regress/mdoc/punct/hyph0.in
index b1021f94..e989c726 100644
--- a/regress/mdoc/punct/hyph0.in
+++ b/regress/mdoc/punct/hyph0.in
@@ -5,16 +5,14 @@
.Nm foo
.Nd bar
.Sh DESCRIPTION
-asdflkjhasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhsadflkjhsadflkjhasf d-asdf
+aasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhsadflkjhsadflkjhasf d-asdf
.Pp
-asdflkjhasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhsadflkjhsadflkjhasf d\(hyasdf
+aasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhsadflkjhsadflkjhasf d\(hyasdf
.Pp
asdflkjhasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhsadflkjhsadflkjhasf d--yasdf
.Pp
asdflkjhasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhsadflkjhsadfhsasf d---yasdf
.Pp
-asdflkjhasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhsadflkjhsadfhsasf "d-yasdf"
+aaasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhsadflkjhsadfhsasf "d-yasdf"
.Pp
asdflkjhasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhsadflkjhsadfhsasf d\-yasdf
-.Pp
-.Qq lkjhasdflkjhasdflkjhasdflkjhasdflkjhasdflkjhsadflkjhsadflkjhasfasas d-asdf