Componente TOC e ID delle intestazioni

Il componente TOC genera gli attributi id degli elementi di intestazione in base al testo dell’intestazione.

Ecco un esempio di intestazione.

main outlet

Gli spaziaggi derivano dagli stili applicati a #main-outlet, che è un elemento dell’app Discourse non correlato a questo post.

Non è la fine del mondo se potessi specificare un id alternativo per l’intestazione. Il componente TOC lo supporta:

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

Sfortunatamente, Discourse rimuove gli attributi id dagli elementi dei post prima che il codice sopra venga eseguito, quindi la logica viene neutralizzata.

Ecco un’intestazione che utilizza <h4 id="alt-main-outlet">main outlet</h4>:

main outlet

Notare che viene ancora utilizzato main-outlet invece di alt-main-outlet.

Immagino che Discourse lo faccia nell’anticipazione che qualcuno possa manomettere un elemento della pagina. Ma con il componente TOC è abbastanza semplice aggirarlo.

Se esiste una soluzione a questo problema o se si tratta di un problema già ampiamente discusso che mi sono perso, chiedo scusa per le opinioni non richieste che seguono :slight_smile:


P.S.

Personalmente penso che Discourse NON dovrebbe rimuovere gli attributi id degli elementi. Questa è una costruzione fondamentale delle pagine web ed è utilizzata nella navigazione delle pagine con frammenti URL. Se qualcuno vuole creare un collegamento a un elemento in un post, penso che sia il suo diritto come autore.

Il fatto che il TOC apra la possibilità di manipolare gli ID suggerisce che questa misura di rimozione degli ID in primo luogo potrebbe potenzialmente essere eliminata.

Se il team di Discourse è così preoccupato per il dirottamento degli ID, tutti gli ID di Discourse dovrebbero avere un prefisso, ad esempio discourse-main-outlet, e la rimozione degli ID dovrebbe applicarsi solo a quegli ID con prefisso.

Posso apprezzare l’impossibilità di questo dato il codice esistente!

Si può immaginare un insieme di ID esclusi (ad esempio main-outlet, ecc.) che vengono rimossi. Questo lascia comunque il problema del TOC utilizzato per aggirare questa misura di sicurezza, ma permetterebbe almeno agli autori di creare ancoraggi utili.


P.P.S.

Direttamente correlato a questo è il problema delle intestazioni con lo stesso contenuto testuale.

Topic One

Examples

Topic Two

Examples

Con il TOC, entrambe le intestazioni Examples ricevono lo stesso ID, il che è ovviamente molto rotto. Il TOC potrebbe aggiungere indici incrementali (ad esempio examples, examples-2, ecc.) — e probabilmente dovrebbe farlo come comportamento predefinito — ma sarebbe ancora meglio una soluzione al problema discusso sopra, che permette agli autori di decidere come descrivere il proprio contenuto. Ad esempio <h5 id="topic-one-examples">Examples</h5>, ecc.

@Johani, cosa ne pensi di questo?

Se devi aggiungere un’intestazione, questa deve essere preceduta da heading--. Puoi trovare ulteriori informazioni a riguardo qui Linking to a heading within a post or topic

Gli ID che non sono preceduti in questo modo verranno rimossi, indipendentemente dal valore dell’ID.

Le intestazioni con testo duplicato non sono attualmente supportate – e non lo sono mai state – nel componente TOC. Il componente genera l’ID in base al testo dell’intestazione. Quindi, due intestazioni con lo stesso testo esatto riceveranno lo stesso ID.

Non sono previsti interventi per risolvere questo problema nel componente al momento, poiché la generazione automatica degli ID è nella nostra lista di funzionalità per il prossimo rilascio di Discourse e intendiamo affrontare il problema delle intestazioni duplicate aggiungendo l’indice dell’intestazione al suo ID.

Quando implementeremo questa funzionalità nel core, penso che aggiungere un prefisso alle intestazioni generate dovrebbe essere sufficiente.

Ha senso. Grazie per la spiegazione dettagliata!