mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Start work on adding dictionaries
This commit is contained in:
parent
16e572266a
commit
b060f55d5f
@ -6,13 +6,16 @@ from __future__ import (unicode_literals, division, absolute_import,
|
|||||||
__license__ = 'GPL v3'
|
__license__ = 'GPL v3'
|
||||||
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
|
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||||
|
|
||||||
import cPickle
|
import cPickle, os
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
from PyQt4.Qt import (
|
from PyQt4.Qt import (
|
||||||
QGridLayout, QApplication, QTreeWidget, QTreeWidgetItem, Qt, QFont,
|
QGridLayout, QApplication, QTreeWidget, QTreeWidgetItem, Qt, QFont,
|
||||||
QStackedLayout, QLabel, QVBoxLayout, QVariant, QWidget, QPushButton, QIcon)
|
QStackedLayout, QLabel, QVBoxLayout, QVariant, QWidget, QPushButton, QIcon,
|
||||||
|
QDialogButtonBox, QLineEdit, QDialog, QToolButton, QFormLayout, QHBoxLayout)
|
||||||
|
|
||||||
|
from calibre.constants import __appname__
|
||||||
|
from calibre.gui2 import choose_files, error_dialog
|
||||||
from calibre.gui2.tweak_book.widgets import Dialog
|
from calibre.gui2.tweak_book.widgets import Dialog
|
||||||
from calibre.spell.dictionary import (
|
from calibre.spell.dictionary import (
|
||||||
builtin_dictionaries, custom_dictionaries, best_locale_for_language,
|
builtin_dictionaries, custom_dictionaries, best_locale_for_language,
|
||||||
@ -32,6 +35,71 @@ def country_map():
|
|||||||
_country_map = cPickle.loads(P('localization/iso3166.pickle', data=True, allow_user_override=False))
|
_country_map = cPickle.loads(P('localization/iso3166.pickle', data=True, allow_user_override=False))
|
||||||
return _country_map
|
return _country_map
|
||||||
|
|
||||||
|
class AddDictionary(QDialog):
|
||||||
|
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
QDialog.__init__(self, parent)
|
||||||
|
self.setWindowTitle(_('Add a dictionary'))
|
||||||
|
self.l = l = QFormLayout(self)
|
||||||
|
self.setLayout(l)
|
||||||
|
|
||||||
|
self.la = la = QLabel('<p>' + _(
|
||||||
|
'''{0} supports the use of OpenOffice dictionaries for spell checking. You can
|
||||||
|
download more dictionaries from <a href="{1}">the OpenOffice extensions repository</a>.
|
||||||
|
The dictionary will download as an .oxt file. Simply specify the path to the
|
||||||
|
downloaded .oxt file here to add the dictionary to {0}.'''.format(
|
||||||
|
__appname__, 'http://extensions.openoffice.org'))+'<p>')
|
||||||
|
la.setWordWrap(True)
|
||||||
|
la.setOpenExternalLinks(True)
|
||||||
|
la.setMinimumWidth(450)
|
||||||
|
l.addRow(la)
|
||||||
|
|
||||||
|
self.h = h = QHBoxLayout()
|
||||||
|
self.path = p = QLineEdit(self)
|
||||||
|
p.setPlaceholderText(_('Path to OXT file'))
|
||||||
|
h.addWidget(p)
|
||||||
|
|
||||||
|
self.b = b = QToolButton(self)
|
||||||
|
b.setIcon(QIcon(I('document_open.png')))
|
||||||
|
b.setToolTip(_('Browse for an OXT file'))
|
||||||
|
b.clicked.connect(self.choose_file)
|
||||||
|
h.addWidget(b)
|
||||||
|
l.addRow(_('&Path to OXT file:'), h)
|
||||||
|
l.labelForField(h).setBuddy(p)
|
||||||
|
|
||||||
|
self.nick = n = QLineEdit(self)
|
||||||
|
n.setPlaceholderText(_('Choose a nickname for this dictionary'))
|
||||||
|
l.addRow(_('&Nickname:'), n)
|
||||||
|
|
||||||
|
self.bb = bb = QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel)
|
||||||
|
bb.accepted.connect(self.accept)
|
||||||
|
bb.rejected.connect(self.reject)
|
||||||
|
l.addRow(bb)
|
||||||
|
b.setFocus(Qt.OtherFocusReason)
|
||||||
|
|
||||||
|
def choose_file(self):
|
||||||
|
path = choose_files(self, 'choose-dict-for-import', _('Choose OXT Dictionary'), filters=[
|
||||||
|
(_('Dictionaries', ['oxt']))], all_files=False, select_only_single_file=True)
|
||||||
|
if path is not None:
|
||||||
|
self.path.setText(path[0])
|
||||||
|
if not self.nickname:
|
||||||
|
n = os.path.basename(path[0])
|
||||||
|
self.nick.setText(n.rpartition('.')[0])
|
||||||
|
|
||||||
|
@property
|
||||||
|
def nickname(self):
|
||||||
|
return unicode(self.nick.text()).strip()
|
||||||
|
|
||||||
|
def accept(self):
|
||||||
|
nick = self.nickname
|
||||||
|
if not nick:
|
||||||
|
return error_dialog(self, _('Must specify nickname'), _(
|
||||||
|
'You must specify a nickname for this dictionary'), show=True)
|
||||||
|
if nick in {d.name for d in custom_dictionaries()}:
|
||||||
|
return error_dialog(self, _('Nickname already used'), _(
|
||||||
|
'A dictionary with the nick name "%s" already exists.'), show=True)
|
||||||
|
QDialog.accept(self)
|
||||||
|
|
||||||
class ManageDictionaries(Dialog):
|
class ManageDictionaries(Dialog):
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
@ -117,7 +185,10 @@ class ManageDictionaries(Dialog):
|
|||||||
self.dictionaries.expandAll()
|
self.dictionaries.expandAll()
|
||||||
|
|
||||||
def add_dictionary(self):
|
def add_dictionary(self):
|
||||||
pass
|
d = AddDictionary(self)
|
||||||
|
if d.exec_() == d.Accepted:
|
||||||
|
path = unicode(d.path.text())
|
||||||
|
print (path)
|
||||||
|
|
||||||
def current_item_changed(self):
|
def current_item_changed(self):
|
||||||
item = self.dictionaries.currentItem()
|
item = self.dictionaries.currentItem()
|
||||||
|
@ -10,9 +10,12 @@ import sys, glob, os, shutil
|
|||||||
|
|
||||||
from lxml import etree
|
from lxml import etree
|
||||||
|
|
||||||
|
from calibre.utils.zipfile import ZipFile
|
||||||
|
|
||||||
NS_MAP = {
|
NS_MAP = {
|
||||||
'oor': "http://openoffice.org/2001/registry",
|
'oor': "http://openoffice.org/2001/registry",
|
||||||
'xs': "http://www.w3.org/2001/XMLSchema",
|
'xs': "http://www.w3.org/2001/XMLSchema",
|
||||||
|
'manifest': 'http://openoffice.org/2001/manifest',
|
||||||
}
|
}
|
||||||
|
|
||||||
XPath = lambda x: etree.XPath(x, namespaces=NS_MAP)
|
XPath = lambda x: etree.XPath(x, namespaces=NS_MAP)
|
||||||
@ -57,5 +60,13 @@ def import_from_libreoffice_source_tree(source_path):
|
|||||||
if want_locales:
|
if want_locales:
|
||||||
raise Exception('Failed to find dictionaries for some wanted locales: %s' % want_locales)
|
raise Exception('Failed to find dictionaries for some wanted locales: %s' % want_locales)
|
||||||
|
|
||||||
|
def import_from_oxt(source_path):
|
||||||
|
with ZipFile(source_path) as zf:
|
||||||
|
root = etree.fromstring(zf.open('META-INF/manifest.xml').read())
|
||||||
|
xcu = XPath('//manifest:file-entry[@manifest:media-type="application/vnd.sun.star.configuration-data"]')(root)[0].get(
|
||||||
|
'{%s}full-path' % NS_MAP['manifest'])
|
||||||
|
dictionaries = {(dic.lstrip('/'), aff.lstrip('/')):locales for (dic, aff), locales in parse_xcu(zf.open(xcu).read(), origin='').iteritems()}
|
||||||
|
return dictionaries
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import_from_libreoffice_source_tree(sys.argv[-1])
|
import_from_libreoffice_source_tree(sys.argv[-1])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user