21namespace sharg::detail
36class format_help :
public format_help_base<format_help>
39 using base_type = format_help_base<format_help>;
48 format_help() =
default;
49 format_help(format_help
const & pf) =
default;
50 format_help & operator=(format_help
const &) =
default;
51 format_help(format_help &&) =
default;
52 format_help & operator=(format_help &&) =
default;
53 ~format_help() =
default;
62 struct console_layout_struct
67 uint32_t defaultScreenWidth;
69 uint32_t maximalScreenWidth;
71 uint32_t minimalScreenWidth;
75 uint32_t centerPadding;
77 uint32_t rightPadding;
79 uint32_t leftColumnWidth;
81 uint32_t rightColumnWidth;
83 uint32_t rightColumnTab;
87 console_layout_struct(uint32_t
const terminal_width) :
89 defaultScreenWidth{80},
90 maximalScreenWidth{120},
91 minimalScreenWidth{40},
99 screenWidth = (terminal_width > 0) ? terminal_width : defaultScreenWidth;
100 screenWidth =
std::max(screenWidth, minimalScreenWidth);
101 screenWidth =
std::min(screenWidth, maximalScreenWidth);
102 screenWidth -= rightPadding;
104 rightColumnWidth = screenWidth - leftPadding - leftColumnWidth - centerPadding - rightPadding;
105 rightColumnTab = leftPadding + leftColumnWidth + centerPadding;
109 console_layout_struct() : console_layout_struct{get_terminal_width()}
119 if (!
empty(meta.short_description))
120 std::cout <<
" - " << meta.short_description;
124 text_width(meta.app_name) + (
empty(meta.short_description) ? 0 : 3) + text_width(meta.short_description);
141 return std::toupper(c);
144 prev_was_paragraph =
false;
156 prev_was_paragraph =
false;
164 void print_line(
std::string const & text,
bool const line_is_paragraph)
166 if (prev_was_paragraph)
171 print_text(text, layout.leftPadding);
172 prev_was_paragraph = line_is_paragraph;
191 if (prev_was_paragraph)
199 unsigned pos = layout.leftPadding + term.
size();
200 if (pos + layout.centerPadding > layout.rightColumnTab)
205 std::fill_n(out, layout.rightColumnTab - pos,
' ');
206 print_text(desc, layout.rightColumnTab);
208 prev_was_paragraph =
false;
224 for (
auto it = str.
begin(); it != str.
end(); ++it)
230 assert(it != str.
end());
238 assert(it != str.
end());
283 for (
unsigned i = 0; i < text.
size(); ++i)
291 if (i + 1 == text.
size())
297 if (text[i + 1] ==
'\\' || text[i + 1] ==
'-')
304 if (i + 2 == text.
size())
311 if (text[i + 1] ==
'f')
313 if (text[i + 2] ==
'B' || text[i + 2] ==
'I' || text[i + 2] ==
'P')
327 void print_text(
std::string const & text,
unsigned const tab)
341 for (
auto it = tokens.begin(); it != tokens.end(); ++it)
343 if (it == tokens.begin())
346 pos += text_width(*it);
347 if (pos > layout.screenWidth)
356 if (pos + 1 + text_width(*it) > layout.screenWidth)
362 pos = tab + text_width(*it);
368 pos += text_width(*it) + 1;
382 return to_text(
"\\fB") + str + to_text(
"\\fP");
386 bool prev_was_paragraph{
false};
389 friend struct ::sharg::detail::test_accessor;
392 console_layout_struct layout{};
406class format_short_help :
public format_help
412 void parse(parser_meta_data
const & parser_meta)
418 if (!parser_meta.synopsis.empty())
421 print_line(
"Try -h or --help for more information.\n",
true);
438class format_version :
public format_help
444 void parse(parser_meta_data & parser_meta)
466class format_copyright :
public format_help
472 void parse(parser_meta_data
const & parser_meta)
476 R
"(Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
477Copyright (c) 2016-2022, Knut Reinert & MPI für molekulare Genetik
480Redistribution and use in source and binary forms, with or without
481modification, are permitted provided that the following conditions are met:
483 * Redistributions of source code must retain the above copyright
484 notice, this list of conditions and the following disclaimer.
485 * Redistributions in binary form must reproduce the above copyright
486 notice, this list of conditions and the following disclaimer in the
487 documentation and/or other materials provided with the distribution.
488 * Neither the name of Knut Reinert or the FU Berlin nor the names of
489 its contributors may be used to endorse or promote products derived
490 from this software without specific prior written permission.
492THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
493AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
494IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
495ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE
496FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
497DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
498SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
499CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
500LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
501OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
505 << in_bold(
"Copyright information for " + meta.app_name +
":\n") <<
std::string(80,
'-') <<
'\n';
507 if (!
empty(meta.long_copyright))
509 std::cout << to_text(
"\\fP") << meta.long_copyright <<
"\n";
511 else if (!
empty(meta.short_copyright))
513 std::cout << in_bold(meta.app_name +
" full copyright information not available. "
514 +
"Displaying short copyright information instead:\n")
515 << meta.short_copyright <<
"\n";
519 std::cout << to_text(
"\\fP") << meta.app_name <<
" copyright information not available.\n";
523 << in_bold(
"This program contains SeqAn code licensed under the following terms:\n")
525 << seqan_license <<
'\n';
Checks if program is run interactively and retrieves dimensions of terminal (Transferred from seqan2)...
Forward declares sharg::detail::test_accessor.