From 36e34a23c2a0557430962141dfcb78714c3c2490 Mon Sep 17 00:00:00 2001 From: rlbr Date: Tue, 13 Nov 2018 15:33:17 -0600 Subject: [PATCH] all functionality done --- .gitignore | 1 + indenter.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 .gitignore create mode 100755 indenter.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/indenter.py b/indenter.py new file mode 100755 index 0000000..533e2fb --- /dev/null +++ b/indenter.py @@ -0,0 +1,51 @@ +#!/usr/bin/python +import re +import argparse +import functools +leading_whitespace = re.compile(r'^( +)(?! )') +#@functools.lru_cache(maxsize=None) +def get_whitespaces_re(line): + return leading_whitespace.match(line) +def get_indent_frequency(lines): + lens = sorted(match.span()[1] for match in filter(bool,map(get_whitespaces_re,lines))) + freq = {} + for i in range(len(lens)-1): + p = lens[i] + n = lens[i+1] + diff = n - p + if diff > 0: + new_val = freq.get(diff,0) + 1 + freq[diff] = new_val + return freq +def get_best_canitdate(lines): + freqs = get_indent_frequency(lines) + if freqs: + return sorted(freqs.keys(),key = lambda k: freqs[k],reverse=True)[0] +def change_all(text,new_indent): + lines = text.split('\n') + i = get_best_canitdate(lines) + for row,line in enumerate(lines): + prev_whitespaces = get_whitespaces_re(line) + if prev_whitespaces is not None: + prev_len = prev_whitespaces.span()[1] + n,remaining = divmod(prev_len,i) + if remaining*2 >= i: + n += 1 + stripped = line.lstrip(' ') + lines[row] = ' '*(new_indent*n) + stripped + return '\n'.join(lines) +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-o',help='output file') + parser.add_argument('file') + parser.add_argument('indent',type=int) + args = parser.parse_args() + with open(args.file) as file: + text = file.read() + new = change_all(text,args.indent) + if args.o: + with open(args.o,'w') as file: + file.write(new) + else: + with open(args.file,'w') as file: + file.write(new)