diff --git a/application.py b/application.py index 71d38d1..43bf940 100755 --- a/application.py +++ b/application.py @@ -857,26 +857,28 @@ class Application(object): def draw_nothing(self): self.win.addstr(self.y-1, 0, util.pad('', self.x - 1)) -def open_aes_file(path, nl, name=None, binary=False): +def open_aes_file(path, name=None, binary=False): if os.path.isfile(path) or not os.path.exists(path): p = getpass.getpass("Please enter the AES password: ") - return buffer.AesBuffer(path, p, nl, name) + return buffer.AesBuffer(path, p, name) else: raise Exception, "can't open %r; unsupported file type" % path -def open_plain_file(path, nl, name=None, binary=False): +def open_plain_file(path, name=None, binary=False): if os.path.isfile(path) or not os.path.exists(path): if binary: - return buffer.Binary32Buffer(path, nl, name) + return buffer.Binary32Buffer(path, name) else: - return buffer.FileBuffer(path, nl, name) + return buffer.FileBuffer(path, name) elif os.path.isdir(path): - return buffer.DirBuffer(path, nl, name) + return buffer.DirBuffer(path, name) else: raise Exception, "can't open %r; unsupported file type" % path if __name__ == "__main__": - ciphers = { 'none': open_plain_file, 'aes': open_aes_file } - linetypes = { 'win': '\r\n', 'mac': '\r', 'unix': '\n' } + ciphers = { + 'none': open_plain_file, + 'aes': open_aes_file, + } # preprocess args argv = list(sys.argv[1:]) @@ -908,8 +910,6 @@ if __name__ == "__main__": help='decrypt and encrypt with CIPHER (default: none)') parser.add_option('-g', '--goto', dest='goto', metavar='NUM', type='int', help='jump to line NUM of the first argument') - parser.add_option('-l', '--line-end', dest='linetype', metavar='TYPE', - help='use TYPE (win,mac,unix) line endings (default: unix)') parser.add_option('-m', '--mode', dest='mode', metavar='MODE', help='open arguments in MODE') @@ -928,12 +928,6 @@ if __name__ == "__main__": if goto_line: opts.goto = goto_line - # figure out which kind of line types we're using - if opts.linetype not in linetypes: - sys.stderr.write('invalid linetype: %r' % opts.linetype) - sys.exit(1) - nl = linetypes[opts.linetype] - # figure out what kind of file open function to use if opts.cipher not in ciphers: sys.stderr.write('invalid cipher: %r' % opts.cipher) @@ -959,12 +953,12 @@ if __name__ == "__main__": name = auxname try: - b = f(path, nl, name, opts.binary) + b = f(path, name, opts.binary) b.open() except buffer.BinaryDataException, e: if not opts.mode: opts.mode = 'hex' - b = f(path, nl, name, True) + b = f(path, name, True) b.open() buffers.append(b) diff --git a/buffer.py b/buffer.py index 7b69be9..988dfdc 100644 --- a/buffer.py +++ b/buffer.py @@ -50,19 +50,38 @@ class DelMove(object): # abstract class class Buffer(object): - btype = 'generic' - def __init__(self, nl='\n', stack_limit=STACK_LIMIT): - assert nl in ('\n', '\r', '\r\n'), "Invalid line ending" + btype = 'generic' + mac_re = re.compile('\r(?!\n)') + unix_re = re.compile('(?= win_c and unix_c >= mac_c: + return '\n' + elif mac_c >= win_c: + return '\r' + else: + return '\r\n' + # basic file operation stuff def _open_file_r(self, path): path = os.path.realpath(path) @@ -175,8 +194,8 @@ class Buffer(object): return n def num_lines(self): return len(self.lines) - def make_string(self, nl='\n'): - return nl.join(self.lines) + def make_string(self): + return self.nl.join(self.lines) # methods to be overridden by subclasses def name(self): @@ -200,7 +219,7 @@ class Buffer(object): raise Exception, "oh no! %r already exists" % path # create the string that we're going to write into the file - data = self.write_filter(self.make_string(nl=self.nl)) + data = self.write_filter(self.make_string()) # create a safe temporary path to write to, and write out data to it temp_path = self._temp_path() @@ -339,8 +358,8 @@ class ScratchBuffer(Buffer): class DataBuffer(Buffer): btype = 'data' - def __init__(self, name, data, nl='\n'): - Buffer.__init__(self, nl) + def __init__(self, name, data): + Buffer.__init__(self) self._name = name self.lines = data.split("\n") def name(self): @@ -361,8 +380,8 @@ class ConsoleBuffer(Buffer): b = object.__new__(ConsoleBuffer, *args, **kwargs) console = b return console - def __init__(self, nl='\n'): - Buffer.__init__(self, nl) + def __init__(self): + Buffer.__init__(self) self.clear() def clear(self): lines = ['Python Console\n', @@ -385,9 +404,9 @@ class BinaryDataException(Exception): class FileBuffer(Buffer): btype = 'file' - def __init__(self, path, nl='\n', name=None): + def __init__(self, path, name=None): '''fb = FileBuffer(path)''' - Buffer.__init__(self, nl) + Buffer.__init__(self) self.path = os.path.realpath(path) self.checksum = None if name is None: @@ -445,6 +464,7 @@ class FileBuffer(Buffer): self.store_checksum(data) else: data = '' + self.nl = self._detect_nl_type(data) data = self.read_filter(data) data = data.replace("\t", " ") for i in range(0, min(len(data), 8)): @@ -478,7 +498,7 @@ class FileBuffer(Buffer): raise Exception, "oh no! %r has changed on-disk!" % self.path temp_path = self._temp_path() - data = self.make_string(nl=self.nl) + data = self.make_string() if self.windows[0].mode.savetabs: data = data.replace(" ", "\t") @@ -501,9 +521,9 @@ class FileBuffer(Buffer): class AesBuffer(FileBuffer): btype = 'aesfile' - def __init__(self, path, password, nl='\n', name=None): + def __init__(self, path, password, name=None): '''fb = FileBuffer(path)''' - FileBuffer.__init__(self, path, nl, name) + FileBuffer.__init__(self, path, name) self.password = password def read_filter(self, data): return aes.decrypt_data(data, self.password) @@ -518,9 +538,9 @@ class Binary32Buffer(FileBuffer): bytepad = 1 data = None wordsize = 4 - def __init__(self, path, nl='\n', name=None): + def __init__(self, path, name=None): '''fb = FileBuffer(path)''' - FileBuffer.__init__(self, path, nl, name) + FileBuffer.__init__(self, path, name) def cursorx_to_datax(self, cy, cx): bytespace = 2 + self.bytepad groupspace = bytespace * self.groupsize - self.bytepad + self.grouppad @@ -593,8 +613,8 @@ class Binary32Buffer(FileBuffer): class DirBuffer(Buffer): btype = 'dir' - def __init__(self, path, nl='\n', name=None): - Buffer.__init__(self, nl) + def __init__(self, path, name=None): + Buffer.__init__(self) self.path = os.path.realpath(path) def changed(self): return False @@ -650,8 +670,8 @@ class DirBuffer(Buffer): class PathListBuffer(DirBuffer): btype = 'pathlist' - def __init__(self, name, paths, nl='\n'): - Buffer.__init__(self, nl) + def __init__(self, name, paths): + Buffer.__init__(self) self.paths = list(paths) self.path = os.getcwd() self._name = name @@ -721,12 +741,12 @@ class ColorDataBuffer(DataBuffer): btype = 'colordata' modename = 'colortext' color_re = re.compile(r'\[([a-z:]+)\]') - def __init__(self, name, data, nl='\n'): + def __init__(self, name, data): data2 = ColorHighlighter.color_re.sub('', data) data2 = data2.replace('\\[', '[') data2 = data2.replace('\\]', ']') data2 = data2.replace('\\\\', '\\') - DataBuffer.__init__(self, name, data2, nl) + DataBuffer.__init__(self, name, data2) lines = data.split(self.nl) self.highlights = { 'Colortext': ColorHighlighter(),