Js-beautify: Paradigme "non formaté" cassé, "non formaté" et "en ligne" ne sont pas les mêmes

Créé le 13 janv. 2016  ·  6Commentaires  ·  Source: beautify-web/js-beautify

Toute l'approche adoptée par js-beautify pour déterminer ce qu'il faut envelopper est conceptuellement cassé, si je le comprends bien.

Disons que j'ai le code HTML suivant :

    <li>Install at least one Git client. <span class="tip">Recommended: <a

         href="https://www.sourcetreeapp.com/">SourceTree</a> (Windows, Mac)</span>all Git commands.</li>

Notez tout cet espace vide et ces nouvelles lignes à l'intérieur des attributs de la balise <a> . Si je mets span comme l'un des éléments unformatted , alors js-beautify ne change rien ! Il laisse tout cet espace blanc laid!

Si par contre je supprime span des éléments unformatted , alors js-beautify me donne ceci :

    <li>Install at least one Git client.
        <span class="tip">Recommended: <a href="https://www.sourcetreeapp.com/">SourceTree</a> (Windows, Mac)</span>all Git commands.</li>

Notez que js-beautify ajoute maintenant une nouvelle ligne avant <span> ! Cela aussi est complètement incorrect --- <span> est un élément de phrasé en ligne, et il n'est pas nécessaire de casser ici.

Le problème semble être que js-beautify utilise l'idée de "non formaté" pour être équivalent à l'élément "en ligne". C'est la mauvaise approche et ne correspond pas à la sémantique HTML/CSS !! L'idée si block vs inline est complètement orthogonale à savoir si les éléments doivent être enveloppés.

js-beautify doit déterminer si un élément est en bloc ou en ligne. Les éléments de bloc doivent avoir des sauts de ligne avant eux ; les éléments en ligne ne devraient pas.

L'idée de « non formaté » est un concept distinct ; il devrait dire à js-beautify de le laisser seul, que l'élément soit en bloc ou en ligne.

Dans l'état actuel des choses, il n'y a aucun moyen de dire à js-beautify qu'un élément ne doit _pas_ avoir de nouvelle ligne, mais que son contenu doit être formaté.

Toute la conception est cassée. Veuillez résoudre ce problème fondamental. (Ou expliquez-moi que je me trompe, et que js-beautify ne confond pas les concepts de "bloc/en ligne" et "formaté/non formaté".)

html enhancement

Commentaire le plus utile

Je ne suis pas sûr que vous compreniez ce que je dis. Tous les éléments doivent être formatés ! C'est juste que certains sont en ligne, et certains sont des éléments de bloc. C'est ainsi qu'il en est avec XML/HTML/CSS depuis une vingtaine d'années maintenant.

S'il s'agit d'un élément de bloc, il crée un nouveau bloc visuellement. Ces éléments, lors du formatage du code source HTML, ont presque toujours une nouvelle ligne avant eux (à la fois dans le code source et dans le rendu). Un élément en ligne n'a pas de nouvelle ligne avant lui (à la fois dans le code source et dans l'affichage). Mais cela ne signifie pas que son _contenu_ ne doit pas être formaté. (Cela signifie que son contenu ne devrait pas avoir de nouvelles lignes ajoutées, à moins que vous n'enveloppiez des lignes.)

Ce n'est donc pas un ajustement. C'est une reconnaissance que tout le paradigme utilisé par js-beautify pour le formatage est brisé. (Je ne suis pas méchant --- je suis juste objectif et j'essaie de vous aider en vous expliquant.) Vous devez faire la distinction entre trois choses différentes :

  • "formaté" - Cet élément est-il formaté ? (Par défaut, tous les éléments doivent être formatés, à moins que quelqu'un ne le désactive.)
  • "block/display" - S'agit-il d'un bloc ou d'un élément d'affichage ? S'il s'agit d'un élément de bloc, il doit avoir un saut de ligne _prepended_ avant la balise de début, et il doit être indenté au niveau d'indentation actuel. Sinon, il ne devrait pas y avoir de nouvelle ligne devant lui.
  • "conteneur" - Cette chose est-elle normalement utilisée uniquement pour contenir d'autres éléments de bloc ? Si tel est le cas, une nouvelle ligne doit être générée _après_ la balise de début, après la balise de fin, et le contenu doit être mis en retrait à un nouveau niveau de retrait. C'est le plus controversé, c'est-à-dire que cela variera le plus en fonction des goûts des utilisateurs. Un candidat évident est <ul> ; son contenu (par exemple <li> ) doit être indenté. Certaines personnes voudront ajouter <p> à cette liste afin que les balises <p> soient sur des lignes séparées. D'autres (par exemple moi) ne les voudront pas sur des lignes séparées.

Je vous suggère de revoir le modèle de boîte CSS et de comprendre comment fonctionne le bloc vs en ligne. Et puis réécrivez la logique de formatage HTML js-beautify, en tenant compte du modèle de boîte CSS (car le code source doit refléter la façon dont le rendu sera finalement effectué).

Par défaut, rien ne doit être "non formaté". Tout doit être formaté --- juste formaté de manière appropriée. "unformatted" devrait être un paramètre de dernier recours pour qu'un utilisateur dise : "hey, je n'aime pas ce que fait js-beautify, alors ne touchez pas à cet élément et laissez-moi m'en occuper.

Tous les 6 commentaires

Votre proposition sur la façon dont cela devrait fonctionner semble raisonnable. Veuillez indiquer quels éléments doivent être en ligne et lesquels doivent être non formatés. Alors s'il vous plaît mettre en œuvre et soumettre une demande d'extraction.

Je ne suis pas sûr que vous compreniez ce que je dis. Tous les éléments doivent être formatés ! C'est juste que certains sont en ligne, et certains sont des éléments de bloc. C'est ainsi qu'il en est avec XML/HTML/CSS depuis une vingtaine d'années maintenant.

S'il s'agit d'un élément de bloc, il crée un nouveau bloc visuellement. Ces éléments, lors du formatage du code source HTML, ont presque toujours une nouvelle ligne avant eux (à la fois dans le code source et dans le rendu). Un élément en ligne n'a pas de nouvelle ligne avant lui (à la fois dans le code source et dans l'affichage). Mais cela ne signifie pas que son _contenu_ ne doit pas être formaté. (Cela signifie que son contenu ne devrait pas avoir de nouvelles lignes ajoutées, à moins que vous n'enveloppiez des lignes.)

Ce n'est donc pas un ajustement. C'est une reconnaissance que tout le paradigme utilisé par js-beautify pour le formatage est brisé. (Je ne suis pas méchant --- je suis juste objectif et j'essaie de vous aider en vous expliquant.) Vous devez faire la distinction entre trois choses différentes :

  • "formaté" - Cet élément est-il formaté ? (Par défaut, tous les éléments doivent être formatés, à moins que quelqu'un ne le désactive.)
  • "block/display" - S'agit-il d'un bloc ou d'un élément d'affichage ? S'il s'agit d'un élément de bloc, il doit avoir un saut de ligne _prepended_ avant la balise de début, et il doit être indenté au niveau d'indentation actuel. Sinon, il ne devrait pas y avoir de nouvelle ligne devant lui.
  • "conteneur" - Cette chose est-elle normalement utilisée uniquement pour contenir d'autres éléments de bloc ? Si tel est le cas, une nouvelle ligne doit être générée _après_ la balise de début, après la balise de fin, et le contenu doit être mis en retrait à un nouveau niveau de retrait. C'est le plus controversé, c'est-à-dire que cela variera le plus en fonction des goûts des utilisateurs. Un candidat évident est <ul> ; son contenu (par exemple <li> ) doit être indenté. Certaines personnes voudront ajouter <p> à cette liste afin que les balises <p> soient sur des lignes séparées. D'autres (par exemple moi) ne les voudront pas sur des lignes séparées.

Je vous suggère de revoir le modèle de boîte CSS et de comprendre comment fonctionne le bloc vs en ligne. Et puis réécrivez la logique de formatage HTML js-beautify, en tenant compte du modèle de boîte CSS (car le code source doit refléter la façon dont le rendu sera finalement effectué).

Par défaut, rien ne doit être "non formaté". Tout doit être formaté --- juste formaté de manière appropriée. "unformatted" devrait être un paramètre de dernier recours pour qu'un utilisateur dise : "hey, je n'aime pas ce que fait js-beautify, alors ne touchez pas à cet élément et laissez-moi m'en occuper.

PS Je vous ai déjà donné un début dans #840 indiquant ce qui constitue un élément en ligne en HTML5. Cependant, je n'ai pas le temps pour le moment de réécrire l'intégralité de votre moteur de formatage. Si j'obtiens ce temps, il serait plus efficace d'écrire le mien. En attendant, j'essaie de vous aider pour que vous puissiez faire fonctionner le vôtre, ce qui serait le mieux pour nous deux. Bonne chance et dites-moi quelles informations supplémentaires je peux fournir.

Je comprends tout à fait ce que vous avez dit au départ. Vous pensez qu'il y a un bogue dans l'embellisseur html. Vous voudriez le décrire comme "tout le paradigme utilisé par js-beautify pour le formatage [html] est cassé". Je n'ai pas conçu ni implémenté le module d'embellissement html, et il a connu la moindre amélioration depuis mon temps en tant que mainteneur de ce projet. Il a certainement besoin d'attention et de remaniement important, tout comme l'embellisseur CSS d'ailleurs.

L'embellisseur html fait cependant certaines choses d'une manière raisonnablement passable malgré ses défauts. Et je remets en question votre évaluation selon laquelle la gestion du #840 en particulier nécessiterait une "réécriture" ou un changement de "paradigme". C'est une amélioration comme une autre. Il existe probablement un certain nombre de façons de l'implémenter, d'un piratage malveillant à une refonte et une réécriture complètes.

Quelle que soit la portée, je pense que le changement que vous avez décrit vaut la peine d'être fait, mais j'ai déjà une liste importante de corrections de bogues et de fonctionnalités concrètes, bien décrites et très demandées qui ont globalement une priorité plus élevée pour le projet. Je dois passer le peu de temps dont je dispose pour ce projet sur ces éléments. Si vous pensez vraiment que cela vaut la peine d'être corrigé maintenant, vous devrez passer votre temps à le faire. J'accueille les demandes de tirage.

Vous pensez qu'il y a un bogue dans l'embellisseur html.

Non, je dis qu'il n'y a aucun moyen de dire à js-beautify de ne pas mettre de saut de ligne _avant_ un élément sans en même temps dire à js-beautify de ne rien formater _à l'intérieur_ de l'élément. Est-ce vrai ou n'est-ce pas vrai ?

Vous voudriez le décrire comme "tout le paradigme utilisé par js-beautify pour le formatage [html] est cassé".

Si js-beautify ne connaît pas la différence entre "les choses qui ne doivent pas avoir de sauts de ligne ajoutés avant elles" et "les choses que je dois complètement ignorer", alors oui, son paradigme est inadéquat même pour du HTML simple. Après tout, je ne veux pas de saut de ligne avant <dfn> (car c'est un élément en ligne), mais si le <dfn> contient un <img> , je ne veux pas js-beautify pour renoncer au formatage de la balise <img> . (Ceci est un exemple artificiel ; il s'applique à n'importe quelle image en ligne.)

Alors tu me dis. Est-ce que js-beautify peut formater un <img> intérieur d'un <dfn> sans mettre de saut de ligne avant le <dfn> ?

Le point de ce que je dis est que "ne pas formater le contenu de cet élément" est différent de "ne mettez pas de nouvelle ligne avant cet élément". Alors laissez-moi vous demander à nouveau. js-beautify comprend-il la distinction entre ces deux choses, ou confond-il ces concepts ? S'il ne comprend pas la différence, son modèle fondamental est brisé.

Mais bien sûr, vous pouvez parfois contourner des défauts fondamentaux. Je reviens donc vous demander à nouveau : comment pourrais-je contourner ce défaut ? Comment dirais-je à js-beautify de ne pas mettre de saut de ligne avant <code> mais de toujours formater un élément <img> à l'intérieur du <code> ?

@garretwilson Ceci est disponible dans 1.8.0-rc2 .

Cette page vous a été utile?
0 / 5 - 0 notes