Mercurial > hg > TextShaper
view textshaper/main.py @ 36:55e0579e2143
STUB: textshaper/main.py textshaper/whitespace.py
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Sat, 03 May 2014 14:47:16 -0700 |
parents | 88a69d587326 |
children | 8cf9a26b9aaa |
line wrap: on
line source
#!/usr/bin/env python # -*- coding: utf-8 -*- """ package to shape text blocks """ import argparse import os import subprocess import sys import time from .commands import Commands from .indent import deindent, indent from .whitespace import underscore from which import which HR = '--' def info(content): """gathers info about the content and returns a dict""" lines = content.splitlines() return {'lines': len(lines), 'chars': len(content), 'columns': max([len(line) for line in lines])} def display(content, keys=('lines', 'chars', 'columns'), hr=HR): """displays the content""" print (content) if keys: _info = info(content) print (hr) print ('; '.join(['{}: {}'.format(key, _info[key]) for key in keys])) def add_commands(): # TODO: do this dynamically commands = Commands() commands.add(indent, 'i') commands.add(deindent, 'd') commands.add(underscore, 'u') return commands def add_options(parser): """add options to the parser instance""" parser.add_argument('-f', '--file', dest='input', type=argparse.FileType('r'), default=sys.stdin, help="file to read from [DEFAULT: stdin]") parser.add_argument('-n', '--no-strip', dest='strip', action='store_false', default=True, help="do not strip whitespace before processing") if which('xclip'): # TODO: support e.g. xsel or python native parser.add_argument('-c', '-o', '--clip', '--copy', dest='copy_to_clipboard', action='store_true', default=False, help="copy to clipboard") parser.add_argument('-i', dest='input_from_clipboard', action='store_true', default=False, help="copy from clipboard") def main(args=sys.argv[1:]): """CLI""" # TODO: read ~/.textshaper # parse command line options parser = argparse.ArgumentParser(description=__doc__) add_options(parser) options = parser.parse_args(args) # read input if getattr(options, 'input_from_clipboard', False): content = subprocess.check_output(['xclip', '-o']) else: content = options.input.read() # get formatting commands commands = add_commands() # pre-process output if options.strip: content = content.strip() # main display loop # TODO: read input + commands try: while True: # print formatted content display(content) print (commands.display()) choice = raw_input('? ') new_content = commands(choice, content) if new_content is None: print ("Choice '{}' not recognized".format(choice)) continue content = new_content if options.copy_to_clipboard: # copy content to X clipboard process = subprocess.Popen(['xclip', '-i'], stdin=subprocess.PIPE) _, _ = process.communicate(content) except KeyboardInterrupt: sys.exit(0) if __name__ == '__main__': main()