Files
fenrir/src/fenrirscreenreader/utils/word_utils.py

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