otamachan
9/16/2013 - 12:45 AM

folder.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import re

import sys
import codecs

sys.stdout = codecs.getwriter('shift_jis')(sys.stdout)

def get_file_description(file_name):
    root, ext = os.path.splitext(file_name)
    ext = ext.lower()
    if ext == '.c':
        brief = re.compile('\s*/?\*\*\s+@brief\s+(\S*)\s*')
        for line in codecs.open(file_name, 'r', 'utf-8'):
            m = brief.match(line)
            if m:
                return m.groups()[0]
    return ''

def main():
    root_path = '../spx'
    message_len = 20
    root_path_len = len(root_path)+1
    paths = []
    for root, dirs, files in os.walk(root_path):
        if root_path == root:
            paths.append(([], files))
        else:
            paths.append((root[root_path_len:].split('\\'), files))
    dir_max_len = []
    file_max_len = 0
    for path in paths:
        for i, d in enumerate(path[0]):
            if i >= len(dir_max_len):
                dir_max_len.append(len(d))
            else:
                dir_max_len[i] = max(dir_max_len[i], len(d))
        if path[1]:
            file_max_len = max(file_max_len, max([len(x) for x in path[1]]))
    path_len = 0
    msg_line = '-'*message_len+'+'
    msg_space = ' '*message_len+'|'
    file_line = '-'*file_max_len+'+'
    file_space = ' '*file_max_len+'|'
    for path in paths:
        def make_line(dot1,sep1,dot2,sep2,half):
            if half < 0: half = 0
            return (sep1+ \
                        ''.join([dot1*l+sep1 for l in dir_max_len[0:half]])+ \
                        ''.join([dot2*l+sep2 for l in dir_max_len[half:]]))[0:-1]
        pre_path_len = path_len
        path_len = len(path[0])
        blank = min(pre_path_len, path_len-1)
        line1 = make_line(' ','+','-','+',blank)+'+'+file_line+msg_line
        line2 = ''
        for i, max_len in enumerate(dir_max_len):
            line2 += ' ' if i > path_len else '|'
            line2 += (path[0][i] if i == path_len-1 else '').ljust(max_len)
        line2 += '|'+file_space+msg_space
        line3 = make_line(' ','+',' ',' ',blank+1)+'+'+file_line+msg_line
        line4 = make_line(' ','|',' ',' ',path_len)
        print line1
        print line2
        for f in path[1]:
            print line3
            d = get_file_description(os.path.join(root_path, '\\'.join(path[0]), f))
            m = sum([ord(x) > 255 for x in d])
            print line4+'|'+f.ljust(file_max_len)+'|'+d.ljust(message_len-m)+'|'
    print make_line('-','+','-','+',0)+'+'+file_line+msg_line

if __name__ == '__main__':
    main()