aboutsummaryrefslogtreecommitdiffstats
path: root/python/refcat/utils.py
blob: 30f35930af375a9ee074b6004bc56d3018452347 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
"""
Assorted utilities.
"""

import io


def columnize(lines, term_width=80, indent=0, pad=2):
    n_lines = len(lines)
    if n_lines == 0:
        return

    col_width = max(len(line) for line in lines)
    n_cols = int((term_width + pad - indent) / (col_width + pad))
    n_cols = min(n_lines, max(1, n_cols))

    col_len = int(n_lines / n_cols) + (0 if n_lines % n_cols == 0 else 1)
    if (n_cols - 1) * col_len >= n_lines:
        n_cols -= 1

    cols = [lines[i * col_len:i * col_len + col_len] for i in range(n_cols)]

    rows = list(zip(*cols))
    rows_missed = zip(*[col[len(rows):] for col in cols[:-1]])
    rows.extend(rows_missed)

    sio = io.StringIO()
    for row in rows:
        sio.write(" " * indent + (" " * pad).join(line.ljust(col_width) for line in row) + "\n")

    return sio.getvalue()