diff --git a/html_to_django/converter.py b/html_to_django/converter.py index 65a4c28..5288eb3 100644 --- a/html_to_django/converter.py +++ b/html_to_django/converter.py @@ -18,8 +18,7 @@ def convert_file(path: str, overwrite: bool = False) -> None: out_path = path.replace(".html", ".n.html") with open(out_path, "w") as file: file.write("{% load static %}\n") - # indent=4 will be re added when https://github.com/python/typeshed/pull/11855 is accepted - file.write(soup.prettify(formatter=bs4.formatter.HTMLFormatter())) + file.write(soup.prettify(formatter=bs4.formatter.HTMLFormatter(indent=4))) def convert_dir(path: str, overwrite: bool = False) -> None: diff --git a/html_to_django/formatters/__init__.py b/html_to_django/formatters/__init__.py index 1486335..adbd25b 100644 --- a/html_to_django/formatters/__init__.py +++ b/html_to_django/formatters/__init__.py @@ -1,4 +1,6 @@ -from . import for_formatter, if_formatter, var_formatter, block_formatter, static_formatter +from . import (for_formatter, if_formatter, var_formatter, block_formatter, static_formatter, attr_formatter, + for_wrap_formatter, unwrap_formatter, include_formatter, remove_default_formatter, command_formatter) -formatters = [for_formatter, if_formatter, var_formatter, block_formatter, static_formatter] +formatters = [for_formatter, if_formatter, var_formatter, block_formatter, static_formatter, attr_formatter, + for_wrap_formatter, unwrap_formatter, include_formatter, remove_default_formatter, command_formatter] diff --git a/html_to_django/formatters/attr_formatter.py b/html_to_django/formatters/attr_formatter.py new file mode 100644 index 0000000..e0d237e --- /dev/null +++ b/html_to_django/formatters/attr_formatter.py @@ -0,0 +1,8 @@ +from bs4 import BeautifulSoup + + +def format(soup: BeautifulSoup) -> None: + for element in soup.find_all(attrs={"dj-attr": True}): + tag, value = element.get("dj-attr").split(";") + element[tag] = f"{{{{ {value} }}}}" + del element.attrs["dj-attr"] diff --git a/html_to_django/formatters/command_formatter.py b/html_to_django/formatters/command_formatter.py new file mode 100644 index 0000000..3ce8193 --- /dev/null +++ b/html_to_django/formatters/command_formatter.py @@ -0,0 +1,7 @@ +from bs4 import BeautifulSoup + + +def format(soup: BeautifulSoup) -> None: + for element in soup.find_all(attrs={"dj-command": True}): + element.string = f"{{% {element.get("dj-command")} %}}" + element.unwrap() diff --git a/html_to_django/formatters/for_wrap_formatter.py b/html_to_django/formatters/for_wrap_formatter.py new file mode 100644 index 0000000..37c9b28 --- /dev/null +++ b/html_to_django/formatters/for_wrap_formatter.py @@ -0,0 +1,8 @@ +from bs4 import BeautifulSoup + + +def format(soup: BeautifulSoup) -> None: + for element in soup.find_all(attrs={"dj-for-wrap": True}): + element.insert_before(f"{{% for {element.get("dj-for-wrap")} %}}") + element.insert_after("{% endfor %}") + del element["dj-for-wrap"] diff --git a/html_to_django/formatters/include_formatter.py b/html_to_django/formatters/include_formatter.py new file mode 100644 index 0000000..f8cb988 --- /dev/null +++ b/html_to_django/formatters/include_formatter.py @@ -0,0 +1,7 @@ +from bs4 import BeautifulSoup + + +def format(soup: BeautifulSoup) -> None: + for element in soup.find_all(attrs={"dj-include": True}): + element.string = f'{{% include "{element.get("dj-include")}" %}}' + del element.attrs["dj-include"] diff --git a/html_to_django/formatters/remove_default_formatter.py b/html_to_django/formatters/remove_default_formatter.py new file mode 100644 index 0000000..f69a792 --- /dev/null +++ b/html_to_django/formatters/remove_default_formatter.py @@ -0,0 +1,19 @@ +from bs4 import BeautifulSoup, Doctype, Tag + + +def format(soup: BeautifulSoup) -> None: + if html := soup.find("html"): + if isinstance(html, Tag): + if html.has_attr("dj-remove-default"): + if isinstance(soup.contents[0], Doctype): + soup.contents[0].extract() + if head := html.find("head"): + if isinstance(head, Tag): + head.decompose() + if body := html.find("body"): + if isinstance(body, Tag): + if script := body.find("script"): + if isinstance(script, Tag): + script.decompose() + body.unwrap() + html.unwrap() diff --git a/html_to_django/formatters/unwrap_formatter.py b/html_to_django/formatters/unwrap_formatter.py new file mode 100644 index 0000000..fb91dbb --- /dev/null +++ b/html_to_django/formatters/unwrap_formatter.py @@ -0,0 +1,6 @@ +from bs4 import BeautifulSoup + + +def format(soup: BeautifulSoup) -> None: + for element in soup.find_all(attrs={"dj-unwrap": True}): + element.unwrap()