62 class format_man :
public format_base
74 template <
typename option_t,
typename val
idator_type>
75 void add_option(option_t & value,
77 std::string
const & long_id,
78 std::string
const & desc,
80 validator_type && validator)
82 parser_set_up_calls.push_back([=, &value]()
85 print_list_item(prep_id_for_help(short_id, long_id) +
" " + option_type_and_list_info(value),
86 (desc +
" " + validator.get_help_page_message()));
97 void add_flag(
bool & ,
99 std::string
const & long_id,
100 std::string
const & desc,
103 parser_set_up_calls.push_back([=] ()
105 if (!(spec & option_spec::HIDDEN) && (!(spec & option_spec::ADVANCED)))
106 print_list_item(prep_id_for_help(short_id, long_id), desc);
117 template <
typename option_t,
typename val
idator_type>
118 void add_positional_option(option_t & value,
119 std::string
const & desc,
120 validator_type && validator)
122 ++positional_option_count;
124 positional_option_calls.push_back([=, &value]()
126 std::string key{
"\\fBARGUMENT-" + std::to_string(positional_option_count) +
127 "\\fP " + option_type_and_list_info(value)};
128 print_list_item(key, (desc +
" " + validator.get_help_page_message()));
135 void parse(argument_parser_meta_data
const & parser_meta)
139 print_section(
"Synopsis");
142 if (!parser_meta.description.empty())
144 print_section(
"Description");
145 for (
auto desc : parser_meta.description)
150 if (!positional_option_calls.empty())
151 print_section(
"Positional Arguments");
154 for (
auto f : positional_option_calls)
158 if (!parser_set_up_calls.empty())
159 print_section(
"Options");
162 for (
auto f : parser_set_up_calls)
167 throw parser_interruption();
173 void add_section(std::string
const & title)
175 parser_set_up_calls.push_back([&] ()
177 print_section(title);
184 void add_subsection(std::string
const & title)
186 parser_set_up_calls.push_back([&] ()
188 print_subsection(title);
196 void add_line(std::string
const & text,
bool line_is_paragraph)
198 parser_set_up_calls.push_back([&] ()
200 print_line(text, line_is_paragraph);
209 void add_list_item(std::string
const & key, std::string
const & description)
211 parser_set_up_calls.push_back([&] ()
213 print_list_item(key, description);
221 std::ostream_iterator<char> out(std::cout);
225 std::transform(meta.app_name.begin(), meta.app_name.end(), out, [] (
unsigned char c) {
return std::toupper(c); });
226 std::cout <<
" " << std::to_string(meta.man_page_section) <<
" \"" << meta.date <<
"\" \"";
227 std::transform(meta.app_name.begin(), meta.app_name.end(), out, [] (
unsigned char c) {
return std::tolower(c); });
228 std::cout <<
" " << meta.version <<
"\" \"" << meta.man_page_title <<
"\"\n";
231 std::cout <<
".SH NAME\n" 232 << meta.app_name <<
" \\- " << meta.short_description << std::endl;
236 void print_synopsis()
238 for (
unsigned i = 0; i < meta.synopsis.size(); ++i)
240 std::string text =
"\\fB";
241 text.append(meta.app_name);
242 text.append(
"\\fP ");
243 text.append(meta.synopsis[i]);
245 print_line(text,
false);
252 void print_section(std::string
const & title)
254 std::ostream_iterator<char> out(std::cout);
256 std::transform(title.begin(), title.end(), out, [] (
unsigned char c) {
return std::toupper(c); });
258 is_first_in_section =
true;
264 void print_subsection(std::string
const & title)
266 std::cout <<
".SS " << title <<
"\n";
267 is_first_in_section =
true;
276 void print_line(std::string
const & text,
bool const line_is_paragraph)
278 if (!is_first_in_section && line_is_paragraph)
279 std::cout <<
".sp\n";
280 else if (!is_first_in_section && !line_is_paragraph)
281 std::cout <<
".br\n";
283 std::cout << text <<
"\n";
284 is_first_in_section =
false;
290 void print_line(std::string
const & text)
292 print_line(text,
true);
304 void print_list_item(std::string
const & term, std::string
const & desc)
309 is_first_in_section =
false;
316 if ((!
empty(meta.short_copyright)) || (!
empty(meta.long_copyright)) || (!
empty(meta.citation)))
318 std::cout <<
".SH LEGAL\n";
320 if (!
empty(meta.short_copyright))
321 std::cout <<
"\\fB" << meta.app_name <<
" Copyright:\\fR " << meta.short_copyright <<
"\n.br\n";
323 std::cout <<
"\\fBSeqAn Copyright:\\fR 2006-2015 Knut Reinert, FU-Berlin; released under the 3-clause BSDL.\n.br\n";
325 if (!
empty(meta.citation))
326 std::cout <<
"\\fBIn your academic works please cite:\\fR " << meta.citation <<
"\n.br\n";
328 if (!
empty(meta.long_copyright))
329 std::cout <<
"For full copyright and/or warranty information see \\fB--copyright\\fR.\n";
347 argument_parser_meta_data meta;
349 std::vector<std::function<void()>> parser_set_up_calls;
351 std::vector<std::function<void()>> positional_option_calls;
353 bool is_first_in_section{
true};
355 unsigned positional_option_count{0};
constexpr auto transform
A range adaptor that takes a invocable and returns a view of the elements with the invocable applied...
Definition: transform.hpp:95
Definition: auxiliary.hpp:72
Checks if program is run interactively and retrieves dimensions of terminal (Transferred from seqan2)...
Definition: aligned_sequence_concept.hpp:288
Definition: auxiliary.hpp:68
::ranges::empty empty
Alias for ranges::empty. Checks whether a range is empty.
Definition: ranges:205
option_spec
Used to further specify argument_parser options/flags.
Definition: auxiliary.hpp:60
Contains SeqAn version macros and global variables.