Emoji mention theme component

This is a simple component that will automatically add an emoji (or other text, if you’d like) to a @mention in a post

40%20AM

Github repo: https://github.com/awesomerobot/discourse-emoji-mention

How do I install a Theme or Theme Component?

How to

To configure it, add items to the list in the format of @username, emoji (You can copy and paste emoji from https://getemoji.com/ or https://emojipedia.org/)

41%20AM

There’s also an option to show the emoji after the mention, instead of before.

That’s all it does!

29 « J'aime »

Would be possible to use this with custom emojis?
As we provide support from our community, it would be nice to add our logo before mentioning one of the staff

1 « J'aime »

Not using the current structure because the setting uses unicode for emojis.

1 « J'aime »

Mmm, and maybe it could be changed? :sweat_smile:

This component is kind of a super basic template on finding content in a post and appending something to it. There’s probably a way to grab existing emojis, but I don’t know it off the top of my head.

What would work is replacing the header.html file in the component with this, which would just append an image after a mention instead (that image could be a little logo).

<script type="text/discourse-plugin" version="0.8.18">
    $.expr[":"].contains = $.expr.createPseudo(function(arg) { // make case insensitive
        return function( elem ) {
            return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
        };
    }); 
    
    let emoji = {};
    
    settings.username_emoji.split('|').forEach(pair => {
        let split = pair.split(",");
        emoji[split[0].toLowerCase()] = split[1];
    });
    
    $.each(emoji, function (key, value){
        api.decorateCooked($elem => $elem.find("a.mention:contains(" + key + ")").append("<img src='" + value + "'>").addClass("with-image"));
    });
    
</script> 

Using a setting like this

11 « J'aime »

J’aime beaucoup ce concept !

Deux choses me viennent à l’esprit, je ne sais pas si c’est actuellement possible mais j’adorerais l’avoir :

  1. La possibilité de l’utiliser pour les mentions de groupe ? Je viens de l’essayer pour mon groupe d’administrateurs mais cela ne semble pas fonctionner.

  2. La possibilité pour l’utilisateur de choisir son propre emoji dans ses préférences et il s’afficherait alors chaque fois qu’il serait mentionné. Ce pourrait même être un avantage à accorder aux utilisateurs les plus engagés ayant des niveaux de confiance plus élevés.

Modifier :

  1. La possibilité de l’utiliser pour les mentions de groupe ? Je viens de l’essayer pour mon groupe d’administrateurs mais cela ne semble pas fonctionner.

J’ai trouvé comment faire mais je ne sais pas comment faire une demande de PR, donc pour l’instant, je vais juste poster le code ci-dessous :

common.scss ajoute .mention-group:after et .mention-group:before

@if $show-after-mention == "true" {
  .mention:after,
  .mention-group:after {
    content: attr(data-emoji);
    display: inline;
  }
} @else {
  .mention:before,
  .mention-group:after {
    content: attr(data-emoji);
    display: inline;
  }
}

header.html ajoute ceci à la fin :

$.each(emoji, function(key, value) {
  api.decorateCooked($elem =>
    $elem
      .find("a.mention-group:contains(" + key + ")")
      .attr("data-emoji", value)
      .addClass("with-emoji")
  );
});
1 « J'aime »

Je voulais la possibilité d’utiliser également des SVG personnalisés comme icône à côté d’une mention, quelque chose que j’ai vu sur Guilded pour le personnel et que je voulais avoir là mais que je ne pouvais pas avoir — encore une autre raison pour laquelle j’aime tellement Discourse, c’est que je peux réellement bricoler quelque chose qui pourrait fonctionner au lieu d’espérer et d’attendre que les développeurs l’ajoutent.

J’ai donc bricolé la solution suivante. Elle n’est en aucun cas infaillible, elle nécessite probablement que le SVG que vous téléchargez ait une variable SCSS qui commence par svg et pourtant, elle semble fonctionner suffisamment pour moi maintenant :slight_smile:

Si quelqu’un veut prendre ce code et l’améliorer, l’incorporer pour le rendre plus sophistiqué, j’en serais reconnaissant !

Choses possibles à améliorer

  1. La faire fonctionner pour toutes les icônes SVG, c’est-à-dire toutes celles de Discourse et toutes celles qui sont téléchargées et qui ne commencent pas par svg.
  2. Nettoyer le code.
  3. Améliorer le style, car j’ai un peu bricolé le CSS pour qu’il fonctionne et il pourrait ne pas fonctionner dans toutes les situations.

Quoi qu’il en soit, voici un exemple de mention avec moi utilisant l’icône personnalisée que j’ai pour la Défense Émotionnelle en tant qu’icône de mention du personnel :

image

Voici le code que j’ai ajouté :

header.html

  // Add SVG icons as an option, as long as they're included in assets and uploaded
  // Creates an object of all the assets and iterates to find which links have the data-emoji
  // attribute equaling the asset variable name then adds the URL for it

  // convert object to key's array
  const keys = Object.keys(settings.theme_uploads);

  // print all keys
  console.log(keys);

  // iterate over object
  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;
  }
}

Cela nécessite également que vous :

  1. Créez un dossier /assets
  2. Ajoutez des fichiers svg dans le dossier /assets, comme /assets/esd-heart.svg
  3. Mettez à jour le fichier about.json pour lier ces actifs avec quelque chose comme :
"assets": {
  	"svg_esd_heart": "assets/esd-heart.svg"
}
1 « J'aime »

Y a-t-il un moyen pour que l’emoji n’apparaisse que pour l’utilisateur choisi ? Si vous avez un utilisateur nommé Taylor et TaylorLife, l’emoji apparaît pour les deux.