#pragma once #include #include 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