diff --git a/addons/FastWQ.py b/addons/FastWQ.py index 55a9e5d..88cde11 100644 --- a/addons/FastWQ.py +++ b/addons/FastWQ.py @@ -21,7 +21,6 @@ from anki.hooks import addHook ############## other config here ################## shortcut = 'Ctrl+Q' -LDOCE6_PATH = u'D:\\mdx_server\\mdx\\LDOCE6.mdx' ################################################### def start_here(): @@ -34,7 +33,6 @@ def start_here(): import fastwq fastwq.config.read() - fastwq.config.LDOCE6_PATH = LDOCE6_PATH fastwq.my_shortcut = shortcut if not fastwq.have_setup: fastwq.have_setup = True diff --git a/addons/fastwq/context.py b/addons/fastwq/context.py index 03c1d33..cb40c2b 100644 --- a/addons/fastwq/context.py +++ b/addons/fastwq/context.py @@ -37,7 +37,6 @@ class Config(object): """ _CONFIG_FILENAME = u'fastwqcfg.json' #Config File Path - LDOCE6_PATH = u'' def __init__(self, window): self.path = u'_' + self._CONFIG_FILENAME diff --git a/addons/fastwq/gui/options.py b/addons/fastwq/gui/options.py index ed277ee..f2fda7e 100644 --- a/addons/fastwq/gui/options.py +++ b/addons/fastwq/gui/options.py @@ -75,14 +75,22 @@ class OptionsDialog(Dialog): 'local': [], #本地词典 'web': [] #网络词典 } - for cls in service_manager.local_services: - service = service_pool.get(cls.__unique__) + for clazz in service_manager.local_services: + service = service_pool.get(clazz.__unique__) if service and service.support: - self.dict_services['local'].append(service) - for cls in service_manager.web_services: - service = service_pool.get(cls.__unique__) + self.dict_services['local'].append({ + 'title': service.title, + 'unique': service.unique + }) + service_pool.put(service) + for clazz in service_manager.web_services: + service = service_pool.get(clazz.__unique__) if service and service.support: - self.dict_services['web'].append(service) + self.dict_services['web'].append({ + 'title': service.title, + 'unique': service.unique + }) + service_pool.put(service) # emit finished self._signal.emit('after_build') @@ -474,7 +482,7 @@ class TabContent(QWidget): # local dict service for service in services['local']: - dict_combo.addItem(service.title, userData=service.unique) + dict_combo.addItem(service['title'], userData=service['unique']) # hr if len(services['local']) > 0: @@ -482,7 +490,7 @@ class TabContent(QWidget): # web dict service for service in services['web']: - dict_combo.addItem(service.title, userData=service.unique) + dict_combo.addItem(service['title'], userData=service['unique']) def set_dict_combo_index(): #dict_combo.setCurrentIndex(-1) diff --git a/addons/fastwq/service/dict/LDOCE6.py b/addons/fastwq/service/dict/LDOCE6.py index 1446b84..49cdb0e 100644 --- a/addons/fastwq/service/dict/LDOCE6.py +++ b/addons/fastwq/service/dict/LDOCE6.py @@ -1,7 +1,6 @@ #-*- coding:utf-8 -*- import re from ..base import * -from ...context import config VOICE_PATTERN = r'' MAPPINGS = [ @@ -15,7 +14,16 @@ LANG_TO_REGEXPS = {lang: regexps for lang, regexps in MAPPINGS} class Ldoce6(MdxService): def __init__(self): - super(Ldoce6, self).__init__(config.LDOCE6_PATH) + from ...service import service_manager, service_pool + dict_path = '' + for clazz in service_manager.mdx_services: + service = service_pool.get(clazz.__unique__) + title = service.builder._title if service and service.support else u'' + service_pool.put(service) + if title.startswith(u'LDOCE6'): + dict_path = service.dict_path + break + super(Ldoce6, self).__init__(dict_path) @property def title(self): diff --git a/addons/fastwq/service/manager.py b/addons/fastwq/service/manager.py index 2f4919a..a4db63c 100644 --- a/addons/fastwq/service/manager.py +++ b/addons/fastwq/service/manager.py @@ -43,35 +43,21 @@ class ServiceManager(object): def services(self): return self.web_services + self.local_services - # def start_all(self): - # self.fetch_headers() - # make all local services available - # for service in self.local_services: - # if not service.index(only_header=True): - # self.local_services.remove(service) - def update_services(self): + self.mdx_services, self.star_dict_services = self._get_available_local_services() self.web_services, self.local_custom_services = self._get_services_from_files() - self.local_services = self._get_available_local_services() - # self.fetch_headers() # combine the customized local services into local services - self.local_services = self.local_services + self.local_custom_services + self.local_services = self.mdx_services + self.star_dict_services + self.local_custom_services def get_service(self, unique): # webservice unique: class name - # mdxservice unique: dict filepath + # mdxservice unique: md5 of dict filepath for each in self.services: if each.__unique__ == unique: - #cls = getattr(each,"__class__") service = each() service.unique = unique return service - def get_service_action(self, service, label): - for each in service.fields: - if each.label == label: - return each - def _get_services_from_files(self, *args): """ get service from service packages, available type is @@ -80,41 +66,42 @@ class ServiceManager(object): service_path = u'dict' web_services, local_custom_services = list(), list() mypath = os.path.join(os.path.dirname(os.path.realpath(__file__)), service_path) - files = [f for f in os.listdir(mypath) - if f not in ('__init__.py') and not f.endswith('.pyc') and not os.path.isdir(mypath+os.sep+f)] - base_class = (WebService, LocalService, - MdxService, StardictService) - + files = [ + f for f in os.listdir(mypath) \ + if f not in ('__init__.py') and \ + not f.endswith('.pyc') and \ + not os.path.isdir(mypath+os.sep+f) + ] + base_class = ( + WebService, + LocalService, + MdxService, + StardictService + ) for f in files: #try: module = importlib.import_module( u'.%s.%s' % (service_path, os.path.splitext(f)[0]), __package__ ) - for name, cls in inspect.getmembers(module, predicate=inspect.isclass): - if cls in base_class: + for name, clazz in inspect.getmembers(module, predicate=inspect.isclass): + if clazz in base_class: continue - #try: - #service = cls(*args) - service = service_wrap(cls, *args) + service = service_wrap(clazz, *args) service.__unique__ = name - if issubclass(cls, WebService): + if issubclass(clazz, WebService): web_services.append(service) # get the customized local services - if issubclass(cls, LocalService): + if issubclass(clazz, LocalService): local_custom_services.append(service) - #except Exception: - # exclude the local service whose path has error. - # pass - #except ImportError: - # continue return web_services, local_custom_services def _get_available_local_services(self): ''' available local dictionary services ''' - local_services = list() + mdx_services = list() + star_dict_services = list() for each in config.dirs: for dirpath, dirnames, filenames in os.walk(each): for filename in filenames: @@ -124,11 +111,11 @@ class ServiceManager(object): if MdxService.check(dict_path): service = service_wrap(MdxService, dict_path) service.__unique__ = md5(dict_path).hexdigest() - local_services.append(service) + mdx_services.append(service) #Stardict if StardictService.check(dict_path): service = service_wrap(StardictService, dict_path) service.__unique__ = md5(dict_path).hexdigest() - local_services.append(service) + star_dict_services.append(service) # support mdx dictionary and stardict format dictionary - return local_services + return mdx_services, star_dict_services diff --git a/addons21/fastwq/__init__.py b/addons21/fastwq/__init__.py index 4fe8419..3f45864 100644 --- a/addons21/fastwq/__init__.py +++ b/addons21/fastwq/__init__.py @@ -18,19 +18,17 @@ # along with this program. If not, see . from anki.hooks import addHook -from . import common as fastwq -from .context import config ############## other config here ################## shortcut = 'Ctrl+Q' -LDOCE6_PATH = u'D:\\mdx_server\\mdx\\LDOCE6.mdx' ################################################### def start_here(): + from . import common as fastwq + from .context import config config.read() - config.LDOCE6_PATH = LDOCE6_PATH fastwq.my_shortcut = shortcut if not fastwq.have_setup: fastwq.have_setup = True diff --git a/addons21/fastwq/context.py b/addons21/fastwq/context.py index 619c3a9..6edf81f 100644 --- a/addons21/fastwq/context.py +++ b/addons21/fastwq/context.py @@ -37,7 +37,6 @@ class Config(object): """ _CONFIG_FILENAME = 'fastwqcfg.json' #Config File Path - LDOCE6_PATH = '' def __init__(self, window): self.path = u'_' + self._CONFIG_FILENAME diff --git a/addons21/fastwq/gui/options.py b/addons21/fastwq/gui/options.py index ed277ee..f2fda7e 100644 --- a/addons21/fastwq/gui/options.py +++ b/addons21/fastwq/gui/options.py @@ -75,14 +75,22 @@ class OptionsDialog(Dialog): 'local': [], #本地词典 'web': [] #网络词典 } - for cls in service_manager.local_services: - service = service_pool.get(cls.__unique__) + for clazz in service_manager.local_services: + service = service_pool.get(clazz.__unique__) if service and service.support: - self.dict_services['local'].append(service) - for cls in service_manager.web_services: - service = service_pool.get(cls.__unique__) + self.dict_services['local'].append({ + 'title': service.title, + 'unique': service.unique + }) + service_pool.put(service) + for clazz in service_manager.web_services: + service = service_pool.get(clazz.__unique__) if service and service.support: - self.dict_services['web'].append(service) + self.dict_services['web'].append({ + 'title': service.title, + 'unique': service.unique + }) + service_pool.put(service) # emit finished self._signal.emit('after_build') @@ -474,7 +482,7 @@ class TabContent(QWidget): # local dict service for service in services['local']: - dict_combo.addItem(service.title, userData=service.unique) + dict_combo.addItem(service['title'], userData=service['unique']) # hr if len(services['local']) > 0: @@ -482,7 +490,7 @@ class TabContent(QWidget): # web dict service for service in services['web']: - dict_combo.addItem(service.title, userData=service.unique) + dict_combo.addItem(service['title'], userData=service['unique']) def set_dict_combo_index(): #dict_combo.setCurrentIndex(-1) diff --git a/addons21/fastwq/service/dict/LDOCE6.py b/addons21/fastwq/service/dict/LDOCE6.py index 9adcef2..fc0f0fa 100644 --- a/addons21/fastwq/service/dict/LDOCE6.py +++ b/addons21/fastwq/service/dict/LDOCE6.py @@ -1,7 +1,6 @@ #-*- coding:utf-8 -*- import re from ..base import * -from ...context import config VOICE_PATTERN = r'' @@ -16,7 +15,16 @@ LANG_TO_REGEXPS = {lang: regexps for lang, regexps in MAPPINGS} class Ldoce6(MdxService): def __init__(self): - super(Ldoce6, self).__init__(config.LDOCE6_PATH) + from ...service import service_manager, service_pool + dict_path = '' + for clazz in service_manager.mdx_services: + service = service_pool.get(clazz.__unique__) + title = service.builder._title if service and service.support else u'' + service_pool.put(service) + if title.startswith(u'LDOCE6'): + dict_path = service.dict_path + break + super(Ldoce6, self).__init__(dict_path) @property def title(self): diff --git a/addons21/fastwq/service/manager.py b/addons21/fastwq/service/manager.py index f17abbe..dc34d6e 100644 --- a/addons21/fastwq/service/manager.py +++ b/addons21/fastwq/service/manager.py @@ -17,7 +17,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import sys import inspect import os from hashlib import md5 @@ -39,35 +38,21 @@ class ServiceManager(object): def services(self): return self.web_services + self.local_services - # def start_all(self): - # self.fetch_headers() - # make all local services available - # for service in self.local_services: - # if not service.index(only_header=True): - # self.local_services.remove(service) - def update_services(self): + self.mdx_services, self.star_dict_services = self._get_available_local_services() self.web_services, self.local_custom_services = self._get_services_from_files() - self.local_services = self._get_available_local_services() - # self.fetch_headers() # combine the customized local services into local services - self.local_services = self.local_services + self.local_custom_services + self.local_services = self.mdx_services + self.star_dict_services + self.local_custom_services def get_service(self, unique): # webservice unique: class name - # mdxservice unique: dict filepath + # mdxservice unique: md5 of dict filepath for each in self.services: if each.__unique__ == unique: - #cls = getattr(each,"__class__") service = each() service.unique = unique return service - def get_service_action(self, service, label): - for each in service.fields: - if each.label == label: - return each - def _get_services_from_files(self, *args): """ get service from service packages, available type is @@ -76,41 +61,42 @@ class ServiceManager(object): service_path = u'dict' web_services, local_custom_services = list(), list() mypath = os.path.join(os.path.dirname(os.path.realpath(__file__)), service_path) - files = [f for f in os.listdir(mypath) - if f not in ('__init__.py') and not f.endswith('.pyc') and not os.path.isdir(mypath+os.sep+f)] - base_class = (WebService, LocalService, - MdxService, StardictService) - + files = [ + f for f in os.listdir(mypath) \ + if f not in ('__init__.py') and \ + not f.endswith('.pyc') and \ + not os.path.isdir(mypath+os.sep+f) + ] + base_class = ( + WebService, + LocalService, + MdxService, + StardictService + ) for f in files: #try: module = importlib.import_module( u'.%s.%s' % (service_path, os.path.splitext(f)[0]), __package__ ) - for name, cls in inspect.getmembers(module, predicate=inspect.isclass): - if cls in base_class: + for name, clazz in inspect.getmembers(module, predicate=inspect.isclass): + if clazz in base_class: continue - #try: - #service = cls(*args) - service = service_wrap(cls, *args) + service = service_wrap(clazz, *args) service.__unique__ = name - if issubclass(cls, WebService): + if issubclass(clazz, WebService): web_services.append(service) # get the customized local services - if issubclass(cls, LocalService): + if issubclass(clazz, LocalService): local_custom_services.append(service) - #except Exception: - # exclude the local service whose path has error. - # pass - #except ImportError: - # continue return web_services, local_custom_services def _get_available_local_services(self): ''' available local dictionary services ''' - local_services = list() + mdx_services = list() + star_dict_services = list() for each in config.dirs: for dirpath, dirnames, filenames in os.walk(each): for filename in filenames: @@ -120,11 +106,11 @@ class ServiceManager(object): if MdxService.check(dict_path): service = service_wrap(MdxService, dict_path) service.__unique__ = md5(str(dict_path).encode('utf-8')).hexdigest() - local_services.append(service) + mdx_services.append(service) #Stardict if StardictService.check(dict_path): service = service_wrap(StardictService, dict_path) service.__unique__ = md5(str(dict_path).encode('utf-8')).hexdigest() - local_services.append(service) + star_dict_services.append(service) # support mdx dictionary and stardict format dictionary - return local_services + return mdx_services, star_dict_services