=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.32 retrieving revision 1.38 diff -u -p -r1.32 -r1.38 --- mandoc/term.c 2009/03/01 23:14:15 1.32 +++ mandoc/term.c 2009/03/03 22:28:21 1.38 @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.32 2009/03/01 23:14:15 kristaps Exp $ */ +/* $Id: term.c,v 1.38 2009/03/03 22:28:21 kristaps Exp $ */ /* * Copyright (c) 2009 Kristaps Dzonsons * @@ -25,14 +25,11 @@ #include "term.h" -#define INDENT 6 - /* * Performs actions on nodes of the abstract syntax tree. Both pre- and * post-fix operations are defined here. */ -/* FIXME: indent/tab. */ /* FIXME: macro arguments can be escaped. */ #define TTYPE_PROG 0 @@ -53,7 +50,8 @@ #define TTYPE_INCLUDE 15 #define TTYPE_SYMB 16 #define TTYPE_SYMBOL 17 -#define TTYPE_NMAX 18 +#define TTYPE_DIAG 18 +#define TTYPE_NMAX 19 /* * These define "styles" for element types, like command arguments or @@ -61,6 +59,8 @@ * the same thing (like .Ex -std cmd and .Nm cmd). */ +/* TODO: abstract this into mdocterm.c. */ + const int ttypes[TTYPE_NMAX] = { TERMP_BOLD, /* TTYPE_PROG */ TERMP_BOLD, /* TTYPE_CMD_FLAG */ @@ -79,7 +79,8 @@ const int ttypes[TTYPE_NMAX] = { TERMP_BOLD, /* TTYPE_CMD */ TERMP_BOLD, /* TTYPE_INCLUDE */ TERMP_BOLD, /* TTYPE_SYMB */ - TERMP_BOLD /* TTYPE_SYMBOL */ + TERMP_BOLD, /* TTYPE_SYMBOL */ + TERMP_BOLD /* TTYPE_DIAG */ }; static int arg_hasattr(int, size_t, @@ -416,6 +417,10 @@ termp_it_pre(DECL_ARGS) /* FALLTHROUGH */ case (MDOC_Tag): /* FALLTHROUGH */ + case (MDOC_Inset): + /* FALLTHROUGH */ + case (MDOC_Diag): + /* FALLTHROUGH */ case (MDOC_Ohang): type = bl->argv[i].arg; i = (int)bl->argc; @@ -450,10 +455,9 @@ termp_it_pre(DECL_ARGS) case (MDOC_Enum): /* FALLTHROUGH */ case (MDOC_Hyphen): - width = width > 6 ? width : 6; + width = width > 4 ? width : 4; break; case (MDOC_Tag): - /* FIXME: auto-size. */ if (0 == width) errx(1, "need non-zero -width"); break; @@ -463,9 +467,16 @@ termp_it_pre(DECL_ARGS) /* Word-wrap control. */ - p->flags |= TERMP_NOSPACE; - switch (type) { + case (MDOC_Diag): + /* XXX - ignore child macros!? */ + if (MDOC_HEAD == node->type) + TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_DIAG]); + /* FALLTHROUGH */ + case (MDOC_Inset): + if (MDOC_HEAD == node->type) + p->flags |= TERMP_NOSPACE; + break; case (MDOC_Bullet): /* FALLTHROUGH */ case (MDOC_Dash): @@ -475,6 +486,7 @@ termp_it_pre(DECL_ARGS) case (MDOC_Hyphen): /* FALLTHROUGH */ case (MDOC_Tag): + p->flags |= TERMP_NOSPACE; if (MDOC_HEAD == node->type) p->flags |= TERMP_NOBREAK; else if (MDOC_BODY == node->type) @@ -541,19 +553,65 @@ termp_it_pre(DECL_ARGS) static void termp_it_post(DECL_ARGS) { + int type, i; + struct mdoc_block *bl; if (MDOC_BODY != node->type && MDOC_HEAD != node->type) return; - flushln(p); + assert(MDOC_BLOCK == node->parent->parent->parent->type); + assert(MDOC_Bl == node->parent->parent->parent->tok); + bl = &node->parent->parent->parent->data.block; + for (type = -1, i = 0; i < (int)bl->argc; i++) + switch (bl->argv[i].arg) { + case (MDOC_Bullet): + /* FALLTHROUGH */ + case (MDOC_Dash): + /* FALLTHROUGH */ + case (MDOC_Enum): + /* FALLTHROUGH */ + case (MDOC_Hyphen): + /* FALLTHROUGH */ + case (MDOC_Tag): + /* FALLTHROUGH */ + case (MDOC_Diag): + /* FALLTHROUGH */ + case (MDOC_Inset): + /* FALLTHROUGH */ + case (MDOC_Ohang): + type = bl->argv[i].arg; + i = (int)bl->argc; + break; + default: + errx(1, "list type not supported"); + /* NOTREACHED */ + } + + + switch (type) { + case (MDOC_Diag): + /* FALLTHROUGH */ + case (MDOC_Inset): + break; + default: + flushln(p); + break; + } + p->offset = pair->offset; p->rmargin = pair->rmargin; - if (MDOC_HEAD == node->type) - p->flags &= ~TERMP_NOBREAK; - else if (MDOC_BODY == node->type) - p->flags &= ~TERMP_NOLPAD; + switch (type) { + case (MDOC_Inset): + break; + default: + if (MDOC_HEAD == node->type) + p->flags &= ~TERMP_NOBREAK; + else if (MDOC_BODY == node->type) + p->flags &= ~TERMP_NOLPAD; + break; + } } @@ -934,6 +992,9 @@ static int termp_ft_pre(DECL_ARGS) { + if (SEC_SYNOPSIS == node->sec) + if (node->prev && MDOC_Fo == node->prev->tok) + vspace(p); TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_FUNC_TYPE]); return(1); } @@ -944,7 +1005,7 @@ static void termp_ft_post(DECL_ARGS) { - if (node->sec == SEC_SYNOPSIS) + if (SEC_SYNOPSIS == node->sec) newln(p); } @@ -1050,8 +1111,8 @@ static int termp_bd_pre(DECL_ARGS) { const struct mdoc_block *bl; - const struct mdoc_node *n; - int i; + const struct mdoc_node *n; + int i, type; if (MDOC_BLOCK == node->type) { if (node->prev) @@ -1060,31 +1121,55 @@ termp_bd_pre(DECL_ARGS) } else if (MDOC_BODY != node->type) return(1); - assert(MDOC_BLOCK == node->parent->type); pair->offset = p->offset; - bl = &node->parent->data.block; + for (type = -1, i = 0; i < (int)bl->argc; i++) { + switch (bl->argv[i].arg) { + case (MDOC_Ragged): + /* FALLTHROUGH */ + case (MDOC_Filled): + /* FALLTHROUGH */ + case (MDOC_Unfilled): + /* FALLTHROUGH */ + case (MDOC_Literal): + type = bl->argv[i].arg; + i = (int)bl->argc; + break; + default: + errx(1, "display type not supported"); + } + } + + assert(-1 != type); + i = arg_getattr(MDOC_Offset, bl->argc, bl->argv); if (-1 != i) { assert(1 == bl->argv[i].sz); p->offset += arg_offset(&bl->argv[i]); } + + switch (type) { + case (MDOC_Literal): + /* FALLTHROUGH */ + case (MDOC_Unfilled): + break; + default: + return(1); + } + p->flags |= TERMP_LITERAL; for (n = node->child; n; n = n->next) { - if (MDOC_TEXT != n->type) - errx(1, "non-text displays unsupported"); - if ((*n->data.text.string)) { - word(p, n->data.text.string); - flushln(p); - } else - vspace(p); - + if (MDOC_TEXT != n->type) { + warnx("non-text children not yet allowed"); + continue; + } + word(p, n->data.text.string); + flushln(p); } - p->flags &= ~TERMP_LITERAL; return(0); } @@ -1096,7 +1181,11 @@ termp_bd_post(DECL_ARGS) if (MDOC_BODY != node->type) return; - newln(p); + + if ( ! (p->flags & TERMP_LITERAL)) + flushln(p); + + p->flags &= ~TERMP_LITERAL; p->offset = pair->offset; } @@ -1141,7 +1230,8 @@ static void termp_bx_post(DECL_ARGS) { - p->flags |= TERMP_NOSPACE; + if (node->child) + p->flags |= TERMP_NOSPACE; word(p, "BSD"); } @@ -1292,6 +1382,7 @@ termp_cd_pre(DECL_ARGS) { TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_CONFIG]); + newln(p); return(1); }