Commencer

Installation

djLint est construit avec Python et publié sur PyPI. Avec uv, ajoutez-le à votre projet comme dépendance de développement :

uv add --dev djlint

Ou installez-le en tant qu’outil autonome :

uv tool install djlint

Ou avec pip :

pip install djlint

Ou avec pipx:

pipx install djlint

Ou avec la formule Homebrew maintenue par la communauté sur macOS ou Linux:

brew install djlint

Ou avec npm - attention : le paquet npm n’est qu’une enveloppe, son script d’installation exécute pip install --upgrade djlint avec le python3 de votre chemin système. npm ne gère ni ne désinstalle le paquet réel - préférez pip directement si possible.

npm i djlint

Pour lancer djLint à chaque commit, voir pre-commit.

Utilisation de l’interface CLI

djLint est une application en ligne de commande. Voir la page configuration pour une configuration avancée.

Usage: djlint [OPTIONS] SRC ...

  djLint · HTML template linter and formatter.

Options:
  --version                       Show the version and exit.
  -e, --extension TEXT            File extension to check [default: html]
  -i, --ignore TEXT               Codes to ignore. ex: "H014,H017"
  --reformat                      Reformat the file(s).
  --check                         Check formatting on the file(s).
  --stdin-filename TEXT           Filename to use for per-file-ignores and
                                  messages when reading from stdin. [default: -]
  --indent INTEGER                Indent spacing. [default: 4]
  --quiet                         Do not print diff when reformatting.
  --profile TEXT                  Enable defaults by template language. ops:
                                  django, jinja, nunjucks, handlebars, liquid,
                                  golang, angular, tera, askama, html [default:
                                  html]
  --require-pragma                Only format or lint files that starts with a
                                  comment with the text 'djlint:on'
  --lint                          Lint for common issues. [default option]
  --use-gitignore                 Use .gitignore file to extend excludes.
  --allow-empty-input             Exit with 0 instead of 2 when the given paths
                                  match no files.
  --warn                          Return errors as warnings.
  --preserve-leading-space        Attempt to preserve leading space on text.
  --preserve-blank-lines          Attempt to preserve blank lines.
  --preserve-class-newlines       Preserve line breaks inside multiline class
                                  attributes.
  --format-css                    Also format contents of <style> tags.
  --format-js                     Also format contents of <script> tags.
  --format-attribute-js-json      Also format JavaScript/JSON inside HTML
                                  attributes.
  --format-attribute-js-json-pattern TEXT
                                  Regex pattern to match JavaScript attributes.
  --format-attribute-js-json-min-props INTEGER
                                  Minimum number of properties to treat
                                  attribute content as JS/JSON.
  --configuration FILE            Path to global configuration file in
                                  djlint.toml, .djlint.toml, or .djlintrc format
  --prefer-configuration          Let --configuration override the project's own
                                  config file, rather than the other way round.
  --rules FILE                    Path to custom rules file in
                                  .djlint_rules.yaml format
  --statistics                    Count the number of occurrences of each
                                  error/warning code.
  --include TEXT                  Codes to include. ex: "H014,H017"
  --ignore-case                   Do not fix case on known html tags.
  --ignore-blocks TEXT            Comma list of template blocks to not indent.
  --blank-line-after-tag TEXT     Add an additional blank line after {% <tag>
                                  ... %} tag groups.
  --blank-line-before-tag TEXT    Add an additional blank line before {% <tag>
                                  ... %} tag groups.
  --line-break-after-multiline-tag
                                  Do not condense the content of multi-line tags
                                  into the line of the last attribute.
  --custom-blocks TEXT            Indent custom template blocks. For example {%
                                  toc %}...{% endtoc %}
  --custom-html TEXT              Indent custom HTML tags. For example <mjml>
  --exclude TEXT                  Override the default exclude paths.
  --extend-exclude TEXT           Add additional paths to the default exclude.
  --linter-output-format TEXT     Customize order of linter output message.
  --max-line-length INTEGER       Max line length. [default: 120]
  --max-attribute-length INTEGER  Max attribute length. [default: 70]
  --format-attribute-template-tags
                                  Attempt to format template syntax inside of
                                  tag attributes.
  --single-attribute-per-line     When an opening tag wraps, put each attribute
                                  on its own line.
  --per-file-ignores <TEXT TEXT>...
                                  Ignore linter rules on a per-file basis.
  --indent-css INTEGER            Set CSS indent level.
  --indent-js INTEGER             Set JS indent level.
  --close-void-tags               Add closing mark on known void tags. Ex: <img>
                                  becomes <img />
  --no-line-after-yaml            Do not add a blank line after yaml front
                                  matter.
  --name-endblocks                Name the endblock of a block written across
                                  lines.
  --sort-attributes               Sort attributes by name, with id first and
                                  class second.
  --sort-load-tags                Sort the libraries in {% load %} tags.
  --no-indent-inner-html          Do not indent <head> and <body> below <html>.
  --no-function-formatting        Do not attempt to format function contents.
  --no-set-formatting             Do not attempt to format set contents.
  --keep-br-inline                Keep <br> on the line of the text it breaks.
  --no-entity-formatting          Do not rewrite entity references as
                                  characters.
  --quote-style [double|single]   Quotes to use for strings inside template
                                  tags. [default: double]
  --max-blank-lines INTEGER       Consolidate blank lines down to x lines.
                                  [default: 0]
  --github-output / --no-github-output
                                  Output GitHub-compatible formatting.
  --sarif                         Output findings as SARIF 2.1.0 json, for
                                  GitHub code scanning and other tools.
  -h, --help                      Show this message and exit.

Note

Si la commande djlint n’est pas trouvée, assurez-vous que Python est dans votre path.

Utilisation de Path vs Stdin

djLint fonctionne avec un path ou stdin.

Exécution avec un path -

djlint /path/to/templates --lint

Ou un fichier spécifique -

djlint /path/to/this.mustache --lint

Ou avec stdin -

echo "<div></div>" | djlint -

Stdin peut également être utilisé pour reformater le code. La sortie sera uniquement le code formaté sans messages.

echo "<div></div>" | djlint - --reformat

Sortie -

<div></div>

Lors de la lecture depuis stdin, djLint n’a pas de vrai chemin à comparer avec per-file-ignores ni à afficher dans les messages, il utilise donc - par défaut. Passez --stdin-filename pour indiquer à djLint le vrai chemin du contenu reçu, par exemple quand une intégration d’éditeur lui envoie le contenu d’un fichier à l’enregistrement.

echo "<div></div>" | djlint - --stdin-filename templates/index.html

Codes de sortie

Code Signification
0 Tout ce que djLint devait vérifier est correct, ou chaque fichier trouvé a été ignoré par votre configuration.
1 djLint a trouvé des erreurs de linting ou des fichiers à reformater. Avec --warn, elles sont signalées comme avertissements et le code de sortie est 0.
2 djLint n’a pas vérifié ce que vous avez demandé : les chemins ne correspondent à aucun fichier, la ligne de commande ou la configuration est invalide, ou djLint a échoué.

Seul le code 1 signifie que djLint a examiné vos modèles et y a trouvé des problèmes. Le code 2 signifie toujours que l’exécution elle-même n’a pas abouti : un pipeline peut donc traiter les deux cas différemment sans avoir à deviner.

Le code 2 détecte une exécution qui n’a rien vérifié du tout : un mauvais chemin, une --extension qui ne correspond plus, ou des modèles qui ont été déplacés. Sans lui, une telle exécution réussit en silence sans avoir examiné un seul de vos modèles.

Les fichiers que djLint a trouvés puis ignorés volontairement, via exclude, extend_exclude, use_gitignore ou require_pragma, ne sont pas une erreur. L’exécution se termine avec le code 0, car la configuration a fait exactement ce qu’on lui demandait. C’est aussi ce qui permet à exclude de fonctionner avec pre-commit, qui transmet les noms de vos fichiers indexés, que vous vouliez ou non que djLint les examine.

Si un chemin sans aucun modèle est normal dans votre pipeline, désactivez le code 2 avec allow_empty_input :

djlint /path/to/templates --lint --allow-empty-input