some comment.

This commit is contained in:
puckoprutt 2025-10-26 19:48:02 +01:00
commit d803c576da
11 changed files with 208 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
__pycache__/
*/__pycache__/

0
README.md Normal file
View File

2
__init__.py Normal file
View File

@ -0,0 +1,2 @@
from .terminal import Terminal
from .highlighters import get_highlighter

1
header.py Normal file
View File

@ -0,0 +1 @@

8
highlighters/__init__.py Normal file
View File

@ -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

65
highlighters/base.py Normal file
View File

@ -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

View File

@ -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<email>[\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})"]

9
highlighters/html4.py Normal file
View File

@ -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:(?<element>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(?<attr>.+?))*>"]

11
highlighters/misc.py Normal file
View File

@ -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)

94
terminal.py Normal file
View File

@ -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")

1
traceback.py Normal file
View File

@ -0,0 +1 @@