83 static_cast<const char*
>(::memchr(from,
'\x1b',
input_end_ - from));
96 auto is_parameter_char = [](
char ch) ->
bool {
97 return (ch >=
'0' && ch <=
'9') || ch ==
';';
100 const char* end = seq + 2;
101 while (is_parameter_char(end[0])) {
186 if (str.size() <= max_width) {
191 if (str.find(
'\x1b') == std::string::npos) {
192 const int ellipsis_width = 3;
195 if (max_width <= ellipsis_width) {
196 str.assign(
"...", max_width);
202 const size_t remaining_size = max_width - ellipsis_width;
203 const size_t left_span_size = remaining_size / 2;
204 const size_t right_span_size = remaining_size - left_span_size;
207 const size_t gap_start = left_span_size;
208 const size_t gap_end = str.size() - right_span_size;
209 str.replace(gap_start, gap_end - gap_start,
"...");
214 size_t visible_width = str.size();
216 ansi.NextSequence()) {
217 visible_width -= ansi.SequenceSize();
220 if (visible_width <= max_width)
225 const size_t ellipsis_width = max_width < 3 ? max_width : 3;
226 const size_t visible_left_span_size = (max_width - ellipsis_width) / 2;
227 const size_t visible_right_span_size =
228 (max_width - ellipsis_width) - visible_left_span_size;
232 const size_t visible_gap_start = visible_left_span_size;
233 const size_t visible_gap_end = visible_width - visible_right_span_size;
236 result.reserve(str.size());
259 result.append(str.begin(), str.begin() + iter.
InputIndex());
262 result.append(
"...", ellipsis_width);
273 result.append(str.begin() + iter.
InputIndex(), str.end());
275 str = std::move(result);
void ElideMiddleInPlace(std::string &str, size_t max_width)
Elide the given string str with '...' in the middle if the length exceeds max_width.
AnsiColorSequenceIterator(const std::string &input)
size_t SequenceSize() const
size_t SequenceStart() const
size_t SequenceEnd() const
bool SequenceContains(size_t input_index) const
bool FindNextSequenceFrom(const char *from)