From 99984915e4b79b1b2c848af4ce017ff5d4122151 Mon Sep 17 00:00:00 2001 From: Chrys Date: Thu, 22 Aug 2019 23:44:44 +0200 Subject: [PATCH] restore orign sorting --- .../onCursorChange/45000-char_echo.py | 42 ++++++ .../onCursorChange/46000-tab_completion.py | 42 ++++++ ...resent_char_if_cursor_change_horizontal.py | 51 +++++++ ...-present_line_if_cursor_change_vertical.py | 59 ++++++++ .../onCursorChange/60000-word_echo_type.py | 58 ++++++++ .../61000-word_echo_navigation.py | 54 +++++++ .../onCursorChange/62000-spell_check.py | 133 ++++++++++++++++++ .../onCursorChange/65000-char_delete_echo.py | 46 ++++++ .../onCursorChange/66000-exit_review_mode.py | 26 ++++ .../onCursorChange/77000-has_attribute.py | 34 +++++ 10 files changed, 545 insertions(+) create mode 100644 src/fenrirscreenreader/commands/onCursorChange/45000-char_echo.py create mode 100644 src/fenrirscreenreader/commands/onCursorChange/46000-tab_completion.py create mode 100644 src/fenrirscreenreader/commands/onCursorChange/50000-present_char_if_cursor_change_horizontal.py create mode 100644 src/fenrirscreenreader/commands/onCursorChange/55000-present_line_if_cursor_change_vertical.py create mode 100644 src/fenrirscreenreader/commands/onCursorChange/60000-word_echo_type.py create mode 100644 src/fenrirscreenreader/commands/onCursorChange/61000-word_echo_navigation.py create mode 100644 src/fenrirscreenreader/commands/onCursorChange/62000-spell_check.py create mode 100644 src/fenrirscreenreader/commands/onCursorChange/65000-char_delete_echo.py create mode 100644 src/fenrirscreenreader/commands/onCursorChange/66000-exit_review_mode.py create mode 100644 src/fenrirscreenreader/commands/onCursorChange/77000-has_attribute.py diff --git a/src/fenrirscreenreader/commands/onCursorChange/45000-char_echo.py b/src/fenrirscreenreader/commands/onCursorChange/45000-char_echo.py new file mode 100644 index 00000000..c4cd2ad6 --- /dev/null +++ b/src/fenrirscreenreader/commands/onCursorChange/45000-char_echo.py @@ -0,0 +1,42 @@ +#!/bin/python +# -*- coding: utf-8 -*- + +# Fenrir TTY screen reader +# By Chrys, Storm Dragon, and contributers. + +from fenrirscreenreader.core import debug + +class command(): + def __init__(self): + pass + def initialize(self, environment): + self.env = environment + def shutdown(self): + pass + def getDescription(self): + return 'No Description found' + + def run(self): + # big changes are no char (but the value is bigger than one maybe the differ needs longer than you can type, so a little strange random buffer for now) + xMove = abs(self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x']) + if xMove > 1: + return + if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'charEcho'): + return + # detect deletion or chilling + if self.env['screen']['newCursor']['x'] <= self.env['screen']['oldCursor']['x']: + return + # is there any change? + if not self.env['runtime']['screenManager'].isDelta(): + return + + # filter unneded space on word begin + currDelta = self.env['screen']['newDelta'] + if len(currDelta.strip()) != len(currDelta) and \ + currDelta.strip() != '': + currDelta = currDelta.strip() + self.env['runtime']['outputManager'].presentText(currDelta, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False) + + def setCallback(self, callback): + pass + diff --git a/src/fenrirscreenreader/commands/onCursorChange/46000-tab_completion.py b/src/fenrirscreenreader/commands/onCursorChange/46000-tab_completion.py new file mode 100644 index 00000000..43b91159 --- /dev/null +++ b/src/fenrirscreenreader/commands/onCursorChange/46000-tab_completion.py @@ -0,0 +1,42 @@ +#!/bin/python +# -*- coding: utf-8 -*- + +# Fenrir TTY screen reader +# By Chrys, Storm Dragon, and contributers. + +from fenrirscreenreader.core import debug + +class command(): + def __init__(self): + pass + def initialize(self, environment): + self.env = environment + def shutdown(self): + pass + def getDescription(self): + return 'No Description found' + + def run(self): + # try to detect the tab completion by cursor change + xMove = abs(self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x']) + if xMove == 1: + return + # is there any change? + if not self.env['runtime']['screenManager'].isDelta(): + return + if not( (xMove > 1) and xMove == len(self.env['screen']['newDelta'])): + return + # detect deletion or chilling + if self.env['screen']['newCursor']['x'] <= self.env['screen']['oldCursor']['x']: + return + + # filter unneded space on word begin + currDelta = self.env['screen']['newDelta'] + if len(currDelta.strip()) != len(currDelta) and \ + currDelta.strip() != '': + currDelta = currDelta.strip() + self.env['runtime']['outputManager'].presentText(currDelta, interrupt=True, announceCapital=True, flush=False) + + def setCallback(self, callback): + pass + diff --git a/src/fenrirscreenreader/commands/onCursorChange/50000-present_char_if_cursor_change_horizontal.py b/src/fenrirscreenreader/commands/onCursorChange/50000-present_char_if_cursor_change_horizontal.py new file mode 100644 index 00000000..ecd32a40 --- /dev/null +++ b/src/fenrirscreenreader/commands/onCursorChange/50000-present_char_if_cursor_change_horizontal.py @@ -0,0 +1,51 @@ +#!/bin/python +# -*- coding: utf-8 -*- + +# Fenrir TTY screen reader +# By Chrys, Storm Dragon, and contributers. + +from fenrirscreenreader.core import debug +from fenrirscreenreader.utils import char_utils + +class command(): + def __init__(self): + pass + def initialize(self, environment): + self.env = environment + def shutdown(self): + pass + def getDescription(self): + return '' + + def run(self): + if not self.env['runtime']['settingsManager'].getSettingAsBool('focus', 'cursor'): + return + if self.env['runtime']['screenManager'].isScreenChange(): + return + # detect an change on the screen, we just want to cursor arround, so no change should appear + if self.env['runtime']['screenManager'].isDelta(): + return + if self.env['runtime']['screenManager'].isNegativeDelta(): + return + # is a vertical change? + if self.env['runtime']['cursorManager'].isCursorVerticalMove(): + return + # is it a horizontal change? + if not self.env['runtime']['cursorManager'].isCursorHorizontalMove(): + return + + # echo word insteed of char + if self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'wordEcho'): + if abs(self.env['screen']['oldCursor']['x'] - self.env['screen']['newCursor']['x']) != 1: + # get the word + newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']] + x, y, currWord, endOfScreen, lineBreak = \ + word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent) + if self.env['screen']['newCursor']['x'] == x: + return + x, y, currChar = char_utils.getCurrentChar(self.env['screen']['newCursor']['x'], self.env['screen']['newCursor']['y'], self.env['screen']['newContentText']) + if not currChar.isspace(): + self.env['runtime']['outputManager'].presentText(currChar, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False) + def setCallback(self, callback): + pass + diff --git a/src/fenrirscreenreader/commands/onCursorChange/55000-present_line_if_cursor_change_vertical.py b/src/fenrirscreenreader/commands/onCursorChange/55000-present_line_if_cursor_change_vertical.py new file mode 100644 index 00000000..5ccbd0cd --- /dev/null +++ b/src/fenrirscreenreader/commands/onCursorChange/55000-present_line_if_cursor_change_vertical.py @@ -0,0 +1,59 @@ +#!/bin/python +# -*- coding: utf-8 -*- + +# Fenrir TTY screen reader +# By Chrys, Storm Dragon, and contributers. + +from fenrirscreenreader.core import debug +from fenrirscreenreader.utils import line_utils +from fenrirscreenreader.utils import word_utils + +class command(): + def __init__(self): + self.lastIdent = -1 + def initialize(self, environment): + self.env = environment + def shutdown(self): + pass + def getDescription(self): + return '' + + def run(self): + if not self.env['runtime']['settingsManager'].getSettingAsBool('focus', 'cursor'): + return + if self.env['runtime']['screenManager'].isScreenChange(): + self.lastIdent = 0 + return + # this leads to problems in vim -> status line change -> no announcement, so we do check the lengh as hack + if self.env['runtime']['screenManager'].isDelta(): + return + + # is a vertical change? + if not self.env['runtime']['cursorManager'].isCursorVerticalMove(): + return + + x, y, currLine = line_utils.getCurrentLine(self.env['screen']['newCursor']['x'], self.env['screen']['newCursor']['y'], self.env['screen']['newContentText']) + if currLine.isspace(): + self.env['runtime']['outputManager'].presentText(_("blank"), soundIcon='EmptyLine', interrupt=True, flush=False) + else: + # ident + currIdent = len(currLine) - len(currLine.lstrip()) + if self.lastIdent == -1: + self.lastIdent = currIdent + doInterrupt = True + if self.env['runtime']['settingsManager'].getSettingAsBool('general', 'autoPresentIndent'): + if self.lastIdent != currIdent: + self.env['runtime']['outputManager'].presentText(_('indented ') + str(currIdent) + ' ', interrupt=doInterrupt, flush=False) + doInterrupt = False + # barrier + sayLine = currLine + if self.env['runtime']['settingsManager'].getSettingAsBool('barrier','enabled'): + isBarrier, barrierLine = self.env['runtime']['barrierManager'].handleLineBarrier(self.env['screen']['newContentText'].split('\n'), self.env['screen']['newCursor']['x'],self.env['screen']['newCursor']['y']) + if isBarrier: + sayLine = barrierLine + # output + self.env['runtime']['outputManager'].presentText(sayLine, interrupt=doInterrupt, flush=False) + self.lastIdent = currIdent + def setCallback(self, callback): + pass + diff --git a/src/fenrirscreenreader/commands/onCursorChange/60000-word_echo_type.py b/src/fenrirscreenreader/commands/onCursorChange/60000-word_echo_type.py new file mode 100644 index 00000000..57a530fd --- /dev/null +++ b/src/fenrirscreenreader/commands/onCursorChange/60000-word_echo_type.py @@ -0,0 +1,58 @@ +#!/bin/python +# -*- coding: utf-8 -*- + +# Fenrir TTY screen reader +# By Chrys, Storm Dragon, and contributers. + +from fenrirscreenreader.core import debug +from fenrirscreenreader.utils import word_utils +import string + +class command(): + def __init__(self): + pass + def initialize(self, environment): + self.env = environment + def shutdown(self): + pass + def getDescription(self): + return 'No Description found' + + def run(self): + # is it enabled? + if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'wordEcho'): + return + # is naviation? + if self.env['screen']['newCursor']['x'] - self.env['screen']['oldCursor']['x'] != 1: + return + # just when cursor move worddetection is needed + if not self.env['runtime']['cursorManager'].isCursorHorizontalMove(): + return + # for now no new line + if self.env['runtime']['cursorManager'].isCursorVerticalMove(): + return + # currently writing + if self.env['runtime']['screenManager'].isDelta(): + return + + # get the word + newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']] + x, y, currWord, endOfScreen, lineBreak = \ + word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent) + + # is there a word? + if currWord == '': + return + # at the end of a word + if not newContent[self.env['screen']['newCursor']['x']].isspace(): + return + # at the end of a word + if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \ + (x + len(currWord) != self.env['screen']['newCursor']['x']-1): + return + + self.env['runtime']['outputManager'].presentText(currWord, interrupt=True, flush=False) + + def setCallback(self, callback): + pass + diff --git a/src/fenrirscreenreader/commands/onCursorChange/61000-word_echo_navigation.py b/src/fenrirscreenreader/commands/onCursorChange/61000-word_echo_navigation.py new file mode 100644 index 00000000..08778cee --- /dev/null +++ b/src/fenrirscreenreader/commands/onCursorChange/61000-word_echo_navigation.py @@ -0,0 +1,54 @@ +#!/bin/python +# -*- coding: utf-8 -*- + +# Fenrir TTY screen reader +# By Chrys, Storm Dragon, and contributers. + +from fenrirscreenreader.core import debug +from fenrirscreenreader.utils import word_utils +import string + +class command(): + def __init__(self): + pass + def initialize(self, environment): + self.env = environment + def shutdown(self): + pass + def getDescription(self): + return 'No Description found' + + def run(self): + # is navigation? + if not abs(self.env['screen']['oldCursor']['x'] - self.env['screen']['newCursor']['x']) > 1: + return + + # just when cursor move worddetection is needed + if not self.env['runtime']['cursorManager'].isCursorHorizontalMove(): + return + # for now no new line + if self.env['runtime']['cursorManager'].isCursorVerticalMove(): + return + # currently writing + if self.env['runtime']['screenManager'].isDelta(): + return + + # get the word + newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']] + x, y, currWord, endOfScreen, lineBreak = \ + word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent) + + # is there a word? + if currWord == '': + return + + # at the start of a word + if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \ + (self.env['screen']['newCursor']['x'] != x): + return + + self.env['runtime']['outputManager'].presentText(currWord, interrupt=True, flush=False) + + def setCallback(self, callback): + pass + diff --git a/src/fenrirscreenreader/commands/onCursorChange/62000-spell_check.py b/src/fenrirscreenreader/commands/onCursorChange/62000-spell_check.py new file mode 100644 index 00000000..1fe67221 --- /dev/null +++ b/src/fenrirscreenreader/commands/onCursorChange/62000-spell_check.py @@ -0,0 +1,133 @@ +#!/bin/python +# -*- coding: utf-8 -*- + +# Fenrir TTY screen reader +# By Chrys, Storm Dragon, and contributers. + +from fenrirscreenreader.core import debug +from fenrirscreenreader.utils import word_utils +import os, string + +initialized = False +try: + import enchant + initialized = True +except: + pass + +class command(): + def __init__(self): + self.language = '' + self.spellChecker = '' + def initialize(self, environment): + self.env = environment + self.updateSpellLanguage() + def shutdown(self): + pass + def getDescription(self): + return 'No Description found' + + def updateSpellLanguage(self): + if not initialized: + return + self.spellChecker = enchant.Dict(self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage')) + self.language = self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage') + + def run(self): + if not initialized: + return + if not self.env['runtime']['settingsManager'].getSettingAsBool('general', 'autoSpellCheck'): + return + if self.env['runtime']['settingsManager'].getSetting('general', 'spellCheckLanguage') != self.language: + try: + self.updateSpellLanguage() + except: + return + + # just when horizontal cursor move worddetection is needed + if not self.env['runtime']['cursorManager'].isCursorHorizontalMove(): + return + + # for now no new line + if self.env['runtime']['cursorManager'].isCursorVerticalMove(): + return + # more than a keyecho? + if len(self.env['screen']['newDelta']) > 1: + return + # deletion + if self.env['runtime']['screenManager'].isNegativeDelta(): + return + # first place could not be the end of a word + if self.env['screen']['newCursor']['x'] == 0: + return + + # get the word (just for speedup only look at current line + newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']] + x, y, currWord, endOfScreen, lineBreak = word_utils.getCurrentWord(self.env['screen']['newCursor']['x'], 0, newContent) + # was this a typed word? + if self.env['runtime']['screenManager'].isDelta(): + if not(newContent[self.env['screen']['oldCursor']['x']] in string.whitespace + '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~' and x != self.env['screen']['oldCursor']['x']): + return + else: + currWord = currWord.strip(string.whitespace + '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~') + else: + # or just arrow arround? + if not newContent[self.env['screen']['newCursor']['x']].isspace(): + return + if (x + len(currWord) != self.env['screen']['newCursor']['x']) and \ + (x + len(currWord) != self.env['screen']['newCursor']['x']-1): + return + + # just on end of word + if self.env['screen']['newCursor']['x'] > 0: + if not newContent[self.env['screen']['oldCursor']['x'] - 1].lower() in string.ascii_lowercase: + return + + # ignore bash buildins + if currWord in ['cd','fg','bg','alias','bind','dir','caller','buildin','command','declare','echo','enable','help','let','local','logout',\ + 'mapfile','printf','read','readarray','source','type','typeset','ulimit','unalias']: + return + # ignore the application name + if currWord.upper() == 'FENRIR': + return + if currWord[0] =='-': + return + if currWord[0] == '/': + return + if currWord[0] == '#': + return + if currWord.startswith('./'): + return + if '@' in currWord and '.' in currWord: + return + if currWord[0] == '@': + return + if currWord.isnumeric(): + return + if currWord.isdecimal(): + return + if currWord.isspace(): + return + + try: + if os.path.exists("/bin/"+currWord): + return + except: + pass + try: + if os.path.exists("/usr/bin/"+currWord): + return + except: + pass + try: + if os.path.exists("/sbin/"+currWord): + return + except: + pass + + if not self.spellChecker.check(currWord): + self.env['runtime']['outputManager'].presentText(_('misspelled'), soundIcon='mispell', interrupt=False, flush=False) + + def setCallback(self, callback): + pass + diff --git a/src/fenrirscreenreader/commands/onCursorChange/65000-char_delete_echo.py b/src/fenrirscreenreader/commands/onCursorChange/65000-char_delete_echo.py new file mode 100644 index 00000000..41281316 --- /dev/null +++ b/src/fenrirscreenreader/commands/onCursorChange/65000-char_delete_echo.py @@ -0,0 +1,46 @@ +#!/bin/python +# -*- coding: utf-8 -*- + +# Fenrir TTY screen reader +# By Chrys, Storm Dragon, and contributers. + +from fenrirscreenreader.core import debug + +class command(): + def __init__(self): + pass + def initialize(self, environment): + self.env = environment + def shutdown(self): + pass + def getDescription(self): + return 'No Description found' + + def run(self): + if not self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'charDeleteEcho'): + return + # detect typing or chilling + if self.env['screen']['newCursor']['x'] >= self.env['screen']['oldCursor']['x']: + return + + # More than just a deletion happend + if self.env['runtime']['screenManager'].isDelta(ignoreSpace=True): + return + + # no deletion + if not self.env['runtime']['screenManager'].isNegativeDelta(): + return + + # too much for a single backspace... + # word begin produce a diff wiht len == 2 |a | others with 1 |a| + if len(self.env['screen']['newNegativeDelta']) > 2: + return + + currNegativeDelta = self.env['screen']['newNegativeDelta'] + if len(currNegativeDelta.strip()) != len(currNegativeDelta) and \ + currNegativeDelta.strip() != '': + currNegativeDelta = currNegativeDelta.strip() + self.env['runtime']['outputManager'].presentText(currNegativeDelta, interrupt=True, ignorePunctuation=True, announceCapital=True, flush=False) + def setCallback(self, callback): + pass + diff --git a/src/fenrirscreenreader/commands/onCursorChange/66000-exit_review_mode.py b/src/fenrirscreenreader/commands/onCursorChange/66000-exit_review_mode.py new file mode 100644 index 00000000..d934fb1c --- /dev/null +++ b/src/fenrirscreenreader/commands/onCursorChange/66000-exit_review_mode.py @@ -0,0 +1,26 @@ +#!/bin/python +# -*- coding: utf-8 -*- + +# Fenrir TTY screen reader +# By Chrys, Storm Dragon, and contributers. + +from fenrirscreenreader.core import debug + +class command(): + def __init__(self): + pass + def initialize(self, environment): + self.env = environment + def shutdown(self): + pass + def getDescription(self): + return _('exits review mode') + + def run(self): + if not self.env['runtime']['settingsManager'].getSettingAsBool('review', 'leaveReviewOnCursorChange'): + return + if self.env['runtime']['cursorManager'].isReviewMode(): + self.env['runtime']['cursorManager'].clearReviewCursor() + + def setCallback(self, callback): + pass diff --git a/src/fenrirscreenreader/commands/onCursorChange/77000-has_attribute.py b/src/fenrirscreenreader/commands/onCursorChange/77000-has_attribute.py new file mode 100644 index 00000000..b3678759 --- /dev/null +++ b/src/fenrirscreenreader/commands/onCursorChange/77000-has_attribute.py @@ -0,0 +1,34 @@ +#!/bin/python +# -*- coding: utf-8 -*- + +# Fenrir TTY screen reader +# By Chrys, Storm Dragon, and contributers. + +from fenrirscreenreader.core import debug +from fenrirscreenreader.utils import screen_utils + +class command(): + def __init__(self): + pass + def initialize(self, environment): + self.env = environment + def shutdown(self): + pass + def getDescription(self): + return _('Reads attributes of current cursor position') + def run(self): + # is it enabled? + if not self.env['runtime']['settingsManager'].getSettingAsBool('general', 'hasAttributes'): + return + # is a vertical change? + if not (self.env['runtime']['cursorManager'].isCursorVerticalMove() or\ + self.env['runtime']['cursorManager'].isCursorHorizontalMove()): + return + + cursorPos = self.env['screen']['newCursor'] + + if not self.env['runtime']['attributeManager'].hasAttributes(cursorPos): + return + self.env['runtime']['outputManager'].presentText('has attribute', soundIcon='HasAttributes', interrupt=False) + def setCallback(self, callback): + pass