From: schwarze@mdocml.bsd.lv
To: source@mdocml.bsd.lv
Subject: mdocml: In -man -Tascii, support .sp with negative argument.
Date: Fri, 13 Jul 2012 10:19:49 -0400 (EDT) [thread overview]
Message-ID: <201207131419.q6DEJn8t006998@krisdoz.my.domain> (raw)
Log Message:
-----------
In -man -Tascii, support .sp with negative argument.
In -mdoc -Tman, improve the framework to control vertical spacing.
Use both to support .Bl -compact (surprisingly hard to get right).
OpenBSD rev. 1.85 and 1.34, respectively.
Modified Files:
--------------
mdocml:
man_term.c
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.35
retrieving revision 1.36
diff -Lmdoc_man.c -Lmdoc_man.c -u -p -r1.35 -r1.36
--- mdoc_man.c
+++ mdoc_man.c
@@ -102,6 +102,8 @@ static int pre_vt(DECL_ARGS);
static int pre_ux(DECL_ARGS);
static int pre_xr(DECL_ARGS);
static void print_word(const char *);
+static void print_line(const char *, int);
+static void print_block(const char *, int);
static void print_offs(const char *);
static void print_width(const char *,
const struct mdoc_node *, size_t);
@@ -241,15 +243,16 @@ static const struct manact manacts[MDOC_
};
static int outflags;
-#define MMAN_spc (1 << 0)
-#define MMAN_spc_force (1 << 1)
-#define MMAN_nl (1 << 2)
-#define MMAN_br (1 << 3)
-#define MMAN_sp (1 << 4)
-#define MMAN_Sm (1 << 5)
-#define MMAN_Bk (1 << 6)
-#define MMAN_An_split (1 << 7)
-#define MMAN_An_nosplit (1 << 8)
+#define MMAN_spc (1 << 0) /* blank character before next word */
+#define MMAN_spc_force (1 << 1) /* even before trailing punctuation */
+#define MMAN_nl (1 << 2) /* break man(7) code line */
+#define MMAN_br (1 << 3) /* break output line */
+#define MMAN_sp (1 << 4) /* insert a blank output line */
+#define MMAN_PP (1 << 5) /* reset indentation etc. */
+#define MMAN_Sm (1 << 6) /* horizontal spacing mode */
+#define MMAN_Bk (1 << 7) /* word keep mode */
+#define MMAN_An_split (1 << 8) /* author mode is "split" */
+#define MMAN_An_nosplit (1 << 9) /* author mode is "nosplit" */
static struct {
char *head;
@@ -287,17 +290,21 @@ static void
print_word(const char *s)
{
- if ((MMAN_sp | MMAN_br | MMAN_nl) & outflags) {
+ if ((MMAN_PP | MMAN_sp | MMAN_br | MMAN_nl) & outflags) {
/*
* If we need a newline, print it now and start afresh.
*/
- if (MMAN_sp & outflags)
+ if (MMAN_PP & outflags) {
+ if ( ! (MMAN_sp & outflags))
+ printf("\n.sp -1v");
+ printf("\n.PP\n");
+ } else if (MMAN_sp & outflags)
printf("\n.sp\n");
else if (MMAN_br & outflags)
printf("\n.br\n");
else if (MMAN_nl & outflags)
putchar('\n');
- outflags &= ~(MMAN_sp|MMAN_br|MMAN_nl|MMAN_spc);
+ outflags &= ~(MMAN_PP|MMAN_sp|MMAN_br|MMAN_nl|MMAN_spc);
} else if (MMAN_spc & outflags && '\0' != s[0])
/*
* If we need a space, only print it if
@@ -341,6 +348,30 @@ print_word(const char *s)
}
static void
+print_line(const char *s, int newflags)
+{
+
+ outflags &= ~MMAN_br;
+ outflags |= MMAN_nl;
+ print_word(s);
+ outflags |= newflags;
+}
+
+static void
+print_block(const char *s, int newflags)
+{
+
+ outflags &= ~MMAN_PP;
+ if (MMAN_sp & outflags)
+ outflags &= ~(MMAN_sp | MMAN_br);
+ else
+ print_line(".sp -1v", 0);
+ outflags |= MMAN_nl;
+ print_word(s);
+ outflags |= newflags;
+}
+
+static void
print_offs(const char *v)
{
char buf[24];
@@ -381,9 +412,9 @@ print_width(const char *v, const struct
sz = su.scale;
else {
if (chsz)
- print_word(".HP");
+ print_block(".HP", 0);
else
- print_word(".TP");
+ print_block(".TP", 0);
print_word(v);
return;
}
@@ -391,9 +422,9 @@ print_width(const char *v, const struct
sz = strlen(v);
if (chsz > sz)
- print_word(".HP");
+ print_block(".HP", 0);
else
- print_word(".TP");
+ print_block(".TP", 0);
snprintf(buf, sizeof(buf), "%ldn", sz + 2);
print_word(buf);
}
@@ -597,8 +628,8 @@ pre_sect(DECL_ARGS)
if (MDOC_HEAD != n->type)
return(1);
- outflags |= MMAN_nl;
- print_word(manacts[n->tok].prefix);
+ outflags |= MMAN_sp;
+ print_block(manacts[n->tok].prefix, 0);
print_word("\"");
outflags &= ~MMAN_spc;
return(1);
@@ -697,15 +728,14 @@ static int
pre_bd(DECL_ARGS)
{
- if (0 == n->norm->Bd.comp)
- outflags |= MMAN_sp;
+ outflags &= ~(MMAN_PP | MMAN_sp | MMAN_br);
+
if (DISP_unfilled == n->norm->Bd.type ||
- DISP_literal == n->norm->Bd.type) {
- outflags |= MMAN_nl;
- print_word(".nf");
- }
- outflags |= MMAN_nl;
- print_word(".RS");
+ DISP_literal == n->norm->Bd.type)
+ print_line(".nf", 0);
+ if (0 == n->norm->Bd.comp && NULL != n->parent->prev)
+ outflags |= MMAN_sp;
+ print_line(".RS", 0);
print_offs(n->norm->Bd.offs);
outflags |= MMAN_nl;
return(1);
@@ -715,14 +745,10 @@ static void
post_bd(DECL_ARGS)
{
- outflags |= MMAN_nl;
- print_word(".RE");
+ print_line(".RE", MMAN_nl);
if (DISP_unfilled == n->norm->Bd.type ||
- DISP_literal == n->norm->Bd.type) {
- outflags |= MMAN_nl;
- print_word(".fi");
- }
- outflags |= MMAN_nl;
+ DISP_literal == n->norm->Bd.type)
+ print_line(".fi", MMAN_nl);
}
static int
@@ -797,12 +823,11 @@ pre_bl(DECL_ARGS)
return(1);
}
- outflags |= MMAN_nl;
- print_word(".TS");
- outflags |= MMAN_nl;
+ print_line(".TS", MMAN_nl);
for (icol = 0; icol < n->norm->Bl.ncols; icol++)
print_word("l");
print_word(".");
+ outflags |= MMAN_nl;
return(1);
}
@@ -811,17 +836,17 @@ post_bl(DECL_ARGS)
{
switch (n->norm->Bl.type) {
+ case (LIST_column):
+ print_line(".TE", 0);
+ break;
case (LIST_enum):
n->norm->Bl.count = 0;
break;
- case (LIST_column):
- outflags |= MMAN_nl;
- print_word(".TE");
- break;
default:
break;
}
- outflags |= MMAN_br;
+ outflags |= MMAN_PP | MMAN_nl;
+ outflags &= ~(MMAN_sp | MMAN_br);
}
static int
@@ -856,9 +881,7 @@ static int
pre_dl(DECL_ARGS)
{
- outflags |= MMAN_nl;
- print_word(".RS 6n");
- outflags |= MMAN_nl;
+ print_line(".RS 6n", MMAN_nl);
return(1);
}
@@ -866,9 +889,7 @@ static void
post_dl(DECL_ARGS)
{
- outflags |= MMAN_nl;
- print_word(".RE");
- outflags |= MMAN_nl;
+ print_line(".RE", MMAN_nl);
}
static int
@@ -1070,28 +1091,24 @@ pre_it(DECL_ARGS)
switch (n->type) {
case (MDOC_HEAD):
- outflags |= MMAN_nl;
+ outflags |= MMAN_PP | MMAN_nl;
bln = n->parent->parent;
+ if (0 == bln->norm->Bl.comp ||
+ NULL == bln->parent->prev)
+ outflags |= MMAN_sp;
+ outflags &= ~MMAN_br;
switch (bln->norm->Bl.type) {
case (LIST_item):
- if (bln->norm->Bl.comp)
- outflags |= MMAN_br;
- else
- outflags |= MMAN_sp;
return(0);
case (LIST_inset):
/* FALLTHROUGH */
case (LIST_diag):
/* FALLTHROUGH */
case (LIST_ohang):
- if (bln->norm->Bl.comp)
- outflags |= MMAN_br;
- else
- outflags |= MMAN_sp;
if (bln->norm->Bl.type == LIST_diag)
- print_word(".B \"");
+ print_line(".B \"", 0);
else
- print_word(".R \"");
+ print_line(".R \"", 0);
outflags &= ~MMAN_spc;
return(1);
case (LIST_bullet):
@@ -1254,12 +1271,10 @@ static int
pre_pp(DECL_ARGS)
{
- outflags |= MMAN_nl;
- if (MDOC_It == n->parent->tok)
- print_word(".sp");
- else
- print_word(".PP");
- outflags |= MMAN_nl;
+ if (MDOC_It != n->parent->tok)
+ outflags |= MMAN_PP;
+ outflags |= MMAN_sp | MMAN_nl;
+ outflags &= ~MMAN_br;
return(0);
}
@@ -1268,9 +1283,8 @@ pre_rs(DECL_ARGS)
{
if (SEC_SEE_ALSO == n->sec) {
- outflags |= MMAN_nl;
- print_word(".PP");
- outflags |= MMAN_nl;
+ outflags |= MMAN_PP | MMAN_sp | MMAN_nl;
+ outflags &= ~MMAN_br;
}
return(1);
}
@@ -1291,8 +1305,7 @@ static int
pre_sp(DECL_ARGS)
{
- outflags |= MMAN_nl;
- print_word(".sp");
+ print_line(".sp", MMAN_nl);
return(1);
}
Index: man_term.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man_term.c,v
retrieving revision 1.130
retrieving revision 1.131
diff -Lman_term.c -Lman_term.c -u -p -r1.130 -r1.131
--- man_term.c
+++ man_term.c
@@ -440,7 +440,9 @@ pre_in(DECL_ARGS)
static int
pre_sp(DECL_ARGS)
{
+ char *s;
size_t i, len;
+ int neg;
if ((NULL == n->prev && n->parent)) {
if (MAN_SS == n->parent->tok)
@@ -449,19 +451,32 @@ pre_sp(DECL_ARGS)
return(0);
}
+ neg = 0;
switch (n->tok) {
case (MAN_br):
len = 0;
break;
default:
- len = n->child ? a2height(p, n->child->string) : 1;
+ if (NULL == n->child) {
+ len = 1;
+ break;
+ }
+ s = n->child->string;
+ if ('-' == *s) {
+ neg = 1;
+ s++;
+ }
+ len = a2height(p, s);
break;
}
if (0 == len)
term_newln(p);
- for (i = 0; i < len; i++)
- term_vspace(p);
+ else if (neg)
+ p->skipvsp += len;
+ else
+ for (i = 0; i < len; i++)
+ term_vspace(p);
return(0);
}
--
To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv
reply other threads:[~2012-07-13 14:19 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201207131419.q6DEJn8t006998@krisdoz.my.domain \
--to=schwarze@mdocml.bsd.lv \
--cc=source@mdocml.bsd.lv \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).