Changeset 3743:5efdb4a90267 in livinglogic.python.xist

Show
Ignore:
Timestamp:
04/04/09 21:31:50 (10 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Add multicolumn mode to uls.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/ll/scripts/uls.py

    r3741 r3743  
    4040        return astyle.style_default(style_pad("."*(l-len(meas))), s) 
    4141    return s 
     42 
     43 
     44def findcolcount(urls, width, spacing): 
     45    def width4cols(numcols, spacing): 
     46        cols = [0]*numcols 
     47        rows = (len(urls)+numcols-1)//numcols 
     48        for (i, u) in enumerate(urls): 
     49            cols[i//rows] = max(cols[i//rows], len(str(u))) 
     50        return (sum(cols) + (numcols-1)*spacing, rows, cols) 
     51 
     52    numcols = len(urls) 
     53    while True: 
     54        (s, rows, cols) = width4cols(numcols, spacing) 
     55        if s <= width or numcols == 1: 
     56            return (rows, cols) 
     57        numcols -=1 
     58 
    4259 
    4360def main(args=None): 
     
    88105            stdout.writeln(astyle.style_file(str(url))) 
    89106 
    90     def printall(base, url, one, long, recursive, human): 
     107    def printblock(urls, width, spacing): 
     108        (rows, cols) = findcolcount(urls, width, spacing) 
     109        for i in xrange(rows): 
     110            for (j, w) in enumerate(cols): 
     111                index = i+j*rows 
     112                try: 
     113                    url = urls[index] 
     114                except IndexError: 
     115                    pass 
     116                else: 
     117                    if url.isdir(): 
     118                        url = astyle.style_dir(str(url)) 
     119                    else: 
     120                        url = astyle.style_file(str(url)) 
     121                    if index + rows < len(urls): 
     122                        url = rpad(url, w+spacing) 
     123                    stdout.write(url) 
     124            stdout.writeln() 
     125 
     126    def printall(base, url, one, long, recursive, human, spacing): 
    91127        if url.isdir(): 
    92128            if url.path.segments[-1][0]: 
    93129                url.path.segments.append(("",)) 
    94             if recursive: 
     130            if not long and not one: 
     131                urls = [(url/child).relative(base) for child in url.listdir()] 
     132                if urls: 
     133                    printblock(urls, width, spacing) 
     134                    if recursive: 
     135                        for child in url.dirs(): 
     136                            printall(base, url/child, one, long, recursive, human, spacing) 
     137            else: 
    95138                for child in url.listdir(): 
    96139                    printone(url/child, long, human) 
    97                     printall(base, url/child, one, long, recursive, human) 
    98             else: 
    99                 for child in url.listdir(): 
    100                     printone((url/child).relative(base), long, human) 
     140                    if recursive: 
     141                        printall(base, url/child, one, long, recursive, human, spacing) 
    101142        else: 
    102143            printone(url, long, human) 
     
    109150    p.add_option("-s", "--human-readable-sizes", dest="human", help="Output human readable sizes?", action="store_true") 
    110151    p.add_option("-r", "--recursive", dest="recursive", help="Recursive listing?", action="store_true") 
     152    p.add_option("-w", "--spacing", dest="spacing", help="Spacing between columns", type="int", default=3) 
    111153     
    112154    (options, args) = p.parse_args(args) 
     
    127169        for u in args: 
    128170            u = url.URL(u) 
    129             printall(u, u, options.one, options.long, options.recursive, options.human) 
     171            printall(u, u, options.one, options.long, options.recursive, options.human, options.spacing) 
    130172 
    131173