def render(tweet, selected=False, max_width=None): lines = tweet.text.splitlines() spacing = ' ' * (15 - len(tweet.author)) if selected: modificators = [curses.A_UNDERLINE] else: modificators = [] first_line = True result = Text() for line in lines: splitted_line = CursesTweetRenderer.split_for_max_width( line, max_width, modificators, ) for screen_line in splitted_line: # raise RuntimeError(splitted_line) if first_line: result += Text( spacing, Green(), tweet.author, Default(), ' ', Default(modificators), ) + screen_line first_line = False else: result += Text( Default(), '\n' + ' ' * 16, ) + screen_line result += Text(Default(), '\n') return result
def split_for_max_width(line, max_width, modificators): if max_width is None: return [Text(Default(modificators), line)] max_width -= 16 # spacing + '> ' result = [] remains = line first_part_of_line = True while remains: if first_part_of_line: screen_line, remains = ( Text(Default(modificators), remains[:max_width]), remains[max_width:], ) first_part_of_line = False else: screen_line, remains = ( Text( Blue(), '| ', Default(modificators), remains[:max_width - 2], ), remains[max_width - 2:], ) result.append(screen_line) return result
def test_it_renders_single_line_tweets(): tweet = Tweet( 'fooser', 'this is a tweet', ) expected = Text( ' ', Green(), 'fooser', Default(), ' ', 'this is a tweet', '\n', ) assert expected == CursesTweetRenderer.render(tweet)
def test_it_underlines_selected_tweets(): tweet = Tweet( 'fooser', 'this is a tweet', ) expected = Text( ' ', Green(), 'fooser', Default(), ' ', Default([curses.A_UNDERLINE]), 'this is a tweet', Default(), '\n', ) assert expected == CursesTweetRenderer.render(tweet, selected=True)
def test_renders_with_limited_screen_width(): tweet_text = ( 'This is a long tweet, its 68 characters long. ZzZzZzZzZzZzZzZzZzZzZz') assert 68 == len(tweet_text) tweet = Tweet( 'fooser', tweet_text, ) expected = Text( ' ', Green(), 'fooser', Default(), ' ', 'This is a long tweet, its 68 characters long. ', '\n ', Blue(), '| ', Default(), 'ZzZzZzZzZzZzZzZzZzZzZz', '\n', ) assert expected == CursesTweetRenderer.render(tweet, max_width=62)
def test_text_renders_to_string_with_colors(): assert 'test it' == str(Text('test', Green(), ' it'))
def test_text_renders_to_string(): assert 'test' == str(Text('test'))
def test_you_can_add_one_text_to_another_with_colors(): assert Text('first') + Text(Green(), 'second') == \ Text('first', Green(), 'second')
def test_you_can_add_one_text_to_another(): assert Text('first') + Text('second') == Text('first', 'second')