import os import re from markdown import markdown from urllib.parse import urlparse image_extensions = ['.jpg', '.jpeg', '.png'] document_extensions = ['.doc', '.docx', '.pdf', '.xls', '.xlsx'] class TokenFactory: def __init__(self, token) -> None: super().__init__() self.token = token def create(self, data): return self.token(data=data) class BuildTokenFactory(TokenFactory): def __init__(self, token, build) -> None: super().__init__(token) self.build = build def create(self, data): x = self.token(data=data) x.build = self.build return x class Token: @staticmethod def test(data: str): return True def __init__(self, name, data) -> None: super().__init__() self.name = name self.data = data self.joinable = True async def compile(self): return str(self.data) def merge(self, token): return self def __repr__(self) -> str: return f'[Token {self.name} {self.data}]' class SplitToken(Token): @staticmethod def test(data: str): data = data.strip() return data == '' def __init__(self, data) -> None: super().__init__(name='split', data=None) class TextToken(Token): @staticmethod def test(data: str): return True def __init__(self, data) -> None: super().__init__(name='text', data=data) def merge(self, token: Token): data = self.data data += '\n' data += token.data return TextToken(data.strip()) async def compile(self): return markdown_to_html(self.data) class FileToken(Token): @staticmethod def test(data: str): return is_file(data, document_extensions + image_extensions) def __init__(self, data) -> None: super().__init__(name='file', data=data) self.joinable = False async def compile(self): data = parse_file(self.data) url = data['file'] text = data['caption'] if data['caption'] else url return f'{text}' class ImageToken(Token): @staticmethod def test(data: str): return is_image(data) def __init__(self, data) -> None: super().__init__(name='image', data=data) self.joinable = True self.build = None def merge(self, token: Token): merged_token = ImageCollectionToken([self.data, token.data]) merged_token.build = self.build return merged_token async def compile(self): img = self.parse_data() img = await self.build(img) alt = img['alt'] caption = markdown_to_html(img['caption']) src = img['src'] tpl = f'''