strbuf_add_wrapped_text(): skip over colour codes
Ignore display mode escape sequences (colour codes) for the purpose of text wrapping because they don't have a visible width. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
3288f20171
commit
8a3c63e01d
22
utf8.c
22
utf8.c
@ -314,6 +314,20 @@ static void strbuf_add_indented_text(struct strbuf *buf, const char *text,
|
||||
}
|
||||
}
|
||||
|
||||
static size_t display_mode_esc_sequence_len(const char *s)
|
||||
{
|
||||
const char *p = s;
|
||||
if (*p++ != '\033')
|
||||
return 0;
|
||||
if (*p++ != '[')
|
||||
return 0;
|
||||
while (isdigit(*p) || *p == ';')
|
||||
p++;
|
||||
if (*p++ != 'm')
|
||||
return 0;
|
||||
return p - s;
|
||||
}
|
||||
|
||||
/*
|
||||
* Wrap the text, if necessary. The variable indent is the indent for the
|
||||
* first line, indent2 is the indent for all other lines.
|
||||
@ -337,7 +351,13 @@ int strbuf_add_wrapped_text(struct strbuf *buf,
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
char c = *text;
|
||||
char c;
|
||||
size_t skip;
|
||||
|
||||
while ((skip = display_mode_esc_sequence_len(text)))
|
||||
text += skip;
|
||||
|
||||
c = *text;
|
||||
if (!c || isspace(c)) {
|
||||
if (w < width || !space) {
|
||||
const char *start = bol;
|
||||
|
Reference in New Issue
Block a user