#!/bin/python # -*- coding: utf-8 -*- # Fenrir TTY screen reader # By Chrys, Storm Dragon, and contributers. from fenrirscreenreader.core import debug import re, string class barrierManager(): def __init__(self): self.currIsBarrier = False self.prefIsBarrier = False def initialize(self, environment): self.env = environment def shutdown(self): pass def updateBarrierChange(self, isBarrier): self.prefIsBarrier = self.currIsBarrier self.currIsBarrier = isBarrier def resetBarrierChange(self): self.currIsBarrier = False self.prefIsBarrier = False def isBarrierChange(self): return self.currIsBarrier != self.prefIsBarrier def handleLineBarrier(self, text, xCursor, yCursor, output=True, doInterrupt=True): isBarrier = False try: isBarrier, sayLine = self.getBarrierText(text, xCursor, yCursor) except Exception as e: return False, '' self.updateBarrierChange(isBarrier) if self.isBarrierChange(): if output: if isBarrier: self.env['runtime']['outputManager'].playSoundIcon(soundIcon='BarrierStart', interrupt=doInterrupt) else: self.env['runtime']['outputManager'].playSoundIcon(soundIcon='BarrierEnd', interrupt=doInterrupt) if not isBarrier: sayLine = '' return isBarrier, sayLine def hasBorder(self, text, xCursor, yCursor, validBorder, barrierPos): # check for corners here lastLineNo = len(text) - 1 if yCursor <= 0: if not (text[0][barrierPos] in validBorder): return False if len(text) > 1: if not (text[1][barrierPos] in validBorder): return False if len(text) > 2: if not (text[2][barrierPos] in validBorder): return False elif yCursor >= lastLineNo: if not (text[lastLineNo][barrierPos] in validBorder): return False if len(text) > 1: if not (text[lastLineNo - 1][barrierPos] in validBorder): return False if len(text) > 2: if not (text[lastLineNo - 2][barrierPos] in validBorder): return False else: if not (text[yCursor][barrierPos] in validBorder): return False if not (text[yCursor - 1][barrierPos] in validBorder): return False if not (text[yCursor + 1][barrierPos] in validBorder): return False return True def getBarrierText(self, text, xCursor, yCursor): line = text[yCursor] if not self.env['runtime']['settingsManager'].getSettingAsBool('barrier', 'enabled'): return False, line offset = xCursor leftBarriers = self.env['runtime']['settingsManager'].getSetting('barrier', 'leftBarriers') rightBarriers = self.env['runtime']['settingsManager'].getSetting('barrier', 'rightBarriers') # is the cursor at the begin or end of an entry: #print(line[:offset + 1].count('│'),line[offset:].count('│')) # start for b in leftBarriers: if line[:offset + 1].count(b) > line[offset:].count(b): offset = xCursor - 1 start = line[:offset + 1].rfind(b) if start != -1: if not self.hasBorder(text, xCursor, yCursor, leftBarriers, start): start = -1 else: start += 1 break if start == -1: return False, line # end for b in rightBarriers: end = line[start + 1:].find(b) if end != -1: end = start + end if not self.hasBorder(text, xCursor, yCursor,rightBarriers, end + 1): end = -1 break if end == -1: return False, line if start == end: return False, line end += offset + 1 return True, line[start:end]