From 94395c3e3c848865811f82950824a30a4e9b734b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 7 Jan 2025 13:01:26 +0530 Subject: [PATCH] Edit book: Spell check: Add a button to export the currently displayed list of words as a CSV file. Fixes #2092496 [[Enhacement] Spell Checker - Save word list](https://bugs.launchpad.net/calibre/+bug/2092496) --- src/calibre/gui2/tweak_book/spell.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/tweak_book/spell.py b/src/calibre/gui2/tweak_book/spell.py index 0b701ae750..847c516bb6 100644 --- a/src/calibre/gui2/tweak_book/spell.py +++ b/src/calibre/gui2/tweak_book/spell.py @@ -54,7 +54,7 @@ from qt.core import ( from calibre.constants import __appname__ from calibre.ebooks.oeb.base import NCX_MIME, OEB_DOCS, OPF_MIME from calibre.ebooks.oeb.polish.spell import get_all_words, get_checkable_file_names, merge_locations, replace_word, undo_replace_word -from calibre.gui2 import choose_files, error_dialog +from calibre.gui2 import choose_files, choose_save_file, error_dialog from calibre.gui2.complete2 import LineEdit from calibre.gui2.languages import LanguagesEdit from calibre.gui2.progress_indicator import ProgressIndicator @@ -739,6 +739,18 @@ class WordsModel(QAbstractTableModel): self.camel_case_pat = regex.compile(r'[a-z][A-Z]', flags=regex.UNICODE) self.snake_case_pat = regex.compile(r'\w_\w', flags=regex.UNICODE) + def to_csv(self): + from csv import writer as csv_writer + from io import StringIO + buf = StringIO(newline='') + w = csv_writer(buf) + w.writerow(self.headers) + cols = self.columnCount() + for r in range(self.rowCount()): + items = [self.index(r, c).data(Qt.ItemDataRole.DisplayRole) for c in range(cols)] + w.writerow(items) + return buf.getvalue() + def rowCount(self, parent=QModelIndex()): return len(self.items) @@ -1147,6 +1159,10 @@ class SpellCheck(Dialog): b.setIcon(QIcon.ic('chapters.png')) b.clicked.connect(self.change_excluded_files) self.update_exclude_button() + b = self.save_words_button = self.bb.addButton(_('&Save words'), QDialogButtonBox.ButtonRole.ActionRole) + b.setToolTip('

' + _('Save the curretly displayed list of words in a CSV file')) + b.setIcon(QIcon.ic('save.png')) + b.clicked.connect(self.save_words) self.progress = p = QWidget(self) s.addWidget(p) @@ -1312,6 +1328,14 @@ class SpellCheck(Dialog): return return Dialog.keyPressEvent(self, ev) + def save_words(self): + dest = choose_save_file(self, 'spellcheck-csv-export', _('CSV file'), filters=[(_('CSV file'), ['csv'])], + all_files=False, initial_filename=_('Words') + '.csv') + if dest: + csv = self.words_view.model().to_csv() + with open(dest, 'wb') as f: + f.write(csv.encode()) + def change_excluded_files(self): d = ManageExcludedFiles(self, self.excluded_files) if d.exec_() == QDialog.DialogCode.Accepted: