]> git.cameronkatri.com Git - mandoc.git/commitdiff
Right after .Fl, a middle delimiter triggers an empty scope,
authorIngo Schwarze <schwarze@openbsd.org>
Thu, 21 Aug 2014 12:57:17 +0000 (12:57 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Thu, 21 Aug 2014 12:57:17 +0000 (12:57 +0000)
just like a closing delimiter.  This didn't work in groff-1.15,
but it now works in groff-1.22.

After being closed by delimiters, .Nm scopes do not reopen.

Do not suppress white space after .Fl if the next node is a text node
on the same input line; that can happen for middle delimiters.

Fixing an issue reported by jmc@.

mdoc_html.c
mdoc_macro.c
mdoc_man.c
mdoc_term.c

index 0dc32208f017fe2cd2af8c2f7f2a04cf4172772a..5b0497a8b3db6dda79afc80dab132a5e5aa3ad23 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_html.c,v 1.198 2014/08/14 00:31:43 schwarze Exp $ */
+/*     $Id: mdoc_html.c,v 1.199 2014/08/21 12:57:17 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -640,9 +640,10 @@ mdoc_fl_pre(MDOC_ARGS)
 
        print_text(h, "\\-");
 
-       if (n->child)
-               h->flags |= HTML_NOSPACE;
-       else if (n->next && n->next->line == n->line)
+       if ( ! (n->nchild == 0 &&
+           (n->next == NULL ||
+            n->next->type == MDOC_TEXT ||
+            n->next->flags & MDOC_LINE)))
                h->flags |= HTML_NOSPACE;
 
        return(1);
index 4c5bf351c82098655911c29fef49e3355df713f8..dfe350c8c11c8424ae37ad46c90fc2349b57f43c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_macro.c,v 1.141 2014/08/16 19:50:37 schwarze Exp $ */
+/*     $Id: mdoc_macro.c,v 1.142 2014/08/21 12:57:17 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -843,7 +843,7 @@ blk_exp_close(MACRO_PROT_ARGS)
 static int
 in_line(MACRO_PROT_ARGS)
 {
-       int              la, scope, cnt, nc, nl;
+       int              la, scope, cnt, mayopen, nc, nl;
        enum margverr    av;
        enum mdoct       ntok;
        enum margserr    ac;
@@ -894,6 +894,7 @@ in_line(MACRO_PROT_ARGS)
                return(0);
        }
 
+       mayopen = 1;
        for (cnt = scope = 0;; ) {
                la = *pos;
                ac = mdoc_args(mdoc, line, pos, buf, tok, &p);
@@ -950,19 +951,19 @@ in_line(MACRO_PROT_ARGS)
                         * 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?).
+                        * a new scope.
                         */
-                       if (0 == cnt && (nc || MDOC_Li == tok) &&
-                           DELIM_CLOSE == d && ! scope) {
+                       if ((d == DELIM_CLOSE ||
+                            (d == DELIM_MIDDLE && tok == MDOC_Fl)) &&
+                           (nc || tok == MDOC_Li) &&
+                           !scope && !cnt && mayopen) {
                                if ( ! mdoc_elem_alloc(mdoc,
                                    line, ppos, tok, arg))
                                        return(0);
-                               if (MDOC_Ar == tok || MDOC_Li == tok ||
-                                   MDOC_Fl == tok)
-                                       cnt++;
                                scope = 1;
+                               cnt++;
+                               if (MDOC_Li == tok || MDOC_Nm == tok)
+                                       mayopen = 0;
                        }
                        /*
                         * Close out our scope, if one is open, before
@@ -971,14 +972,12 @@ in_line(MACRO_PROT_ARGS)
                        if (scope && ! rew_elem(mdoc, tok))
                                return(0);
                        scope = 0;
-               } else if ( ! scope) {
+               } else if (mayopen && !scope) {
                        if ( ! mdoc_elem_alloc(mdoc, line, ppos, tok, arg))
                                return(0);
                        scope = 1;
-               }
-
-               if (DELIM_NONE == d)
                        cnt++;
+               }
 
                if ( ! dword(mdoc, line, la, p, d,
                    MDOC_JOIN & mdoc_macros[tok].flags))
index 62c7cec2c81c1e8d8a9dda733863571cdd2a89e2..6fa424aea356dc60665c71dab44abcf41ed35b7a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_man.c,v 1.69 2014/08/10 23:54:41 schwarze Exp $ */
+/*     $Id: mdoc_man.c,v 1.70 2014/08/21 12:57:17 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -1166,7 +1166,8 @@ pre_fl(DECL_ARGS)
 
        font_push('B');
        print_word("\\-");
-       outflags &= ~MMAN_spc;
+       if (n->nchild)
+               outflags &= ~MMAN_spc;
        return(1);
 }
 
@@ -1175,8 +1176,10 @@ post_fl(DECL_ARGS)
 {
 
        font_pop();
-       if (0 == n->nchild && NULL != n->next &&
-                       n->next->line == n->line)
+       if ( ! (n->nchild ||
+           n->next == NULL ||
+           n->next->type == MDOC_TEXT ||
+           n->next->flags & MDOC_LINE))
                outflags &= ~MMAN_spc;
 }
 
index 1f759399060c03fbe7da85a58248f515c26d5062..f10b5c49603c00eddd469bb72bc1572a346e30b2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.279 2014/08/17 16:51:55 schwarze Exp $ */
+/*     $Id: mdoc_term.c,v 1.280 2014/08/21 12:57:17 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -1075,9 +1075,10 @@ termp_fl_pre(DECL_ARGS)
        term_fontpush(p, TERMFONT_BOLD);
        term_word(p, "\\-");
 
-       if (n->child)
-               p->flags |= TERMP_NOSPACE;
-       else if (n->next && n->next->line == n->line)
+       if ( ! (n->nchild == 0 &&
+           (n->next == NULL ||
+            n->next->type == MDOC_TEXT ||
+            n->next->flags & MDOC_LINE)))
                p->flags |= TERMP_NOSPACE;
 
        return(1);