#!/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()