Per iniziare

Installazione

djLint è scritto in Python ed è pubblicato su PyPI. Con uv, aggiungilo al progetto come dipendenza di sviluppo:

uv add --dev djlint

Oppure installalo come strumento autonomo:

uv tool install djlint

Oppure con pip:

pip install djlint

Oppure con pipx:

pipx install djlint

Oppure con la formula Homebrew mantenuta dalla community, su macOS o Linux:

brew install djlint

Oppure con npm. Attenzione: il pacchetto npm è solo un wrapper. Il suo script di installazione esegue pip con il python3 che si trova nel PATH di sistema e installa la versione di djLint di quella release npm, che può sostituire un djLint più recente con uno più vecchio. npm non gestisce né disinstalla il pacchetto vero e proprio, quindi, se puoi, preferisci pip.

npm i djlint

Per eseguire djLint a ogni commit, consulta pre-commit.

Uso da riga di comando

djLint è un’applicazione a riga di comando. Per la configurazione avanzata, consulta la pagina configurazione.

Usage: djlint [OPTIONS] SRC ...

  djLint · HTML template linter and formatter.

Options:
  --version                       Show the version and exit.
  --lsp                           Run as a language server over stdio, for
                                  editors.
  -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.

Nota

Se il comando djlint non viene trovato, assicurati che Python sia nel PATH.

Percorso o stdin

djLint funziona con un percorso o con stdin.

Esecuzione con un percorso:

djlint /path/to/templates --lint

Oppure con un file specifico:

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

Oppure con stdin:

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

Stdin si può usare anche per riformattare il codice. L’output conterrà solo il codice formattato, senza messaggi.

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

Output:

<div></div>

Quando legge da stdin, djLint non ha un percorso reale da confrontare con per-file-ignores o da mostrare nei messaggi, quindi usa - per impostazione predefinita. Passa --stdin-filename per indicare a djLint il percorso reale del contenuto ricevuto tramite pipe, ad esempio quando un’integrazione con l’editor gli passa il contenuto di un file al salvataggio.

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

Codici di uscita

Codice Significato
0 Tutto ciò che djLint doveva controllare è pulito, oppure ogni file trovato è stato escluso dalla configurazione.
1 djLint ha trovato errori di lint o file da riformattare. Con --warn vengono segnalati come avvisi e il codice di uscita è invece 0.
2 djLint non ha controllato ciò che gli hai chiesto: i percorsi non corrispondevano a nessun file, la riga di comando o la configurazione non erano valide, oppure djLint si è interrotto con un errore.

Solo il codice 1 significa che djLint ha esaminato i tuoi template e ciò che ha trovato non gli è piaciuto. Il codice 2 significa sempre che l’esecuzione stessa non ha fatto il suo lavoro, così una pipeline può trattare i due casi in modo diverso.

Il codice 2 intercetta un’esecuzione che non ha controllato proprio nulla: un percorso sbagliato, un --extension che non corrisponde più, oppure template che sono stati spostati. Senza di esso un’esecuzione del genere passa in silenzio.

I file che djLint ha trovato e poi escluso di proposito, tramite exclude, extend_exclude, use_gitignore o require_pragma, non sono un errore. In quel caso il codice di uscita è 0, perché la configurazione ha fatto esattamente ciò che le era stato chiesto. Così exclude funziona anche con pre-commit, che passa i nomi dei file in stage indipendentemente dal fatto che tu voglia o meno che djLint li esamini.

Se per la tua pipeline è normale un percorso che legittimamente non contiene template, disattiva il codice 2 con allow_empty_input:

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