Signed-off-by: Jacob Stopak <jacob@xxxxxxxxxxxxxxxx> --- table.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/table.c b/table.c index 54cf9e4d07..87b6df8c66 100644 --- a/table.c +++ b/table.c @@ -25,15 +25,44 @@ static void build_table_border(struct strbuf *buf, int cols) static void build_table_entry(struct strbuf *buf, char *entry, int cols) { + int len = strlen(entry); + size_t col_width = (cols / 3) - 5; /* subtract for padding */ + strbuf_reset(buf); - strbuf_addchars(buf, ' ', (cols / 3 - 1 - strlen(entry)) / 2); + + /* Trim equally from both sides if it doesn't fit in column */ + if (len > col_width) { + struct strbuf start_buf = STRBUF_INIT; + struct strbuf end_buf = STRBUF_INIT; + struct strbuf entry_buf = STRBUF_INIT; + + strbuf_addstr(&start_buf, entry); + strbuf_addstr(&end_buf, entry); + + strbuf_remove(&start_buf, col_width / 2, len - col_width / 2); + strbuf_remove(&end_buf, 0, len - col_width / 2); + + strbuf_addstr(&entry_buf, start_buf.buf); + strbuf_addstr(&entry_buf, "..."); + strbuf_addstr(&entry_buf, end_buf.buf); + + entry = strbuf_detach(&entry_buf, &col_width); + len = strlen(entry); + + strbuf_release(&start_buf); + strbuf_release(&end_buf); + strbuf_release(&entry_buf); + } + + strbuf_addchars(buf, ' ', (cols / 3 - len - 1) / 2); /* left padding */ strbuf_addstr(buf, entry); - /* Bump right padding if entry length is odd */ - if (!(strlen(entry) % 2)) - strbuf_addchars(buf, ' ', (cols / 3 - 1 - strlen(entry)) / 2 + 1); + /* right padding */ + if (!(len % 2)) + /* Bump right padding if entry length is odd */ + strbuf_addchars(buf, ' ', (cols / 3 - len - 1) / 2 + 1); else - strbuf_addchars(buf, ' ', (cols / 3 - 1 - strlen(entry)) / 2); + strbuf_addchars(buf, ' ', (cols / 3 - len - 1) / 2); } static void print_table_body_line(struct strbuf *buf1, struct strbuf *buf2, struct strbuf *buf3, struct wt_status *s) -- 2.42.0.402.gbe8243af7b.dirty