Nous pouvons résoudre le problème de la recherche et du signalement des éléments à fermeture automatique avec parse5 . Il possède une classe SAXParser qui devrait être assez robuste (parse5 est conforme aux normes html5). Le parseur lève un événement, lorsqu'il trouve une balise start-tags, qui contient un booléen indiquant si la balise trouvée se ferme d'elle-même.
var parser = new SAXParser();
parser.on("startTag", (name, attrs, selfClosing)=>{
if(selfClosing){
//check if name is void, if not report error
}
});
parser.push(html);
Pour utiliser cette fonctionnalité, j'ai mis en place un projet qui peut être utilisé afin d'aider à assainir le html en utilisant l'approche ci-dessus. L'outil lint développé est capable d'exécuter une sélection de règles, de collecter toutes les erreurs et de les retourner sous forme de promesse. Cela peut ensuite être signalé à l'utilisateur.
Vanilla Html/Templates
modèle-lint constitue la base du jeu d'outils. Il comprend le Linter, et quelques règles de base :
- SelfClose - veiller à ce que les éléments non vides ne se ferment pas d'eux-mêmes
- Parser - renvoie des erreurs pour les éléments non fermés ou mal assortis, tels qu'ils sont capturés pendant l'analyse syntaxique.
gulp-template-lint est le wrapper gulp pour template-lint et peut être utilisé comme suit :
var gulp = require('gulp');
var linter = require('gulp-template-lint');
gulp.task('build-html', function () {
return gulp.src(['source/**/*.html'])
.pipe(linter())
.pipe(gulp.dest('output'));
});
Exemple
Étant donné le html suivant :
<template>
<custom-element/>
<svg>
<rect/>
</svg>
<div>
<div>
</div>
</template>
produit :
Remarque : le système de fermeture automatique <rect/>
ne produit pas d'erreur. Les éléments svg contiennent du xml et les Règles peuvent faire la différence en fonction de la portée.
Modèles Aurélia
J'ai d'abord fait aurelia-template-lint mais nous avons décidé de séparer les composants réutilisables (en dehors d'aurelia) en modèle-lint . Bien que les deux soient actuellement séparés, je vais avoir le aurelia-template-lint s'étendre sur modèle-lint en temps voulu. Il existe actuellement quelques règles de validation du concept :
- SelfClose - veiller à ce que les éléments non vides ne se ferment pas d'eux-mêmes
- Parser - renvoie des erreurs pour les éléments non fermés ou mal assortis, tels qu'ils sont capturés pendant l'analyse syntaxique.
- Modèle - s'assurer que Root est un élément de modèle, et qu'il n'y a pas plus d'un élément de modèle présent
- RouterView - ne pas permettre à l'élément router-view de contenir des éléments de contenu
- Exiger - s'assurer que les éléments requis ont un attribut "de".
il existe un wrapper gulp qui peut être installé via :
npm install gulp-aurelia-template-lint
et utilisé dans une construction gulp :
var linter = require('gulp-aurelia-template-lint');
gulp.task('lint-template-html', function () {
return gulp.src('**/*.html')
.pipe(linter())
.pipe(gulp.dest('output'));
});
cela utilisera le jeu de règles par défaut.
Exemple
un test simple avec le modèle aurelia mal formé suivant :
<link/>
<template bindable="items">
<require from="foo"/>
<require frm="foo"/>
<br/>
<div></div>
<router-view>
<div/>
</router-view>
</template>
<template>
</template>
sorties :
Améliorations
il y a beaucoup d'améliorations à apporter ; par exemple, il y a quelques façons de définir des modèles vanille sans l'option <template>
étiquette. Il existe également un certain nombre d'attributs spécifiques introduits par Aurelia qui pourraient être assainis.