Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Natlinksettingsdir #56

Merged
merged 5 commits into from
Oct 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/natlinkcore/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'''Python portion of Natlink, a compatibility module for Dragon Naturally Speaking
The python stuff including test modules'''
__version__="5.3.5"
__version__="5.3.6"
#pylint:disable=
from pathlib import Path

Expand Down
21 changes: 16 additions & 5 deletions src/natlinkcore/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,9 +260,12 @@ def _call_and_catch_all_exceptions(self, fn: Callable[[], None]) -> None:

def unload_module(self, module: ModuleType) -> None:
unload = getattr(module, 'unload', None)
if unload is not None:
self.logger.debug(f'unloading module: {module.__name__}')
self._call_and_catch_all_exceptions(unload)
if unload is None:
self.logger.info(f'cannot unload module {module.__name__}')
return
self.logger.debug(f'unloading module: {module.__name__}')
self._call_and_catch_all_exceptions(unload)


@staticmethod
def _import_module_from_path(mod_path: Path) -> ModuleType:
Expand Down Expand Up @@ -357,6 +360,13 @@ def load_or_reload_modules(self, mod_paths: Iterable[Path], force_load: bool = N
for mod_path in mod_paths:
self.load_or_reload_module(mod_path, force_load=force_load)
self.seen.add(mod_path)

def unload_all_loaded_modules(self):
"""unload the modules that are loaded, and empty the bad modules list
"""
for module in self.loaded_modules.values():
self.unload_module(module)
self.bad_modules.clear()

def remove_modules_that_no_longer_exist(self) -> None:
mod_paths = self.module_paths_for_user
Expand Down Expand Up @@ -401,6 +411,8 @@ def on_change_callback(self, change_type: str, args: Any) -> None:
self.set_user_language(args)
self.logger.debug(f'on_change_callback, user "{self.user}", profile: "{self.profile}", language: "{self.language}"')
if self.config.load_on_user_changed:
# added line, QH, 2023-10-08
self.unload_all_loaded_modules()
self.trigger_load(force_load=True)
elif change_type == 'mic' and args == 'on':
self.logger.debug('on_change_callback called with: "mic", "on"')
Expand Down Expand Up @@ -487,10 +499,9 @@ def set_user_language(self, args: Any = None):
self.logger.debug(f'set_user_language, user: "{self.user}", profile: "{self.profile}", language: "{self.language}"')
else:
self.user, self.profile = '', ''
self.logger.warning('set_user_language, cannot get input for get_user_language, set to "enx",\n\tprobably Dragon is not running')
self.logger.warning('set_user_language, cannot get input for get_user_language, set to "enx",\n\tprobably Dragon is not running or you are preforming pytests')
self.language = 'enx'


def start(self) -> None:
self.logger.info(f'Starting natlink loader from config file:\n\t"{self.config.config_path}"')
natlink.active_loader = self
Expand Down
62 changes: 31 additions & 31 deletions src/natlinkcore/natlinkstatus.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ class NatlinkStatus(metaclass=singleton.Singleton):

"""
known_directory_options = ['userdirectory', 'dragonflyuserdirectory',
'unimacrodirectory', 'unimacrogrammarsdirectory',
'unimacrodirectory',
'vocoladirectory', 'vocolagrammarsdirectory']

def __init__(self):
Expand All @@ -152,7 +152,7 @@ def __init__(self):
## Unimacro:
self.UnimacroDirectory = None
self.UnimacroUserDirectory = None
self.UnimacroGrammarsDirectory = None
# self.UnimacroGrammarsDirectory = None
self.UnimacroDataDirectory = None
## Vocola:
self.VocolaUserDirectory = None
Expand Down Expand Up @@ -426,34 +426,34 @@ def getUnimacroDataDirectory(self):

return um_data_dir

def getUnimacroGrammarsDirectory(self):
"""return the path to the directory where (part of) the ActiveGrammars of Unimacro are located.

By default in the UnimacroGrammars subdirectory of site-packages/unimacro, but look in natlink.ini file...

"""
isdir, abspath = os.path.isdir, os.path.abspath
if self.UnimacroGrammarsDirectory is not None:
return self.UnimacroGrammarsDirectory
key = 'unimacrogrammarsdirectory'
value = self.natlinkmain.getconfigsetting(section="directories", option=key)
if not value:
self.UnimacroGrammarsDirectory = ''
return ''
if isdir(value):
self.UnimacroGrammarDirectory = value
return abspath(value)

expanded = config.expand_path(value)
if expanded and isdir(expanded):
self.UnimacroGrammarDirectory = abspath(expanded)
return self.UnimacroGrammarDirectory

# check_natlinkini =
self.UnimacroGrammarsDirectory = ''

return ''

# def getUnimacroGrammarsDirectory(self):
# """return the path to the directory where (part of) the ActiveGrammars of Unimacro are located.
#
# By default in the UnimacroGrammars subdirectory of site-packages/unimacro, but look in natlink.ini file...
#
# """
# isdir, abspath = os.path.isdir, os.path.abspath
# if self.UnimacroGrammarsDirectory is not None:
# return self.UnimacroGrammarsDirectory
# key = 'unimacrogrammarsdirectory'
# value = self.natlinkmain.getconfigsetting(section="directories", option=key)
# if not value:
# self.UnimacroGrammarsDirectory = ''
# return ''
# if isdir(value):
# self.UnimacroGrammarDirectory = value
# return abspath(value)
#
# expanded = config.expand_path(value)
# if expanded and isdir(expanded):
# self.UnimacroGrammarDirectory = abspath(expanded)
# return self.UnimacroGrammarDirectory
#
# # check_natlinkini =
# self.UnimacroGrammarsDirectory = ''
#
# return ''
#
def getNatlinkDirectory(self):
"""return the path of the NatlinkDirectory, where the _natlink_core.pyd package (C++ code) is
"""
Expand Down Expand Up @@ -807,7 +807,7 @@ def getNatlinkStatusString(self):
## Unimacro:
if D['unimacroIsEnabled']:
self.appendAndRemove(L, D, 'unimacroIsEnabled', "---Unimacro is enabled")
for key in ('UnimacroUserDirectory', 'UnimacroDirectory', 'UnimacroGrammarsDirectory', 'UnimacroDataDirectory'):
for key in ('UnimacroUserDirectory', 'UnimacroDirectory', 'UnimacroDataDirectory'):
self.appendAndRemove(L, D, key)
else:
self.appendAndRemove(L, D, 'unimacroIsEnabled', "---Unimacro is disabled")
Expand Down
91 changes: 64 additions & 27 deletions src/natlinkcore/nsformat.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
removed pre 11 things,
now for python3 version, with (normally) DNSVersion 15 (QH, June 2020)/Febr 2022
"""
#pylint:disable=C0116, C0123, R0911, R0912, R0915, R0916
#pylint:disable=C0116, C0123, R0911, R0912, R0915, R0916, R1735, R1728
import copy
import natlink

Expand Down Expand Up @@ -51,37 +51,37 @@
if name.startswith('flag_') and isinstance(globals()[name], int) and 0 < globals()[name] < 32:
flagNames[globals()[name]] = name
#
flags_like_period = (9, 4, 21, 17) # flag_two_spaces_next = 9, flag_passive_cap_next = 4, flag_no_space_before = 21
flags_like_comma = (21, ) # flag_no_space_before = 21 (flag_nodelete = 3 we just ignore here, so leave out)
flags_like_number = (10,)
flags_like_point = (8, 10, 21) # no spacing (combination with numbers seems
flags_like_period = {9, 4, 21, 17} # flag_two_spaces_next = 9, flag_passive_cap_next = 4, flag_no_space_before = 21
flags_like_comma = {21} # flag_no_space_before = 21 (flag_nodelete = 3 we just ignore here, so leave out)
flags_like_number = {10}
flags_like_point = {8, 10, 21} # no spacing (combination with numbers seems
# obsolete (cond_no_space = 10)
flags_like_hyphen = (8, 21) # no spacing before and after
flags_like_open_quote = (8, 20) # no space next and no cap change
flags_like_close_quote = (21, 20, 19) # no space before, no cap change and no space change (??)
flags_like_hyphen = {8, 21} # no spacing before and after
flags_like_open_quote = {8, 20} # no space next and no cap change
flags_like_close_quote = {21, 20, 19} # no space before, no cap change and no space change (??)

# word flags from properties part of the word:
# Dragon 11...
propDict = {}
propDict['space-bar'] = (flag_space_bar, flag_no_space_next, flag_no_formatting,
flag_no_cap_change, flag_no_space_before) # (8, 18, 20, 21, 27)
propDict['space-bar'] = {flag_space_bar, flag_no_space_next, flag_no_formatting,
flag_no_cap_change, flag_no_space_before} # {8, 18, 20, 21, 27}

propDict['period'] = flags_like_period
propDict['point'] = flags_like_point
propDict['dot'] = flags_like_point
propDict['comma'] = flags_like_comma
propDict['cap'] = (19, 18, flag_active_cap_next)
propDict['caps-on'] = (19, 18, flag_cap_all)
propDict['caps-off'] = (19, 18, flag_reset_uc_lc_caps)
propDict['all-caps'] = (19, 18, flag_uppercase_next)
propDict['all-caps-on'] = (19, 18, flag_uppercase_all)
propDict['all-caps-off'] = (19, 18, flag_reset_uc_lc_caps)
propDict['no-caps'] = (19, 18, flag_lowercase_next)
propDict['no-caps-on'] = (19, 18, flag_lowercase_all)
propDict['no-caps-off'] = (19, 18, flag_reset_uc_lc_caps)
propDict['no-space'] = (18, 20, flag_no_space_next)
propDict['no-space-on'] = (18, 20, flag_no_space_all)
propDict['no-space-off'] = (18, 20, flag_reset_no_space)
propDict['caps-on'] = {19, 18, flag_cap_all}
propDict['caps-off'] = {19, 18, flag_reset_uc_lc_caps}
propDict['all-caps'] = {19, 18, flag_uppercase_next}
propDict['all-caps-on'] = {19, 18, flag_uppercase_all}
propDict['all-caps-off'] = {19, 18, flag_reset_uc_lc_caps}
propDict['no-caps'] = {19, 18, flag_lowercase_next}
propDict['no-caps-on'] = {19, 18, flag_lowercase_all}
propDict['no-caps-off'] = {19, 18, flag_reset_uc_lc_caps}
propDict['no-space'] = {18, 20, flag_no_space_next}
propDict['no-space-on'] = {18, 20, flag_no_space_all}
propDict['no-space-off'] = {18, 20, flag_reset_no_space}
propDict['left-double-quote'] = flags_like_open_quote
propDict['right-double-quote'] = flags_like_close_quote
# left- as left-double-quote
Expand Down Expand Up @@ -112,15 +112,17 @@
#
# If you already have the wordInfo for each word, you can pass in a list of
# tuples of (wordName,wordInfo) instead of just the list of words.

def formatWords(wordList,state=None):
def formatWords(wordList, state=None):
"""return the formatted words and the state at end.

when passing this state in the next call, the spacing and capitalization
will be maintained.

"""
#pylint:disable=W0603
global flags_like_period
assert isinstance(wordList, list)

language = 'enx'
if language != 'enx':
flags_like_period = (4, 21, 17) # one space after period.
Expand Down Expand Up @@ -164,6 +166,41 @@ def formatWords(wordList,state=None):

return output, state


def formatString(text, state=None):
r"""pass in a string, and optionally the result of previous call

Do NOT require the .\period\period specifications, so you can call this one from a plain sentence.


For frequent punctuation, like "." these are replaced by the counterparts.
"""
like_period = ".?!"
like_comma = ",;:"
like_hyphen = "-"

all_special = like_period + like_comma + like_hyphen
for char in all_special:
text = text.replace(char, f' {char} ')

input_list = text.split()
for i, w in enumerate(input_list):
if w not in all_special:
continue
if w in like_period:
input_list[i] = (w, set(flags_like_period))
if w in like_comma:
input_list[i] = (w, set(flags_like_comma))
if w in like_hyphen:
input_list[i] = (w, set(flags_like_hyphen))



result, state = formatWords(input_list, state=state)
return result, state



countDict= dict(one=1, two=2, three=3, four=4, five=5, six=6, seven=7, eight=8, nine=9,
een=1, twee=2, drie=3, vier=4, vijf=5, zes=6, zeven=7, acht=8, negen=9)

Expand Down Expand Up @@ -236,7 +273,7 @@ def formatWord(wordName,wordInfo=None,stateFlags=None, gwi=None):
elif isinstance(state, (list, tuple)):
state = set(state)
else:
raise ValueError("formatWord, invalid stateFlags: %s"% repr(stateFlags))
raise ValueError(f'formatWord, invalid stateFlags: {repr(stateFlags)}')
stateFlags = copy.copy(state)


Expand Down Expand Up @@ -392,7 +429,7 @@ def getWordInfo(word):
return set(propDict['left-double-quote'])
if prop.startswith('right-'):
return set(propDict['right-double-quote'])
print('getWordInfo11, unknown word property: "%s" ("%s")'% (prop, word))
print(f'getWordInfo, unknown word property: {prop} {"word"}')
return set() # empty tuple
# should not come here
return set()
Expand Down Expand Up @@ -445,8 +482,8 @@ def testSubroutine(state, Input, Output):
words[i] = words[i].replace('_', ' ')
actual,state = formatWords(words,state)
if actual != Output:
print('Expected "%s"'%Output)
print('Actually "%s"'%actual)
print(f'Expected {"Output"}')
print(f'Actually {"actual"}')
raise ValueError("test error")
return state

Expand Down
Loading