diff --git a/src/bozodown.py b/src/bozodown.py deleted file mode 100644 index 224d51e..0000000 --- a/src/bozodown.py +++ /dev/null @@ -1,153 +0,0 @@ -from __future__ import annotations - -from collections.abc import Callable -from typing import Any - -def _photohub_render(id: str, text: str) -> str: - if (id == "img"): - return f"" - -def _bozodown_render(id: str, text: str) -> str: - if (id == "list"): - print("error: list not supported") - return "" - if (id == "block"): - style, to_parse = text[5:-5].split("---") - style = style.replace("\n", "") - content: str = render(to_parse) - return f""" -
-{content} -
-""" - - -_specific_case_namespaces: dict[str, Callable[[str, str], str]] = { - "bozodown": _bozodown_render, - "photohub": _photohub_render, -} - - -_converters: list[dict[str, str]] = [ - { - "from_prefix": "# ", - "from_suffix": "\n", - "to_prefix": "

", - "to_suffix": "

", - }, - { - "from_prefix": "## ", - "from_suffix": "\n", - "to_prefix": "

", - "to_suffix": "

", - }, - { - "from_prefix": "### ", - "from_suffix": "\n", - "to_prefix": "

", - "to_suffix": "

", - }, - { - "from_prefix": "#### ", - "from_suffix": "\n", - "to_prefix": "

", - "to_suffix": "

", - }, - { - "from_prefix": "`", - "from_suffix": "`", - "to_prefix": "

", - "to_suffix": "

", - }, - { - "from_prefix": "**", - "from_suffix": "**", - "to_prefix": "", - "to_suffix": "", - }, - { - "from_prefix": "- ", - "from_suffix": "\n", - "code": "bozodown:list", - }, - { - "from_prefix": "```", - "from_suffix": "```", - "to_prefix": "
",
-        "to_suffix": "
", - }, - { - "from_prefix": "![", - "from_suffix": "]", - "code": "photohub:img", - }, - { - "from_prefix": "- [ ] ", - "from_suffix": "\n", - "to_prefix": "
  • ", - "to_suffix": "
  • ", - }, - { - "from_prefix": "- [x] ", - "from_suffix": "\n", - "to_prefix": "
  • ", - "to_suffix": "
  • ", - }, - { - "from_prefix": "
    ", - "from_suffix": "", - "to_prefix": "
    ", - }, - { - "from_prefix": "-----", - "from_suffix": "-----", - "code": "bozodown:block" - }, -] - -_default_converter: dict[str, str] = { - "from_prefix": "", - "to_prefix": "

    ", - "to_suffix": "

    ", -} - -def _render_element(text: str, converter: dict[str, str]) -> str: - code: str = converter.get("code") - if (code is not None): - namespace, id = code.split(":") - func = _specific_case_namespaces[namespace] - return func(id, text) - start: int = len(converter["from_prefix"]) - stop: int = len(text) - len(converter.get("from_suffix", "")) - return f"{converter['to_prefix']}{text[start:stop]}{converter['to_suffix']}" - -def _get_first_converter(text: str) -> tuple[str, dict] | None: - first_converter_found: dict[str, str | Callable[[str, list[str]], Any]] | None = None - start: int | None = None - for converter in _converters: - matching_patern_pos: str = text.find(converter['from_prefix']) - if (matching_patern_pos != -1): - if (first_converter_found is None or matching_patern_pos < start): - first_converter_found = converter - start = matching_patern_pos - if (first_converter_found is None): - return text, _default_converter - if (start != 0): - return text[:start], _default_converter - suffix: int = first_converter_found.get("from_suffix", "") - prefix: int = first_converter_found['from_prefix'] - stop: int = text.find(suffix, start + len(prefix)) - if (stop == -1): - print(f"error: '{prefix}' was never finished by a '{suffix}'") - return - stop += len(suffix) - return text[start:stop], first_converter_found - -def render(raw_content: str) -> str: - content: str = "" - to_parse: str = raw_content - while len(to_parse) > 0: - text, converter = _get_first_converter(to_parse) - content += _render_element(text, converter) - to_parse = to_parse[len(text):] - return content \ No newline at end of file diff --git a/src/bozodown/__init__.py b/src/bozodown/__init__.py new file mode 100644 index 0000000..acf0ac1 --- /dev/null +++ b/src/bozodown/__init__.py @@ -0,0 +1 @@ +__all__ = ["Bozodown"] \ No newline at end of file diff --git a/src/bozodown/bozodown.py b/src/bozodown/bozodown.py new file mode 100644 index 0000000..a89a6d0 --- /dev/null +++ b/src/bozodown/bozodown.py @@ -0,0 +1,65 @@ + + +from collections.abc import Callable + +from . import default_converters + +class Bozodown(): + + def __init__(self): + self._converters: dict[str, dict[str, str]] = default_converters.converters.copy() + self._text_converter: dict[str, str] = default_converters.text_converter.copy() + self._specific_case_namespaces: dict[str, Callable[[object, str, str], str]] = { + "bozodown": self._bozodown_render, + } + + def render(self, to_parse: str): + content: str = "" + while len(to_parse) > 0: + text, converter = self._get_first_converter(to_parse) + content += self._render_element(text, converter) + to_parse = to_parse[len(text):] + return content + + + def _render_element(self, text: str, converter: dict[str, str]) -> str: + code: str = converter.get("code") + if (code is not None): + namespace, id = code.split(":") + func = self._specific_case_namespaces[namespace] + return func(id, text) + start: int = len(converter["from_prefix"]) + stop: int = len(text) - len(converter.get("from_suffix", "")) + return f"{converter['to_prefix']}{text[start:stop]}{converter['to_suffix']}" + + def _bozodown_render(self, id: str, text: str) -> str: + if (id == "list"): + print("error: list not supported") + return "" + if (id == "block"): + style, to_parse = text[5:-5].split("---") + style = style.replace("\n", "") + content: str = self.render(to_parse) + return f"
    {content}
    " + + def _get_first_converter(self, text: str) -> tuple[str, dict] | None: + first_converter_found: dict[str, str] | None = None + start: int | None = None + for converter in self._converters.values(): + matching_patern_pos: str = text.find(converter['from_prefix']) + if (matching_patern_pos != -1): + if (first_converter_found is None or matching_patern_pos < start): + first_converter_found = converter + start = matching_patern_pos + if (first_converter_found is None): + return text, self._text_converter + if (start != 0): + return text[:start], self._text_converter + suffix: int = first_converter_found.get("from_suffix", "") + prefix: int = first_converter_found['from_prefix'] + stop: int = text.find(suffix, start + len(prefix)) + if (stop == -1): + print(f"error: '{prefix}' was never finished by a '{suffix}'") + return + stop += len(suffix) + return text[start:stop], first_converter_found \ No newline at end of file diff --git a/src/bozodown/default_converters.py b/src/bozodown/default_converters.py new file mode 100644 index 0000000..f2d39ec --- /dev/null +++ b/src/bozodown/default_converters.py @@ -0,0 +1,83 @@ +converters: list[str, dict[str, str]] = { + "title": { + "from_prefix": "# ", + "from_suffix": "\n", + "to_prefix": "

    ", + "to_suffix": "

    ", + }, + "subtitle": { + "from_prefix": "## ", + "from_suffix": "\n", + "to_prefix": "

    ", + "to_suffix": "

    ", + }, + "subsubtitle": { + "from_prefix": "### ", + "from_suffix": "\n", + "to_prefix": "

    ", + "to_suffix": "

    ", + }, + "subsubsubtitle": { + "from_prefix": "#### ", + "from_suffix": "\n", + "to_prefix": "

    ", + "to_suffix": "

    ", + }, + "quote": { + "from_prefix": "`", + "from_suffix": "`", + "to_prefix": "

    ", + "to_suffix": "

    ", + }, + "bold": { + "from_prefix": "**", + "from_suffix": "**", + "to_prefix": "", + "to_suffix": "", + }, + "list": { + "from_prefix": "- ", + "from_suffix": "\n", + "code": "bozodown:list", + }, + "code": { + "from_prefix": "```", + "from_suffix": "```", + "to_prefix": "
    ",
    +        "to_suffix": "
    ", + }, + "image": { + "from_prefix": "![", + "from_suffix": "]", + "to_prefix": "", + }, + "block": { + "from_prefix": "-----", + "from_suffix": "-----", + "code": "bozodown:block", + }, + "checkbox_clear": { + "from_prefix": "- [ ] ", + "from_suffix": "\n", + "to_prefix": "
  • ", + "to_suffix": "
  • ", + }, + "checkbox_full": { + "from_prefix": "- [x] ", + "from_suffix": "\n", + "to_prefix": "
  • ", + "to_suffix": "
  • ", + }, + "newline": { + "from_prefix": "
    ", + "from_suffix": "", + "to_prefix": "
    ", + }, +} + +text_converter: dict[str, str] = { + "from_prefix": "", + "to_prefix": "

    ", + "to_suffix": "

    ", +} \ No newline at end of file diff --git a/src/photodown.py b/src/photodown.py new file mode 100644 index 0000000..aaac921 --- /dev/null +++ b/src/photodown.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from bozodown.bozodown import Bozodown + +if TYPE_CHECKING: + from picture import Picture + from bulk_page import BulkPage + +class Photodown(Bozodown): + + def __init__(self): + super().__init__() + self._specific_case_namespaces.update({"photohub": self._photohub_render}) + image_converter = self._converters.get("image") + image_converter.update({"code": "photohub:image"}) + self._bulk: list[Picture] = [] + + def add_bulk(self, bulk: list[Picture]): + self._bulk = bulk.copy() + + def _photohub_render(self, id: str, text: str) -> str: + if (id == "image"): + picture_url = f"{text[2:-1]}" + + return f"" +