- D : s’applique spécifiquement à Django
- H : s’applique au html
- J : s’applique spécifiquement à Jinja
- M : s’applique spécifiquement à Handlebars
- N : s’applique spécifiquement à Nunjucks
- T : s’applique généralement aux modèles
djLint inclut de nombreuses règles pour vérifier le style et la validité de vos modèles. Profitez pleinement du linter en le configurant pour utiliser un profil prédéfini pour la langue du modèle de votre choix.
djlint /path/to/templates --lint
# with custom extensions
djlint /path/to/templates -e html.dj --profile=django
# or to file
djlint /path/to/this.html.j2 --profile=jinja
La plupart des règles sont activées par défaut. Les règles peuvent être désactivées en ligne de commande avec l’option --ignore
. Les règles peuvent être activées avec l’option --include
.
Par exemple :
djlint . --lint --include=H017,H035 --ignore=H013,H015
Cela peut également se faire par l’intermédiaire de l’option Configuration fichier.
Code | Signification | Défaut |
---|---|---|
D004 | (Django) Les urls statiques doivent suivre le modèle {% static path/to/file %} . |
✔️ |
D018 | (Django) Les liens internes doivent utiliser le modèle {% url ... %} . |
✔️ |
H005 | La balise Html doit avoir l’attribut lang . |
✔️ |
H006 | La balise img doit avoir les attributs height et width . |
✔️ |
H007 | LA BALISE <!DOCTYPE ... > doit être présent avant la balise html. |
✔️ |
H008 | Les attributs doivent être entre guillemets. | ✔️ |
H009 | Les noms de balises doivent être en minuscules. | ✔️ |
H010 | Les noms d’attributs doivent être en minuscules. | ✔️ |
H011 | Les valeurs des attributs doivent être citées. | ✔️ |
H012 | Il ne doit pas y avoir d’espace autour de l’attribut = . |
✔️ |
H013 | La balise img doit avoir des attributs alt. |
✔️ |
H014 | Plus de 2 lignes vides. | ✔️ |
H015 | Les balises “h” doivent être suivies d’un retour à la ligne. | ✔️ |
H016 | Balise title manquante dans le html. |
✔️ |
H017 | Les étiquettes vides doivent se refermer automatiquement. | - |
H019 | Remplacez javascript:abc() par l’événement on_ et l’url réelle. |
✔️ |
H020 | Couple de balises vide trouvé. Envisagez de le supprimer. | ✔️ |
H021 | Les styles en ligne doivent être évités. | ✔️ |
H022 | Utilisez HTTPS pour les liens externes. | ✔️ |
H023 | N’utilisez pas de références d’entités. | ✔️ |
H024 | Omettre le type sur les scripts et les styles. | ✔️ |
H025 | La balise semble être orpheline. | ✔️ |
H026 | Les balises id et class vides peuvent être supprimées. | ✔️ |
H029 | Pensez à utiliser des valeurs de méthode de formulaire en minuscules. | ✔️ |
H030 | Pensez à ajouter une méta-description. | ✔️ |
H031 | Pensez à ajouter des méta keywords. | ✔️ |
H033 | Espace supplémentaire dans l’action du formulaire. | ✔️ |
J004 | (Jinja) Les urls statiques doivent suivre le modèle { url_for('static'..) }} . |
✔️ |
J018 | (Jinja) Les liens internes doivent utiliser le modèle {% url ... %} . |
✔️ |
T001 | Les variables doivent être entourées d’un espace. Ex : {{ this }} |
✔️ |
T002 | Les doubles quotes doivent être utilisées dans les balises. Ex : {% extends "this.html" %} |
✔️ |
T003 | Le bloc de fin doit avoir un nom. Ex : {% endblock body %} . |
✔️ |
T027 | Chaîne non fermée trouvée dans la syntaxe du modèle. | ✔️ |
T028 | Envisagez d’utiliser des balises sans espace à l’intérieur des valeurs d’attributs. {%- if/for -%} |
✔️ |
T032 | Espace blanc supplémentaire trouvé dans les balises du modèle. | ✔️ |
T034 | Aviez-vous l’intention d’utiliser {% … %} au lieu de {% … }% ? | ✔️ |
H035 | Meta doivent se fermer d’elles-mêmes. | - |
H036 | Évitez d’utiliser les balises . |
- |
H037 | Attribut en double trouvé. | ✔️ |
La première lettre d’un code suit le modèle :
Nous accueillons volontiers les pull requests contenant de nouvelles règles !
Une bonne règle consiste en
Veuillez inclure un test pour valider la règle.
Il est possible d’ajouter des règles personnalisées directement au sein de votre projet.
Pour cela, créez un fichier .djlint_rules.yaml
à côté de votre pyproject.toml
.
Des règles peuvent être ajoutées à ce fichier et djLint les reprendra.
Vous pouvez ajouter une règle qui échouera si l’un des regex listés dans patterns
est trouvé dans le code html.
- rule:
name: T001
message: Trouver la Trichotillomanie
flags: re.DOTALL|re.I
pattern:
- Trichotillomanie
Vous pouvez ajouter une règle qui va importer et executer une fonction python
personalisée.
- rule:
name: T001
message: Le mot 'bad' a été trouvé
python_module: votre_package.votre_module
Le module indiqué dans python_module
doit contenir une fonction run()
qui sera
executé sur chacun des fichiers testés. La fonction doit accepter les arguments suivants :
rule
: Le dictionnaire python qui représente votre règle dans .djlint_rules.yaml
.name
et message
que vous avez défini dansyaml
.config
: L’objet de configuration global de DJLint.html
: Le contenu html complet du fichier testé.filepath
: Chemin du fichier testé.line_ends
: Liste qui, pour chacune des lignes du fichier html testé, contient unstart
et end
qui donnent les indexes globaux dans le fichier dudjlint.lint.get_line()
*args, **kwargs
: Il est possible que nous ajoutions d’autres arguments à l’avenir,La fonction doit retourner une liste de dictionnaire, un pour chacune des erreurs
trouvées. Le dictionnaire doit contenir les clées suivantes :
code
: Code de la règle qui rapporte l’erreur (généralement rule['name']
)line
: Numéro de ligne et numéro de caractère dans cette ligne, séparées par un :
."2:3"
veut dire que l’erreur a été trouvée sur la ligne 2, au caractère 3.match
: La partie du contenu qui contient l’erreurmessage
: Le message qui serra affiché pour signaler l’erreur (généralement rule['message']
)from typing import Any, Dict, List
from djlint.settings import Config
from djlint.lint import get_line
import re
def run(
rule: Dict[str, Any],
config: djlint.settings.Config,
html: str,
filepath: str,
line_ends: List[Dict[str, int]],
*args: Any,
**kwargs: Any,
) -> List[Dict[str, str]]:
"""
Rule that fails if if the html file contains 'bad'. This is just an exemple, in
reality it's much simpler to do that with "pattern rule".
"""
errors: List[Dict[str, str]] = []
for match in re.finditer(r"bad", html):
errors.append(
{
"code": rule["name"],
"line": get_line(match.start(), line_ends),
"match": match.group().strip()[:20],
"message": rule["message"],
}
)
return errors