[lvm-devel] main - man-generator: improve hyphenation for longer option list
Zdenek Kabelac
zkabelac at sourceware.org
Mon Apr 12 07:55:44 UTC 2021
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d86b5836442a357e6c01ee897b5d530e14494f73
Commit: d86b5836442a357e6c01ee897b5d530e14494f73
Parent: b76283c4b377b3fffd5c20974e4a99e6407d71cb
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Sun Apr 11 00:47:00 2021 +0200
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Apr 12 09:54:16 2021 +0200
man-generator: improve hyphenation for longer option list
Disable hyphenation around longer option lists (>42 chars)
and use \: to markup places for line splits.
The code ATM is somewhat mixtured so it's not easy to encapsulate
section .nh ... .hy.
ATM global _was_hyphen is used to properly finish sections after
disabled hyphenation.
---
tools/command.c | 47 ++++++++++++++++++++++++++++++++++-------------
1 file changed, 34 insertions(+), 13 deletions(-)
diff --git a/tools/command.c b/tools/command.c
index 38b11b8eb..7e0c2584d 100644
--- a/tools/command.c
+++ b/tools/command.c
@@ -301,6 +301,14 @@ static struct oo_line _oo_lines[MAX_OO_LINES];
static void __add_optional_opt_line(struct cmd_context *cmdtool, struct command *cmd, int argc, char *argv[]);
+static unsigned _was_hyphen = 0;
+static void printf_hyphen(char c)
+{
+ /* When .hy 1 was printed, we do not want to emit empty space */
+ printf("%c%c\n", _was_hyphen ? '\n' : ' ', c);
+ _was_hyphen = 0;
+}
+
/*
* modifies buf, replacing the sep characters with \0
* argv pointers point to positions in buf
@@ -1901,7 +1909,7 @@ void print_usage(struct command *cmd, int longhelp, int desc_first)
}
}
- printf(" )\n");
+ printf_hyphen(')');
}
if (!any_req && cmd->ro_count) {
@@ -2252,6 +2260,8 @@ static void _print_val_man(struct command_name *cname, int opt_enum, int val_enu
char *line_argv[MAX_LINE_ARGC];
int line_argc;
int i;
+
+ _was_hyphen = 0;
int is_relative_opt = (opt_enum == size_ARG) ||
(opt_enum == extents_ARG) ||
(opt_enum == poolmetadatasize_ARG) ||
@@ -2357,15 +2367,20 @@ static void _print_val_man(struct command_name *cname, int opt_enum, int val_enu
if (strchr(str, '|')) {
if (!(line = strdup(str)))
return;
+ if ((_was_hyphen = (strlen(line) > 42)))
+ /* TODO: prevent line to end with already printed space */
+ printf("\n.nh\n");
_split_line(line, &line_argc, line_argv, '|');
for (i = 0; i < line_argc; i++) {
if (i)
- printf("|");
+ printf("|%s", _was_hyphen ? "\\:" : "");
if (strstr(line_argv[i], "Number"))
printf("\\fI%s\\fP", line_argv[i]);
else
printf("\\fB%s\\fP", line_argv[i]);
}
+ if (_was_hyphen)
+ printf("\n.hy");
free(line);
return;
}
@@ -2391,9 +2406,13 @@ static void _print_def_man(struct command_name *cname, int opt_enum, struct arg_
else {
if (sep) printf("|");
- if (!usage || !val_names[val_enum].usage)
+ if (!usage || !val_names[val_enum].usage) {
+ if (_was_hyphen) {
+ printf("\n");
+ _was_hyphen = 0;
+ }
printf("\\fI%s\\fP", val_names[val_enum].name);
- else
+ } else
_print_val_man(cname, opt_enum, val_enum);
sep = 1;
@@ -2470,6 +2489,7 @@ static void _print_man_usage(char *lvmname, struct command *cmd)
int need_ro_indent_end = 0;
int include_extents = 0;
+ _was_hyphen = 0;
if (!(cname = _find_command_name(cmd->name)))
return;
@@ -2590,7 +2610,7 @@ static void _print_man_usage(char *lvmname, struct command *cmd)
sep++;
}
- printf(" )\n");
+ printf_hyphen(')');
printf(".RE\n");
}
@@ -2689,7 +2709,8 @@ static void _print_man_usage(char *lvmname, struct command *cmd)
printf(".ad l\n");
printf("[ \\fB-l\\fP|\\fB--extents\\fP ");
_print_val_man(cname, extents_ARG, opt_names[extents_ARG].val_enum);
- printf(" ]\n");
+
+ printf_hyphen(']');
printf(".ad b\n");
sep = 1;
}
@@ -2720,7 +2741,7 @@ static void _print_man_usage(char *lvmname, struct command *cmd)
printf(" ");
_print_def_man(cname, opt_enum, &cmd->optional_opt_args[oo].def, 1);
}
- printf(" ]\n");
+ printf_hyphen(']');
printf(".ad b\n");
sep = 1;
}
@@ -2752,7 +2773,7 @@ static void _print_man_usage(char *lvmname, struct command *cmd)
printf(" ");
_print_def_man(cname, opt_enum, &cmd->optional_opt_args[oo].def, 1);
}
- printf(" ]\n");
+ printf_hyphen(']');
printf(".ad b\n");
sep = 1;
}
@@ -2783,7 +2804,7 @@ static void _print_man_usage(char *lvmname, struct command *cmd)
}
}
- printf(" ]\n");
+ printf_hyphen(']');
printf(".RE\n");
}
@@ -2845,7 +2866,7 @@ static void _print_man_usage_common_lvm(struct command *cmd)
printf(" ");
_print_def_man(cname, opt_enum, &cmd->optional_opt_args[oo].def, 1);
}
- printf(" ]\n");
+ printf_hyphen(']');
printf(".ad b\n");
sep = 1;
break;
@@ -2880,7 +2901,7 @@ static void _print_man_usage_common_lvm(struct command *cmd)
printf(" ");
_print_def_man(cname, opt_enum, &cmd->optional_opt_args[oo].def, 1);
}
- printf(" ]\n");
+ printf_hyphen(']');
printf(".ad b\n");
sep = 1;
break;
@@ -2942,7 +2963,7 @@ static void _print_man_usage_common_cmd(struct command *cmd)
printf(" ");
_print_def_man(cname, opt_enum, &cmd->optional_opt_args[oo].def, 1);
}
- printf(" ]\n");
+ printf_hyphen(']');
printf(".ad b\n");
sep = 1;
break;
@@ -2984,7 +3005,7 @@ static void _print_man_usage_common_cmd(struct command *cmd)
printf(" ");
_print_def_man(cname, opt_enum, &cmd->optional_opt_args[oo].def, 1);
}
- printf(" ]\n");
+ printf_hyphen(']');
printf(".ad b\n");
sep = 1;
break;
More information about the lvm-devel
mailing list