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 Me gusta

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 me gusta

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

1 me gusta

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 Me gusta

¡Me gusta mucho este concepto!

Dos cosas que se me ocurren, no estoy seguro si son posibles actualmente pero me encantaría tener:

  1. ¿La capacidad de usar esto para menciones de grupo? Acabo de intentarlo para mi grupo de administradores pero no pareció funcionar.

  2. La capacidad para que el usuario elija su propio emoji en sus preferencias y luego se mostraría cada vez que se le mencionara. Incluso podría ser un beneficio para dar a los usuarios más comprometidos en niveles de confianza más altos.

Editar:

  1. ¿La capacidad de usar esto para menciones de grupo? Acabo de intentarlo para mi grupo de administradores pero no pareció funcionar.

Descubrí cómo hacerlo pero no sé cómo hacer una solicitud de PR, así que por ahora, solo publicaré el código a continuación:

common.scss agrega .mention-group:after y .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 agrega esto al final:

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

Quería la capacidad de usar también SVG personalizados como icono junto a una mención, algo que he visto en Guilded para el personal y que quería tener allí pero no podía tener; otra razón por la que me gusta tanto Discourse es que realmente puedo hackear algo que funcione en lugar de esperar a que los desarrolladores lo añadan.

Así que hackeé la siguiente solución. No es infalible, probablemente requiere que el SVG que subas tenga una variable SCSS que comience con svg y, sin embargo, parece funcionar lo suficiente para mí ahora :slight_smile:

Si alguien quiere tomar este código y desarrollarlo, incorporarlo para hacerlo más elegante, ¡estaré agradecido!

Posibles mejoras

  1. Hacer que funcione para todos los iconos SVG, es decir, todos los de Discourse y todos los que se suben y no empiezan con svg.
  2. Limpiar el código.
  3. Mejorar el estilo, ya que he hackeado un poco el CSS para que funcione y puede que no funcione en todas las situaciones.

Sin embargo, aquí tienes un ejemplo de una mención conmigo usando el icono personalizado que tengo para Defensa Emocional Personal como icono de mención del personal:

image

Aquí está el código que añadí:

header.html

  // Añade iconos SVG como opción, siempre que estén incluidos en los assets y subidos
  // Crea un objeto de todos los assets e itera para encontrar qué enlaces tienen el atributo data-emoji
  // igual al nombre de la variable del asset y luego añade la URL correspondiente

  // convierte el objeto en un array de claves
  const keys = Object.keys(settings.theme_uploads);

  // imprime todas las claves
  console.log(keys);

  // itera sobre el 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;
  }
}

Esto también requiere que:

  1. Creas una carpeta /assets
  2. Añadas archivos svg en la carpeta /assets, como /assets/esd-heart.svg
  3. Actualices el archivo about.json para enlazar a esos assets con algo como:
"assets": {
  	"svg_esd_heart": "assets/esd-heart.svg"
}
1 me gusta

¿Hay alguna forma de que el emoji solo aparezca para el usuario elegido? Si tienes un usuario con el nombre Taylor y TaylorLife, el emoji aparece para ambos.