Why are there graphic-based smileys at all, when Unicode supports most of them directly? What Unicode doesn't support can be handled by FontAwesome or a little CSS. Keeping font-based solutions to emojis allows them to scale naturally with the fonts. An emoji in the title becomes a different size than an emoji in paragraph, or an emoji in a subscript. Here's a smileys.mdwn file that doesn't use any graphics at all: <pre> This page is used to control what smileys are supported by the wiki. Just write the text of a smiley to display it. * \\:) [🙂] * \\:smile: [🙂] * \\:-) [🙂] * \\:D [😃] * \\:-D [😃] * \\:grin: [😃] * \\B) [😎] * \\B-) [😎] * \\:)) [😛] * \\:-)) [😛] * \\;) [😉] * \\;-) [😉] * \\:\ [😕] * \\:-\ [😕] * \\:/ [😕] * \\:-/ [😕] * \\:| [ðŸ˜] * \\:-| [ðŸ˜] * \\>:> [😈] * \\X-( [😡] * \\<:( [😧] * \\:( [ðŸ™] * \\:-( [ðŸ™] * \\:-? [ðŸ˜] * \\:-P [ðŸ˜] * \\:o [😱] * \\|) [😪] * \\|-) [😪] * \\{OK} [ðŸ‘] * \\:+1: [ðŸ‘] * \\:-1: [👎] * \\(/) [🚫] * \\{X} [🛑] * \\{i} [ℹï¸] * \\(./) [✔︎] * \\(!) [💡] * \\[!] [✋] * \\/!\ [âš ï¸] * \\(?) [â“] * \\(!?) [â‰ï¸] * \\{x} [☒] * \\{*} [☑︎] * \\{o} [â˜] * \\{1} [<span class="priority-1">ðŸ™</span>] * \\{2} [<span class="priority-2">ðŸš</span>] * \\{3} [<span class="priority-3">ðŸ›<span>] For example: {x} B) {x} {3} :grin: :-1: ---- To change the supported smileys, just edit the lists on this page. Note that the format is important; each list item should start with the text that is turned into the smiley, escaped so that users can see what produces it, followed by a [[ikiwiki/WikiLink]] to the image to display. /!\ Bear in mind that the link to the image needs to be written in a way that will work if it's copied to other pages on the wiki. So be sure to include the smileys directory in the path to the file. </pre> Here's the patch to smiley.pm: <pre> --- smiley.pm.orig 2017-05-26 18:00:01.000000000 -0400 +++ smiley.pm 2017-05-26 22:01:18.000000000 -0400 @@ -33,17 +33,17 @@ return; } my $list=readfile($srcfile); - while ($list =~ m/^\s*\*\s+\\\\([^\s]+)\s+\[\[([^]]+)\]\]/mg) { + while ($list =~ m/^\s*\*\s+\\\\([^\s]+)\s+\[([^\]]+)\]/mg) { my $smiley=$1; - my $file=$2; + my $value=$2; - $smileys{$smiley}=$file; + $smileys{$smiley}=$value; # Add a version with < and > escaped, since they probably # will be (by markdown) by the time the sanitize hook runs. $smiley=~s/</</g; $smiley=~s/>/>/g; - $smileys{$smiley}=$file; + $smileys{$smiley}=$value; } if (! %smileys) { @@ -94,10 +94,18 @@ } else { # Replace the smiley with its expanded value. - my $link=htmllink($params{page}, $params{destpage}, - $smileys{$smiley}, linktext => $smiley); - substr($_, $spos, length($smiley))=$link; - pos=$epos+length($link); + my $value = $smileys{$smiley}; + my $replacement = ""; + if ($value =~ /\[([^\]]*)/) { + $value=$1; + $replacement=htmllink($params{page}, $params{destpage}, + $value, linktext => $smiley); + } + else { + $replacement=$value; + } + substr($_, $spos, length($smiley))=$replacement; + pos=$epos+length($replacement); } } </pre> As you can see, it keeps the [] characters around the smiley. This can be useful if it renders to nothing in the browser -- particularly in the CSS-based solutions. It keeps the same data structure, but images get a "[" prefix to them as a marker. Since I minimized the changes to the regex, the trailing "]" is still dropped.