Skip to content

Commit

Permalink
strbuf_add_wrapped_text(): skip over colour codes
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
René Scharfe authored and Junio C Hamano committed Nov 23, 2009
1 parent 3288f20 commit 8a3c63e
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 4 deletions.
4 changes: 1 addition & 3 deletions Documentation/pretty-formats.txt
Original file line number Diff line number Diff line change
Expand Up @@ -136,9 +136,7 @@ The placeholders are:
- '%n': newline
- '%x00': print a byte from a hex code
- '%w([<w>[,<i1>[,<i2>]]])': switch line wrapping, like the -w option of
linkgit:git-shortlog[1]. NOTE: Color placeholders (`%C*`) are not
recognized as having no width, so they should not be put into wrapped
sections.
linkgit:git-shortlog[1].

NOTE: Some placeholders may depend on other options given to the
revision traversal engine. For example, the `%g*` reflog options will
Expand Down
22 changes: 21 additions & 1 deletion utf8.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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;
Expand Down

0 comments on commit 8a3c63e

Please sign in to comment.