Mercurial > hg > TextShaper
comparison textshaper/main.py @ 34:88a69d587326
round1 of commands
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Sun, 02 Mar 2014 15:33:07 -0800 |
parents | 929a5e97af3e |
children | 55e0579e2143 |
comparison
equal
deleted
inserted
replaced
33:de3148412191 | 34:88a69d587326 |
---|---|
8 import argparse | 8 import argparse |
9 import os | 9 import os |
10 import subprocess | 10 import subprocess |
11 import sys | 11 import sys |
12 import time | 12 import time |
13 from .commands import Commands | |
14 from .indent import deindent, indent | |
13 from which import which | 15 from which import which |
14 | 16 |
17 HR = '--' | |
15 | 18 |
16 def info(content): | 19 def info(content): |
17 """gathers info about the content and returns a dict""" | 20 """gathers info about the content and returns a dict""" |
18 | 21 |
19 lines = content.splitlines() | 22 lines = content.splitlines() |
20 return {'lines': len(lines), | 23 return {'lines': len(lines), |
21 'chars': len(content), | 24 'chars': len(content), |
22 'columns': max([len(line) for line in lines])} | 25 'columns': max([len(line) for line in lines])} |
23 | 26 |
24 | 27 |
25 def display(content, keys=('lines', 'chars', 'columns'), hr='--'): | 28 def display(content, keys=('lines', 'chars', 'columns'), hr=HR): |
26 """displays the content""" | 29 """displays the content""" |
27 print (content) | 30 print (content) |
28 if keys: | 31 if keys: |
29 _info = info(content) | 32 _info = info(content) |
30 print (hr) | 33 print (hr) |
31 print ('; '.join(['{}: {}'.format(key, _info[key]) | 34 print ('; '.join(['{}: {}'.format(key, _info[key]) |
32 for key in keys])) | 35 for key in keys])) |
36 | |
37 def add_commands(): | |
38 # TODO: do this dynamically | |
39 commands = Commands() | |
40 commands.add(indent, 'i') | |
41 commands.add(deindent, 'd') | |
42 return commands | |
33 | 43 |
34 def add_options(parser): | 44 def add_options(parser): |
35 """add options to the parser instance""" | 45 """add options to the parser instance""" |
36 | 46 |
37 parser.add_argument('-f', '--file', dest='input', | 47 parser.add_argument('-f', '--file', dest='input', |
40 parser.add_argument('-n', '--no-strip', dest='strip', | 50 parser.add_argument('-n', '--no-strip', dest='strip', |
41 action='store_false', default=True, | 51 action='store_false', default=True, |
42 help="do not strip whitespace before processing") | 52 help="do not strip whitespace before processing") |
43 | 53 |
44 if which('xclip'): # TODO: support e.g. xsel or python native | 54 if which('xclip'): # TODO: support e.g. xsel or python native |
45 parser.add_argument('-c', '--clip', '--copy', dest='copy_to_clipboard', | 55 parser.add_argument('-c', '-o', '--clip', '--copy', dest='copy_to_clipboard', |
46 action='store_true', default=False, | 56 action='store_true', default=False, |
47 help="copy to clipboard") | 57 help="copy to clipboard") |
48 | 58 parser.add_argument('-i', dest='input_from_clipboard', |
59 action='store_true', default=False, | |
60 help="copy from clipboard") | |
49 | 61 |
50 | 62 |
51 def main(args=sys.argv[1:]): | 63 def main(args=sys.argv[1:]): |
64 """CLI""" | |
52 | 65 |
53 # TODO: read ~/.textshaper | 66 # TODO: read ~/.textshaper |
54 | 67 |
55 # parse command line options | 68 # parse command line options |
56 parser = argparse.ArgumentParser(description=__doc__) | 69 parser = argparse.ArgumentParser(description=__doc__) |
57 add_options(parser) | 70 add_options(parser) |
58 options = parser.parse_args(args) | 71 options = parser.parse_args(args) |
59 | 72 |
60 # read input | 73 # read input |
61 content = options.input.read() | 74 if getattr(options, 'input_from_clipboard', False): |
75 content = subprocess.check_output(['xclip', '-o']) | |
76 else: | |
77 content = options.input.read() | |
78 | |
79 # get formatting commands | |
80 commands = add_commands() | |
62 | 81 |
63 # pre-process output | 82 # pre-process output |
64 if options.strip: | 83 if options.strip: |
65 content = content.strip() | 84 content = content.strip() |
66 | 85 |
67 # print formatted content | |
68 display(content) | |
69 | |
70 # main display loop | 86 # main display loop |
71 # TODO: read input + commands | 87 # TODO: read input + commands |
72 while True: | 88 try: |
73 time.sleep(1) # XXX | 89 while True: |
90 # print formatted content | |
91 display(content) | |
92 print (commands.display()) | |
93 choice = raw_input('? ') | |
94 new_content = commands(choice, content) | |
95 if new_content is None: | |
96 print ("Choice '{}' not recognized".format(choice)) | |
97 continue | |
98 content = new_content | |
74 | 99 |
75 if options.copy_to_clipboard: | 100 if options.copy_to_clipboard: |
76 # copy content to X clipboard | 101 # copy content to X clipboard |
77 process = subprocess.Popen(['xclip', '-i'], stdin=subprocess.PIPE) | 102 process = subprocess.Popen(['xclip', '-i'], stdin=subprocess.PIPE) |
78 _, _ = process.communicate(content) | 103 _, _ = process.communicate(content) |
104 except KeyboardInterrupt: | |
105 sys.exit(0) | |
79 | 106 |
80 if __name__ == '__main__': | 107 if __name__ == '__main__': |
81 main() | 108 main() |
82 | 109 |