101 lines
2.9 KiB
Python
101 lines
2.9 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Fenrir TTY screen reader
|
|
# By Chrys, Storm Dragon, and contributors.
|
|
|
|
import re
|
|
import string
|
|
|
|
from fenrirscreenreader.core import debug
|
|
|
|
|
|
class BarrierManager:
|
|
def __init__(self):
|
|
self.currIsBarrier = False
|
|
self.prefIsBarrier = False
|
|
|
|
def initialize(self, environment):
|
|
self.env = environment
|
|
|
|
def shutdown(self):
|
|
pass
|
|
|
|
def update_barrier_change(self, is_barrier):
|
|
self.prefIsBarrier = self.currIsBarrier
|
|
self.currIsBarrier = is_barrier
|
|
|
|
def reset_barrier_change(self):
|
|
self.currIsBarrier = False
|
|
self.prefIsBarrier = False
|
|
|
|
def is_barrier_change(self):
|
|
return self.currIsBarrier != self.prefIsBarrier
|
|
|
|
def handle_line_barrier(
|
|
self, text, xCursor, yCursor, output=True, do_interrupt=True
|
|
):
|
|
is_barrier = False
|
|
try:
|
|
is_barrier, say_line = self.get_barrier_text(
|
|
text, xCursor, yCursor
|
|
)
|
|
except Exception as e:
|
|
return False, ""
|
|
|
|
self.update_barrier_change(is_barrier)
|
|
if self.is_barrier_change():
|
|
if output:
|
|
if is_barrier:
|
|
self.env["runtime"]["OutputManager"].play_sound_icon(
|
|
sound_icon="BarrierStart", interrupt=do_interrupt
|
|
)
|
|
else:
|
|
self.env["runtime"]["OutputManager"].play_sound_icon(
|
|
sound_icon="BarrierEnd", interrupt=do_interrupt
|
|
)
|
|
|
|
if not is_barrier:
|
|
say_line = ""
|
|
return is_barrier, say_line
|
|
|
|
def get_barrier_text(self, text, xCursor, yCursor):
|
|
line = text[yCursor]
|
|
if not self.env["runtime"]["SettingsManager"].get_setting_as_bool(
|
|
"barrier", "enabled"
|
|
):
|
|
return False, line
|
|
offset = xCursor
|
|
|
|
left_barriers = self.env["runtime"]["SettingsManager"].get_setting(
|
|
"barrier", "left_barriers"
|
|
)
|
|
right_barriers = self.env["runtime"]["SettingsManager"].get_setting(
|
|
"barrier", "right_barriers"
|
|
)
|
|
# is the cursor at the begin or end of an entry:
|
|
# print(line[:offset + 1].count('│'),line[offset:].count('│'))
|
|
# start
|
|
|
|
for b in left_barriers:
|
|
if line[: offset + 1].count(b) > line[offset:].count(b):
|
|
offset = xCursor - 1
|
|
start = line[:offset].rfind(b)
|
|
if start != -1:
|
|
start += 1
|
|
break
|
|
if start == -1:
|
|
return False, line
|
|
# end
|
|
for b in right_barriers:
|
|
end = line[start:].find(b)
|
|
if end != -1:
|
|
end = start + end
|
|
break
|
|
if end == -1:
|
|
return False, line
|
|
if start == end:
|
|
return False, line
|
|
|
|
return True, line[start:end]
|