diff --git a/core/reader.py b/core/reader.py index cfc1b9d..600dbcf 100644 --- a/core/reader.py +++ b/core/reader.py @@ -17,6 +17,7 @@ import os +import tarfile from PyQt4 import QtGui, QtCore from reader_ui import Ui_MainWindowReader from preferences import DialogPreferences @@ -160,7 +161,8 @@ class MainWindowReader(QtGui.QMainWindow, Ui_MainWindowReader): filename = QtGui.QFileDialog.getOpenFileName( parent=self, caption='Select a file to open', - filter='Text files (*.txt);;All files (*.*)' + filter='Archive files (*.bz2 *.gz *.tar *.tgz);;Text files (*.txt);;All files (*.*)', + selectedFilter='Text files (*.txt)' ) if not filename.isNull(): self.openFile(filename) @@ -318,8 +320,7 @@ class MainWindowReader(QtGui.QMainWindow, Ui_MainWindowReader): def openFile(self, filename): filename = unicode(filename) try: - with open(filename, 'rb') as fp: - content = fp.read() + content = self.openFileByExtension(filename) except IOError: self.setStatus(u'Failed to load file {0}'.format(filename)) QtGui.QMessageBox.critical(self, 'Yomichan', 'Cannot open file for read') @@ -348,6 +349,46 @@ class MainWindowReader(QtGui.QMainWindow, Ui_MainWindowReader): self.setStatus(u'Loaded file {0}'.format(filename)) self.setWindowTitle(u'Yomichan - {0} ({1})'.format(os.path.split(filename)[1], encoding)) + + def openFileByExtension(self, filename): + if tarfile.is_tarfile(filename): + # opening an empty tar file raises ReadError + with tarfile.open(filename, 'r:*') as tp: + files = [f for f in tp.getnames() if tp.getmember(f).isfile()] + if len(files) == 0: + content = unicode() + elif len(files) == 1: + fp = tp.extractfile(files[0]) + content = fp.read() + fp.close() + else: + # Using index because of encoding difficulties + (index, ok) = self.selectItem([f.decode('utf-8') for f in files]) + if ok: + fp = tp.extractfile(files[index - 1]) + content = fp.read() + fp.close() + else: + content = unicode() + else: + with open(filename, 'rb') as fp: + content = fp.read() + return content + + def selectItem(self, list): + items = [self.formatQString(i, x) for i, x in enumerate(list)] + (item, ok) = QtGui.QInputDialog.getItem( + self, + 'Yomichan', + 'Select file to open:', + items, + current = 0, + editable=False) + (index, success) = item.split('.').first().toInt() + return (index, ok and success) + + def formatQString(self, index, item): + return QtCore.QString(str(index + 1) + '. ').append(QtCore.QString(item)) def closeFile(self): self.setWindowTitle('Yomichan')