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 Mi Piace

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 Mi Piace

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

1 Mi Piace

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 Mi Piace

Mi piace molto questo concetto!

Due cose che mi vengono in mente, non sono sicuro se attualmente possibili ma mi piacerebbe avere:

  1. La possibilità di usarlo per le menzioni di gruppo? Ho appena provato per il mio gruppo di amministratori ma non sembrava funzionare.

  2. La possibilità per l’utente di scegliere la propria emoji nelle preferenze e poi mostrerebbe ogni volta che viene menzionato. Forse potrebbe anche essere un vantaggio da dare agli utenti più coinvolti a livelli di fiducia più elevati.

Modifica:

  1. La possibilità di usarlo per le menzioni di gruppo? Ho appena provato per il mio gruppo di amministratori ma non sembrava funzionare.

Ho capito come fare ma non so come fare una richiesta di PR, quindi per ora posterò il codice qui sotto:

common.scss aggiunge .mention-group:after e .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 aggiunge questo alla fine:

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

Volevo anche la possibilità di utilizzare SVG personalizzati come icona accanto a una menzione, qualcosa che ho visto su Guilded per lo staff e che volevo avere lì ma non potevo avere—un altro motivo per cui mi piace così tanto Discourse è che posso effettivamente creare qualcosa che potrebbe funzionare invece di sperare e aspettare che gli sviluppatori lo aggiungano.

Così ho creato la seguente soluzione. Non è infallibile in alcun modo, probabilmente richiede che l’SVG che carichi abbia una variabile SCSS che inizi con svg e tuttavia sembra funzionare abbastanza per me ora :slight_smile:

Se qualcuno vuole prendere questo codice e svilupparlo, incorporarlo per renderlo più elegante, gli sarei grato!

Possibili miglioramenti

  1. Far funzionare tutte le icone SVG, il che significa tutte quelle di Discourse e tutte quelle caricate che non iniziano con svg.
  2. Pulire il codice.
  3. Migliorare lo stile, dato che ho un po’ improvvisato il CSS per farlo funzionare e potrebbe non funzionare in tutte le situazioni.

Indipendentemente da ciò, ecco un esempio di menzione con me che uso l’icona personalizzata che ho per Emotional Self-Defense come icona di menzione dello staff:

image

Ecco il codice che ho aggiunto:

header.html

  // Aggiunge icone SVG come opzione, purché siano incluse negli asset e caricate
  // Crea un oggetto di tutti gli asset e itera per trovare quali link hanno l'attributo data-emoji
  // uguale al nome della variabile dell'asset e quindi aggiunge l'URL per esso

  // converte l'oggetto in un array di chiavi
  const keys = Object.keys(settings.theme_uploads);

  // stampa tutte le chiavi
  console.log(keys);

  // itera sull'oggetto
  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;
  }
}

Questo richiede anche di:

  1. Creare una cartella /assets
  2. Aggiungere file svg nella cartella /assets, come /assets/esd-heart.svg
  3. Aggiornare il file about.json per collegare tali asset con qualcosa come:
"assets": {
  	"svg_esd_heart": "assets/esd-heart.svg"
}
1 Mi Piace

C’è un modo per far apparire l’emoji solo per l’utente scelto? Se hai un utente con il nome Taylor e TaylorLife, l’emoji appare per entrambi.