| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #pragma once
- #include <string>
- #include <cstddef>
- namespace lumacs {
- /// @brief Shared message formatting utilities for both GTK and TUI frontends.
- ///
- /// This utility provides consistent message formatting including:
- /// - Multi-line message collapsing (show first line + count)
- /// - Message truncation with help hint
- class MessageFormatter {
- public:
- /// Truncation suffix shown when message is too long
- static constexpr const char* TRUNCATION_SUFFIX = "... [C-h e]";
- /// @brief Collapse a multi-line message to show only the first line with a count indicator.
- /// @param message The original message (may contain newlines)
- /// @return The collapsed message with line count indicator if multi-line, otherwise unchanged
- static std::string collapse_multiline(const std::string& message) {
- size_t newline_pos = message.find('\n');
- if (newline_pos == std::string::npos) {
- return message; // Single line, return as-is
- }
- // Count additional lines
- size_t line_count = 1;
- size_t pos = 0;
- while ((pos = message.find('\n', pos)) != std::string::npos) {
- ++line_count;
- ++pos;
- }
- // Return first line with indicator
- return message.substr(0, newline_pos) +
- " [+" + std::to_string(line_count - 1) + " lines, C-h e]";
- }
- /// @brief Truncate a message to fit within a maximum character width.
- /// @param message The message to truncate
- /// @param max_width Maximum number of characters allowed
- /// @return The truncated message with suffix if it was too long, otherwise unchanged
- static std::string truncate_to_width(const std::string& message, size_t max_width) {
- if (message.length() <= max_width) {
- return message;
- }
- const std::string suffix = TRUNCATION_SUFFIX;
- if (max_width <= suffix.length()) {
- return suffix.substr(0, max_width); // Edge case: very narrow width
- }
- size_t max_chars = max_width - suffix.length();
- return message.substr(0, max_chars) + suffix;
- }
- /// @brief Format a message for display in the echo area.
- /// Combines multi-line collapsing and width truncation.
- /// @param message The original message
- /// @param max_width Maximum display width in characters
- /// @return The formatted message ready for display
- static std::string format_for_echo_area(const std::string& message, size_t max_width) {
- std::string result = collapse_multiline(message);
- return truncate_to_width(result, max_width);
- }
- };
- } // namespace lumacs
|