From 050d7e2a5ec6ed750ee3951aedd1b3240fdc17ad Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Thu, 21 Nov 2024 16:46:59 +0000 Subject: [PATCH] separate the lnk routine to avind unnecessary loops --- TermTk/TTkCore/TTkTerm/colors.py | 22 +++++----- TermTk/TTkCore/color.py | 8 ++-- TermTk/TTkTestWidgets/testwidget.py | 6 ++- tests/timeit/30.rendering.02.Colors.py | 59 ++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 16 deletions(-) create mode 100755 tests/timeit/30.rendering.02.Colors.py diff --git a/TermTk/TTkCore/TTkTerm/colors.py b/TermTk/TTkCore/TTkTerm/colors.py index e4b83e21..8765c284 100644 --- a/TermTk/TTkCore/TTkTerm/colors.py +++ b/TermTk/TTkCore/TTkTerm/colors.py @@ -61,17 +61,10 @@ class TTkTermColor(): 29: ~STRIKETROUGH } # Ps = 2 9 β‡’ Not crossed-out, ECMA-48 3rd. @staticmethod - def rgb2ansi(fg: tuple=None, bg:tuple=None, mod:int=0, link:str='', clean:bool=False, cleanLink:bool=False): + def rgb2ansi(fg: tuple=None, bg:tuple=None, mod:int=0, clean:bool=False): ret = [] ret_append = ret.append - linkAnsi = "" - - if cleanLink: - linkAnsi = "\033]8;;\033\\" - if link: - linkAnsi = f"\033]8;;{link}\033\\" - if clean: ret_append('0') @@ -98,9 +91,18 @@ class TTkTermColor(): if mod & TTkTermColor.STRIKETROUGH: ret_append('9') if ret: - return f'\033[{";".join(ret)}m{linkAnsi}' + return f'\033[{";".join(ret)}m' else: - return '\033[0m'+linkAnsi + return '\033[0m' + + @staticmethod + def rgb2ansi_link(fg: tuple=None, bg:tuple=None, mod:int=0, link:str='', clean:bool=False, cleanLink:bool=False): + linkAnsi = "" + if cleanLink: + linkAnsi = "\033]8;;\033\\" + if link: + linkAnsi = f"\033]8;id=1;{link}\033\\" + return TTkTermColor.rgb2ansi(fg=fg,bg=bg,mod=mod,clean=clean)+linkAnsi def _256toRgb(val): pass diff --git a/TermTk/TTkCore/color.py b/TermTk/TTkCore/color.py index da6c585b..8d9e7e19 100644 --- a/TermTk/TTkCore/color.py +++ b/TermTk/TTkCore/color.py @@ -372,7 +372,7 @@ class _TTkColor_mod_link(_TTkColor_mod): def __str__(self): if not self._buffer: - self._buffer = TTkTermColor.rgb2ansi( + self._buffer = TTkTermColor.rgb2ansi_link( fg=self._fg, bg=self._bg, mod=self._mod, link=self._link, clean=self._clean) return self._buffer @@ -428,16 +428,16 @@ class _TTkColor_mod_link(_TTkColor_mod): None == self._fg != other._fg or self._link != otherLink or self._mod != otherMod ): - return TTkTermColor.rgb2ansi( + return TTkTermColor.rgb2ansi_link( fg=self._fg, bg=self._bg, mod=self._mod, link=self._link, clean=True) return '' def __rsub__(self, other) -> str: if type(other) == _TTkColor: - return TTkTermColor.rgb2ansi(fg=other._fg, bg=other._bg, clean=True, cleanLink=True) + return TTkTermColor.rgb2ansi_link(fg=other._fg, bg=other._bg, clean=True, cleanLink=True) else: - return TTkTermColor.rgb2ansi(fg=other._fg, bg=other._bg, mod=other._mod, clean=True, cleanLink=True) + return TTkTermColor.rgb2ansi_link(fg=other._fg, bg=other._bg, mod=other._mod, clean=True, cleanLink=True) def copy(self, modifier=True): ret = _TTkColor_mod_link() diff --git a/TermTk/TTkTestWidgets/testwidget.py b/TermTk/TTkTestWidgets/testwidget.py index fc778461..41573623 100644 --- a/TermTk/TTkTestWidgets/testwidget.py +++ b/TermTk/TTkTestWidgets/testwidget.py @@ -31,8 +31,10 @@ from TermTk.TTkWidgets.label import * from TermTk.TTkWidgets.frame import * class _TestContent(TTkWidget): - t01 = TTkString(color=TTkColor.fg("#ff0000") ,text=" L😎rem ipsum dolor sit amet, ⌚ ❀ πŸ’™ πŸ™‹'") - t02 = TTkString(color=TTkColor.fg("#ff8800") ,text="consectetur adipiscing elit,") + t01 = TTkString(color=TTkColor.fg("#ff0000", link="https://github.com/ceccopierangiolieugenio/pyTermTk") , + text=" L😎rem ipsum dolor sit amet, ⌚ ❀ πŸ’™ πŸ™‹'") + t02 = TTkString(color=TTkColor.fg("#ff8800", link="https://ceccopierangiolieugenio.itch.io/dumb-paint-tool"), + text="consectetur adipiscing elit,") t03 = TTkString(color=TTkColor.fg("#ffff00") ,text="sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.") t04 = TTkString(color=TTkColor.fg("#00ff00") ,text="Ut enim ad minim veniam,") t05 = TTkString(color=TTkColor.fg("#00ffff") ,text="quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.") diff --git a/tests/timeit/30.rendering.02.Colors.py b/tests/timeit/30.rendering.02.Colors.py new file mode 100755 index 00000000..0bd82d75 --- /dev/null +++ b/tests/timeit/30.rendering.02.Colors.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 + +# MIT License +# +# Copyright (c) 2024 Eugenio Parodi +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +import os +import sys +import argparse +import operator +import json +import timeit + +sys.path.append(os.path.join(sys.path[0],'../..')) +import TermTk as ttk + +c01 = [ttk.TTkColor.fg( f'#0000{x:02X}') for x in range(200)] +c02 = [ttk.TTkColor.bg( f'#0000{x:02X}') for x in range(200)] +c03 = [ttk.TTkColor.fg( f'#0000{x:02X}')+ttk.TTkColor.UNDERLINE for x in range(200)] +c04 = [ttk.TTkColor.bg( f'#0000{x:02X}')+ttk.TTkColor.UNDERLINE for x in range(200)] +c10 = [ttk.TTkColor.fgbg(f'#0000{x:02X}',f'#0000{x:02X}') for x in range(200)] +c11 = [ttk.TTkColor.fgbg(f'#0000{x:02X}',f'#0000{x:02X}')+ttk.TTkColor.BOLD for x in range(200)] +c20 = [ttk.TTkColor.fgbg(f'#0000{x:02X}',f'#0000{x:02X}','http://www.example.com/{x:02X}')+ttk.TTkColor.UNDERLINE for x in range(200)] + +def test_ti_01(): return len(''.join([str(x) for x in c01])) +def test_ti_02(): return len(''.join([str(x) for x in c02])) +def test_ti_03(): return len(''.join([str(x) for x in c03])) +def test_ti_04(): return len(''.join([str(x) for x in c04])) +def test_ti_10(): return len(''.join([str(x) for x in c10])) +def test_ti_11(): return len(''.join([str(x) for x in c11])) +def test_ti_20(): return len(''.join([str(x) for x in c20])) + +loop = 10000 + +a = {} + +for testName in sorted([tn for tn in globals() if tn.startswith('test_ti_')]): + result = timeit.timeit(f'{testName}(*a)', globals=globals(), number=loop) + # print(f"test{iii}) fps {loop / result :.3f} - s {result / loop:.10f} - {result / loop} {globals()[testName](*a)}") + print(f"{testName} | {result / loop:.10f} sec. | {loop / result : 15.3f} Fps β•žβ•‘-> {globals()[testName](*a)}")