Custom emojis support
This commit is contained in:
47
utils/emojis.py
Normal file
47
utils/emojis.py
Normal file
@@ -0,0 +1,47 @@
|
||||
import mimetypes
|
||||
import re
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
from typing import Dict
|
||||
from typing import List
|
||||
from typing import Set
|
||||
|
||||
from little_boxes import activitypub as ap
|
||||
|
||||
EMOJI_REGEX = re.compile(r"(:[\d\w]+:)")
|
||||
|
||||
EMOJIS: Dict[str, ap.Emoji] = {}
|
||||
EMOJIS_BY_NAME: Dict[str, ap.Emoji] = {}
|
||||
|
||||
|
||||
def _load_emojis(root_dir: Path, base_url: str) -> None:
|
||||
if EMOJIS:
|
||||
return
|
||||
for emoji in (root_dir / "static" / "emojis").iterdir():
|
||||
mt = mimetypes.guess_type(emoji.name)[0]
|
||||
if mt and mt.startswith("image/"):
|
||||
name = emoji.name.split(".")[0]
|
||||
ap_emoji = ap.Emoji(
|
||||
name=f":{name}:",
|
||||
updated=ap.format_datetime(datetime.fromtimestamp(0.0).astimezone()),
|
||||
id=f"{base_url}/emoji/{name}",
|
||||
icon={
|
||||
"mediaType": mt,
|
||||
"type": ap.ActivityType.IMAGE.value,
|
||||
"url": f"{base_url}/static/emojis/{emoji.name}",
|
||||
},
|
||||
)
|
||||
EMOJIS[emoji.name] = ap_emoji
|
||||
EMOJIS_BY_NAME[ap_emoji.name] = ap_emoji
|
||||
|
||||
|
||||
def tags(content: str) -> List[Dict[str, Any]]:
|
||||
tags: List[Dict[str, Any]] = []
|
||||
added: Set[str] = set()
|
||||
for e in re.findall(EMOJI_REGEX, content):
|
||||
if e not in added and e in EMOJIS_BY_NAME:
|
||||
tags.append(EMOJIS_BY_NAME[e].to_dict())
|
||||
added.add(e)
|
||||
|
||||
return tags
|
Reference in New Issue
Block a user