126 lines
4.1 KiB
Python
126 lines
4.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Fenrir TTY screen reader
|
|
# By Chrys, Storm Dragon, and contributers.
|
|
|
|
from fenrirscreenreader.core import debug
|
|
import string
|
|
|
|
|
|
def get_current_word(curr_x, curr_y, curr_text):
|
|
line_break = False
|
|
end_of_screen = False
|
|
if curr_text == '':
|
|
return -1, -1, '', end_of_screen, line_break
|
|
if curr_text.strip(string.whitespace) == '':
|
|
return curr_x, curr_y, '', end_of_screen, line_break
|
|
x = curr_x
|
|
y = curr_y
|
|
curr_word = ''
|
|
wrapped_lines = curr_text.split('\n')
|
|
curr_line = wrapped_lines[y]
|
|
found = False
|
|
while (not found):
|
|
if not curr_line[x] in string.whitespace:
|
|
if x == 0:
|
|
found = True
|
|
else:
|
|
if curr_line[x - 1] in string.whitespace:
|
|
found = True
|
|
if not found:
|
|
if x - 1 < 0:
|
|
if y - 1 < 0:
|
|
line_break = False
|
|
end_of_screen = True
|
|
return curr_x, curr_y, '', end_of_screen, line_break
|
|
else:
|
|
y -= 1
|
|
curr_line = wrapped_lines[y]
|
|
x = len(curr_line) - 1
|
|
line_break = True
|
|
else:
|
|
x -= 1
|
|
if found:
|
|
curr_word = curr_line[x:]
|
|
for d in string.whitespace:
|
|
delimiter_pos = curr_word.find(d)
|
|
if delimiter_pos != -1:
|
|
curr_word = curr_word[:delimiter_pos]
|
|
return x, y, curr_word, end_of_screen, line_break
|
|
return curr_x, curr_y, '', False, False
|
|
|
|
|
|
def get_prev_word(curr_x, curr_y, curr_text):
|
|
line_break = False
|
|
end_of_screen = False
|
|
if curr_text == '':
|
|
return -1, -1, '', end_of_screen, line_break
|
|
if curr_text.strip(string.whitespace) == '':
|
|
return curr_x, curr_y, '', end_of_screen, line_break
|
|
x, y, curr_word, end_of_screen, line_break_curr_word = get_current_word(
|
|
curr_x, curr_y, curr_text)
|
|
if end_of_screen:
|
|
return x, y, curr_word, end_of_screen, line_break
|
|
wrapped_lines = curr_text.split('\n')
|
|
curr_line = wrapped_lines[y]
|
|
if x - 1 < 0:
|
|
if y - 1 < 0:
|
|
line_break = False
|
|
end_of_screen = True
|
|
return curr_x, curr_y, '', end_of_screen, line_break
|
|
else:
|
|
y -= 1
|
|
curr_line = wrapped_lines[y]
|
|
x = len(curr_line) - 1
|
|
line_break = True
|
|
else:
|
|
x -= 1
|
|
line_break_curr_word = line_break or line_break_curr_word
|
|
x, y, curr_word, end_of_screen, line_break = get_current_word(x, y, curr_text)
|
|
line_break = line_break or line_break_curr_word
|
|
return x, y, curr_word, end_of_screen, line_break
|
|
|
|
|
|
def get_next_word(curr_x, curr_y, curr_text):
|
|
line_break = False
|
|
end_of_screen = False
|
|
if curr_text == '':
|
|
return -1, -1, '', end_of_screen, line_break
|
|
if curr_text.strip(string.whitespace) == '':
|
|
return curr_x, curr_y, '', end_of_screen, line_break
|
|
x = curr_x
|
|
y = curr_y
|
|
curr_word = ''
|
|
wrapped_lines = curr_text.split('\n')
|
|
curr_line = wrapped_lines[y]
|
|
found = False
|
|
while (not found):
|
|
if not found:
|
|
if x + 1 > len(curr_line) - 1:
|
|
if y + 1 > len(wrapped_lines) - 1:
|
|
line_break = False
|
|
end_of_screen = True
|
|
return curr_x, curr_y, '', end_of_screen, line_break
|
|
else:
|
|
y += 1
|
|
curr_line = wrapped_lines[y]
|
|
x = 0
|
|
line_break = True
|
|
else:
|
|
x += 1
|
|
if not curr_line[x] in string.whitespace:
|
|
if x == 0:
|
|
found = True
|
|
else:
|
|
if curr_line[x - 1] in string.whitespace:
|
|
found = True
|
|
if found:
|
|
curr_word = curr_line[x:]
|
|
for d in string.whitespace:
|
|
delimiter_pos = curr_word.find(d)
|
|
if delimiter_pos != -1:
|
|
curr_word = curr_word[:delimiter_pos]
|
|
return x, y, curr_word, end_of_screen, line_break
|
|
return curr_x, curr_y, '', False, False
|