Eu queria a capacidade de usar também SVGs personalizados como ícone ao lado de uma menção, algo que vi no Guilded para a equipe e que eu queria ter lá, mas não conseguia — mais um motivo pelo qual estou gostando tanto do Discourse é que posso realmente criar algo que funcione em vez de esperar que os desenvolvedores o adicionem.
Então, criei a seguinte solução. Não é infalível de forma alguma, provavelmente requer que o SVG que você carrega tenha uma variável SCSS que comece com svg e, ainda assim, parece funcionar o suficiente para mim agora ![]()
Se alguém quiser pegar este código e desenvolvê-lo, incorporá-lo para torná-lo mais sofisticado, ficaria grato!
Possíveis melhorias
- Fazer com que funcione para todos os ícones SVG, ou seja, todos os do Discourse e todos os que são carregados e não começam com
svg. - Limpar o código.
- Melhorar o estilo, pois eu meio que criei o CSS para funcionar e pode não funcionar em todas as situações.
Independentemente disso, aqui está um exemplo de uma menção comigo usando o ícone personalizado que tenho para Defesa Emocional como ícone de menção da equipe:

Aqui está o código que adicionei:
header.html
// Adiciona ícones SVG como uma opção, desde que estejam incluídos nos assets e carregados
// Cria um objeto de todos os assets e itera para encontrar quais links têm o atributo data-emoji
// igual ao nome da variável do asset e, em seguida, adiciona o URL para ele
// converte o objeto em um array de chaves
const keys = Object.keys(settings.theme_uploads);
// imprime todas as chaves
console.log(keys);
// itera sobre o objeto
keys.forEach((key, index) => {
console.log(`${key}: ${settings.theme_uploads[key]}`);
api.decorateCooked($elem => {
var url = settings.theme_uploads[key];
console.log("key: " + key);
console.log("index: " + index);
console.log("url: " + url);
console.log(JSON.stringify(settings.theme_uploads));
$elem
.find("a[data-emoji^='" + key + "']")
.css("--svg-icon", "url('" + url + "')");
}
);
});
common.scss
@if $show-after-mention == "true" {
[data-emoji^="svg"]:after {
content: 'hey ';
color: transparent;
height:5px;
width:15px;
background: var(--svg-icon) no-repeat center;
background-size: contain;
display: inline;
}
} @else {
[data-emoji^="svg"]:before {
content: 'hey ';
color: transparent;
height:5px;
width:15px;
background: var(--svg-icon) no-repeat center;
background-size: contain;
display: inline;
}
}
Isso também requer que você:
- Crie uma pasta
/assets - Adicione arquivos
svgna pasta/assets, como/assets/esd-heart.svg - Atualize o arquivo
about.jsonpara vincular esses assets com algo como:
"assets": {
"svg_esd_heart": "assets/esd-heart.svg"
}