some comment.
This commit is contained in:
commit
d803c576da
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
__pycache__/
|
||||
*/__pycache__/
|
||||
2
__init__.py
Normal file
2
__init__.py
Normal file
@ -0,0 +1,2 @@
|
||||
from .terminal import Terminal
|
||||
from .highlighters import get_highlighter
|
||||
8
highlighters/__init__.py
Normal file
8
highlighters/__init__.py
Normal 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
65
highlighters/base.py
Normal 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
|
||||
15
highlighters/communication.py
Normal file
15
highlighters/communication.py
Normal 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
9
highlighters/html4.py
Normal 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
11
highlighters/misc.py
Normal 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
94
terminal.py
Normal 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
1
traceback.py
Normal file
@ -0,0 +1 @@
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user