def test_transformers_can_be_stacked(): sh = TM.shape((1, 1)) green = Color((0, 255, 0)) sh.context.color = "red" sh.context.background = green sh.context.effects = TM.Effects.underline sh[0, 0] = "*" res = tuple(sh[0, 0]) # in SVG land, from where we get the color names, 'green' is 0, 128, 0. green = Color((0, 255, 0)) assert res == ("*", Color("red"), green, TM.Effects.underline) sh.context.transformers.append(TM.Transformer(char=lambda value: ".")) res = tuple(sh[0, 0]) assert res == (".", Color("red"), green, TM.Effects.underline) sh.context.transformers.append( TM.Transformer(foreground=lambda value: TM.Color( (value.green, value.blue, value.red)))) res = tuple(sh[0, 0]) assert res == (".", Color("blue"), green, TM.Effects.underline) sh.context.transformers.append( TM.Transformer(background=lambda value: TM.Color( (value.green, value.blue, value.red)))) res = tuple(sh[0, 0]) assert res == (".", Color("blue"), Color("red"), TM.Effects.underline) sh.context.transformers.append( TM.Transformer(effects=lambda value: value | TM.Effects.blink)) res = tuple(sh[0, 0]) assert res == (".", Color("blue"), Color("red"), TM.Effects.underline | TM.Effects.blink)
def test_transformers_stacked_are_run_in_order(): sh = TM.shape((1,1)) sh.context.color = "red" sh.context.background = "green" sh.context.effects = TM.Effects.underline sh[0,0] = "*" sh.context.transformers.append(TM.Transformer(char=lambda value: ".")) sh.context.transformers.append(TM.Transformer(char=lambda value: "-" if value == "." else value)) assert sh[0,0].value == "-"
def test_transformers_stack_accepts_insertions(): sh = TM.shape((1,1)) sh.context.color = "red" sh.context.background = "green" sh.context.effects = TM.Effects.underline sh[0,0] = "*" sh.context.transformers.append(TM.Transformer(char=lambda value: "-" if value == "." else "#")) assert sh[0,0].value == "#" sh.context.transformers.insert(0, TM.Transformer(char=lambda value: ".")) assert sh[0,0].value == "-"
def test_transform_pixel_channel_works(): sh = TM.shape((1,1)) def new_pixel(value): return "*", TM.Color("red"), TM.Color("blue"), TM.Effects.underline sh.context.transformers.append(TM.Transformer(pixel=new_pixel, background=TM.Color("green"))) assert tuple(sh[0,0]) == ("*", TM.Color("red"), TM.Color("green"), TM.Effects.underline)
def test_transformer_dependency_injection_pixel_parameter(): sh = TM.shape((1,1)) sh[0,0] = "a" sh.context.transformers.append(TM.Transformer(effects=lambda pixel: TM.Effects.underline if pixel.value.isupper() else TM.Effects.none)) assert sh[0,0].effects == TM.Effects.none sh[0,0] = "A" assert sh[0,0].effects == TM.Effects.underline
def test_transformer_effects_channel_works(): sh = TM.shape((1,1)) sh.context.effects = TM.Effects.underline sh[0,0] = "*" assert sh[0,0].effects == TM.Effects.underline sh.context.transformers.append(TM.Transformer(effects=lambda value: value | TM.Effects.blink)) assert sh[0,0].value == "*" assert sh[0,0].effects == TM.Effects.blink | TM.Effects.underline
def test_transformer_background_channel_works(): sh = TM.shape((1,1)) sh.context.background = "red" sh[0,0] = "*" assert sh[0,0].background == Color("red") sh.context.transformers.append(TM.Transformer(background=lambda value: TM.Color((value.green, value.blue, value.red)))) assert sh[0,0].value == "*" assert sh[0,0].background == Color("blue")
def test_styled_text_transformers_inline_end_markup_dont_turn_off_location_based_mark_when_both_are_defined_as_string( ): sc, sh, text_plane = styled_text() sc.text.transformers_map["red"] = TM.Transformer( foreground=lambda: TM.Color("red")) sc.text.transformers_map["blue"] = TM.Transformer( background=lambda: TM.Color("blue")) sc.text[1].marks[3, 0] = TM.Mark(attributes={"pretransformer": "blue"}) sc.text[1][0, 0] = "[transformer: red]012345[/transformer]6789" sc.update() yield None assert sc.data[0, 0].foreground == TM.Color("red") assert sc.data[3, 0].foreground == TM.Color("red") assert sc.data[3, 0].background == TM.Color("blue") assert sc.data[6, 0].foreground == TM.values.DEFAULT_FG assert sc.data[6, 0].background == TM.Color("blue")
def test_styled_text_push_context_sequence_attribute(): from copy import copy seq = StyledSequence("", {}) seq._enter_iteration() tr1 = TM.Transformer(foreground="red") tr2 = TM.Transformer(background="yellow") assert tr1 not in seq.context.pretransformers original = copy(seq.context.pretransformers) seq._context_push({"pretransformer": tr1}, {}, "sequence", 0) assert seq.context.pretransformers[-1].foreground == tr1.foreground seq._context_push({"pretransformer": tr2}, {}, "sequence", 0) assert seq.context.pretransformers[-1].background == tr2.background assert seq.context.pretransformers[-2].foreground == tr1.foreground seq._context_push({}, {"pretransformer": None}, "sequence", 0) assert seq.context.pretransformers[-1].foreground == tr1.foreground seq._context_push({}, {"pretransformer": None}, "sequence", 0) assert seq.context.pretransformers == original
def test_styled_sequence_retrieves_transformers_from_text_plane_transformers_map( ): sc, sh, text_plane = styled_text() text_plane.transformers_map["asteriscs"] = TM.Transformer(char="*") text_plane[0, 5] = "012[transformer: asteriscs]345[/transformer]6789" sc.update() yield None assert sc.data[2, 5].value == "2" for i in range(3, 6): assert sc.data[i, 5].value == "*" assert sc.data[6, 5].value == "6"
def test_styled_text_transformers_inline_end_markup_turn_off_just_last_transformer( ): sc, sh, text_plane = styled_text() sc.text.transformers_map["red"] = TM.Transformer( foreground=lambda: TM.Color("red")) sc.text.transformers_map["blue"] = TM.Transformer( background=lambda: TM.Color("blue")) sc.text[1][ 0, 0] = "[transformer: red]012[transformer: blue]345[/transformer]67[/transformer]89" sc.update() yield None assert sc.data[0, 0].foreground == TM.Color("red") assert sc.data[3, 0].foreground == TM.Color("red") assert sc.data[3, 0].background == TM.Color("blue") assert sc.data[6, 0].foreground == TM.Color("red") assert sc.data[6, 0].background == TM.values.DEFAULT_BG assert sc.data[8, 0].foreground == TM.values.DEFAULT_FG assert sc.data[8, 0].background == TM.values.DEFAULT_BG
def text(): global sc sc.update() # TM.pause() entry1 = W.Text(sc, size=(4, 3), pos=(0, 2), text_plane=4, cancellable=True, border=True) entry2 = W.Entry(sc, width=10, pos=(0, 17), enter_callback=done, text_plane=1, border=True) #sh = TM.shape(TM.V2(8,5)*4) #sshaped_area(sh, 4) #sp = TM.Sprite(sh) #sh.draw.fill(color="white") #sp.active = True #sp.pos = (0, 10) #entry = W.Text(sc, sprite=sp, pos=(0, 5),esc_callback=done, text_plane=4) entry1.shape.context.color = "red" entry2.shape.context.color = "red" entry2.shape.context.background = (128, 128, 0) #entry2.shape.draw.fill(char=" ") entry1.sprite.transformers.append( TM.Transformer(background=lambda: (0, 0, 0) if not entry1.focus else (90, 90, 90))) TM.context.fps = 15 menu1 = W.ScreenMenu( sc, { "1": (lambda: sc.draw.rect( (30, 0, 38, 4), fill=True, color="red"), "vermelho"), "2": (lambda: sc.draw.rect( (30, 0, 38, 4), fill=True, color="yellow"), "amarelo"), "3": ("toggle", "Liga/desliga menu"), "4": ({ "1": (lambda: sc.draw.rect( (30, 0, 38, 4), fill=True, color="blue"), "azul"), "5": (lambda: sc.draw.rect( (30, 0, 38, 4), fill=True, color="green"), "verde"), }, "mais cores"), "f": (file_selector, "escolher arquivo") }, columns=3, )
def test_styled_text_transformers_spam_based_index_attribute_and_deactivation( ): sc, sh, text_plane = styled_text() sc.text.transformers_map["red"] = TM.Transformer( foreground=lambda: TM.Color("red")) sc.text.transformers_map["deg1"] = TM.Transformer( background=lambda sequence_index: TM.Color( (0, 25 * sequence_index, 255 - 25 * sequence_index))) sc.text[1][ 0, 0] = "[transformer: red 5]abc[transformer: deg1 10]defghijklmnopqrstyz" sc.update() yield None for i in range(0, 20): assert sc.data[i, 0].foreground == (TM.Color("red") if i < 5 else TM.values.DEFAULT_FG) if i < 3 or 13 <= i: assert sc.data[i, 0].background == TM.values.DEFAULT_BG else: assert sc.data[i, 0].background == TM.Color( (0, 25 * (i - 3), 255 - 25 * (i - 3)))
def test_styled_sequence_can_handle_pretransformers(): sc, sh, text_plane = styled_text() msg = "0123456789" tt = TM.Transformer( foreground=lambda pos: TM.Color((pos[0] * 25 % 256, 0, 0)), background=lambda pos: TM.Color((0, 0, (255 - pos[0] * 25) % 256)), ) aa = StyledSequence(msg, {0: TM.Mark(attributes={"pretransformer": tt})}, text_plane) aa.render() sc.update() yield None assert sc.data[0, 0].foreground == TM.Color((0, 0, 0)) assert sc.data[0, 0].background == TM.Color((0, 0, 255)) assert sc.data[9, 0].foreground == TM.Color((225, 0, 0)) assert sc.data[9, 0].background == TM.Color((0, 0, 30))
def test_transformer_character_channel_works_with_static_transform(): sh = TM.shape((1, 1)) sh[0, 0] = "*" assert sh[0, 0].value == "*" sh.context.transformers.append(TM.Transformer(char=".")) assert sh[0, 0].value == "."
def main(shape, resolution=None, clear=False, cycle=False): """Quick example to navigate an string-defined shape through the terminal using the arrow keys! Press <ESC> to exit. Usage example: $ terminedia-shapes --custom=" \\n *** \\n * * \\n *** " """ # Work around apparent bug in click: if shape is None: shape = shape1 if "\\n" in shape: shape = shape.replace("\\n", "\n") original_shape = shape shape = TM.shape( original_shape, **({ "color_map": c_map } if original_shape == shape2 else {})) shape = TM.FullShape.promote(shape, resolution=resolution) last_frame = time.time() time_acumulator = 0 counter = 0 def cycle_color(foreground, tick): if foreground != TM.DEFAULT_FG: return foreground return TM.Color(["red", "blue", "yellow", "lime"][tick % 4]) try: with keyboard(), Screen(clear_screen=clear) as scr: # with Screen(clear_screen=True) as scr: x = scr.get_size()[0] // 2 - 6 y = 0 pos = V2(x, y) sprite = scr.data.sprites.add(shape, pos, active=True) if cycle: sprite.transformers.append( TM.Transformer(foreground=cycle_color)) while True: key = inkey() if key in (K.ESC, "q"): break if not clear and key in (K.RIGHT, K.LEFT, K.UP, K.DOWN): scr.data.draw.rect(sprite.rect, erase=True) sprite.pos += ( ((key == K.RIGHT) - (key == K.LEFT)), ((key == K.DOWN) - (key == K.UP)), ) scr.update() current = time.time() ellapsed = current - last_frame time_acumulator += ellapsed counter += 1 pause_time = max(FRAME_DELAY - ellapsed, 0) time.sleep(pause_time) last_frame = time.time() finally: print( f"\nTotal frames: {counter}\nAverage time per frame: {time_acumulator / (counter or 1):.04f}" )
import sys import terminedia as TM sc = TM.Screen() b1 = TM.shape(sys.argv[1] if len(sys.argv) > 2 else "butterfly.jpg", size=(60,30)) b2 = TM.FullShape.promote(b1) sc.data.sprites.append(b2) sc.data.sprites[0].active=True def pixel(pixel): fg = TM.Color(pixel.foreground) char = "#*o. "[int((1 - fg.value) * 5)] fg.value = 1 return char, fg, pixel.background, pixel.effects sc.data.sprites[0].transformers.append(TM.Transformer(pixel=pixel)) sc.update()