SnappySnippet
J'ai enfin trouvé le temps de créer cet outil. Vous pouvez installer SnappySnippet à partir de Github. Il permet une extraction HTML + CSS facile à partir du nœud DOM spécifié (dernière inspection). De plus, vous pouvez envoyer votre code directement à CodePen ou JSFiddle. Prendre plaisir!
Autres caractéristiques
- nettoie le HTML (suppression des attributs inutiles, correction de l'indentation)
- optimise CSS pour le rendre lisible
- entièrement configurable (tous les filtres peuvent être désactivés)
- fonctionne avec
::before
et ::after
pseudo-éléments
- belle interface utilisateur grâce aux projets Bootstrap et Flat-UI
Code
SnappySnippet est open source, et vous pouvez trouver le code sur GitHub .
la mise en oeuvre
Comme j'ai beaucoup appris en faisant cela, j'ai décidé de partager certains des problèmes que j'ai rencontrés et mes solutions, peut-être que quelqu'un le trouvera intéressant.
Première tentative - getMatchedCSSRules ()
Au début, j'ai essayé de récupérer les règles CSS d'origine (provenant de fichiers CSS sur le site Web). Étonnamment, c'est très simple grâce à window.getMatchedCSSRules()
, cependant, cela n'a pas bien fonctionné. Le problème était que nous ne prenions qu'une partie des sélecteurs HTML et CSS qui correspondaient dans le contexte de l'ensemble du document, qui ne correspondaient plus dans le contexte d'un extrait HTML. Étant donné que l'analyse et la modification des sélecteurs ne semblaient pas être une bonne idée, j'ai abandonné cette tentative.
Deuxième tentative - getComputedStyle ()
Ensuite, je suis parti de quelque chose que @CollectiveCognition a suggéré - getComputedStyle()
. Cependant, je voulais vraiment séparer le HTML du formulaire CSS au lieu d'inclure tous les styles.
Problème 1 - séparer CSS de HTML
La solution ici n'était pas très belle mais assez simple. J'ai attribué des ID à tous les nœuds de la sous-arborescence sélectionnée et utilisé cet ID pour créer des règles CSS appropriées.
Problème 2 - suppression de propriétés avec des valeurs par défaut
L'affectation d'ID aux nœuds a bien fonctionné, mais j'ai découvert que chacune de mes règles CSS a environ 300 propriétés, ce qui rend l'ensemble CSS illisible.
Il s'avère que getComputedStyle()
renvoie toutes les propriétés CSS possibles et les valeurs calculées pour l'élément donné. Certains d'entre eux étaient vides, d'autres avaient des valeurs par défaut du navigateur. Pour supprimer les valeurs par défaut, je devais d'abord les obtenir à partir du navigateur (et chaque balise a des valeurs par défaut différentes). La solution était de comparer les styles de l'élément provenant du site Web avec le même élément inséré dans un espace vide <iframe>
. La logique ici était qu'il n'y avait pas de feuilles de style dans un espace vide <iframe>
, donc chaque élément auquel j'ai ajouté n'y avait que des styles de navigateur par défaut. De cette façon, j'ai pu me débarrasser de la plupart des propriétés insignifiantes.
Problème 3 - conserver uniquement les propriétés sténographiques
La prochaine chose que j'ai repérée est que les propriétés ayant un équivalent raccourci ont été inutilement imprimées (par exemple, il y avait border: solid black 1px
et puis border-color: black;
, border-width: 1px
itd.).
Pour résoudre ce problème, j'ai simplement créé une liste de propriétés qui ont des équivalents sténographiques et les ai filtrées des résultats.
Problème 4 - suppression des propriétés préfixées
Le nombre de propriétés dans chaque règle a été significativement plus faible après l'opération précédente, mais je l' ai trouvé que je SILL eu beaucoup de -webkit-
propriétés préfixées que je n'ai jamais entendu parler de ( -webkit-app-region
? -webkit-text-emphasis-position
?).
Je me demandais si je devais conserver ces propriétés car certaines d'entre elles semblaient utiles ( -webkit-transform-origin
, -webkit-perspective-origin
etc.). Je n'ai pas encore compris comment vérifier cela, et comme je savais que la plupart du temps ces propriétés ne sont que des ordures, j'ai décidé de les supprimer toutes.
Problème 5 - combinaison des mêmes règles CSS
Le problème suivant que j'ai repéré était que les mêmes règles CSS sont répétées encore et encore (par exemple, pour chacune <li>
avec exactement les mêmes styles, il y avait la même règle dans la sortie CSS créée).
Il s'agissait simplement de comparer les règles entre elles et de combiner celles-ci qui avaient exactement le même ensemble de propriétés et de valeurs. En conséquence, au lieu de #LI_1{...}, #LI_2{...}
je suis arrivé #LI_1, #LI_2 {...}
.
Problème 6 - Nettoyage et correction de l'indentation du HTML
Comme j'étais satisfait du résultat, je suis passé au HTML. Cela ressemblait à un gâchis, principalement parce que la outerHTML
propriété le maintient formaté exactement tel qu'il a été renvoyé par le serveur.
La seule chose dont le code HTML pris outerHTML
était nécessaire était un simple reformatage du code. Étant donné que c'est quelque chose de disponible dans chaque IDE, j'étais sûr qu'il existe une bibliothèque JavaScript qui fait exactement cela. Et il s'avère que j'avais raison (jquery-clean) . De plus, j'ai des suppressions inutiles supplémentaires ( style
, data-ng-repeat
etc.).
Problème 7 - Filtres brisant CSS
Comme il est possible que dans certains cas, les filtres mentionnés ci-dessus puissent briser CSS dans l'extrait de code, je les ai tous rendus facultatifs. Vous pouvez les désactiver à partir du menu Paramètres .