django-despacer
A lightweight loader for the Django Template Language (DTL) that enables
removing excess whitespace by using delimiters like {#- and -#}.
It's lightweight because it adds just two regular expressions
at template loading time and nothing to request handling time.
This package is intended as a demonstration of this feature. I'm hoping this feature will eventually be included in Django's core code, at which time this package will no longer be needed.
About
I'm a frugal pragmatic perfectionist (with deadlines).
As a perfectionist, I'm horrified by the HTML generated by DTL: so many empty lines and bits of text floating in space. Being pragmatic, I accept that perfect whitespace control that generates perfectly indented HTML is unrealistic; so I'll settle for merely better looking HTML. Being frugal, I won't repeatedly pay a price for it but I'm willing to pay just once (at template load time).
So, I created django-despacer,
a Python package which meets these criteria.
Features:
- At request handling time, it does nothing (no overhead added).
- At template loading time, just two regular expressions are run to
alter templates before they're passed to the template compiler.
- When DEBUG is False (production), whitespace is removed as indicated
by despacing indicators (
{#-,-#},{{-,-}},{%-,-%}) that you add where you desire. - When DEBUG is True (development), only the despacing indicator
-is removed. Whitespace is not removed so that DTL compiler error messages have the correct line numbers.
- When DEBUG is False (production), whitespace is removed as indicated
by despacing indicators (
- Just two regular expressions are added. It's lightweight.
- My favourite feature: I can now add lots of comments
(comments are a good thing),
{#- yada yada -#}, without adding lots of blank lines to the HTML generated.
Function
Below ··· represents one or more consecutive
space, tab, and new line characters.
- When DEBUG is
False(prod), when a DTL template is loaded:···{#-,-#}···are replace with{#,#}respectively.···{%-,-%}···are replace with{%,%}respectively.···{{-,-}}···are replace with{{,}}respectively.- thereby removing blank lines and floating text in the generated HTML.
- When DEBUG is
True(dev), when a DTL template is loaded:···is not removed; only the-. Why? The line numbers of the original DTL source code must match the line numbers in the compiler's input to have correct line numbers in any error messages. That's important in development.{#-,-#}are replace with{#,#}respectively.{%-,-%}are replace with{%,%}respectively.{{-,-}}are replace with{{,}}respectively.
Usage
In my DTL templates I usually:
- Despace before and after comments
{#- yada yada -#}. I can now have many lines of comments without having many empty lines in my generated HTML! - Despace before but not after tags like
{%- if ... %}. This omits the empty line but still has a new-line after. Seeifbelow. - Despace before and after when I want to squeeze things down more.
See
<button>below where I want a one-liner.
<div>
{#- I can now add lots of comments to my template -#}
{#- ... without adding a ton of empty lines! -#}
{#- the {%- on the `if` below removes empty lines -#}
{#- I added for readability -#}
{%- if not user.is_authenticated %}
Howdy, stranger!
{%- else %}
Welcome back, {{ user.name }}.
{%- endif -%}
<button>
{#- Despacing before and after collapses <button> down to a one liner -#}
{%- translate "Save and Publish" -%}
{#- Isn't it just great to be able to add lots of comments! -#}
</button>
</div>
Without django-despacer (and without the -), the HTML would look like:
<div>
Howdy, stranger!
<button>
Save and Publish
</button>
</div>
... but with django-despacer:
<div>
Howdy, stranger!
<button>Save and Publish</button>
</div>
Installation
-
Requirements:
- Python >= 3.4
- Django >= 2.0
-
Install the package:
uv add django-despacer(or for old-schoolerspip install django-despacer) -
Configure Django settings to use the template loader provided
TEMPLATES = [
{
# ...
"OPTIONS": {
# ...
"loaders": [
(
"django.template.loaders.cached.Loader",
[
(
"django_despacer.DespacingLoader",
[
"django.template.loaders.filesystem.Loader",
"django.template.loaders.app_directories.Loader",
]
)
],
),
]
},
},
]
- Since you are defining "loaders" explicitly, you must specify them all, especially "django.template.loaders.cached.Loader".
- Apologies for the ugly configuration. If Django adopts this feature into core, you'll just need to remove the loader.
License
This project is licensed under the MIT License.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_despacer-0.1.2.tar.gz.
File metadata
- Download URL: django_despacer-0.1.2.tar.gz
- Upload date:
- Size: 4.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38cf34060dc712a3188612734fc45d852c17bbbe07acd8d348aadc7d91ea86fb
|
|
| MD5 |
9268979b281e6c2645cd35a734956df5
|
|
| BLAKE2b-256 |
8dba35666bb5180ef4f108a45038a296d8cd071141291a33ce8f65098a7e426c
|
File details
Details for the file django_despacer-0.1.2-py3-none-any.whl.
File metadata
- Download URL: django_despacer-0.1.2-py3-none-any.whl
- Upload date:
- Size: 5.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15f3f0a2be96789677c88f726609837c6a10b1225b2b674ba175bf4a4a3f892d
|
|
| MD5 |
a930bdd7bd00534ab2fc4a14e07e9735
|
|
| BLAKE2b-256 |
06a1f4a2c226047548d3607b2100f1594afc5fec392289e94783d5547629cb4b
|