]> git.cameronkatri.com Git - mandoc.git/commitdiff
Clarify -man -T[x]html handling of `br' within `B'.
authorKristaps Dzonsons <kristaps@bsd.lv>
Mon, 22 Mar 2010 14:03:03 +0000 (14:03 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Mon, 22 Mar 2010 14:03:03 +0000 (14:03 +0000)
Consolidated node unlinking in -man.
Conclude nested next-line scope issues noted by Ingo Schwarze.

libman.h
man.c
man_action.c
man_html.c
mandoc.1

index ad33e44fe4fe020f3788614fa7e0c6f4a857c036..28dc5ffa699087e5f627f87449ef9ddd1a2e7ee6 100644 (file)
--- a/libman.h
+++ b/libman.h
@@ -1,4 +1,4 @@
-/*     $Id: libman.h,v 1.24 2010/03/22 05:59:32 kristaps Exp $ */
+/*     $Id: libman.h,v 1.25 2010/03/22 14:03:03 kristaps Exp $ */
 /*
  * Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -45,6 +45,7 @@ enum  merr {
        WMSEC,
        WDATE,
        WLNSCOPE,
+       WLNSCOPE2,
        WTSPACE,
        WTQUOTE,
        WNODATA,
@@ -94,6 +95,7 @@ int             man_body_alloc(struct man *, int, int, int);
 int              man_elem_alloc(struct man *, int, int, int);
 void             man_node_free(struct man_node *);
 void             man_node_freelist(struct man_node *);
+void             man_node_unlink(struct man *, struct man_node *);
 void             man_hash_init(void);
 int              man_hash_find(const char *);
 int              man_macroend(struct man *);
diff --git a/man.c b/man.c
index d823a5d14d4593dd4578bc685aaca8a91d672b40..2aee2cb5e94b5f0a86be47c940137708358a770f 100644 (file)
--- a/man.c
+++ b/man.c
@@ -1,4 +1,4 @@
-/*     $Id: man.c,v 1.50 2010/03/22 05:59:32 kristaps Exp $ */
+/*     $Id: man.c,v 1.51 2010/03/22 14:03:03 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -35,6 +35,7 @@ const char *const __man_merrnames[WERRMAX] = {
        "invalid manual section", /* WMSEC */
        "invalid date format", /* WDATE */
        "scope of prior line violated", /* WLNSCOPE */
+       "over-zealous prior line scope violation", /* WLNSCOPE2 */
        "trailing whitespace", /* WTSPACE */
        "unterminated quoted parameter", /* WTQUOTE */
        "document has no body", /* WNODATA */
@@ -535,41 +536,37 @@ man_pmacro(struct man *m, int ln, char *buf)
                        goto err;
 
        /* 
-        * Remove prior ELINE macro, as a macro is clobbering it by
-        * being invoked without prior text.  Note that NSCOPED macros
-        * do not close out ELINE macros, as they print no text.
+        * Remove prior ELINE macro, as it's being clobbering by a new
+        * macro.  Note that NSCOPED macros do not close out ELINE
+        * macros---they don't print text---so we let those slip by.
         */
 
-       if (m->flags & MAN_ELINE && 
-                       ! (MAN_NSCOPED & man_macros[c].flags)) {
+       if ( ! (MAN_NSCOPED & man_macros[c].flags) &&
+                       m->flags & MAN_ELINE) {
+               assert(MAN_TEXT != m->last->type);
+
+               /*
+                * This occurs in the following construction:
+                *   .B
+                *   .br
+                *   .B
+                *   .br
+                *   I hate man macros.
+                * Flat-out disallow this madness.
+                */
+               if (MAN_NSCOPED & man_macros[m->last->tok].flags)
+                       return(man_perr(m, ln, ppos, WLNSCOPE));
+
                n = m->last;
+
+               assert(n);
                assert(NULL == n->child);
                assert(0 == n->nchild);
+
                if ( ! man_nwarn(m, n, WLNSCOPE))
                        return(0);
 
-               /* FIXME: when called as in:
-                *
-                * .B
-                * .br
-                * .B
-                * .br
-                * hello
-                */
-
-               if (n->prev) {
-                       assert(n != n->parent->child);
-                       assert(n == n->prev->next);
-                       n->prev->next = NULL;
-                       m->last = n->prev;
-                       m->next = MAN_NEXT_SIBLING;
-               } else {
-                       assert(n == n->parent->child);
-                       n->parent->child = NULL;
-                       m->last = n->parent;
-                       m->next = MAN_NEXT_CHILD;
-               }
-
+               man_node_unlink(m, n);
                man_node_free(n);
                m->flags &= ~MAN_ELINE;
        }
@@ -671,3 +668,28 @@ man_err(struct man *m, int line, int pos, int iserr, enum merr type)
 
        return(man_vwarn(m, line, pos, p));
 }
+
+
+void
+man_node_unlink(struct man *m, struct man_node *n)
+{
+
+       if (n->prev) {
+               n->prev->next = n->next;
+               if (m->last == n) {
+                       assert(NULL == n->next);
+                       m->last = n->prev;
+                       m->next = MAN_NEXT_SIBLING;
+               }
+       } else {
+               n->parent->child = n->next;
+               if (m->last == n) {
+                       assert(NULL == n->next);
+                       m->last = n->parent;
+                       m->next = MAN_NEXT_CHILD;
+               }
+       }
+
+       if (n->next)
+               n->next->prev = n->prev;
+}
index 2b8eba9fc557a21a4759378c952d73f796e59c8c..d481f103bbfb1270550dbe401c5450dc732cb6c4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_action.c,v 1.25 2010/01/01 17:14:27 kristaps Exp $ */
+/*     $Id: man_action.c,v 1.26 2010/03/22 14:03:03 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -178,24 +178,8 @@ post_TH(struct man *m)
        if (n && (n = n->next))
                m->meta.vol = mandoc_strdup(n->string);
 
-       /* 
-        * The end document shouldn't have the prologue macros as part
-        * of the syntax tree (they encompass only meta-data).  
-        */
-
-       if (m->last->parent->child == m->last) {
-               m->last->parent->child = NULL;
-               n = m->last;
-               m->last = m->last->parent;
-               m->next = MAN_NEXT_CHILD;
-       } else {
-               assert(m->last->prev);
-               m->last->prev->next = NULL;
-               n = m->last;
-               m->last = m->last->prev;
-               m->next = MAN_NEXT_SIBLING;
-       }
-
+       n = m->last;
+       man_node_unlink(m, n);
        man_node_freelist(n);
        return(1);
 }
index b5e69343d4179128502fd5d8fda33b6930f6bcce..495a5fca6cf0d0e36320dd5dc15acf976c14cebf 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_html.c,v 1.27 2010/03/22 05:59:32 kristaps Exp $ */
+/*     $Id: man_html.c,v 1.28 2010/03/22 14:03:03 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -181,6 +181,12 @@ print_man_node(MAN_ARGS)
 
        bufinit(h);
 
+       /*
+        * FIXME: embedded elements within next-line scopes (e.g., `br'
+        * within an empty `B') will cause formatting to be forgotten
+        * due to scope closing out.
+        */
+
        switch (n->type) {
        case (MAN_ROOT):
                child = man_root_pre(m, n, h);
@@ -567,6 +573,8 @@ man_IP_pre(MAN_ARGS)
        SCALE_HS_INIT(&su, INDENT);
        width = 0;
 
+       /* Width is the last token. */
+
        if (MAN_IP == n->tok && NULL != nn)
                if (NULL != (nn = nn->next)) {
                        for ( ; nn->next; nn = nn->next)
@@ -574,11 +582,14 @@ man_IP_pre(MAN_ARGS)
                        width = a2width(nn, &su);
                }
 
+       /* Width is the first token. */
+
        if (MAN_TP == n->tok && NULL != nn) {
+               /* Skip past non-text children. */
                while (nn && MAN_TEXT != nn->type)
                        nn = nn->next;
-               /* FIXME: sync with pre_TP(), man_term.c */
-               width = a2width(nn, &su);
+               if (nn)
+                       width = a2width(nn, &su);
        }
 
        if (MAN_BLOCK == n->type) {
@@ -604,12 +615,19 @@ man_IP_pre(MAN_ARGS)
        PAIR_STYLE_INIT(&tag, h);
        print_otag(h, TAG_DIV, 1, &tag);
 
-       /* With a length string, manually omit the last child. */
+       /*
+        * Without a length string, we can print all of our children.
+        */
 
        if ( ! width)
                return(1);
 
-       /* FIXME: sync with pre_TP(), man_term.c */
+       /*
+        * When a length has been specified, we need to carefully print
+        * our child context:  IP gets all children printed but the last
+        * (the width), while TP gets all children printed but the first
+        * (the width).
+        */
 
        if (MAN_IP == n->tok)
                for (nn = n->child; nn->next; nn = nn->next)
index 64152e8b68d1794b10667ca9293ac249b375cf72..5ab241261fb6c912563e6b90cbfd735e5dc7c1dd 100644 (file)
--- a/mandoc.1
+++ b/mandoc.1
@@ -1,4 +1,4 @@
-.\"    $Id: mandoc.1,v 1.50 2010/01/29 14:39:38 kristaps Exp $
+.\"    $Id: mandoc.1,v 1.51 2010/03/22 14:03:03 kristaps Exp $
 .\"
 .\" Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
 .\"
@@ -14,7 +14,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: January 29 2010 $
+.Dd $Mdocdate: March 22 2010 $
 .Dt MANDOC 1
 .Os
 .
@@ -502,8 +502,8 @@ and
 .Fl T Ns Ar xhtml
 CSS2 styling used for
 .Fl m Ns Ar doc
-input lists does not render properly in brain-dead browsers, such as
-Internet Explorer 6 and earlier.
+input lists does not render properly in older browsers, such as Internet
+Explorer 6 and earlier.
 .Pp
 In
 .Fl T Ns Ar html
@@ -525,3 +525,15 @@ font size escape documented in
 .Xr mdoc 7
 and
 .Xr man 7 .
+.Pp
+Nesting elements within next-line element scopes of
+.Fl m Ar Ns an ,
+such as
+.Sq br
+within an empty
+.Sq B ,
+will confuse
+.Fl T Ns Ar html
+and
+.Fl T Ns Ar xhtml
+and cause it to forget the formatting.