Skip to content

Commit

Permalink
Moved parse_text_into_characters into graphics package.
Browse files Browse the repository at this point in the history
  • Loading branch information
binyomen committed Mar 5, 2017
1 parent cecb9a2 commit 29f8264
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 103 deletions.
48 changes: 0 additions & 48 deletions pyrogi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,51 +7,3 @@
tile_dimensions = None
mouse_position = None

def parse_text_into_characters(text):
characters = []
is_escaping = False
group = None
def append(ch):
"""append the next character to the right place"""
if group is None:
characters.append(ch)
else:
group.append(ch)

for ch in text:
if ch == '\\':
if is_escaping:
append(ch)
is_escaping = False
else:
is_escaping = True
elif ch == '[':
if is_escaping:
append(ch)
is_escaping = False
else:
if group is not None:
raise ValueError('You cannot start a character group within another group.')
group = []
is_escaping = False
elif ch == ']':
if is_escaping:
append(ch)
else:
if group is None:
raise ValueError('You cannot end a character group that you have not started.')
if len(group) == 0:
raise ValueError('You cannot have an empty character group.')
characters.append(''.join(group))
group = None
is_escaping = False
else:
if is_escaping:
raise ValueError("Invalid escape character '" + ch + "'.")
append(ch)
is_escaping = False
if is_escaping:
raise ValueError("The '\\' at the end of the string isn't escaping anything.")
if group is not None:
raise ValueError('You started a character group but did not finish it.')
return characters
54 changes: 52 additions & 2 deletions pyrogi/graphics/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,57 @@
import math
from operator import attrgetter
import pyrogi
from pyrogi.util.vector import Vec2

def parse_text_into_characters(text):
characters = []
is_escaping = False
group = None
def append(ch):
"""append the next character to the right place"""
if group is None:
characters.append(ch)
else:
group.append(ch)

for ch in text:
if ch == '\\':
if is_escaping:
append(ch)
is_escaping = False
else:
is_escaping = True
elif ch == '[':
if is_escaping:
append(ch)
is_escaping = False
else:
if group is not None:
raise ValueError('You cannot start a character group within another group.')
group = []
is_escaping = False
elif ch == ']':
if is_escaping:
append(ch)
else:
if group is None:
raise ValueError('You cannot end a character group that you have not started.')
if len(group) == 0:
raise ValueError('You cannot have an empty character group.')
characters.append(''.join(group))
group = None
is_escaping = False
else:
if is_escaping:
raise ValueError("Invalid escape character '" + ch + "'.")
append(ch)
is_escaping = False
if is_escaping:
raise ValueError("The '\\' at the end of the string isn't escaping anything.")
if group is not None:
raise ValueError('You started a character group but did not finish it.')
return characters


class Graphics(object):
def init_window(self, window_dimensions, tile_dimensions, caption):
raise NotImplementedError()
Expand Down Expand Up @@ -140,9 +189,10 @@ def contains_position(self, position):
return False

def write_text(self, text):
characters = pyrogi.parse_text_into_characters(text)
characters = parse_text_into_characters(text)
for tile, offset in self.tiles:
if len(characters) == 0:
break
tile.character = characters[0]
characters.pop(0)

53 changes: 52 additions & 1 deletion pyrogi/graphics/test_graphics.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,58 @@
import unittest
from pyrogi.graphics import Color, LinearGradientPaint
from pyrogi.graphics import parse_text_into_characters, Color, LinearGradientPaint
from pyrogi.util.vector import Vec2

class TestParseTextIntoCharacters(unittest.TestCase):
def test_plain_characters(self):
self.assertEqual(parse_text_into_characters(''), [])
self.assertEqual(parse_text_into_characters('a'), ['a'])
self.assertEqual(parse_text_into_characters('ab'), ['a', 'b'])
self.assertEqual(parse_text_into_characters('abcdefghijk'), ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'])
self.assertEqual(parse_text_into_characters('a b'), ['a', ' ', 'b'])
self.assertEqual(parse_text_into_characters('a b '), ['a', ' ', 'b', ' '])
self.assertEqual(parse_text_into_characters('a b'), ['a', ' ', ' ', 'b'])

def test_escape_characters(self):
self.assertEqual(parse_text_into_characters('\\\\'), ['\\'])
self.assertEqual(parse_text_into_characters('\\['), ['['])
self.assertEqual(parse_text_into_characters('\\]'), [']'])
self.assertEqual(parse_text_into_characters('oauhstt tot\\] ath'), ['o', 'a', 'u', 'h', 's', 't', 't', ' ', 't', 'o', 't', ']', ' ', 'a', 't', 'h'])
self.assertEqual(parse_text_into_characters('oauhstt to[t\\]] ath'), ['o', 'a', 'u', 'h', 's', 't', 't', ' ', 't', 'o', 't]', ' ', 'a', 't', 'h'])
self.assertEqual(parse_text_into_characters('oauhst[t t]o[t\\\\] ath'), ['o', 'a', 'u', 'h', 's', 't', 't t', 'o', 't\\', ' ', 'a', 't', 'h'])

self.assertRaisesRegex(ValueError, "Invalid escape character 'a'.", parse_text_into_characters, '\\a')
self.assertRaisesRegex(ValueError, "Invalid escape character '8'.", parse_text_into_characters, '\\8')
self.assertRaisesRegex(ValueError, "Invalid escape character '8'.", parse_text_into_characters, 'sntahoe a[ot]uhoa\\8 othuas')
self.assertRaisesRegex(ValueError, "Invalid escape character '8'.", parse_text_into_characters, 'sntahoe a[ot]uhoa[\\8] othuas')

self.assertRaisesRegex(ValueError, "The '\\\\' at the end of the string isn't escaping anything.", parse_text_into_characters, '\\')
self.assertRaisesRegex(ValueError, "The '\\\\' at the end of the string isn't escaping anything.", parse_text_into_characters, 'to[u]hats[ ][ot]out tat thot\\')

def test_groups(self):
self.assertEqual(parse_text_into_characters('[a]'), ['a'])
self.assertEqual(parse_text_into_characters('[abcdefghijk]'), ['abcdefghijk'])
self.assertEqual(parse_text_into_characters('abc [def][hi]toh[oo]'), ['a', 'b', 'c', ' ', 'def', 'hi', 't', 'o', 'h', 'oo'])

self.assertRaisesRegex(ValueError, 'You cannot end a character group that you have not started.', parse_text_into_characters, ']')
self.assertRaisesRegex(ValueError, 'You cannot end a character group that you have not started.', parse_text_into_characters, 'tohut otuha]')
self.assertRaisesRegex(ValueError, 'You cannot end a character group that you have not started.', parse_text_into_characters, 'tou[ot][,,]ot<t to[iho][otu]]')

self.assertRaisesRegex(ValueError, 'You started a character group but did not finish it.', parse_text_into_characters, '[')
self.assertRaisesRegex(ValueError, 'You started a character group but did not finish it.', parse_text_into_characters, '[otuh')
self.assertRaisesRegex(ValueError, 'You started a character group but did not finish it.', parse_text_into_characters, '[ otat')
self.assertRaisesRegex(ValueError, 'You started a character group but did not finish it.', parse_text_into_characters, '[o].4c,9sz[332] o,y092[')

self.assertRaisesRegex(ValueError, 'You cannot start a character group within another group.', parse_text_into_characters, '[[a]]')
self.assertRaisesRegex(ValueError, 'You cannot start a character group within another group.', parse_text_into_characters, '[35,.p[a] o]')
self.assertRaisesRegex(ValueError, 'You cannot start a character group within another group.', parse_text_into_characters, '[,tou]ou, ,[oot. o[ot. teo ]otu]')

self.assertRaisesRegex(ValueError, 'You cannot have an empty character group.', parse_text_into_characters, '[]')
self.assertRaisesRegex(ValueError, 'You cannot have an empty character group.', parse_text_into_characters, 'aeu[]')
self.assertRaisesRegex(ValueError, 'You cannot have an empty character group.', parse_text_into_characters, '[]ouu')
self.assertRaisesRegex(ValueError, 'You cannot have an empty character group.', parse_text_into_characters, 'aeaueu[]au')
self.assertRaisesRegex(ValueError, 'You cannot have an empty character group.', parse_text_into_characters, '[ateu,] otu,[ot,] ,0o[ote][oth,][][tout,t][out,][out,]')


class TestColor(unittest.TestCase):
def test_to_tuple(self):
self.assertEqual(Color(1, 2, 3, 4).to_RGB_tuple(), (1, 2, 3))
Expand Down
52 changes: 0 additions & 52 deletions pyrogi/test_pyrogi.py

This file was deleted.

0 comments on commit 29f8264

Please sign in to comment.