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()