=================================================================== RCS file: /cvs/mandoc/mdoc_term.c,v retrieving revision 1.178 retrieving revision 1.185 diff -u -p -r1.178 -r1.185 --- mandoc/mdoc_term.c 2010/07/26 22:35:59 1.178 +++ mandoc/mdoc_term.c 2010/09/23 20:40:00 1.185 @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.178 2010/07/26 22:35:59 kristaps Exp $ */ +/* $Id: mdoc_term.c,v 1.185 2010/09/23 20:40:00 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * Copyright (c) 2010 Ingo Schwarze @@ -92,6 +92,7 @@ static void termp_sh_post(DECL_ARGS); static void termp_sq_post(DECL_ARGS); static void termp_ss_post(DECL_ARGS); +static int termp__a_pre(DECL_ARGS); static int termp_an_pre(DECL_ARGS); static int termp_ap_pre(DECL_ARGS); static int termp_aq_pre(DECL_ARGS); @@ -178,7 +179,7 @@ static const struct termact termacts[MDOC_MAX] = { { termp_under_pre, NULL }, /* Va */ { termp_vt_pre, NULL }, /* Vt */ { termp_xr_pre, NULL }, /* Xr */ - { NULL, termp____post }, /* %A */ + { termp__a_pre, termp____post }, /* %A */ { termp_under_pre, termp____post }, /* %B */ { NULL, termp____post }, /* %D */ { termp_under_pre, termp____post }, /* %I */ @@ -1030,12 +1031,18 @@ termp_nm_pre(DECL_ARGS) synopsis_pre(p, n->parent); if (MDOC_HEAD == n->type && n->next->child) { - p->flags |= TERMP_NOSPACE | TERMP_NOBREAK | TERMP_HANG; - p->rmargin = p->offset + term_len(p, 1) + - (NULL == n->child ? term_strlen(p, m->name) : - MDOC_TEXT == n->child->type ? - term_strlen(p, n->child->string) : - term_len(p, 5)); + p->flags |= TERMP_NOSPACE | TERMP_NOBREAK; + p->rmargin = p->offset + term_len(p, 1); + if (NULL == n->child) { + p->rmargin += term_strlen(p, m->name); + } else if (MDOC_TEXT == n->child->type) { + p->rmargin += term_strlen(p, n->child->string); + if (n->child->next) + p->flags |= TERMP_HANG; + } else { + p->rmargin += term_len(p, 5); + p->flags |= TERMP_HANG; + } } term_fontpush(p, TERMFONT_BOLD); @@ -1079,6 +1086,19 @@ termp_fl_pre(DECL_ARGS) /* ARGSUSED */ static int +termp__a_pre(DECL_ARGS) +{ + + if (n->prev && MDOC__A == n->prev->tok) + if (NULL == n->next || MDOC__A != n->next->tok) + term_word(p, "and"); + + return(1); +} + + +/* ARGSUSED */ +static int termp_an_pre(DECL_ARGS) { @@ -1621,8 +1641,7 @@ termp_fa_pre(DECL_ARGS) static int termp_bd_pre(DECL_ARGS) { - size_t tabwidth; - size_t rm, rmax; + size_t tabwidth, rm, rmax; const struct mdoc_node *nn; if (MDOC_BLOCK == n->type) { @@ -1654,12 +1673,11 @@ termp_bd_pre(DECL_ARGS) p->rmargin = p->maxrmargin = TERM_MAXMARGIN; for (nn = n->child; nn; nn = nn->next) { - p->flags |= TERMP_NOSPACE; print_mdoc_node(p, pair, m, nn); - if (NULL == nn->prev || - nn->prev->line < nn->line || - NULL == nn->next) - term_flushln(p); + if (nn->next && nn->next->line == nn->line) + continue; + term_flushln(p); + p->flags |= TERMP_NOSPACE; } p->tabwidth = tabwidth; @@ -2100,6 +2118,16 @@ static void termp____post(DECL_ARGS) { + /* + * Handle lists of authors. In general, print each followed by + * a comma. Don't print the comma if there are only two + * authors. + */ + if (MDOC__A == n->tok && n->next && MDOC__A == n->next->tok) + if (NULL == n->next->next || MDOC__A != n->next->next->tok) + if (NULL == n->prev || MDOC__A != n->prev->tok) + return; + /* TODO: %U. */ p->flags |= TERMP_NOSPACE; @@ -2121,23 +2149,25 @@ termp_li_pre(DECL_ARGS) static int termp_lk_pre(DECL_ARGS) { - const struct mdoc_node *nn; + const struct mdoc_node *nn, *sv; term_fontpush(p, TERMFONT_UNDER); - nn = n->child; + nn = sv = n->child; + if (NULL == nn->next) return(1); - term_word(p, nn->string); + for (nn = nn->next; nn; nn = nn->next) + term_word(p, nn->string); + term_fontpop(p); p->flags |= TERMP_NOSPACE; term_word(p, ":"); term_fontpush(p, TERMFONT_BOLD); - for (nn = nn->next; nn; nn = nn->next) - term_word(p, nn->string); + term_word(p, sv->string); term_fontpop(p); return(0);