commit d803c576dad6b17f267b11e954e4acb4859961ae Author: puckoprutt Date: Sun Oct 26 19:48:02 2025 +0100 some comment. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0aa8880 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +*/__pycache__/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..2c907d8 --- /dev/null +++ b/__init__.py @@ -0,0 +1,2 @@ +from .terminal import Terminal +from .highlighters import get_highlighter diff --git a/header.py b/header.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/header.py @@ -0,0 +1 @@ + diff --git a/highlighters/__init__.py b/highlighters/__init__.py new file mode 100644 index 0000000..532dc43 --- /dev/null +++ b/highlighters/__init__.py @@ -0,0 +1,8 @@ + +from .base import Highlighter +from .base import Highlight_Manager +from .base import get_highlighter +from .communication import Email_Highlighter +from .communication import Swedish_Phone_Number_Highlighter +from .misc import Rainbow_Highlighter + diff --git a/highlighters/base.py b/highlighters/base.py new file mode 100644 index 0000000..e23a636 --- /dev/null +++ b/highlighters/base.py @@ -0,0 +1,65 @@ +# standard python +from typing import List +from dataclasses import dataclass +from dataclasses import field + +# rich +from rich.highlighter import ISO8601Highlighter +from rich.highlighter import JSONHighlighter + +from .communication import Swedish_Phone_Number_Highlighter +from .communication import Email_Highlighter +from .html4 import HTML4_Highlighter +from .misc import Rainbow_Highlighter + +class Highlighter: + + def __init__(self, name, highlighter, *args, **kwargs): + self.name = name + self.highlighter = highlighter + + def __call__(self, *args, **kwargs): + self.highlighter(*args, **kwargs) + + +@dataclass +class Highlight_Manager: + highlighters: List[Highlighter] + current: int = field(repr=False, default=0) + + def this(self, name): + for hl in self.highlighters: + if hl.name == name: + return hl + return + + def _hl_generator(self): + for x in self.highlighters: + yield x + + def __iter__(self): + return self._hl_generator() + + def __next__(self): + if len(self.highlighters) < self.current: + self.current = self.current + 1 + else: + self.current = 0 + raise StopIteration + + def __call__(self, name): + return self.this(name) + +def get_highlighter(name): + highlighters = Highlight_Manager([ + Highlighter("mobilnr", Swedish_Phone_Number_Highlighter()), + Highlighter("html4", HTML4_Highlighter()), + Highlighter("rainbow", Rainbow_Highlighter()), + Highlighter("email", Email_Highlighter()), + Highlighter("date_iso8601", ISO8601Highlighter()), + Highlighter("json", JSONHighlighter()), + ]) + for x in highlighters: + if x.name == name: + return x + return None diff --git a/highlighters/communication.py b/highlighters/communication.py new file mode 100644 index 0000000..e8f011d --- /dev/null +++ b/highlighters/communication.py @@ -0,0 +1,15 @@ +from rich.console import Console +from rich.highlighter import RegexHighlighter +from rich.theme import Theme + +class Email_Highlighter(RegexHighlighter): + """Apply style to anything that looks like an email.""" + + base_style = "communication." + highlights = [r"(?P[\w-]+@([\w-]+\.)+[\w-]+)"] + +class Swedish_Phone_Number_Highlighter(RegexHighlighter): + """Apply style to anything that looks like a swedish mobile number.""" + + base_style = "communication." + highlights = [r"(\+46|0)(7[02369])(| )(\d{7}|\d{3} \d{2} \d{2})"] diff --git a/highlighters/html4.py b/highlighters/html4.py new file mode 100644 index 0000000..57de1eb --- /dev/null +++ b/highlighters/html4.py @@ -0,0 +1,9 @@ +from rich.console import Console +from rich.highlighter import RegexHighlighter +from rich.theme import Theme + +class HTML4_Highlighter(RegexHighlighter): + """Apply style to anything that looks like an email.""" + + base_style = "html_tags" + highlights = [r"(<\/?)(?i:(?a(bbr|cronym|ddress|pplet|rea)?|b(ase(font)?|do|ig|lockquote|ody|r|utton)?|c(aption|enter|ite|(o(de|l(group)?)))|d(d|el|fn|i(r|v)|l|t)|em|f(ieldset|o(nt|rm)|rame(set)?)|h([1-6]|ead|r|tml)|i(frame|mg|n(put|s)|sindex)?|kbd|l(abel|egend|i(nk)?)|m(ap|e(nu|ta))|no(frames|script)|o(bject|l|pt(group|ion))|p(aram|re)?|q|s(amp|cript|elect|mall|pan|t(r(ike|ong)|yle)|u(b|p))|t(able|body|d|extarea|foot|h|itle|r|t)|u(l)?|var))(\s(?.+?))*>"] diff --git a/highlighters/misc.py b/highlighters/misc.py new file mode 100644 index 0000000..b7007b1 --- /dev/null +++ b/highlighters/misc.py @@ -0,0 +1,11 @@ +from random import randint +from rich.highlighter import Highlighter +from rich.console import Console +from rich.theme import Theme + +class Rainbow_Highlighter(Highlighter): + def highlight(self, text): + for index in range(len(text)): + text.stylize(f"color({randint(0xF, 0xFF)})", index, index+1) + + diff --git a/terminal.py b/terminal.py new file mode 100644 index 0000000..0f35fa7 --- /dev/null +++ b/terminal.py @@ -0,0 +1,94 @@ +# rich framework +from rich.traceback import install +from rich.progress import track +from rich.markdown import Markdown +from rich.console import Console +from rich.layout import Layout +from rich.panel import Panel +from rich.theme import Theme +from rich.table import Table +from rich.text import Text +from rich.tree import Tree + +# own shit +from .highlighters import Highlighter +from .highlighters import Highlight_Manager +from .highlighters import get_highlighter + +class Terminal: + + def __init__(self, *args, **kwargs): + install() + themes = kwargs.get("themes", None) + self.themes = { + "much_success": "bold white on green", + "success": "green", + "normal": "white", + "info": "cyan", + "warning": "yellow", + "danger": "red", + "critical": "bold white on red" + } + super(Terminal, self).__init__() + self.terminal = Console(theme=Theme(self.themes), record=True) + + def print(self, message, *args, **kwargs): + json = kwargs.get("json", False) + if not json: + return self.terminal.print(message, *args, **kwargs) + return self.terminal.print_json(message) + + def input(self, question, *args, **kwargs): + return self.terminal.input(question, *args, **kwargs) + + def log(self, message, log_locals=True, *args, **kwargs): + self.terminal.log(message, log_locals=log_locals, *args, **kwargs) + + def text(self, string, *args, **kwargs): + return Text(string, *args, **kwargs) + + def table(self, *args, **kwargs): + return Table(*args, **kwargs) + + def panel(self, text, *args, **kwargs): + return Panel(text, *args, **kwargs) + + def tree(self, title, *args, **kwargs): + return Tree(title, *args, **kwargs) + + def layout(self, name, *args, **kwargs): + return Layout(name, *args, **kwargs) + + def progressbar(self, generator, description="Processing..."): + for z in track(generator, description=description): + yield z + + def get_highlighter(self): + return get_highlighter() + + def add_themes(self, themes): + if not isinstance(theme, dict): + return 0 + added = 0 + for k, v in theme.items(): + if self.add_theme(k, v): + self.print("could not add {k}, trying the next one..") + else: + added = added + 1 + return added + + def add_theme(self, name, style, forced=False): + if not isinstance(name, str) and not forced: + self.print("bad name.") + return 1 + elif not isinstance(style) and not forced: + self.print("bad style.") + return 2 + if name in self.themes.keys() and not forced: + self.print(f"the theme {k} already exists..") + return 3 + self.themes[name] = style + return 0 + + def __exit__(self, type, value, traceback): + self.terminal.save_html("last_run.html") diff --git a/traceback.py b/traceback.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/traceback.py @@ -0,0 +1 @@ +