IDs de componentes e cabeçalhos do TOC

O componente TOC gera os atributos id dos elementos de cabeçalho com base no texto do cabeçalho.

Aqui está um cabeçalho como exemplo.

main outlet

O espaçamento vem dos estilos aplicados a #main-outlet, que é um elemento do aplicativo Discourse e não tem nada a ver com esta postagem.

Isso não é o fim do mundo se eu pudesse especificar um id alternativo para o cabeçalho. O componente TOC suporta isso:

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

Infelizmente, o Discourse remove os atributos id dos elementos da postagem antes que o código acima seja executado, o que impede essa lógica.

Aqui está um cabeçalho que usa <h4 id="alt-main-outlet">main outlet</h4>:

main outlet

Note que ele ainda usa main-outlet em vez de alt-main-outlet.

Acho que o Discourse faz isso na expectativa de que alguém tente manipular um elemento da página. Mas com o componente TOC, é fácil contornar isso.

Se houver uma solução para isso ou se for um problema bem discutido que eu tenha perdido, peço desculpas pelas opiniões não solicitadas que seguem :slight_smile:


P.S.

Pessoalmente, acho que o Discourse NÃO deve remover os atributos id dos elementos. Isso é uma construção fundamental de páginas web e é usado na navegação da página com fragmentos de URL. Se alguém quiser criar um link para um elemento em uma postagem, acho que isso é um direito do autor.

O fato de o TOC permitir a manipulação de IDs sugere que essa medida de remover IDs desde o início pode, potencialmente, ser descartada.

Se a equipe do Discourse está tão preocupada com o sequestro de IDs, todos os IDs do Discourse deveriam ter um prefixo, por exemplo, discourse-main-outlet, e a remoção de IDs deveria ser aplicada apenas a esses IDs com prefixo.

Posso entender a impossibilidade disso, dado o código existente!

É possível imaginar um conjunto de IDs excluídos (por exemplo, main-outlet, etc.) que são removidos. Isso ainda deixa o problema do TOC ser usado para contornar essa proteção, mas pelo menos permitiria que os autores criassem âncoras úteis.


P.P.S.

Diretamente relacionado a isso está o problema de cabeçalhos com o mesmo conteúdo de texto.

Tópico Um

Exemplos

Tópico Dois

Exemplos

Com o TOC, ambos os cabeçalhos Exemplos recebem o mesmo ID, o que é obviamente bastante problemático. O TOC poderia adicionar índices incrementais (por exemplo, examples, examples-2, etc.) — e provavelmente deveria fazer isso como padrão — mas seria ainda melhor uma solução para o problema discutido acima, que permite aos autores decidir como descrever seu conteúdo. Por exemplo, <h5 id="topic-one-examples">Exemplos</h5>, etc.

@Johani, o que você acha disso?

Se você precisar adicionar um cabeçalho, ele deve ter o prefixo heading--. Você pode encontrar mais informações sobre isso aqui Linking to a heading within a post or topic

IDs que não possuem esse prefixo serão removidos, independentemente do valor do ID.

Cabeçalhos com texto duplicado não são atualmente suportados — e nunca foram — no componente TOC. O componente gera o ID com base no texto do cabeçalho. Portanto, dois cabeçalhos com exatamente o mesmo texto receberão o mesmo ID.

Não há planos para corrigir isso no componente no momento, pois a geração automática de IDs está na nossa lista de recursos para o próximo lançamento do Discourse, e pretendemos resolver o problema de cabeçalhos duplicados adicionando o índice do cabeçalho ao seu ID.

Quando implementarmos isso no núcleo, acho que adicionar um prefixo aos cabeçalhos gerados será suficiente.

Isso faz sentido. Obrigado pela explicação detalhada!