rDrama/files/helpers/marseyfx/parser.py

128 lines
3.7 KiB
Python
Raw Normal View History

2023-09-18 03:01:40 +00:00
from tokenize import Token
from bs4 import BeautifulSoup
from files.helpers.config.const import SITE_FULL_IMAGES
2023-09-24 06:02:53 +00:00
from files.helpers.marseyfx.tokenizer import ArgsToken, DotToken, GroupToken, NumberLiteralToken, Tokenizer, WordToken
from files.helpers.marseyfx.modifiers import Modified, Modifier, modifier_whitelist
2023-09-18 03:01:40 +00:00
emoji_replacers = {
'!': 'is_flipped',
'#': 'is_big',
'@': 'is_user'
}
class Emoji:
name: str
token: Token
is_big = False
is_flipped = False
is_user = False
modifiers: list[Modifier]
2023-09-24 06:02:53 +00:00
is_primary = True
2023-09-18 03:01:40 +00:00
2023-09-24 06:02:53 +00:00
def __init__(self, name: str, modifiers, token: Token, **args):
2023-09-18 03:01:40 +00:00
for symbol, value in emoji_replacers.items():
2023-09-18 05:40:02 +00:00
if symbol in name:
name = name.replace(symbol, '')
setattr(self, value, True)
2023-09-18 03:01:40 +00:00
self.name = name
self.modifiers = modifiers
self.token = token
2023-09-24 06:02:53 +00:00
self.is_primary = args.get('is_primary', True)
2023-09-18 05:40:02 +00:00
2023-09-24 06:02:53 +00:00
def create_el(self, tokenizer: Tokenizer):
2023-09-18 03:01:40 +00:00
soup = BeautifulSoup()
el = soup.new_tag(
'img',
loading='lazy',
2023-09-18 05:40:02 +00:00
src=f'{SITE_FULL_IMAGES}/e/{self.name}.webp',
2023-09-24 06:02:53 +00:00
attrs={
'class': f'marseyfx-emoji marseyfx-image',
}
2023-09-18 05:40:02 +00:00
)
soup.append(el)
el = el.wrap(
2023-09-24 06:02:53 +00:00
soup.new_tag('div', attrs={
'class': 'marseyfx-emoji-container'
})
2023-09-18 03:01:40 +00:00
)
2023-09-24 06:02:53 +00:00
mod = Modified(el, tokenizer)
2023-09-18 05:40:02 +00:00
mod.apply_modifiers(self.modifiers)
2023-09-24 06:02:53 +00:00
container_attrs = {
'class': 'marseyfx-container',
}
if self.is_primary:
container_attrs |= {
'data-bs-toggle': 'tooltip',
'title': tokenizer.str
}
container = soup.new_tag('div', attrs=container_attrs)
2023-09-18 03:01:40 +00:00
if (self.is_big):
2023-09-18 05:40:02 +00:00
container['class'].append(' marseyfx-big')
2023-09-18 03:01:40 +00:00
if (self.is_flipped):
2023-09-18 05:40:02 +00:00
container['class'].append(' marseyfx-flipped')
2023-09-18 03:01:40 +00:00
2023-09-18 15:05:28 +00:00
return mod.container.wrap(container)
2023-09-18 03:01:40 +00:00
2023-09-24 06:02:53 +00:00
def parse_emoji(tokenizer: Tokenizer):
2023-09-18 03:01:40 +00:00
token = tokenizer.parse_next_tokens()
2023-09-18 05:40:02 +00:00
if len(tokenizer.errors) > 0 or token is None:
2023-09-18 03:01:40 +00:00
return False, None, token
emoji = parse_from_token(tokenizer, token)
2023-09-18 05:40:02 +00:00
print(f'Here! {emoji}')
2023-09-18 03:01:40 +00:00
if not emoji:
return False, None, token
return True, emoji, token
def parse_from_token(tokenizer: Tokenizer, token: GroupToken):
if not isinstance(token, GroupToken):
tokenizer.error('Malformed token -- Expected a group token')
return
2023-09-18 05:40:02 +00:00
emoji = token.children[0]
2023-09-18 03:01:40 +00:00
2023-09-24 06:02:53 +00:00
if not isinstance(emoji, WordToken) and not isinstance(emoji, NumberLiteralToken):
tokenizer.error('Malformed token -- Expected an emoji (word token) or number literal token')
2023-09-18 03:01:40 +00:00
return
modifiers = []
i = 1
2023-09-18 05:40:02 +00:00
while i + 1 < len(token.children):
t = token.children[i]
2023-09-18 03:01:40 +00:00
if not isinstance(t, DotToken):
tokenizer.error('Malformed token -- Expected a dot')
return
2023-09-18 05:40:02 +00:00
modifier = token.children[i + 1]
2023-09-18 03:01:40 +00:00
if not isinstance(modifier, WordToken):
tokenizer.error('Malformed token -- Expected a modifier name (word token)')
return
2023-09-24 06:02:53 +00:00
if not modifier.value in modifier_whitelist:
tokenizer.error(f'Unknown modifier: {modifier.value}')
return
2023-09-18 05:40:02 +00:00
if not i + 2 < len(token.children) or not isinstance(token.children[i + 2], ArgsToken):
2023-09-18 03:01:40 +00:00
modifiers.append(Modifier(modifier.value, []))
i += 2
else:
2023-09-18 05:40:02 +00:00
args = token.children[i + 2]
2023-09-24 06:02:53 +00:00
modifiers.append(Modifier(modifier.value, args.children))
2023-09-18 03:01:40 +00:00
i += 3
2023-09-24 06:02:53 +00:00
return Emoji(tokenizer.str[emoji.span[0]:emoji.span[1]], modifiers, token)