diff options
author | Guido van Rossum <guido@python.org> | 2002-12-02 13:08:53 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2002-12-02 13:08:53 (GMT) |
commit | c706c28d75f1455a39e4eca3cf6ddc4be3002149 (patch) | |
tree | 7c83ba7bfe159bfd103ccb8d3d0a3346f76de596 | |
parent | 3b10dc3554f9820b21d4c95bc3f1c1e6f5d4bf94 (diff) | |
download | cpython-c706c28d75f1455a39e4eca3cf6ddc4be3002149.zip cpython-c706c28d75f1455a39e4eca3cf6ddc4be3002149.tar.gz cpython-c706c28d75f1455a39e4eca3cf6ddc4be3002149.tar.bz2 |
Add a better columnizer to print_topics().
-rw-r--r-- | Lib/cmd.py | 65 |
1 files changed, 58 insertions, 7 deletions
@@ -319,10 +319,61 @@ class Cmd: print header if self.ruler: print self.ruler * len(header) - (cmds_per_line,junk)=divmod(maxcol,cmdlen) - col=cmds_per_line - for cmd in cmds: - if col==0: print - print (("%-"+`cmdlen`+"s") % cmd), - col = (col+1) % cmds_per_line - print "\n" + self.columnize(cmds, maxcol-1) + print + + def columnize(self, list, displaywidth=80): + """Display a list of strings as a compact set of columns. + + Each column is only as wide as necessary. + Columns are separated by two spaces (one was not legible enough). + """ + if not list: + print "<empty>" + return + nonstrings = [i for i in range(len(list)) + if not isinstance(list[i], str)] + if nonstrings: + raise TypeError, ("list[i] not a string for i in %s" % + ", ".join(map(str, nonstrings))) + size = len(list) + if size == 1: + print list[0] + return + # Try every row count from 1 upwards + for nrows in range(1, len(list)): + ncols = (size+nrows-1) // nrows + colwidths = [] + totwidth = -2 + for col in range(ncols): + colwidth = 0 + for row in range(nrows): + i = row + nrows*col + if i >= size: + break + x = list[i] + colwidth = max(colwidth, len(x)) + colwidths.append(colwidth) + totwidth += colwidth + 2 + if totwidth > displaywidth: + break + if totwidth <= displaywidth: + break + else: + nrows = len(list) + ncols = 1 + colwidths = [0] + for row in range(nrows): + texts = [] + for col in range(ncols): + i = row + nrows*col + if i >= size: + x = "" + else: + x = list[i] + texts.append(x) + while texts and not texts[-1]: + del texts[-1] + for col in range(len(texts)): + texts[col] = texts[col].ljust(colwidths[col]) + print " ".join(texts) |