* mdocml: If the tag in .Bl -tag .It would leave exactly one blank before
@ 2012-07-13 20:43 schwarze
0 siblings, 0 replies; only message in thread
From: schwarze @ 2012-07-13 20:43 UTC (permalink / raw)
To: source
Log Message:
-----------
If the tag in .Bl -tag .It would leave exactly one blank before the
body of the item, mdoc(7) breaks the line, whereas the .TP used to
translate this to man(7) does not. Thus, insert an explicit roff(7)
line break in this place.
To be able to correctly count the characters, do not pass font escapes
an the like through print_word().
OpenBSD rev. 1.35
Modified Files:
--------------
mdocml:
mdoc_man.c
Revision Data
-------------
Index: mdoc_man.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_man.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -Lmdoc_man.c -Lmdoc_man.c -u -p -r1.36 -r1.37
--- mdoc_man.c
+++ mdoc_man.c
@@ -254,6 +254,8 @@ static int outflags;
#define MMAN_An_split (1 << 8) /* author mode is "split" */
#define MMAN_An_nosplit (1 << 9) /* author mode is "nosplit" */
+static int TPremain; /* characters before tag is full */
+
static struct {
char *head;
char *tail;
@@ -270,7 +272,8 @@ font_push(char newfont)
fontqueue.size);
}
*fontqueue.tail = newfont;
- print_word("\\f");
+ print_word("");
+ printf("\\f");
putchar(newfont);
outflags &= ~MMAN_spc;
}
@@ -282,7 +285,8 @@ font_pop(void)
if (fontqueue.tail > fontqueue.head)
fontqueue.tail--;
outflags &= ~MMAN_spc;
- print_word("\\f");
+ print_word("");
+ printf("\\f");
putchar(*fontqueue.tail);
}
@@ -305,28 +309,34 @@ print_word(const char *s)
else if (MMAN_nl & outflags)
putchar('\n');
outflags &= ~(MMAN_PP|MMAN_sp|MMAN_br|MMAN_nl|MMAN_spc);
- } else if (MMAN_spc & outflags && '\0' != s[0])
+ if (1 == TPremain)
+ printf(".br\n");
+ TPremain = 0;
+ } else if (MMAN_spc & outflags) {
/*
* If we need a space, only print it if
* (1) it is forced by `No' or
* (2) what follows is not terminating punctuation or
* (3) what follows is longer than one character.
*/
- if (MMAN_spc_force & outflags ||
+ if (MMAN_spc_force & outflags || '\0' == s[0] ||
NULL == strchr(".,:;)]?!", s[0]) || '\0' != s[1]) {
if (MMAN_Bk & outflags) {
putchar('\\');
putchar('~');
} else
putchar(' ');
+ if (TPremain)
+ TPremain--;
}
+ }
/*
* Reassign needing space if we're not following opening
* punctuation.
*/
- if (MMAN_Sm & outflags &&
- (('(' != s[0] && '[' != s[0]) || '\0' != s[1]))
+ if (MMAN_Sm & outflags && ('\0' == s[0] ||
+ (('(' != s[0] && '[' != s[0]) || '\0' != s[1])))
outflags |= MMAN_spc;
else
outflags &= ~MMAN_spc;
@@ -344,6 +354,8 @@ print_word(const char *s)
putchar((unsigned char)*s);
break;
}
+ if (TPremain)
+ TPremain--;
}
}
@@ -400,33 +412,38 @@ print_width(const char *v, const struct
char buf[24];
struct roffsu su;
size_t sz, chsz;
+ int numeric, remain;
- /* XXX Rough estimation, might have multiple parts. */
- chsz = (NULL != child && MDOC_TEXT == child->type) ?
- strlen(child->string) : 0;
-
+ numeric = 1;
+ remain = 0;
if (NULL == v)
sz = defsz;
else if (a2roffsu(v, &su, SCALE_MAX)) {
if (SCALE_EN == su.unit)
sz = su.scale;
else {
- if (chsz)
- print_block(".HP", 0);
- else
- print_block(".TP", 0);
- print_word(v);
- return;
+ sz = 0;
+ numeric = 0;
}
} else
sz = strlen(v);
- if (chsz > sz)
+ /* XXX Rough estimation, might have multiple parts. */
+ chsz = (NULL != child && MDOC_TEXT == child->type) ?
+ strlen(child->string) : 0;
+
+ if (defsz && chsz > sz)
print_block(".HP", 0);
- else
+ else {
print_block(".TP", 0);
- snprintf(buf, sizeof(buf), "%ldn", sz + 2);
- print_word(buf);
+ remain = sz + 2;
+ }
+ if (numeric) {
+ snprintf(buf, sizeof(buf), "%ldn", sz + 2);
+ print_word(buf);
+ } else
+ print_word(v);
+ TPremain = remain;
}
void
@@ -499,7 +516,8 @@ print_node(DECL_ARGS)
*/
if (MMAN_nl & outflags && ('.' == *n->string ||
'\'' == *n->string)) {
- print_word("\\&");
+ print_word("");
+ printf("\\&");
outflags &= ~MMAN_spc;
}
print_word(n->string);
@@ -599,7 +617,8 @@ pre__t(DECL_ARGS)
if (n->parent && MDOC_Rs == n->parent->tok &&
n->parent->norm->Rs.quote_T) {
- print_word("\"");
+ print_word("");
+ putchar('\"');
outflags &= ~MMAN_spc;
} else
font_push('I');
@@ -613,7 +632,8 @@ post__t(DECL_ARGS)
if (n->parent && MDOC_Rs == n->parent->tok &&
n->parent->norm->Rs.quote_T) {
outflags &= ~MMAN_spc;
- print_word("\"");
+ print_word("");
+ putchar('\"');
} else
font_pop();
post_percent(m, n);
@@ -630,7 +650,8 @@ pre_sect(DECL_ARGS)
return(1);
outflags |= MMAN_sp;
print_block(manacts[n->tok].prefix, 0);
- print_word("\"");
+ print_word("");
+ putchar('\"');
outflags &= ~MMAN_spc;
return(1);
}
@@ -645,7 +666,8 @@ post_sect(DECL_ARGS)
if (MDOC_HEAD != n->type)
return;
outflags &= ~MMAN_spc;
- print_word("\"");
+ print_word("");
+ putchar('\"');
outflags |= MMAN_nl;
if (MDOC_Sh == n->tok && SEC_AUTHORS == n->sec)
outflags &= ~(MMAN_An_split | MMAN_An_nosplit);
@@ -1117,6 +1139,7 @@ pre_it(DECL_ARGS)
/* FALLTHROUGH */
case (LIST_hyphen):
print_width(bln->norm->Bl.width, NULL, 0);
+ TPremain = 0;
outflags |= MMAN_nl;
font_push('B');
if (LIST_bullet == bln->norm->Bl.type)
@@ -1127,15 +1150,19 @@ pre_it(DECL_ARGS)
break;
case (LIST_enum):
print_width(bln->norm->Bl.width, NULL, 0);
+ TPremain = 0;
outflags |= MMAN_nl;
print_count(&bln->norm->Bl.count);
break;
case (LIST_hang):
print_width(bln->norm->Bl.width, n->child, 6);
+ TPremain = 0;
break;
case (LIST_tag):
- print_width(bln->norm->Bl.width, NULL, 8);
- break;
+ print_width(bln->norm->Bl.width, n->child, 0);
+ putchar('\n');
+ outflags &= ~MMAN_spc;
+ return(1);
default:
return(1);
}
--
To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-07-13 20:43 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-13 20:43 mdocml: If the tag in .Bl -tag .It would leave exactly one blank before schwarze
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).