summaryrefslogtreecommitdiff
path: root/tools/command.c
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2021-04-11 00:47:00 +0200
committerZdenek Kabelac <zkabelac@redhat.com>2021-04-12 09:54:16 +0200
commitd86b5836442a357e6c01ee897b5d530e14494f73 (patch)
treee20c5f6d2449b7a097390ea51ce30c8ccc2f79a5 /tools/command.c
parentb76283c4b377b3fffd5c20974e4a99e6407d71cb (diff)
downloadlvm2-d86b5836442a357e6c01ee897b5d530e14494f73.tar.gz
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.
Diffstat (limited to 'tools/command.c')
-rw-r--r--tools/command.c47
1 files 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;