Mercurial > hg > config
comparison python/tree2.py @ 389:2d4dfe1dc632
make delimeters flexible
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Sat, 27 Jul 2013 20:01:01 -0700 |
parents | 3678770e8c52 |
children | 9d02187611ae |
comparison
equal
deleted
inserted
replaced
388:3678770e8c52 | 389:2d4dfe1dc632 |
---|---|
9 import os | 9 import os |
10 import sys | 10 import sys |
11 | 11 |
12 # ASCII delimeters | 12 # ASCII delimeters |
13 ascii_delimeters = { | 13 ascii_delimeters = { |
14 VERTICAL_LINE = '|' | 14 'vertical_line' : '|', |
15 ITEM = '+' | 15 'item_marker' : '+', |
16 END = '\\' | 16 'last_child' : '\\' |
17 } | 17 } |
18 | 18 |
19 # unicode delimiters | 19 # unicode delimiters |
20 VERTICAL_LINE = '│' | 20 unicode_delimeters = { |
21 ITEM = '├' | 21 'vertical_line' : '│', |
22 END = '└' | 22 'item_marker' : '├', |
23 'last_child' : '└' | |
24 } | |
23 | 25 |
24 def depth(directory): | 26 def depth(directory): |
25 """returns the integer depth of a directory or path relative to '/' """ | 27 """returns the integer depth of a directory or path relative to '/' """ |
26 | 28 |
27 directory = os.path.abspath(directory) | 29 directory = os.path.abspath(directory) |
32 if not remainder: | 34 if not remainder: |
33 break | 35 break |
34 return level | 36 return level |
35 | 37 |
36 def tree(directory, | 38 def tree(directory, |
37 item_marker='', | 39 item_marker=unicode_delimeters['item_marker'], |
40 vertical_line=unicode_delimeters['vertical_line'], | |
41 last_child=unicode_delimeters['last_child'], | |
38 sort_key=lambda x: x.lower()): | 42 sort_key=lambda x: x.lower()): |
39 """ | 43 """ |
40 display tree directory structure for `directory` | 44 display tree directory structure for `directory` |
41 """ | 45 """ |
42 | 46 |
54 | 58 |
55 # sort articles of interest | 59 # sort articles of interest |
56 for resource in (dirnames, filenames): | 60 for resource in (dirnames, filenames): |
57 resource[:] = sorted(resource, key=sort_key) | 61 resource[:] = sorted(resource, key=sort_key) |
58 | 62 |
59 files_end = ITEM | 63 files_end = item_marker |
60 dirpath_marker = ITEM | 64 dirpath_marker = item_marker |
61 | 65 |
62 if level > len(indent): | 66 if level > len(indent): |
63 indent.append(VERTICAL_LINE) | 67 indent.append(vertical_line) |
64 indent = indent[:level] | 68 indent = indent[:level] |
65 | 69 |
66 if dirnames: | 70 if dirnames: |
67 files_end = ITEM | 71 files_end = item_marker |
68 last[abspath] = dirnames[-1] | 72 last[abspath] = dirnames[-1] |
69 else: | 73 else: |
70 files_end = END | 74 files_end = last_child |
71 | 75 |
72 if last.get(parent) == os.path.basename(abspath): | 76 if last.get(parent) == os.path.basename(abspath): |
73 # last directory of parent | 77 # last directory of parent |
74 dirpath_mark = END | 78 dirpath_mark = last_child |
75 indent[-1] = ' ' | 79 indent[-1] = ' ' |
76 elif not indent: | 80 elif not indent: |
77 dirpath_mark = '' | 81 dirpath_mark = '' |
78 else: | 82 else: |
79 dirpath_mark = ITEM | 83 dirpath_mark = item_marker |
80 | 84 |
81 # append the directory and piece of tree structure | 85 # append the directory and piece of tree structure |
82 # if the top-level entry directory, print as passed | 86 # if the top-level entry directory, print as passed |
83 retval.append('%s%s%s'% (''.join(indent[:-1]), | 87 retval.append('%s%s%s'% (''.join(indent[:-1]), |
84 dirpath_mark, | 88 dirpath_mark, |
85 basename if retval else directory)) | 89 basename if retval else directory)) |
86 # add the files | 90 # add the files |
87 if filenames: | 91 if filenames: |
88 last_file = filenames[-1] | 92 last_file = filenames[-1] |
89 retval.extend([('%s%s%s' % (''.join(indent), | 93 retval.extend([('%s%s%s' % (''.join(indent), |
90 files_end if filename == last_file else ITEM, | 94 files_end if filename == last_file else item_marker, |
91 filename)) | 95 filename)) |
92 for index, filename in enumerate(filenames)]) | 96 for index, filename in enumerate(filenames)]) |
93 | 97 |
94 return '\n'.join(retval) | 98 return '\n'.join(retval) |
95 | 99 |