add Formatless matching param
This commit is contained in:
parent
89c7ac15dd
commit
2246236e83
2 changed files with 57 additions and 4 deletions
44
ircrobots/formatting.py
Normal file
44
ircrobots/formatting.py
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
BOLD = "\x02"
|
||||||
|
COLOR = "\x03"
|
||||||
|
INVERT = "\x16"
|
||||||
|
ITALIC = "\x1D"
|
||||||
|
UNDERLINE = "\x1F"
|
||||||
|
RESET = "\x0F"
|
||||||
|
|
||||||
|
FORMATTERS = [
|
||||||
|
BOLD,
|
||||||
|
INVERT,
|
||||||
|
ITALIC,
|
||||||
|
UNDERLINE,
|
||||||
|
RESET
|
||||||
|
]
|
||||||
|
|
||||||
|
def tokens(s: str) -> List[str]:
|
||||||
|
tokens: List[str] = []
|
||||||
|
|
||||||
|
s_copy = list(s)
|
||||||
|
while s_copy:
|
||||||
|
token = s_copy.pop(0)
|
||||||
|
if token == COLOR:
|
||||||
|
for i in range(2):
|
||||||
|
if s_copy and s_copy[0].isdigit():
|
||||||
|
token += s_copy.pop(0)
|
||||||
|
if (len(s_copy) > 1 and
|
||||||
|
s_copy[0] == "," and
|
||||||
|
s_copy[1].isdigit()):
|
||||||
|
token += s_copy.pop(0)
|
||||||
|
token += s_copy.pop(0)
|
||||||
|
if s_copy and s_copy[0].isdigit():
|
||||||
|
token += s_copy.pop(0)
|
||||||
|
|
||||||
|
tokens.append(token)
|
||||||
|
elif token in FORMATTERS:
|
||||||
|
tokens.append(token)
|
||||||
|
return tokens
|
||||||
|
|
||||||
|
def strip(s: str):
|
||||||
|
for token in tokens(s):
|
||||||
|
s = s.replace(token, "", 1)
|
||||||
|
return s
|
|
@ -1,6 +1,7 @@
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from irctokens import Hostmask
|
from irctokens import Hostmask
|
||||||
from ..interface import IMatchResponseParam, IMatchResponseHostmask, IServer
|
from ..interface import IMatchResponseParam, IMatchResponseHostmask, IServer
|
||||||
|
from .. import formatting
|
||||||
|
|
||||||
class Any(IMatchResponseParam):
|
class Any(IMatchResponseParam):
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
|
@ -22,12 +23,20 @@ class Folded(IMatchResponseParam):
|
||||||
self._value = value
|
self._value = value
|
||||||
self._folded: Optional[str] = None
|
self._folded: Optional[str] = None
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return f"FoldString({self._value!r})"
|
return f"Folded({self._value!r})"
|
||||||
def match(self, server: IServer, arg: str) -> bool:
|
def match(self, server: IServer, arg: str) -> bool:
|
||||||
if self._folded is None:
|
if self._folded is None:
|
||||||
self._folded = server.casefold(self._value)
|
self._folded = server.casefold(self._value)
|
||||||
return self._folded == server.casefold(arg)
|
return self._folded == server.casefold(arg)
|
||||||
|
|
||||||
|
class Formatless(Literal):
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
brepr = super().__repr__()
|
||||||
|
return f"Formatless({brepr})"
|
||||||
|
def match(self, server: IServer, arg: str) -> bool:
|
||||||
|
strip = formatting.strip(arg)
|
||||||
|
return super().match(server, strip)
|
||||||
|
|
||||||
class Not(IMatchResponseParam):
|
class Not(IMatchResponseParam):
|
||||||
def __init__(self, param: IMatchResponseParam):
|
def __init__(self, param: IMatchResponseParam):
|
||||||
self._param = param
|
self._param = param
|
||||||
|
|
Loading…
Reference in a new issue