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);
135 print_as_uppercase(title);
137 prev_was_paragraph =
false;
149 prev_was_paragraph =
false;
157 void print_line(
std::string const & text,
bool const line_is_paragraph)
159 if (prev_was_paragraph)
164 print_text(text, layout.leftPadding);
165 prev_was_paragraph = line_is_paragraph;
184 if (prev_was_paragraph)
192 unsigned pos = layout.leftPadding + text_width(term);
193 if (pos + layout.centerPadding > layout.rightColumnTab)
200 std::fill_n(out, layout.rightColumnTab - pos,
' ');
201 print_text(desc, layout.rightColumnTab);
204 prev_was_paragraph =
false;
220 for (
auto it = str.
begin(); it != str.
end(); ++it)
226 assert(it != str.
end());
234 assert(it != str.
end());
237 if (stdout_is_terminal())
242 if (stdout_is_terminal())
247 if (stdout_is_terminal())
279 for (
unsigned i = 0; i < text.
size(); ++i)
287 if (i + 1 == text.
size())
293 if (text[i + 1] ==
'\\' || text[i + 1] ==
'-')
300 if (i + 2 == text.
size())
307 if (text[i + 1] ==
'f')
309 if (text[i + 2] ==
'B' || text[i + 2] ==
'I' || text[i + 2] ==
'P')
323 void print_text(
std::string const & text,
unsigned const tab)
337 for (
auto it = tokens.begin(); it != tokens.end(); ++it)
339 if (it == tokens.begin())
342 pos += text_width(*it);
343 if (pos > layout.screenWidth)
352 if (pos + 1 + text_width(*it) > layout.screenWidth)
358 pos = tab + text_width(*it);
364 pos += text_width(*it) + 1;
378 return to_text(
"\\fB") + str + to_text(
"\\fP");
382 bool prev_was_paragraph{
false};
385 friend struct ::sharg::detail::test_accessor;
388 console_layout_struct layout{};
402class format_short_help :
public format_help
416 if (meta.synopsis.empty())
417 generate_default_synopsis(executable_name);
420 if (!meta.synopsis.empty() && !meta.synopsis.front().empty())
423 print_line(
"Try -h or --help for more information.\n",
true);
438class format_version :
public format_help
464class format_copyright :
public format_help
474 R
"(Copyright (c) 2006-2026, Knut Reinert & Freie Universität Berlin
475Copyright (c) 2016-2026, Knut Reinert & MPI für molekulare Genetik
478Redistribution and use in source and binary forms, with or without
479modification, are permitted provided that the following conditions are met:
481 * Redistributions of source code must retain the above copyright
482 notice, this list of conditions and the following disclaimer.
483 * Redistributions in binary form must reproduce the above copyright
484 notice, this list of conditions and the following disclaimer in the
485 documentation and/or other materials provided with the distribution.
486 * Neither the name of Knut Reinert or the FU Berlin nor the names of
487 its contributors may be used to endorse or promote products derived
488 from this software without specific prior written permission.
490THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
491AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
492IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
493ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE
494FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
495DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
496SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
497CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
498LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
499OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
503 << in_bold(
"Copyright information for " + meta.app_name +
":\n") <<
std::string(80,
'-') <<
'\n';
505 if (!
empty(meta.long_copyright))
507 std::cout << to_text(
"\\fP") << meta.long_copyright <<
"\n";
509 else if (!
empty(meta.short_copyright))
511 std::cout << in_bold(meta.app_name +
" full copyright information not available. "
512 +
"Displaying short copyright information instead:\n")
513 << meta.short_copyright <<
"\n";
517 std::cout << to_text(
"\\fP") << meta.app_name <<
" copyright information not available.\n";
521 << in_bold(
"This program contains SeqAn code licensed under the following terms:\n")
523 << seqan_license <<
'\n';
update_notifications
Indicates whether application allows automatic update notifications by the sharg::parser.
Definition auxiliary.hpp:27
Checks if program is run interactively and retrieves dimensions of terminal (Transferred from seqan2)...
Forward declares sharg::detail::test_accessor.