You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
#!/usr/bin/pythonimport reimport argparseimport functoolsleading_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 freqdef 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)
|