18namespace sharg::detail
33class format_help :
public format_help_base<format_help>
36 using base_type = format_help_base<format_help>;
45 format_help() =
default;
46 format_help(format_help
const & pf) =
default;
47 format_help & operator=(format_help
const &) =
default;
48 format_help(format_help &&) =
default;
49 format_help & operator=(format_help &&) =
default;
50 ~format_help() =
default;
55 bool const advanced =
false) :
56 base_type{names, version_updates, advanced} {};
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());
241 if (stdout_is_terminal())
246 if (stdout_is_terminal())
251 if (stdout_is_terminal())
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);
436class format_version :
public format_help
442 void parse(parser_meta_data & parser_meta)
462class format_copyright :
public format_help
468 void parse(parser_meta_data
const & parser_meta)
472 R
"(Copyright (c) 2006-2024, Knut Reinert & Freie Universität Berlin
473Copyright (c) 2016-2024, Knut Reinert & MPI für molekulare Genetik
476Redistribution and use in source and binary forms, with or without
477modification, are permitted provided that the following conditions are met:
479 * Redistributions of source code must retain the above copyright
480 notice, this list of conditions and the following disclaimer.
481 * Redistributions in binary form must reproduce the above copyright
482 notice, this list of conditions and the following disclaimer in the
483 documentation and/or other materials provided with the distribution.
484 * Neither the name of Knut Reinert or the FU Berlin nor the names of
485 its contributors may be used to endorse or promote products derived
486 from this software without specific prior written permission.
488THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
489AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
490IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
491ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE
492FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
493DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
494SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
495CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
496LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
497OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
501 << in_bold(
"Copyright information for " + meta.app_name +
":\n") <<
std::string(80,
'-') <<
'\n';
503 if (!
empty(meta.long_copyright))
505 std::cout << to_text(
"\fP") << meta.long_copyright <<
"\n";
507 else if (!
empty(meta.short_copyright))
509 std::cout << in_bold(meta.app_name +
" full copyright information not available. "
510 +
"Displaying short copyright information instead:\n")
511 << meta.short_copyright <<
"\n";
515 std::cout << to_text(
"\fP") << meta.app_name <<
" copyright information not available.\n";
519 << in_bold(
"This program contains SeqAn code licensed under the following terms:\n")
521 << seqan_license <<
'\n';
update_notifications
Indicates whether application allows automatic update notifications by the sharg::parser.
Definition auxiliary.hpp:26
Checks if program is run interactively and retrieves dimensions of terminal (Transferred from seqan2)...
Forward declares sharg::detail::test_accessor.