summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-03-03 22:17:19 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-03-03 22:17:19 +0000
commitf64a310e2e71ac67ec7eb30da2ee82c83de8bf44 (patch)
treed4b683bc786ed5c4ff77fa6f7b209ca49e968345
parentc953aa714570186eae41b5407803bc0826f109bf (diff)
downloadmandoc-f64a310e2e71ac67ec7eb30da2ee82c83de8bf44.tar.gz
-inset and -diag lists now supported.
-rw-r--r--mdocterm.14
-rw-r--r--mdocterm.c7
-rw-r--r--term.c78
-rw-r--r--term.h2
4 files changed, 74 insertions, 17 deletions
diff --git a/mdocterm.1 b/mdocterm.1
index 81dd619d..ae2ecf4c 100644
--- a/mdocterm.1
+++ b/mdocterm.1
@@ -247,9 +247,9 @@ utility doesn't yet know how to display the following:
.Pp
.Bl -bullet -compact
.It
-Only \-bullet , \-dash , \-enum , \-hyphen , \-tag and \-ohang
+The \-hang and \-column
.Sq \&Bl
-lists are supported.
+lists are not yet supported.
.It
The \-literal and \-unfilled
.Sq \&Bd
diff --git a/mdocterm.c b/mdocterm.c
index e34ab4f2..0913a1b2 100644
--- a/mdocterm.c
+++ b/mdocterm.c
@@ -227,9 +227,6 @@ main(int argc, char *argv[])
* offset value. This is useful when doing columnar lists where the
* prior column has right-padded.
*
- * - TERMP_LITERAL: don't break apart words. Note that a long literal
- * word will violate the right margin.
- *
* - TERMP_NOBREAK: this is the most important and is used when making
* columns. In short: don't print a newline and instead pad to the
* right margin. Used in conjunction with TERMP_NOLPAD.
@@ -363,10 +360,10 @@ flushln(struct termp *p)
* pad to the right margin and stay off.
*/
- if (p->flags & TERMP_NOBREAK) {
+ if (p->flags & TERMP_NOBREAK)
for ( ; vis < maxvis; vis++)
putchar(' ');
- } else
+ else
putchar('\n');
p->col = 0;
diff --git a/term.c b/term.c
index 3eeb25d6..42febf65 100644
--- a/term.c
+++ b/term.c
@@ -50,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
@@ -78,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,
@@ -415,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;
@@ -452,7 +458,6 @@ termp_it_pre(DECL_ARGS)
width = width > 6 ? width : 6;
break;
case (MDOC_Tag):
- /* FIXME: auto-size. */
if (0 == width)
errx(1, "need non-zero -width");
break;
@@ -462,9 +467,15 @@ termp_it_pre(DECL_ARGS)
/* Word-wrap control. */
- p->flags |= TERMP_NOSPACE;
-
switch (type) {
+ case (MDOC_Diag):
+ 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):
@@ -474,6 +485,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)
@@ -540,19 +552,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;
+ }
}
diff --git a/term.h b/term.h
index 10623b92..e823d42d 100644
--- a/term.h
+++ b/term.h
@@ -93,6 +93,8 @@ struct termp {
#define TERMP_LITERAL (1 << 5) /* Literal words. */
#define TERMP_IGNDELIM (1 << 6) /* Delims like regulars. */
#define TERMP_NONOSPACE (1 << 7) /* No space (no autounset). */
+#define TERMP_NORPAD (1 << 8) /* No rightpad. */
+#define TERMP_NOINSET (1 << 9) /* If NOBREAK, no inset. */
char *buf;
struct termsym *symtab; /* Special-symbol table. */
struct termsym *styletab; /* Style table. */