Repository files navigation

DjHTML

A pure-Python Django/Jinja template indenter without dependencies.

{%blockcontent%}
<blockquotecite="Guido Van Rossum"class="Pythonic"
>
{%blocktranslatetrimmed%}
Don't you hate code that's not properly indented?
{%endblocktranslate%}
</blockquote>
{%endblock%}

DjHTML indents mixed HTML/CSS/JavaScript templates that contain Django or Jinja template tags. It works similar to other code-formatting tools such as Black and interoperates nicely with pre-commit.

DjHTML is an indenter and not a formatter: it will only add/remove whitespace at the beginning of lines. It will not insert newlines or other characters. The goal is to correctly indent already well-structured templates, not to fix broken ones.

If you are looking for an actual template formatter, check out the djangofmt project.

Installation

DjHTML requires Python 3.9 or higher and is compatible with all operating systems supported by Python. Install DjHTML with the following command:

$ pip install djhtml

Note that Windows still uses legacy code pages instead of UTF-8. It is highly advised to set the environment variable PYTHONUTF8 to 1 with the setx command:

C:\> setx /m PYTHONUTF8 1

Usage

After installation you can indent templates using the djhtml command:

$ djhtml template.html
reindented template.html
1 template has been reindented.

You can also run djhtml . to indent all HTML files beneath the current directory.

An exit status of 0 means that everything went well, regardless of whether any files were changed. When the option -c / --check is used, the exit status is 1 when one or more files would have changed, but no changes are actually made. All available options are given by djthml -h / djthml --help.

Command-line arguments

DjHTML supports the following command-line arguments:

  • -h / --help: Show help text.
  • -v / --version: Show version number.
  • -c / --check: Dry-run, checks without modifying files.
  • -t / --tabwidth N: Tabwidth. The default is to guess.
  • -b / --extra-block BEGIN,END: Define an extra non-standard block tag. Can be used multiple times.

fmt:off and fmt:on

You can exclude specific lines from being processed with the {# fmt:off #} and {# fmt:on #} operators:

{# fmt:off #}
,-._|\
/ .\
\_,--._/
{# fmt:on #}

Contents inside <pre> ... </pre>, <!-- ... --->, /* ... */, and {% comment %} ... {% endcomment %} tags are also ignored (depending on the current mode).

Modes

The indenter operates in one of three different modes:

  • DjHTML mode: the default mode. Invoked by using the djhtml command or the pre-commit hook.

  • DjCSS mode. Will be entered when a <style> tag is encountered in DjHTML mode. It can also be invoked directly with the command djcss.

  • DjJS mode. Will be entered when a <script> tag is encountered in DjHTML mode. It can also be invoked directly with the command djjs.

pre-commit configuration

A great way to use DjHTML is as a pre-commit hook, so all your HTML, CSS and JavaScript files will automatically be indented upon every commit.

First, install pre-commit:

$ pip install pre-commit
$ pre-commit install

Then, add the following to your .pre-commit-config.yaml:

repos:
- repo: https://github.com/rtts/djhtmlrev: 'main'# replace with the latest tag on GitHubhooks:
- id: djhtml
- id: djcss
- id: djjs

Now run pre-commit autoupdate to automatically replace main with the latest tag on GitHub, as recommended by pre-commit.

If you want to override a command-line option, for example to change the default tabwidth, you change the entry point of these hooks:

hooks:
- id: djhtml# Use a tabwidth of 2 for HTML filesentry: djhtml --tabwidth 2
- id: djcss
- id: djjs

If you want to limit the files these hooks operate on, you can use pre-commit mechanisms for filtering. For example:

hooks:
- id: djhtml# Indent only HTML files in template directoriesfiles: .*/templates/.*\.html$
- id: djcss# Run this hook only on SCSS files (CSS and SCSS is the default)types: [scss]
- id: djjs# Exclude JavaScript files in vendor directoriesexclude: .*/vendor/.*

Now when you run git commit you will see something like the following output:

$ git commit
DjHTML...................................................................Failed
- hook id: djhtml
- files were modified by this hook
reindented template.html
1 template has been reindented.

To inspect the changes that were made, use git diff. If you are happy with the changes, you can commit them normally. If you are not happy, please do the following:

  1. Run SKIP=djhtml git commit to commit anyway, skipping the djhtml hook.

  2. Consider opening an issue with the relevant part of the input file that was incorrectly formatted, and an example of how it should have been formatted.

Your feedback for improving DjHTML is very welcome!

Development

First of all, clone this repository:

$ git clone https://github.com/rtts/djhtml
$ cd djhtml

Then, create a Python virtualenv and activate it:

$ python -m venv ~/.virtualenvs/djhtml
$ . ~/.virtualenvs/djhtml/bin/activate

Then, install the package in development mode including the dev dependencies, and install the pre-commit hooks:

$ python -m pip install -e '.[dev]'
$ pre-commit install --install-hooks

You can run the unittests with:

$ python -m unittest

Or use nox to test all supported Python interpreters:

$ nox

Finally, to get a little insight into the tokenization step of the indenting algorithm, you can run DjHTML with the -d / --debug argument. You will see a Python representation of the tokens that are created.

About

Django/Jinja template indenter

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

DjHTML

A pure-Python Django/Jinja template indenter without dependencies.

{%blockcontent%}
<blockquotecite="Guido Van Rossum"class="Pythonic"
>
{%blocktranslatetrimmed%}
Don't you hate code that's not properly indented?
{%endblocktranslate%}
</blockquote>
{%endblock%}

DjHTML indents mixed HTML/CSS/JavaScript templates that contain Django or Jinja template tags. It works similar to other code-formatting tools such as Black and interoperates nicely with pre-commit.

DjHTML is an indenter and not a formatter: it will only add/remove whitespace at the beginning of lines. It will not insert newlines or other characters. The goal is to correctly indent already well-structured templates, not to fix broken ones.

If you are looking for an actual template formatter, check out the djangofmt project.

Installation

DjHTML requires Python 3.9 or higher and is compatible with all operating systems supported by Python. Install DjHTML with the following command:

$ pip install djhtml

Note that Windows still uses legacy code pages instead of UTF-8. It is highly advised to set the environment variable PYTHONUTF8 to 1 with the setx command:

C:\> setx /m PYTHONUTF8 1

Usage

After installation you can indent templates using the djhtml command:

$ djhtml template.html
reindented template.html
1 template has been reindented.

You can also run djhtml . to indent all HTML files beneath the current directory.

An exit status of 0 means that everything went well, regardless of whether any files were changed. When the option -c / --check is used, the exit status is 1 when one or more files would have changed, but no changes are actually made. All available options are given by djthml -h / djthml --help.

Command-line arguments

DjHTML supports the following command-line arguments:

  • -h / --help: Show help text.
  • -v / --version: Show version number.
  • -c / --check: Dry-run, checks without modifying files.
  • -t / --tabwidth N: Tabwidth. The default is to guess.
  • -b / --extra-block BEGIN,END: Define an extra non-standard block tag. Can be used multiple times.

fmt:off and fmt:on

You can exclude specific lines from being processed with the {# fmt:off #} and {# fmt:on #} operators:

{# fmt:off #}
,-._|\
/ .\
\_,--._/
{# fmt:on #}

Contents inside <pre> ... </pre>, <!-- ... --->, /* ... */, and {% comment %} ... {% endcomment %} tags are also ignored (depending on the current mode).

Modes

The indenter operates in one of three different modes:

  • DjHTML mode: the default mode. Invoked by using the djhtml command or the pre-commit hook.

  • DjCSS mode. Will be entered when a <style> tag is encountered in DjHTML mode. It can also be invoked directly with the command djcss.

  • DjJS mode. Will be entered when a <script> tag is encountered in DjHTML mode. It can also be invoked directly with the command djjs.

pre-commit configuration

A great way to use DjHTML is as a pre-commit hook, so all your HTML, CSS and JavaScript files will automatically be indented upon every commit.

First, install pre-commit:

$ pip install pre-commit
$ pre-commit install

Then, add the following to your .pre-commit-config.yaml:

repos:
- repo: https://github.com/rtts/djhtmlrev: 'main'# replace with the latest tag on GitHubhooks:
- id: djhtml
- id: djcss
- id: djjs

Now run pre-commit autoupdate to automatically replace main with the latest tag on GitHub, as recommended by pre-commit.

If you want to override a command-line option, for example to change the default tabwidth, you change the entry point of these hooks:

hooks:
- id: djhtml# Use a tabwidth of 2 for HTML filesentry: djhtml --tabwidth 2
- id: djcss
- id: djjs

If you want to limit the files these hooks operate on, you can use pre-commit mechanisms for filtering. For example:

hooks:
- id: djhtml# Indent only HTML files in template directoriesfiles: .*/templates/.*\.html$
- id: djcss# Run this hook only on SCSS files (CSS and SCSS is the default)types: [scss]
- id: djjs# Exclude JavaScript files in vendor directoriesexclude: .*/vendor/.*

Now when you run git commit you will see something like the following output:

$ git commit
DjHTML...................................................................Failed
- hook id: djhtml
- files were modified by this hook
reindented template.html
1 template has been reindented.

To inspect the changes that were made, use git diff. If you are happy with the changes, you can commit them normally. If you are not happy, please do the following:

  1. Run SKIP=djhtml git commit to commit anyway, skipping the djhtml hook.

  2. Consider opening an issue with the relevant part of the input file that was incorrectly formatted, and an example of how it should have been formatted.

Your feedback for improving DjHTML is very welcome!

Development

First of all, clone this repository:

$ git clone https://github.com/rtts/djhtml
$ cd djhtml

Then, create a Python virtualenv and activate it:

$ python -m venv ~/.virtualenvs/djhtml
$ . ~/.virtualenvs/djhtml/bin/activate

Then, install the package in development mode including the dev dependencies, and install the pre-commit hooks:

$ python -m pip install -e '.[dev]'
$ pre-commit install --install-hooks

You can run the unittests with:

$ python -m unittest

Or use nox to test all supported Python interpreters:

$ nox

Finally, to get a little insight into the tokenization step of the indenting algorithm, you can run DjHTML with the -d / --debug argument. You will see a Python representation of the tokens that are created.

About

Django/Jinja template indenter

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DjHTML

A pure-Python Django/Jinja template indenter without dependencies.

{%blockcontent%}
<blockquotecite="Guido Van Rossum"class="Pythonic"
>
{%blocktranslatetrimmed%}
Don't you hate code that's not properly indented?
{%endblocktranslate%}
</blockquote>
{%endblock%}

DjHTML indents mixed HTML/CSS/JavaScript templates that contain Django or Jinja template tags. It works similar to other code-formatting tools such as Black and interoperates nicely with pre-commit.

DjHTML is an indenter and not a formatter: it will only add/remove whitespace at the beginning of lines. It will not insert newlines or other characters. The goal is to correctly indent already well-structured templates, not to fix broken ones.

If you are looking for an actual template formatter, check out the djangofmt project.

Installation

DjHTML requires Python 3.9 or higher and is compatible with all operating systems supported by Python. Install DjHTML with the following command:

$ pip install djhtml

Note that Windows still uses legacy code pages instead of UTF-8. It is highly advised to set the environment variable PYTHONUTF8 to 1 with the setx command:

C:\> setx /m PYTHONUTF8 1

Usage

After installation you can indent templates using the djhtml command:

$ djhtml template.html
reindented template.html
1 template has been reindented.

You can also run djhtml . to indent all HTML files beneath the current directory.

An exit status of 0 means that everything went well, regardless of whether any files were changed. When the option -c / --check is used, the exit status is 1 when one or more files would have changed, but no changes are actually made. All available options are given by djthml -h / djthml --help.

Command-line arguments

DjHTML supports the following command-line arguments:

  • -h / --help: Show help text.
  • -v / --version: Show version number.
  • -c / --check: Dry-run, checks without modifying files.
  • -t / --tabwidth N: Tabwidth. The default is to guess.
  • -b / --extra-block BEGIN,END: Define an extra non-standard block tag. Can be used multiple times.

fmt:off and fmt:on

You can exclude specific lines from being processed with the {# fmt:off #} and {# fmt:on #} operators:

{# fmt:off #}
,-._|\
/ .\
\_,--._/
{# fmt:on #}

Contents inside <pre> ... </pre>, <!-- ... --->, /* ... */, and {% comment %} ... {% endcomment %} tags are also ignored (depending on the current mode).

Modes

The indenter operates in one of three different modes:

  • DjHTML mode: the default mode. Invoked by using the djhtml command or the pre-commit hook.

  • DjCSS mode. Will be entered when a <style> tag is encountered in DjHTML mode. It can also be invoked directly with the command djcss.

  • DjJS mode. Will be entered when a <script> tag is encountered in DjHTML mode. It can also be invoked directly with the command djjs.

pre-commit configuration

A great way to use DjHTML is as a pre-commit hook, so all your HTML, CSS and JavaScript files will automatically be indented upon every commit.

First, install pre-commit:

$ pip install pre-commit
$ pre-commit install

Then, add the following to your .pre-commit-config.yaml:

repos:
- repo: https://github.com/rtts/djhtmlrev: 'main'# replace with the latest tag on GitHubhooks:
- id: djhtml
- id: djcss
- id: djjs

Now run pre-commit autoupdate to automatically replace main with the latest tag on GitHub, as recommended by pre-commit.

If you want to override a command-line option, for example to change the default tabwidth, you change the entry point of these hooks:

hooks:
- id: djhtml# Use a tabwidth of 2 for HTML filesentry: djhtml --tabwidth 2
- id: djcss
- id: djjs

If you want to limit the files these hooks operate on, you can use pre-commit mechanisms for filtering. For example:

hooks:
- id: djhtml# Indent only HTML files in template directoriesfiles: .*/templates/.*\.html$
- id: djcss# Run this hook only on SCSS files (CSS and SCSS is the default)types: [scss]
- id: djjs# Exclude JavaScript files in vendor directoriesexclude: .*/vendor/.*

Now when you run git commit you will see something like the following output:

$ git commit
DjHTML...................................................................Failed
- hook id: djhtml
- files were modified by this hook
reindented template.html
1 template has been reindented.

To inspect the changes that were made, use git diff. If you are happy with the changes, you can commit them normally. If you are not happy, please do the following:

  1. Run SKIP=djhtml git commit to commit anyway, skipping the djhtml hook.

  2. Consider opening an issue with the relevant part of the input file that was incorrectly formatted, and an example of how it should have been formatted.

Your feedback for improving DjHTML is very welcome!

Development

First of all, clone this repository:

$ git clone https://github.com/rtts/djhtml
$ cd djhtml

Then, create a Python virtualenv and activate it:

$ python -m venv ~/.virtualenvs/djhtml
$ . ~/.virtualenvs/djhtml/bin/activate

Then, install the package in development mode including the dev dependencies, and install the pre-commit hooks:

$ python -m pip install -e '.[dev]'
$ pre-commit install --install-hooks

You can run the unittests with:

$ python -m unittest

Or use nox to test all supported Python interpreters:

$ nox

Finally, to get a little insight into the tokenization step of the indenting algorithm, you can run DjHTML with the -d / --debug argument. You will see a Python representation of the tokens that are created.

About

Django/Jinja template indenter

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DjHTML

A pure-Python Django/Jinja template indenter without dependencies.

{%blockcontent%}
<blockquotecite="Guido Van Rossum"class="Pythonic"
>
{%blocktranslatetrimmed%}
Don't you hate code that's not properly indented?
{%endblocktranslate%}
</blockquote>
{%endblock%}

DjHTML indents mixed HTML/CSS/JavaScript templates that contain Django or Jinja template tags. It works similar to other code-formatting tools such as Black and interoperates nicely with pre-commit.

DjHTML is an indenter and not a formatter: it will only add/remove whitespace at the beginning of lines. It will not insert newlines or other characters. The goal is to correctly indent already well-structured templates, not to fix broken ones.

If you are looking for an actual template formatter, check out the djangofmt project.

Installation

DjHTML requires Python 3.9 or higher and is compatible with all operating systems supported by Python. Install DjHTML with the following command:

$ pip install djhtml

Note that Windows still uses legacy code pages instead of UTF-8. It is highly advised to set the environment variable PYTHONUTF8 to 1 with the setx command:

C:\> setx /m PYTHONUTF8 1

Usage

After installation you can indent templates using the djhtml command:

$ djhtml template.html
reindented template.html
1 template has been reindented.

You can also run djhtml . to indent all HTML files beneath the current directory.

An exit status of 0 means that everything went well, regardless of whether any files were changed. When the option -c / --check is used, the exit status is 1 when one or more files would have changed, but no changes are actually made. All available options are given by djthml -h / djthml --help.

Command-line arguments

DjHTML supports the following command-line arguments:

  • -h / --help: Show help text.
  • -v / --version: Show version number.
  • -c / --check: Dry-run, checks without modifying files.
  • -t / --tabwidth N: Tabwidth. The default is to guess.
  • -b / --extra-block BEGIN,END: Define an extra non-standard block tag. Can be used multiple times.

fmt:off and fmt:on

You can exclude specific lines from being processed with the {# fmt:off #} and {# fmt:on #} operators:

{# fmt:off #}
,-._|\
/ .\
\_,--._/
{# fmt:on #}

Contents inside <pre> ... </pre>, <!-- ... --->, /* ... */, and {% comment %} ... {% endcomment %} tags are also ignored (depending on the current mode).

Modes

The indenter operates in one of three different modes:

  • DjHTML mode: the default mode. Invoked by using the djhtml command or the pre-commit hook.

  • DjCSS mode. Will be entered when a <style> tag is encountered in DjHTML mode. It can also be invoked directly with the command djcss.

  • DjJS mode. Will be entered when a <script> tag is encountered in DjHTML mode. It can also be invoked directly with the command djjs.

pre-commit configuration

A great way to use DjHTML is as a pre-commit hook, so all your HTML, CSS and JavaScript files will automatically be indented upon every commit.

First, install pre-commit:

$ pip install pre-commit
$ pre-commit install

Then, add the following to your .pre-commit-config.yaml:

repos:
- repo: https://github.com/rtts/djhtmlrev: 'main'# replace with the latest tag on GitHubhooks:
- id: djhtml
- id: djcss
- id: djjs

Now run pre-commit autoupdate to automatically replace main with the latest tag on GitHub, as recommended by pre-commit.

If you want to override a command-line option, for example to change the default tabwidth, you change the entry point of these hooks:

hooks:
- id: djhtml# Use a tabwidth of 2 for HTML filesentry: djhtml --tabwidth 2
- id: djcss
- id: djjs

If you want to limit the files these hooks operate on, you can use pre-commit mechanisms for filtering. For example:

hooks:
- id: djhtml# Indent only HTML files in template directoriesfiles: .*/templates/.*\.html$
- id: djcss# Run this hook only on SCSS files (CSS and SCSS is the default)types: [scss]
- id: djjs# Exclude JavaScript files in vendor directoriesexclude: .*/vendor/.*

Now when you run git commit you will see something like the following output:

$ git commit
DjHTML...................................................................Failed
- hook id: djhtml
- files were modified by this hook
reindented template.html
1 template has been reindented.

To inspect the changes that were made, use git diff. If you are happy with the changes, you can commit them normally. If you are not happy, please do the following:

  1. Run SKIP=djhtml git commit to commit anyway, skipping the djhtml hook.

  2. Consider opening an issue with the relevant part of the input file that was incorrectly formatted, and an example of how it should have been formatted.

Your feedback for improving DjHTML is very welcome!

Development

First of all, clone this repository:

$ git clone https://github.com/rtts/djhtml
$ cd djhtml

Then, create a Python virtualenv and activate it:

$ python -m venv ~/.virtualenvs/djhtml
$ . ~/.virtualenvs/djhtml/bin/activate

Then, install the package in development mode including the dev dependencies, and install the pre-commit hooks:

$ python -m pip install -e '.[dev]'
$ pre-commit install --install-hooks

You can run the unittests with:

$ python -m unittest

Or use nox to test all supported Python interpreters:

$ nox

Finally, to get a little insight into the tokenization step of the indenting algorithm, you can run DjHTML with the -d / --debug argument. You will see a Python representation of the tokens that are created.

About

Django/Jinja template indenter

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

DjHTML

A pure-Python Django/Jinja template indenter without dependencies.

{%blockcontent%}
<blockquotecite="Guido Van Rossum"class="Pythonic"
>
{%blocktranslatetrimmed%}
Don't you hate code that's not properly indented?
{%endblocktranslate%}
</blockquote>
{%endblock%}

DjHTML indents mixed HTML/CSS/JavaScript templates that contain Django or Jinja template tags. It works similar to other code-formatting tools such as Black and interoperates nicely with pre-commit.

DjHTML is an indenter and not a formatter: it will only add/remove whitespace at the beginning of lines. It will not insert newlines or other characters. The goal is to correctly indent already well-structured templates, not to fix broken ones.

If you are looking for an actual template formatter, check out the djangofmt project.

Installation

DjHTML requires Python 3.9 or higher and is compatible with all operating systems supported by Python. Install DjHTML with the following command:

$ pip install djhtml

Note that Windows still uses legacy code pages instead of UTF-8. It is highly advised to set the environment variable PYTHONUTF8 to 1 with the setx command:

C:\> setx /m PYTHONUTF8 1

Usage

After installation you can indent templates using the djhtml command:

$ djhtml template.html
reindented template.html
1 template has been reindented.

You can also run djhtml . to indent all HTML files beneath the current directory.

An exit status of 0 means that everything went well, regardless of whether any files were changed. When the option -c / --check is used, the exit status is 1 when one or more files would have changed, but no changes are actually made. All available options are given by djthml -h / djthml --help.

Command-line arguments

DjHTML supports the following command-line arguments:

  • -h / --help: Show help text.
  • -v / --version: Show version number.
  • -c / --check: Dry-run, checks without modifying files.
  • -t / --tabwidth N: Tabwidth. The default is to guess.
  • -b / --extra-block BEGIN,END: Define an extra non-standard block tag. Can be used multiple times.

fmt:off and fmt:on

You can exclude specific lines from being processed with the {# fmt:off #} and {# fmt:on #} operators:

{# fmt:off #}
,-._|\
/ .\
\_,--._/
{# fmt:on #}

Contents inside <pre> ... </pre>, <!-- ... --->, /* ... */, and {% comment %} ... {% endcomment %} tags are also ignored (depending on the current mode).

Modes

The indenter operates in one of three different modes:

  • DjHTML mode: the default mode. Invoked by using the djhtml command or the pre-commit hook.

  • DjCSS mode. Will be entered when a <style> tag is encountered in DjHTML mode. It can also be invoked directly with the command djcss.

  • DjJS mode. Will be entered when a <script> tag is encountered in DjHTML mode. It can also be invoked directly with the command djjs.

pre-commit configuration

A great way to use DjHTML is as a pre-commit hook, so all your HTML, CSS and JavaScript files will automatically be indented upon every commit.

First, install pre-commit:

$ pip install pre-commit
$ pre-commit install

Then, add the following to your .pre-commit-config.yaml:

repos:
- repo: https://github.com/rtts/djhtmlrev: 'main'# replace with the latest tag on GitHubhooks:
- id: djhtml
- id: djcss
- id: djjs

Now run pre-commit autoupdate to automatically replace main with the latest tag on GitHub, as recommended by pre-commit.

If you want to override a command-line option, for example to change the default tabwidth, you change the entry point of these hooks:

hooks:
- id: djhtml# Use a tabwidth of 2 for HTML filesentry: djhtml --tabwidth 2
- id: djcss
- id: djjs

If you want to limit the files these hooks operate on, you can use pre-commit mechanisms for filtering. For example:

hooks:
- id: djhtml# Indent only HTML files in template directoriesfiles: .*/templates/.*\.html$
- id: djcss# Run this hook only on SCSS files (CSS and SCSS is the default)types: [scss]
- id: djjs# Exclude JavaScript files in vendor directoriesexclude: .*/vendor/.*

Now when you run git commit you will see something like the following output:

$ git commit
DjHTML...................................................................Failed
- hook id: djhtml
- files were modified by this hook
reindented template.html
1 template has been reindented.

To inspect the changes that were made, use git diff. If you are happy with the changes, you can commit them normally. If you are not happy, please do the following:

  1. Run SKIP=djhtml git commit to commit anyway, skipping the djhtml hook.

  2. Consider opening an issue with the relevant part of the input file that was incorrectly formatted, and an example of how it should have been formatted.

Your feedback for improving DjHTML is very welcome!

Development

First of all, clone this repository:

$ git clone https://github.com/rtts/djhtml
$ cd djhtml

Then, create a Python virtualenv and activate it:

$ python -m venv ~/.virtualenvs/djhtml
$ . ~/.virtualenvs/djhtml/bin/activate

Then, install the package in development mode including the dev dependencies, and install the pre-commit hooks:

$ python -m pip install -e '.[dev]'
$ pre-commit install --install-hooks

You can run the unittests with:

$ python -m unittest

Or use nox to test all supported Python interpreters:

$ nox

Finally, to get a little insight into the tokenization step of the indenting algorithm, you can run DjHTML with the -d / --debug argument. You will see a Python representation of the tokens that are created.

About

Django/Jinja template indenter

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DjHTML

A pure-Python Django/Jinja template indenter without dependencies.

{%blockcontent%}
<blockquotecite="Guido Van Rossum"class="Pythonic"
>
{%blocktranslatetrimmed%}
Don't you hate code that's not properly indented?
{%endblocktranslate%}
</blockquote>
{%endblock%}

DjHTML indents mixed HTML/CSS/JavaScript templates that contain Django or Jinja template tags. It works similar to other code-formatting tools such as Black and interoperates nicely with pre-commit.

DjHTML is an indenter and not a formatter: it will only add/remove whitespace at the beginning of lines. It will not insert newlines or other characters. The goal is to correctly indent already well-structured templates, not to fix broken ones.

If you are looking for an actual template formatter, check out the djangofmt project.

Installation

DjHTML requires Python 3.9 or higher and is compatible with all operating systems supported by Python. Install DjHTML with the following command:

$ pip install djhtml

Note that Windows still uses legacy code pages instead of UTF-8. It is highly advised to set the environment variable PYTHONUTF8 to 1 with the setx command:

C:\> setx /m PYTHONUTF8 1

Usage

After installation you can indent templates using the djhtml command:

$ djhtml template.html
reindented template.html
1 template has been reindented.

You can also run djhtml . to indent all HTML files beneath the current directory.

An exit status of 0 means that everything went well, regardless of whether any files were changed. When the option -c / --check is used, the exit status is 1 when one or more files would have changed, but no changes are actually made. All available options are given by djthml -h / djthml --help.

Command-line arguments

DjHTML supports the following command-line arguments:

  • -h / --help: Show help text.
  • -v / --version: Show version number.
  • -c / --check: Dry-run, checks without modifying files.
  • -t / --tabwidth N: Tabwidth. The default is to guess.
  • -b / --extra-block BEGIN,END: Define an extra non-standard block tag. Can be used multiple times.

fmt:off and fmt:on

You can exclude specific lines from being processed with the {# fmt:off #} and {# fmt:on #} operators:

{# fmt:off #}
,-._|\
/ .\
\_,--._/
{# fmt:on #}

Contents inside <pre> ... </pre>, <!-- ... --->, /* ... */, and {% comment %} ... {% endcomment %} tags are also ignored (depending on the current mode).

Modes

The indenter operates in one of three different modes:

  • DjHTML mode: the default mode. Invoked by using the djhtml command or the pre-commit hook.

  • DjCSS mode. Will be entered when a <style> tag is encountered in DjHTML mode. It can also be invoked directly with the command djcss.

  • DjJS mode. Will be entered when a <script> tag is encountered in DjHTML mode. It can also be invoked directly with the command djjs.

pre-commit configuration

A great way to use DjHTML is as a pre-commit hook, so all your HTML, CSS and JavaScript files will automatically be indented upon every commit.

First, install pre-commit:

$ pip install pre-commit
$ pre-commit install

Then, add the following to your .pre-commit-config.yaml:

repos:
- repo: https://github.com/rtts/djhtmlrev: 'main'# replace with the latest tag on GitHubhooks:
- id: djhtml
- id: djcss
- id: djjs

Now run pre-commit autoupdate to automatically replace main with the latest tag on GitHub, as recommended by pre-commit.

If you want to override a command-line option, for example to change the default tabwidth, you change the entry point of these hooks:

hooks:
- id: djhtml# Use a tabwidth of 2 for HTML filesentry: djhtml --tabwidth 2
- id: djcss
- id: djjs

If you want to limit the files these hooks operate on, you can use pre-commit mechanisms for filtering. For example:

hooks:
- id: djhtml# Indent only HTML files in template directoriesfiles: .*/templates/.*\.html$
- id: djcss# Run this hook only on SCSS files (CSS and SCSS is the default)types: [scss]
- id: djjs# Exclude JavaScript files in vendor directoriesexclude: .*/vendor/.*

Now when you run git commit you will see something like the following output:

$ git commit
DjHTML...................................................................Failed
- hook id: djhtml
- files were modified by this hook
reindented template.html
1 template has been reindented.

To inspect the changes that were made, use git diff. If you are happy with the changes, you can commit them normally. If you are not happy, please do the following:

  1. Run SKIP=djhtml git commit to commit anyway, skipping the djhtml hook.

  2. Consider opening an issue with the relevant part of the input file that was incorrectly formatted, and an example of how it should have been formatted.

Your feedback for improving DjHTML is very welcome!

Development

First of all, clone this repository:

$ git clone https://github.com/rtts/djhtml
$ cd djhtml

Then, create a Python virtualenv and activate it:

$ python -m venv ~/.virtualenvs/djhtml
$ . ~/.virtualenvs/djhtml/bin/activate

Then, install the package in development mode including the dev dependencies, and install the pre-commit hooks:

$ python -m pip install -e '.[dev]'
$ pre-commit install --install-hooks

You can run the unittests with:

$ python -m unittest

Or use nox to test all supported Python interpreters:

$ nox

Finally, to get a little insight into the tokenization step of the indenting algorithm, you can run DjHTML with the -d / --debug argument. You will see a Python representation of the tokens that are created.

About

Django/Jinja template indenter

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DjHTML

A pure-Python Django/Jinja template indenter without dependencies.

{%blockcontent%}
<blockquotecite="Guido Van Rossum"class="Pythonic"
>
{%blocktranslatetrimmed%}
Don't you hate code that's not properly indented?
{%endblocktranslate%}
</blockquote>
{%endblock%}

DjHTML indents mixed HTML/CSS/JavaScript templates that contain Django or Jinja template tags. It works similar to other code-formatting tools such as Black and interoperates nicely with pre-commit.

DjHTML is an indenter and not a formatter: it will only add/remove whitespace at the beginning of lines. It will not insert newlines or other characters. The goal is to correctly indent already well-structured templates, not to fix broken ones.

If you are looking for an actual template formatter, check out the djangofmt project.

Installation

DjHTML requires Python 3.9 or higher and is compatible with all operating systems supported by Python. Install DjHTML with the following command:

$ pip install djhtml

Note that Windows still uses legacy code pages instead of UTF-8. It is highly advised to set the environment variable PYTHONUTF8 to 1 with the setx command:

C:\> setx /m PYTHONUTF8 1

Usage

After installation you can indent templates using the djhtml command:

$ djhtml template.html
reindented template.html
1 template has been reindented.

You can also run djhtml . to indent all HTML files beneath the current directory.

An exit status of 0 means that everything went well, regardless of whether any files were changed. When the option -c / --check is used, the exit status is 1 when one or more files would have changed, but no changes are actually made. All available options are given by djthml -h / djthml --help.

Command-line arguments

DjHTML supports the following command-line arguments:

  • -h / --help: Show help text.
  • -v / --version: Show version number.
  • -c / --check: Dry-run, checks without modifying files.
  • -t / --tabwidth N: Tabwidth. The default is to guess.
  • -b / --extra-block BEGIN,END: Define an extra non-standard block tag. Can be used multiple times.

fmt:off and fmt:on

You can exclude specific lines from being processed with the {# fmt:off #} and {# fmt:on #} operators:

{# fmt:off #}
,-._|\
/ .\
\_,--._/
{# fmt:on #}

Contents inside <pre> ... </pre>, <!-- ... --->, /* ... */, and {% comment %} ... {% endcomment %} tags are also ignored (depending on the current mode).

Modes

The indenter operates in one of three different modes:

  • DjHTML mode: the default mode. Invoked by using the djhtml command or the pre-commit hook.

  • DjCSS mode. Will be entered when a <style> tag is encountered in DjHTML mode. It can also be invoked directly with the command djcss.

  • DjJS mode. Will be entered when a <script> tag is encountered in DjHTML mode. It can also be invoked directly with the command djjs.

pre-commit configuration

A great way to use DjHTML is as a pre-commit hook, so all your HTML, CSS and JavaScript files will automatically be indented upon every commit.

First, install pre-commit:

$ pip install pre-commit
$ pre-commit install

Then, add the following to your .pre-commit-config.yaml:

repos:
- repo: https://github.com/rtts/djhtmlrev: 'main'# replace with the latest tag on GitHubhooks:
- id: djhtml
- id: djcss
- id: djjs

Now run pre-commit autoupdate to automatically replace main with the latest tag on GitHub, as recommended by pre-commit.

If you want to override a command-line option, for example to change the default tabwidth, you change the entry point of these hooks:

hooks:
- id: djhtml# Use a tabwidth of 2 for HTML filesentry: djhtml --tabwidth 2
- id: djcss
- id: djjs

If you want to limit the files these hooks operate on, you can use pre-commit mechanisms for filtering. For example:

hooks:
- id: djhtml# Indent only HTML files in template directoriesfiles: .*/templates/.*\.html$
- id: djcss# Run this hook only on SCSS files (CSS and SCSS is the default)types: [scss]
- id: djjs# Exclude JavaScript files in vendor directoriesexclude: .*/vendor/.*

Now when you run git commit you will see something like the following output:

$ git commit
DjHTML...................................................................Failed
- hook id: djhtml
- files were modified by this hook
reindented template.html
1 template has been reindented.

To inspect the changes that were made, use git diff. If you are happy with the changes, you can commit them normally. If you are not happy, please do the following:

  1. Run SKIP=djhtml git commit to commit anyway, skipping the djhtml hook.

  2. Consider opening an issue with the relevant part of the input file that was incorrectly formatted, and an example of how it should have been formatted.

Your feedback for improving DjHTML is very welcome!

Development

First of all, clone this repository:

$ git clone https://github.com/rtts/djhtml
$ cd djhtml

Then, create a Python virtualenv and activate it:

$ python -m venv ~/.virtualenvs/djhtml
$ . ~/.virtualenvs/djhtml/bin/activate

Then, install the package in development mode including the dev dependencies, and install the pre-commit hooks:

$ python -m pip install -e '.[dev]'
$ pre-commit install --install-hooks

You can run the unittests with:

$ python -m unittest

Or use nox to test all supported Python interpreters:

$ nox

Finally, to get a little insight into the tokenization step of the indenting algorithm, you can run DjHTML with the -d / --debug argument. You will see a Python representation of the tokens that are created.

About

Django/Jinja template indenter

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

DjHTML

A pure-Python Django/Jinja template indenter without dependencies.

{%blockcontent%}
<blockquotecite="Guido Van Rossum"class="Pythonic"
>
{%blocktranslatetrimmed%}
Don't you hate code that's not properly indented?
{%endblocktranslate%}
</blockquote>
{%endblock%}

DjHTML indents mixed HTML/CSS/JavaScript templates that contain Django or Jinja template tags. It works similar to other code-formatting tools such as Black and interoperates nicely with pre-commit.

DjHTML is an indenter and not a formatter: it will only add/remove whitespace at the beginning of lines. It will not insert newlines or other characters. The goal is to correctly indent already well-structured templates, not to fix broken ones.

If you are looking for an actual template formatter, check out the djangofmt project.

Installation

DjHTML requires Python 3.9 or higher and is compatible with all operating systems supported by Python. Install DjHTML with the following command:

$ pip install djhtml

Note that Windows still uses legacy code pages instead of UTF-8. It is highly advised to set the environment variable PYTHONUTF8 to 1 with the setx command:

C:\> setx /m PYTHONUTF8 1

Usage

After installation you can indent templates using the djhtml command:

$ djhtml template.html
reindented template.html
1 template has been reindented.

You can also run djhtml . to indent all HTML files beneath the current directory.

An exit status of 0 means that everything went well, regardless of whether any files were changed. When the option -c / --check is used, the exit status is 1 when one or more files would have changed, but no changes are actually made. All available options are given by djthml -h / djthml --help.

Command-line arguments

DjHTML supports the following command-line arguments:

  • -h / --help: Show help text.
  • -v / --version: Show version number.
  • -c / --check: Dry-run, checks without modifying files.
  • -t / --tabwidth N: Tabwidth. The default is to guess.
  • -b / --extra-block BEGIN,END: Define an extra non-standard block tag. Can be used multiple times.

fmt:off and fmt:on

You can exclude specific lines from being processed with the {# fmt:off #} and {# fmt:on #} operators:

{# fmt:off #}
,-._|\
/ .\
\_,--._/
{# fmt:on #}

Contents inside <pre> ... </pre>, <!-- ... --->, /* ... */, and {% comment %} ... {% endcomment %} tags are also ignored (depending on the current mode).

Modes

The indenter operates in one of three different modes:

  • DjHTML mode: the default mode. Invoked by using the djhtml command or the pre-commit hook.

  • DjCSS mode. Will be entered when a <style> tag is encountered in DjHTML mode. It can also be invoked directly with the command djcss.

  • DjJS mode. Will be entered when a <script> tag is encountered in DjHTML mode. It can also be invoked directly with the command djjs.

pre-commit configuration

A great way to use DjHTML is as a pre-commit hook, so all your HTML, CSS and JavaScript files will automatically be indented upon every commit.

First, install pre-commit:

$ pip install pre-commit
$ pre-commit install

Then, add the following to your .pre-commit-config.yaml:

repos:
- repo: https://github.com/rtts/djhtmlrev: 'main'# replace with the latest tag on GitHubhooks:
- id: djhtml
- id: djcss
- id: djjs

Now run pre-commit autoupdate to automatically replace main with the latest tag on GitHub, as recommended by pre-commit.

If you want to override a command-line option, for example to change the default tabwidth, you change the entry point of these hooks:

hooks:
- id: djhtml# Use a tabwidth of 2 for HTML filesentry: djhtml --tabwidth 2
- id: djcss
- id: djjs

If you want to limit the files these hooks operate on, you can use pre-commit mechanisms for filtering. For example:

hooks:
- id: djhtml# Indent only HTML files in template directoriesfiles: .*/templates/.*\.html$
- id: djcss# Run this hook only on SCSS files (CSS and SCSS is the default)types: [scss]
- id: djjs# Exclude JavaScript files in vendor directoriesexclude: .*/vendor/.*

Now when you run git commit you will see something like the following output:

$ git commit
DjHTML...................................................................Failed
- hook id: djhtml
- files were modified by this hook
reindented template.html
1 template has been reindented.

To inspect the changes that were made, use git diff. If you are happy with the changes, you can commit them normally. If you are not happy, please do the following:

  1. Run SKIP=djhtml git commit to commit anyway, skipping the djhtml hook.

  2. Consider opening an issue with the relevant part of the input file that was incorrectly formatted, and an example of how it should have been formatted.

Your feedback for improving DjHTML is very welcome!

Development

First of all, clone this repository:

$ git clone https://github.com/rtts/djhtml
$ cd djhtml

Then, create a Python virtualenv and activate it:

$ python -m venv ~/.virtualenvs/djhtml
$ . ~/.virtualenvs/djhtml/bin/activate

Then, install the package in development mode including the dev dependencies, and install the pre-commit hooks:

$ python -m pip install -e '.[dev]'
$ pre-commit install --install-hooks

You can run the unittests with:

$ python -m unittest

Or use nox to test all supported Python interpreters:

$ nox

Finally, to get a little insight into the tokenization step of the indenting algorithm, you can run DjHTML with the -d / --debug argument. You will see a Python representation of the tokens that are created.

About

Django/Jinja template indenter

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages