diff --git a/include/cxxopts.hpp b/include/cxxopts.hpp index 2819f502..cfb87de9 100644 --- a/include/cxxopts.hpp +++ b/include/cxxopts.hpp @@ -2290,6 +2290,59 @@ format_description return result; } +String +format_custom_help +( + const std::string& custom_help, + std::size_t start, + std::size_t allowed +) +{ + String result; + std::size_t count = 0; + std::size_t word_size = 0; + + if(allowed <= start) + { + throw_or_mimic("Allowed column" + "width must be greater than start column width!"); + } + + for (std::size_t i = 0; i < custom_help.length(); i++) + { + char c = custom_help[i]; + + while (count < start) { + result.push_back(' '); + count++; + } + + // record the start of a word + word_size = (std::isspace(c)) ? 0 : word_size + 1; + + result.push_back(c); + + count = (c == '\n') ? 0 : count + 1; + + if (count >= allowed) + { + // if we are in the middle of a word, backtrack until word_size is 0 + + for (std::size_t c = 0; c < word_size; c++) + { + char last_char = result.back(); + result.pop_back(); + i--; + } + + result.push_back('\n'); + count = 0; + } + } + + return result; +} + } // namespace inline @@ -2876,6 +2929,7 @@ Options::help(const std::vector& help_groups, bool print_usage) con if (!m_custom_help.empty()) { result += " " + toLocalString(m_custom_help); + result = format_custom_help(result, OPTION_DESC_GAP, m_width); } if (!m_positional.empty() && !m_positional_help.empty()) {