#!/bin/python # -*- coding: utf-8 -*- # Fenrir TTY screen reader # By Chrys, Storm Dragon, and contributers. from fenrirscreenreader.core import debug from collections import Counter import getpass, time, re, string, select, os def removeNonprintable(text): # Get the difference of all ASCII characters from the set of printable characters nonprintable = set([chr(i) for i in range(128)]).difference(string.printable) # Use translate to remove all non-printable characters return text.translate({ord(character):None for character in nonprintable}) def insertNewlines(string, every=64): return '\n'.join(string[i:i+every] for i in range(0, len(string), every)) def splitEvery(toSplit, every=64): return list(toSplit[i:i+every] for i in range(0, len(toSplit), every)) def createScreenEventData(content): eventData = { 'bytes': content, 'lines': content['lines'], 'columns': content['columns'], 'textCursor': { 'x': int( content['cursor'][0]), 'y': int( content['cursor'][1]) }, 'screen': content['screen'], 'text': content['text'], 'attributes': content['attributes'], 'screenUpdateTime': time.time(), } return eventData.copy() def hasMore(fd, timetout=0.2): r, _, _ = select.select([fd], [], [], timetout) return (fd in r) def isValidShell(shell = ''): if not isinstance(shell, str): return False if shell == '': return False try: if not os.path.isfile(shell): return False if not os.access(shell,os.X_OK): return False except: return False return True def getShell(): try: shell = os.environ["FENRIRSHELL"] if isValidShell(shell): return shell except: pass try: shell = os.environ["SHELL"] if isValidShell(shell): return shell except: pass try: if os.acess('/etc/passwd'): with open('/etc/passwd') as f: users = f.readlines() for user in users: (username, encrypwd, uid, gid, gecos, homedir, shell) = user.split(':') shell = shell.replace('\n','') if username == getpass.getuser(): if isValidShell(shell): return shell except: pass if isValidShell('/bin/bash'): return '/bin/bash' return '/bin/sh' def trackHighlights(oldAttr, newAttr, text, lenght): result = '' currCursor = None if oldAttr == newAttr: return result, currCursor if len(newAttr) == 0: return result, currCursor if len(oldAttr) != len(newAttr): return result, currCursor old = splitEvery(oldAttr,lenght) new = splitEvery(newAttr,lenght) textLines = text.split('\n') background = [] if len(textLines) - 1 != len(new): return result, currCursor try: bgStat = Counter(newAttr).most_common(3) background.append(bgStat[0][0]) # if there is a third color add a secondary background (for dialogs for example) if len(bgStat) > 2: if bgStat[1][1] > 40: background.append(bgStat[1][0]) except Exception as e: background.append((7,7,0,0,0,0)) for line in range(len(new)): if old[line] != new[line]: for column in range(len(new[line])): print(new[line][column]) if old[line][column] != new[line][column]: if not new[line][column] in background: if not currCursor: currCursor = {} currCursor['x'] = column currCursor['y'] = line result += textLines[line][column] result += ' ' return result, currCursor ''' t = 'hallo\nwelt!' old = ((1,1,0,0),(1,1,0,0),(1,1,0,0),(1,1,0,0),(1,1,0,0),(1,1,0,0),(1,1,0,0),(1,1,0,0),(1,1,0,0),(1,1,0,0)) new = ((0,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,0,0),(1,1,0,0),(1,1,0,0),(1,1,0,0),(1,1,0,0)) trackHighlights(old,new,t,5) ''' class headLineManipulation: def __init__(self): self.regExSingle = re.compile(r'(([^\w\s])\2{5,})') self.regExDouble = re.compile(r'([^\w\s]{2,}){5,}') def replaceHeadLines(self, text): result = '' newText = '' lastPos = 0 for match in self.regExDouble.finditer(text): span = match.span() newText += text[lastPos:span[0]] numberOfChars = len(text[span[0]:span[1]]) name = text[span[0]:span[1]][:2] if name.strip(name[0]) == '': newText += ' ' + str(numberOfChars) + ' ' + name[0] + ' ' else: newText += ' ' + str(int(numberOfChars / 2)) + ' ' + name + ' ' lastPos = span[1] newText += ' ' + text[lastPos:] lastPos = 0 for match in self.regExSingle.finditer(newText): span = match.span() result += text[lastPos:span[0]] numberOfChars = len(newText[span[0]:span[1]]) name = newText[span[0]:span[1]][:2] if name.strip(name[0]) == '': result += ' ' + str(numberOfChars) + ' ' + name[0] + ' ' else: result += ' ' + str(int(numberOfChars / 2)) + ' ' + name + ' ' lastPos = span[1] result += ' ' + newText[lastPos:] return result