Componente TOC e IDs de encabezado

El componente TOC genera los atributos id de los elementos de encabezado basándose en el texto del encabezado.

Aquí hay un ejemplo de un encabezado.

main outlet

El espaciado proviene de los estilos aplicados a #main-outlet, que es un elemento de la aplicación Discourse que no tiene nada que ver con esta publicación.

Esto no es el fin del mundo si pudiera especificar un id alternativo para el encabezado. El componente TOC lo soporta:

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

Desafortunadamente, Discourse elimina los atributos id de los elementos de las publicaciones antes de que se ejecute el código anterior, por lo que la lógica se ve frustrada.

Aquí hay un encabezado que usa <h4 id="alt-main-outlet">main outlet</h4>:

main outlet

Note que aún usa main-outlet en lugar de alt-main-outlet.

Supongo que Discourse hace esto anticipando que alguien pueda hackear un elemento de la página. Pero con el componente TOC es bastante fácil eludirlo.

Si existe una solución para esto o si este es un problema bien discutido que me he perdido, disculpe las opiniones no solicitadas que siguen :slight_smile:


P.D.

Personalmente, creo que Discourse NO debería eliminar los atributos id de los elementos. Esta es una construcción fundamental de las páginas web y se utiliza en la navegación de páginas con fragmentos de URL. Si alguien quiere crear un enlace a un elemento en una publicación, creo que es su derecho como autor.

El hecho de que TOC abra la puerta a la manipulación de IDs sugiere que esta medida de eliminar IDs desde el principio podría potencialmente descartarse.

Si el equipo de Discourse está tan preocupado por el secuestro de IDs, todos los IDs de Discourse deberían tener un prefijo, por ejemplo discourse-main-outlet, y la eliminación de IDs debería aplicarse solo a esos IDs con prefijo.

Puedo apreciar la imposibilidad de esto dado el código existente.

Se puede imaginar un conjunto de IDs excluidos (por ejemplo, main-outlet, etc.) que se eliminen. Esto aún deja el problema de que TOC se use para eludir esta salvaguarda, pero al menos permitiría a los autores crear anclajes útiles.


P.P.D.

Directamente relacionado con esto está el problema de los encabezados con la misma carga de texto.

Tema Uno

Ejemplos

Tema Dos

Ejemplos

Con TOC, ambos encabezados Ejemplos obtienen el mismo ID, lo cual es obviamente bastante roto. TOC podría agregar índices incrementales (por ejemplo, ejemplos, ejemplos-2, etc.) — y probablemente debería hacerlo por defecto — pero aún mejor sería una solución al problema discutido anteriormente, que permita a los autores decidir cómo describir su contenido. Por ejemplo, <h5 id="topic-one-examples">Ejemplos</h5>, etc.

@Johani, ¿qué te parece esto?

2 Me gusta

Si necesitas agregar un encabezado, debe tener el prefijo heading--. Puedes encontrar más información al respecto aquí Linking to a heading within a post or topic

Los IDs que no tengan ese prefijo se eliminarán, independientemente del valor del ID.

Los encabezados con texto duplicado no están soportados actualmente —y nunca lo han estado— en el componente TOC. El componente genera el ID basándose en el texto del encabezado. Por lo tanto, dos encabezados con exactamente el mismo texto obtendrán el mismo ID.

No hay planes para corregir esto en el componente por ahora, ya que la generación automática de IDs está en nuestra lista de características para la próxima versión de Discourse y planeamos abordar el problema de los encabezados duplicados añadiendo el índice del encabezado a su ID.

Cuando implementemos esto en el núcleo, creo que añadir un prefijo a los encabezados generados debería ser suficiente.

3 Me gusta

Eso tiene sentido. ¡Gracias por la explicación detallada!

3 Me gusta