]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_action.c
Made `Dt' default to LOCAL and UNKNOWN instead of local and unknown (note case).
[mandoc.git] / mdoc_action.c
index 0789283f4c141b408d4ab45c07072382749cc1ac..ff1400a3cef5117e7bc8b62b843943b50d29fa6b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_action.c,v 1.59 2010/05/17 22:11:42 kristaps Exp $ */
+/*     $Id: mdoc_action.c,v 1.63 2010/05/30 11:00:53 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -33,7 +33,7 @@
 #include "libmandoc.h"
 
 #define        POST_ARGS struct mdoc *m, struct mdoc_node *n
-#define        PRE_ARGS  struct mdoc *m, const struct mdoc_node *n
+#define        PRE_ARGS  struct mdoc *m, struct mdoc_node *n
 
 #define        NUMSIZ    32
 #define        DATESIZ   32
@@ -57,6 +57,7 @@ static        int       post_dd(POST_ARGS);
 static int       post_display(POST_ARGS);
 static int       post_dt(POST_ARGS);
 static int       post_lb(POST_ARGS);
+static int       post_li(POST_ARGS);
 static int       post_nm(POST_ARGS);
 static int       post_os(POST_ARGS);
 static int       post_pa(POST_ARGS);
@@ -102,7 +103,7 @@ static      const struct actions mdoc_actions[MDOC_MAX] = {
        { NULL, NULL }, /* Ft */ 
        { NULL, NULL }, /* Ic */ 
        { NULL, NULL }, /* In */ 
-       { NULL, NULL }, /* Li */
+       { NULL, post_li }, /* Li */
        { NULL, NULL }, /* Nd */ 
        { NULL, post_nm }, /* Nm */ 
        { NULL, NULL }, /* Op */
@@ -216,7 +217,7 @@ static      const enum mdoct rsord[RSORD_MAX] = {
 
 
 int
-mdoc_action_pre(struct mdoc *m, const struct mdoc_node *n)
+mdoc_action_pre(struct mdoc *m, struct mdoc_node *n)
 {
 
        switch (n->type) {
@@ -498,8 +499,8 @@ post_dt(POST_ARGS)
        if (NULL == (nn = n->child)) {
                /* XXX: make these macro values. */
                /* FIXME: warn about missing values. */
-               m->meta.title = mandoc_strdup("unknown");
-               m->meta.vol = mandoc_strdup("local");
+               m->meta.title = mandoc_strdup("UNKNOWN");
+               m->meta.vol = mandoc_strdup("LOCAL");
                m->meta.msec = mandoc_strdup("1");
                return(post_prol(m, n));
        }
@@ -508,12 +509,13 @@ post_dt(POST_ARGS)
         *   --> title = TITLE, volume = local, msec = 0, arch = NULL
         */
 
-       m->meta.title = mandoc_strdup(nn->string);
+       m->meta.title = mandoc_strdup
+               ('\0' == nn->string[0] ? "UNKNOWN" : nn->string);
 
        if (NULL == (nn = nn->next)) {
                /* FIXME: warn about missing msec. */
                /* XXX: make this a macro value. */
-               m->meta.vol = mandoc_strdup("local");
+               m->meta.vol = mandoc_strdup("LOCAL");
                m->meta.msec = mandoc_strdup("1");
                return(post_prol(m, n));
        }
@@ -637,11 +639,14 @@ post_bl_tagwidth(POST_ARGS)
        /* Defaults to ten ens. */
 
        sz = 10; /* XXX: make this a macro value. */
-       nn = n->body->child;
+
+       for (nn = n->body->child; nn; nn = nn->next) {
+               if (MDOC_It == nn->tok)
+                       break;
+       }
 
        if (nn) {
                assert(MDOC_BLOCK == nn->type);
-               assert(MDOC_It == nn->tok);
                nn = nn->head->child;
                if (MDOC_TEXT != nn->type) {
                        sz = mdoc_macro2len(nn->tok);
@@ -833,6 +838,27 @@ post_pa(POST_ARGS)
 }
 
 
+/*
+ * Empty `Li' macros get an empty string to make front-ends add an extra
+ * space.
+ */
+static int
+post_li(POST_ARGS)
+{
+       struct mdoc_node *np;
+
+       if (n->child)
+               return(1);
+       
+       np = n;
+       m->next = MDOC_NEXT_CHILD;
+       if ( ! mdoc_word_alloc(m, n->line, n->pos, ""))
+               return(0);
+       m->last = np;
+       return(1);
+}
+
+
 /*
  * The `Ar' macro defaults to two strings "file ..." if no value is
  * provided as an argument.
@@ -942,8 +968,63 @@ pre_offset(PRE_ARGS)
 static int
 pre_bl(PRE_ARGS)
 {
+       int              pos;
+
+       if (MDOC_BLOCK != n->type) {
+               assert(n->parent);
+               assert(MDOC_BLOCK == n->parent->type);
+               assert(MDOC_Bl == n->parent->tok);
+               assert(LIST__NONE != n->parent->data.list);
+               n->data.list = n->parent->data.list;
+               return(1);
+       }
+
+       assert(LIST__NONE == n->data.list);
+
+       for (pos = 0; pos < (int)n->args->argc; pos++) {
+               switch (n->args->argv[pos].arg) {
+               case (MDOC_Bullet):
+                       n->data.list = LIST_bullet;
+                       break;
+               case (MDOC_Dash):
+                       n->data.list = LIST_dash;
+                       break;
+               case (MDOC_Enum):
+                       n->data.list = LIST_enum;
+                       break;
+               case (MDOC_Hyphen):
+                       n->data.list = LIST_hyphen;
+                       break;
+               case (MDOC_Item):
+                       n->data.list = LIST_item;
+                       break;
+               case (MDOC_Tag):
+                       n->data.list = LIST_tag;
+                       break;
+               case (MDOC_Diag):
+                       n->data.list = LIST_diag;
+                       break;
+               case (MDOC_Hang):
+                       n->data.list = LIST_hang;
+                       break;
+               case (MDOC_Ohang):
+                       n->data.list = LIST_ohang;
+                       break;
+               case (MDOC_Inset):
+                       n->data.list = LIST_inset;
+                       break;
+               case (MDOC_Column):
+                       n->data.list = LIST_column;
+                       break;
+               default:
+                       break;
+               }
+               if (LIST__NONE != n->data.list)
+                       break;
+       }
 
-       return(MDOC_BLOCK == n->type ? pre_offset(m, n) : 1);
+       assert(LIST__NONE != n->data.list);
+       return(pre_offset(m, n));
 }