Composant TOC et identifiants d'en-tête

Le composant TOC génère les attributs id des éléments d’en-tête en fonction du texte de l’en-tête.

Voici un exemple d’en-tête.

main outlet

L’espacement provient des styles appliqués à #main-outlet, un élément de l’application Discourse qui n’a rien à voir avec ce message.

Ce n’est pas la fin du monde si je pouvais spécifier un id alternatif pour l’en-tête. Le composant TOC le prend en charge :

https://github.com/discourse/DiscoTOC/blob/master/common/header.html#L293

Malheureusement, Discourse supprime les attributs id des éléments de message avant que le code ci-dessus ne soit exécuté, ce qui bloque la logique.

Voici un en-tête qui utilise <h4 id="alt-main-outlet">main outlet</h4> :

main outlet

Notez qu’il utilise toujours main-outlet plutôt que alt-main-outlet.

Je suppose que Discourse fait cela en prévision du fait que quelqu’un pourrait modifier un élément de page. Mais avec le composant TOC, il est assez facile de contourner cela.

S’il existe une solution à ce problème ou s’il s’agit d’un problème bien connu que j’aurais manqué, je m’excuse pour les opinions non sollicitées qui suivent :slight_smile:


P.S.

Personnellement, je pense que Discourse ne devrait PAS supprimer les attributs id des éléments. C’est une construction fondamentale des pages web et elle est utilisée pour la navigation sur la page via les fragments d’URL. Si quelqu’un souhaite créer un lien vers un élément dans un message, je pense que c’est son droit en tant qu’auteur.

Le fait que le TOC ouvre la porte au piratage d’IDs suggère que cette mesure de suppression des IDs pourrait potentiellement être abandonnée dès le départ.

Si l’équipe Discourse est si préoccupée par le détournement d’IDs, tous les IDs de Discourse devraient être préfixés, par exemple discourse-main-outlet, et la suppression des IDs ne devrait s’appliquer qu’à ces IDs préfixés.

Je comprends l’impossibilité de cela étant donné le code existant !

On peut imaginer un ensemble d’IDs exclus (par exemple main-outlet, etc.) qui sont supprimés. Cela laisse toujours le problème du TOC utilisé pour contourner cette mesure de sécurité, mais cela permettrait au moins aux auteurs de créer des ancres utiles.


P.P.S.

Directement lié à cela est le problème des en-têtes ayant le même contenu textuel.

Sujet Un

Exemples

Sujet Deux

Exemples

Avec le TOC, les deux en-têtes Exemples reçoivent le même ID, ce qui est évidemment très problématique. Le TOC pourrait ajouter des index incrémentaux (par exemple examples, examples-2, etc.) — et il devrait probablement le faire par défaut — mais une meilleure solution serait de résoudre le problème discuté ci-dessus, ce qui permettrait aux auteurs de décider comment décrire leur contenu. Par exemple <h5 id="topic-one-examples">Exemples</h5>, etc.

@Johani, qu’en penses-tu ?

2 « J'aime »

Si vous devez ajouter un titre, il doit être préfixé par heading--. Vous trouverez plus d’informations à ce sujet ici : Linking to a heading within a post or topic

Les identifiants qui ne sont pas préfixés de cette manière seront supprimés, quelle que soit la valeur de l’identifiant.

Les en-têtes avec un texte en double ne sont actuellement pas pris en charge — et ne l’ont jamais été — dans le composant de la table des matières. Le composant génère l’identifiant en fonction du texte de l’en-tête. Ainsi, deux en-têtes ayant exactement le même texte obtiendront le même identifiant.

Aucun correctif n’est prévu pour le composant pour le moment, car la génération automatique d’identifiants figure sur notre liste de fonctionnalités pour la prochaine version de Discourse. Nous prévoyons de résoudre le problème des en-têtes en double en ajoutant l’index de l’en-tête à son identifiant.

Lorsque nous mettrons cela en œuvre dans le cœur du système, je pense qu’ajouter un préfixe aux en-têtes générés devrait suffire.

3 « J'aime »

Cela a du sens. Merci pour cette explication détaillée !

3 « J'aime »