-/* $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>
*
#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
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);
{ 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 */
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) {
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));
}
* --> 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));
}
/* 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);
}
+/*
+ * 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.
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));
}