Pierwsze kroki

Instalacja

djLint jest napisany w Pythonie i opublikowany w PyPI. Za pomocą uv dodaj go do projektu jako zależność deweloperską:

uv add --dev djlint

Możesz też zainstalować go jako samodzielne narzędzie:

uv tool install djlint

Albo za pomocą pip:

pip install djlint

Albo za pomocą pipx:

pipx install djlint

Albo, w systemie macOS lub Linux, za pomocą rozwijanej przez społeczność formuły Homebrew:

brew install djlint

Albo za pomocą npm. Uwaga: pakiet npm jest tylko nakładką. Jego skrypt instalacyjny uruchamia pip dla tego python3, który akurat znajduje się w ścieżce systemowej, i instaluje wersję djLint przypisaną do danego wydania pakietu npm, co może zastąpić nowszy djLint starszym. npm nie zarządza właściwym pakietem ani go nie odinstalowuje, więc jeśli możesz, używaj pip.

npm i djlint

Aby uruchamiać djLint przy każdym commicie, zobacz pre-commit.

Użycie w wierszu poleceń

djLint jest aplikacją wiersza poleceń. Zaawansowaną konfigurację opisuje strona Konfiguracja.

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.

Ścieżka a stdin

djLint działa ze ścieżką lub ze standardowym wejściem (stdin).

Uruchomienie ze ścieżką:

djlint /path/to/templates --lint

Albo z konkretnym plikiem:

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

Albo ze stdin:

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

Stdin można też wykorzystać do przeformatowania kodu. Na wyjściu pojawi się wtedy wyłącznie sformatowany kod, bez komunikatów.

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

Wynik:

<div></div>

Przy czytaniu ze stdin djLint nie ma prawdziwej ścieżki, którą mógłby dopasować do per-file-ignores lub pokazać w komunikatach, więc domyślnie używa -. Przekaż --stdin-filename, aby podać djLint prawdziwą ścieżkę przekazywanej treści, na przykład gdy integracja z edytorem przesyła przy zapisie zawartość pliku.

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

Kody wyjścia

Kod Znaczenie
0 Wszystko, co djLint miał sprawdzić, jest w porządku albo każdy znaleziony plik został pominięty zgodnie z konfiguracją.
1 djLint znalazł błędy lintowania lub pliki wymagające przeformatowania. Przy --warn są one zgłaszane jako ostrzeżenia, a djLint kończy działanie z kodem 0.
2 djLint nie sprawdził tego, o co go poproszono: ścieżki nie pasowały do żadnych plików, wiersz poleceń lub konfiguracja były nieprawidłowe albo djLint zawiódł.

Tylko kod 1 oznacza, że djLint przejrzał twoje szablony i nie spodobało mu się to, co znalazł. Kod 2 zawsze oznacza, że samo uruchomienie nie spełniło swojego zadania, więc potok CI może traktować te dwa przypadki różnie.

To właśnie kod 2 wychwytuje uruchomienie, które niczego nie sprawdziło: błędną ścieżkę, --extension, które już do niczego nie pasuje, albo szablony, które zostały przeniesione. Bez niego takie uruchomienie po cichu kończy się sukcesem.

Pliki, które djLint znalazł, a potem celowo pominął z powodu exclude, extend_exclude, use_gitignore lub require_pragma, nie są błędem. Takie uruchomienie kończy się kodem 0, ponieważ konfiguracja zrobiła dokładnie to, co jej kazano. Dzięki temu exclude działa też w pre-commit, który przekazuje nazwy plików dodanych do indeksu (staged) niezależnie od tego, czy chcesz, żeby djLint je sprawdzał.

Jeśli w twoim potoku CI ścieżka, w której z założenia nie ma szablonów, jest czymś normalnym, wyłącz kod 2 opcją allow_empty_input:

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