Skip to content

Commit

Permalink
Emoji: fixed Twemoji filenames for ZWJ sequences
Browse files Browse the repository at this point in the history
  • Loading branch information
JoshyPHP committed Jun 3, 2019
1 parent 22f6aa9 commit 021b68b
Show file tree
Hide file tree
Showing 9 changed files with 1,209 additions and 1,183 deletions.
2 changes: 1 addition & 1 deletion docs/Plugins/Emoji/Synopsis.md
Expand Up @@ -62,5 +62,5 @@ $html = $renderer->render($xml);
echo $html;
```
```html
Hello world <img alt=":1f937-1f3fe-200d-2640-fe0f:" class="emoji" draggable="false" src="https://twemoji.maxcdn.com/2/svg/1f937-1f3fe-200d-2640.svg">
Hello world <img alt=":1f937-1f3fe-200d-2640-fe0f:" class="emoji" draggable="false" src="https://twemoji.maxcdn.com/2/svg/1f937-1f3fe-200d-2640-fe0f.svg">
```
4 changes: 4 additions & 0 deletions docs/testdox.txt
Expand Up @@ -3977,6 +3977,8 @@ s9e\TextFormatter\Tests\Plugins\Emoji\Parser
[x] Parsing tests with data set #20
[x] Parsing tests with data set #21
[x] Parsing tests with data set #22
[x] Parsing tests with data set #23
[x] Parsing tests with data set #24
[x] Parsing tests (JavaScript) with data set #0
[x] Parsing tests (JavaScript) with data set #1
[x] Parsing tests (JavaScript) with data set #2
Expand All @@ -4000,6 +4002,8 @@ s9e\TextFormatter\Tests\Plugins\Emoji\Parser
[x] Parsing tests (JavaScript) with data set #20
[x] Parsing tests (JavaScript) with data set #21
[x] Parsing tests (JavaScript) with data set #22
[x] Parsing tests (JavaScript) with data set #23
[x] Parsing tests (JavaScript) with data set #24
[x] Parsing+rendering tests with data set #0
[x] Parsing+rendering tests with data set #1
[x] Parsing+rendering tests with data set #2
Expand Down
6 changes: 5 additions & 1 deletion scripts/patchEmoji.php
Expand Up @@ -45,7 +45,11 @@
}
$hex = utf8ToHex($utf8);
$seq = removeMarks($hex);
$tseq = preg_replace('(-fe0f$)', '', ltrim($hex, 0));
$tseq = ltrim($hex, '0');
if (strpos($tseq, '-200d') === false)
{
$tseq = str_replace('-fe0f', '', $tseq);
}

$allText .= $utf8 . "\n";
$allXml .= '<EMOJI seq="' . $seq . '" tseq="' . $tseq . '">' . $utf8 . "</EMOJI>\n";
Expand Down
2 changes: 1 addition & 1 deletion src/Bundles/Forum.php

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/Plugins/Emoji/Configurator.php

Large diffs are not rendered by default.

10 changes: 7 additions & 3 deletions src/Plugins/Emoji/Parser.js
Expand Up @@ -2,7 +2,7 @@
var shortnameRegexp = /:[-+_a-z0-9]+(?=:)/g;

/** @const */
var unicodeRegexp = /(?:[#*0-9]\ufe0f\u20e3?|[\xa9\xae\u203c\u2049\u2122\u2139\u2194-\u2199\u21a9\u21aa\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb\u25fc\u2600-\u2604\u260e\u2611\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u265f\u2660\u2663\u2665\u2666\u2668\u267b\u267e\u2692\u2694-\u2697\u2699\u269b\u269c\u26a0\u26b0\u26b1\u26c8\u26cf\u26d1\u26d3\u26e9\u26f0\u26f1\u26f4\u26f7\u26f8\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u3030\u303d\u3297\u3299]\ufe0f|[\u261d\u270c\u270d](?:\ud83c[\udffb-\udfff]|\ufe0f)|[\u270a\u270b](?:\ud83c[\udffb-\udfff])?|[\u231a\u231b\u23e9-\u23ec\u23f0\u23f3\u25fd\u25fe\u2614\u2615\u2648-\u2653\u267f\u2693\u26a1\u26aa\u26ab\u26bd\u26be\u26c4\u26c5\u26ce\u26d4\u26ea\u26f2\u26f3\u26f5\u26fa\u26fd\u2705\u2728\u274c\u274e\u2753-\u2755\u2757\u2795-\u2797\u27b0\u27bf\u2b1b\u2b1c\u2b50\u2b55]|\u26f9(?:\ud83c[\udffb-\udfff]|\ufe0f)(?:\u200d[\u2640\u2642]\ufe0f)?|\ud83c(?:[\udd70\udd71\udd7e\udd7f\ude02\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff5\udff7]\ufe0f|[\udde6-\uddff](?:\ud83c[\udde6-\uddff])?|[\udf85\udfc2\udfc7](?:\ud83c[\udffb-\udfff])?|[\udfc3\udfc4\udfca](?:\ud83c[\udffb-\udfff])?(?:\u200d[\u2640\u2642]\ufe0f)?|[\udfcb\udfcc](?:\ud83c[\udffb-\udfff]|\ufe0f)(?:\u200d[\u2640\u2642]\ufe0f)?|[\udc04\udccf\udd8e\udd91-\udd9a\ude01\ude1a\ude2f\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff8-\udfff]|\udff3\ufe0f(?:\u200d\ud83c\udf08)?|\udff4(?:\u200d\u2620\ufe0f|\udb40\udc67\udb40\udc62\udb40(?:\udc65\udb40\udc6e\udb40\udc67|\udc73\udb40\udc63\udb40\udc74|\udc77\udb40\udc6c\udb40\udc73)\udb40\udc7f)?)|\ud83d(?:[\udc3f\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]\ufe0f|[\udc42\udc43\udc46-\udc50\udc66\udc67\udc6b-\udc6d\udc70\udc72\udc74-\udc76\udc78\udc7c\udc83\udc85\udcaa\udd7a\udd95\udd96\ude4c\ude4f\udec0\udecc](?:\ud83c[\udffb-\udfff])?|[\udc6e\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6](?:\ud83c[\udffb-\udfff])?(?:\u200d[\u2640\u2642]\ufe0f)?|[\udd74\udd90](?:\ud83c[\udffb-\udfff]|\ufe0f)|[\udc00-\udc14\udc16-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5\udeeb\udeec\udef4-\udefa\udfe0-\udfeb]|\udc15(?:\u200d\ud83e\uddba)?|\udc41\ufe0f(?:\u200d\ud83d\udde8\ufe0f)?|\udc68(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\u2764\ufe0f\u200d\ud83d(?:\udc8b\u200d\ud83d)?\udc68|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d(?:[\udc68\udc69]\u200d\ud83d(?:\udc66(?:\u200d\ud83d\udc66)?|\udc67(?:\u200d\ud83d[\udc66\udc67])?)|[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\udc66(?:\u200d\ud83d\udc66)?|\udc67(?:\u200d\ud83d[\udc66\udc67])?)|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|\ud83c(?:\udffb(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd]))?|\udffc(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d\udc68\ud83c\udffb)))?|\udffd(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc])))?|\udffe(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd])))?|\udfff(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe])))?))?|\udc69(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\u2764\ufe0f\u200d\ud83d(?:\udc8b\u200d\ud83d)?[\udc68\udc69]|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d(?:[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\udc66(?:\u200d\ud83d\udc66)?|\udc67(?:\u200d\ud83d[\udc66\udc67])?|\udc69\u200d\ud83d(?:\udc66(?:\u200d\ud83d\udc66)?|\udc67(?:\u200d\ud83d[\udc66\udc67])?))|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|\ud83c(?:\udffb(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff])))?|\udffc(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d(?:\udc68\ud83c[\udffb\udffd-\udfff]|\udc69\ud83c\udffb))))?|\udffd(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d(?:\udc68\ud83c[\udffb\udffc\udffe\udfff]|\udc69\ud83c[\udffb\udffc]))))?|\udffe(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d(?:\udc68\ud83c[\udffb-\udffd\udfff]|\udc69\ud83c[\udffb-\udffd]))))?|\udfff(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d[\udc68\udc69]\ud83c[\udffb-\udffe])))?))?|\udc6f(?:\u200d[\u2640\u2642]\ufe0f)?|\udd75(?:\ud83c[\udffb-\udfff]|\ufe0f)(?:\u200d[\u2640\u2642]\ufe0f)?)|\ud83e(?:[\udd0f\udd18-\udd1c\udd1e\udd1f\udd30-\udd36\uddb5\uddb6\uddbb\uddd2-\uddd5](?:\ud83c[\udffb-\udfff])?|[\udd26\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd](?:\ud83c[\udffb-\udfff])?(?:\u200d[\u2640\u2642]\ufe0f)?|[\udd3c\uddde\udddf](?:\u200d[\u2640\u2642]\ufe0f)?|[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3f-\udd45\udd47-\udd71\udd73-\udd76\udd7a-\udda2\udda5-\uddaa\uddae-\uddb4\uddb7\uddba\uddbc-\uddca\uddd0\udde0-\uddff\ude70-\ude73\ude78-\ude7a\ude80-\ude82\ude90-\ude95]|\uddd1(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83c(?:\udffb(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffb)?|\udffc(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb\udffc])?|\udffd(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udffd])?|\udffe(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udffe])?|\udfff(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff])?))?))(?!\ufe0e)\ufe0f?/g;
var unicodeRegexp = /(?:[#*0-9]\ufe0f\u20e3?|[\xa9\xae\u203c\u2049\u2122\u2139\u2194-\u2199\u21a9\u21aa\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb\u25fc\u2600-\u2604\u260e\u2611\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u265f\u2660\u2663\u2665\u2666\u2668\u267b\u267e\u2692\u2694-\u2697\u2699\u269b\u269c\u26a0\u26b0\u26b1\u26c8\u26cf\u26d1\u26d3\u26e9\u26f0\u26f1\u26f4\u26f7\u26f8\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u3030\u303d\u3297\u3299]\ufe0f|[\u261d\u270c\u270d](?:\ufe0f|\ud83c[\udffb-\udfff])|[\u270a\u270b](?:\ud83c[\udffb-\udfff])?|[\u231a\u231b\u23e9-\u23ec\u23f0\u23f3\u25fd\u25fe\u2614\u2615\u2648-\u2653\u267f\u2693\u26a1\u26aa\u26ab\u26bd\u26be\u26c4\u26c5\u26ce\u26d4\u26ea\u26f2\u26f3\u26f5\u26fa\u26fd\u2705\u2728\u274c\u274e\u2753-\u2755\u2757\u2795-\u2797\u27b0\u27bf\u2b1b\u2b1c\u2b50\u2b55]|\u26f9(?:\ufe0f|\ud83c[\udffb-\udfff])(?:\u200d[\u2640\u2642]\ufe0f)?|\ud83c(?:[\udd70\udd71\udd7e\udd7f\ude02\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff5\udff7]\ufe0f|[\udde6-\uddff](?:\ud83c[\udde6-\uddff])?|[\udf85\udfc2\udfc7](?:\ud83c[\udffb-\udfff])?|[\udfc3\udfc4\udfca](?:\ud83c[\udffb-\udfff])?(?:\u200d[\u2640\u2642]\ufe0f)?|[\udfcb\udfcc](?:\ufe0f|\ud83c[\udffb-\udfff])(?:\u200d[\u2640\u2642]\ufe0f)?|[\udc04\udccf\udd8e\udd91-\udd9a\ude01\ude1a\ude2f\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff8-\udfff]|\udff3\ufe0f(?:\u200d\ud83c\udf08)?|\udff4(?:\u200d\u2620\ufe0f|\udb40\udc67\udb40\udc62\udb40(?:\udc65\udb40\udc6e\udb40\udc67|\udc73\udb40\udc63\udb40\udc74|\udc77\udb40\udc6c\udb40\udc73)\udb40\udc7f)?)|\ud83d(?:[\udc3f\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]\ufe0f|[\udc42\udc43\udc46-\udc50\udc66\udc67\udc6b-\udc6d\udc70\udc72\udc74-\udc76\udc78\udc7c\udc83\udc85\udcaa\udd7a\udd95\udd96\ude4c\ude4f\udec0\udecc](?:\ud83c[\udffb-\udfff])?|[\udc6e\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6](?:\ud83c[\udffb-\udfff])?(?:\u200d[\u2640\u2642]\ufe0f)?|[\udd74\udd90](?:\ufe0f|\ud83c[\udffb-\udfff])|[\udc00-\udc14\udc16-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5\udeeb\udeec\udef4-\udefa\udfe0-\udfeb]|\udc15(?:\u200d\ud83e\uddba)?|\udc41\ufe0f(?:\u200d\ud83d\udde8\ufe0f)?|\udc68(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\u2764\ufe0f\u200d\ud83d(?:\udc8b\u200d\ud83d)?\udc68|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d(?:[\udc68\udc69]\u200d\ud83d(?:\udc66(?:\u200d\ud83d\udc66)?|\udc67(?:\u200d\ud83d[\udc66\udc67])?)|[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\udc66(?:\u200d\ud83d\udc66)?|\udc67(?:\u200d\ud83d[\udc66\udc67])?)|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|\ud83c(?:\udffb(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd]))?|\udffc(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d\udc68\ud83c\udffb)))?|\udffd(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc])))?|\udffe(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd])))?|\udfff(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe])))?))?|\udc69(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\u2764\ufe0f\u200d\ud83d(?:\udc8b\u200d\ud83d)?[\udc68\udc69]|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d(?:[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\udc66(?:\u200d\ud83d\udc66)?|\udc67(?:\u200d\ud83d[\udc66\udc67])?|\udc69\u200d\ud83d(?:\udc66(?:\u200d\ud83d\udc66)?|\udc67(?:\u200d\ud83d[\udc66\udc67])?))|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|\ud83c(?:\udffb(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff])))?|\udffc(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d(?:\udc68\ud83c[\udffb\udffd-\udfff]|\udc69\ud83c\udffb))))?|\udffd(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d(?:\udc68\ud83c[\udffb\udffc\udffe\udfff]|\udc69\ud83c[\udffb\udffc]))))?|\udffe(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d(?:\udc68\ud83c[\udffb-\udffd\udfff]|\udc69\ud83c[\udffb-\udffd]))))?|\udfff(?:\u200d(?:[\u2695\u2696\u2708]\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e(?:[\uddaf-\uddb3\uddbc\uddbd]|\udd1d\u200d\ud83d[\udc68\udc69]\ud83c[\udffb-\udffe])))?))?|\udc6f(?:\u200d[\u2640\u2642]\ufe0f)?|\udd75(?:\ufe0f|\ud83c[\udffb-\udfff])(?:\u200d[\u2640\u2642]\ufe0f)?)|\ud83e(?:[\udd0f\udd18-\udd1c\udd1e\udd1f\udd30-\udd36\uddb5\uddb6\uddbb\uddd2-\uddd5](?:\ud83c[\udffb-\udfff])?|[\udd26\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd](?:\ud83c[\udffb-\udfff])?(?:\u200d[\u2640\u2642]\ufe0f)?|[\udd3c\uddde\udddf](?:\u200d[\u2640\u2642]\ufe0f)?|[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3f-\udd45\udd47-\udd71\udd73-\udd76\udd7a-\udda2\udda5-\uddaa\uddae-\uddb4\uddb7\uddba\uddbc-\uddca\uddd0\udde0-\uddff\ude70-\ude73\ude78-\ude7a\ude80-\ude82\ude90-\ude95]|\uddd1(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83c(?:\udffb(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffb)?|\udffc(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb\udffc])?|\udffd(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udffd])?|\udffe(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udffe])?|\udfff(?:\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff])?))?))(?!\ufe0e)\ufe0f?/g;

parseShortnames(text);
parseCustomAliases(text);
Expand All @@ -24,8 +24,12 @@ function addTag(tagPos, tagLen, hex)
var seq = hex.replace(/-(?:200d|fe0f)/g, '');
tag.setAttribute('seq', seq);

// Twemoji sequence, leading zeroes and trailing VS16 are removed
var tseq = hex.replace(/^0+/, '').replace(/-fe0f$/, '');
// Twemoji sequence, leading zeroes are removed and VS-16 are removed from non-ZWJ sequences
var tseq = hex.replace(/^0+/, '');
if (tseq.indexOf('-200d') < 0)
{
tseq = tseq.replace(/-fe0f/g, '');
}
tag.setAttribute('tseq', tseq);
}

Expand Down
8 changes: 6 additions & 2 deletions src/Plugins/Emoji/Parser.php
Expand Up @@ -47,8 +47,12 @@ protected function addTag($tagPos, $tagLen, $hex)
$seq = str_replace(['-200d', '-fe0f'], '', $hex);
$tag->setAttribute('seq', $seq);

// Twemoji sequence, leading zeroes and trailing VS16 are removed
$tseq = preg_replace('(-fe0f$)', '', ltrim($hex, '0'));
// Twemoji sequence, leading zeroes are removed and VS-16 are removed from non-ZWJ sequences
$tseq = ltrim($hex, '0');
if (strpos($tseq, '-200d') === false)
{
$tseq = str_replace('-fe0f', '', $tseq);
}
$tag->setAttribute('tseq', $tseq);
}

Expand Down
14 changes: 12 additions & 2 deletions tests/Plugins/Emoji/ParserTest.php
Expand Up @@ -68,7 +68,7 @@ public function getParsingTests()
],
[
'#️⃣1️⃣2️⃣',
'<r><EMOJI seq="0023-20e3" tseq="23-fe0f-20e3">#️⃣</EMOJI><EMOJI seq="0031-20e3" tseq="31-fe0f-20e3">1️⃣</EMOJI><EMOJI seq="0032-20e3" tseq="32-fe0f-20e3">2️⃣</EMOJI></r>'
'<r><EMOJI seq="0023-20e3" tseq="23-20e3">#️⃣</EMOJI><EMOJI seq="0031-20e3" tseq="31-20e3">1️⃣</EMOJI><EMOJI seq="0032-20e3" tseq="32-20e3">2️⃣</EMOJI></r>'
],
[
':bouquet:',
Expand Down Expand Up @@ -132,6 +132,16 @@ function ($configurator, $plugin)
':00a9: :1f1ef-1f1f5: :1f468-200d-2764-fe0f-200d-1f468:',
'<r><EMOJI seq="00a9" tseq="a9">:00a9:</EMOJI> <EMOJI seq="1f1ef-1f1f5" tseq="1f1ef-1f1f5">:1f1ef-1f1f5:</EMOJI> <EMOJI seq="1f468-2764-1f468" tseq="1f468-200d-2764-fe0f-200d-1f468">:1f468-200d-2764-fe0f-200d-1f468:</EMOJI></r>'
],
[
// Do not remove U+FE0F from Twemoji sequences that contain U+200D
":man_judge: :1f468-200d-2696-fe0f: \u{1f468}\u{200d}\u{2696}\u{fe0f}",
'<r><EMOJI seq="1f468-2696" tseq="1f468-200d-2696-fe0f">:man_judge:</EMOJI> <EMOJI seq="1f468-2696" tseq="1f468-200d-2696-fe0f">:1f468-200d-2696-fe0f:</EMOJI> <EMOJI seq="1f468-2696" tseq="1f468-200d-2696-fe0f">&#128104;‍⚖️</EMOJI></r>'
],
[
// Do remove U+FE0F from Twemoji sequences that do not contain U+200D
":0031-20e3: \u{0031}\u{fe0f}\u{20e3}",
'<r><EMOJI seq="0031-20e3" tseq="31-20e3">:0031-20e3:</EMOJI> <EMOJI seq="0031-20e3" tseq="31-20e3">1️⃣</EMOJI></r>'
],
[
file_get_contents(__DIR__ . '/all.txt'),
file_get_contents(__DIR__ . '/all.xml'),
Expand Down Expand Up @@ -159,7 +169,7 @@ public function getRenderingTests()
],
[
':copyright::registered:#️⃣',
'<img alt=":copyright:" class="emoji" draggable="false" src="https://twemoji.maxcdn.com/2/svg/a9.svg"><img alt=":registered:" class="emoji" draggable="false" src="https://twemoji.maxcdn.com/2/svg/ae.svg"><img alt="#️⃣" class="emoji" draggable="false" src="https://twemoji.maxcdn.com/2/svg/23-fe0f-20e3.svg">'
'<img alt=":copyright:" class="emoji" draggable="false" src="https://twemoji.maxcdn.com/2/svg/a9.svg"><img alt=":registered:" class="emoji" draggable="false" src="https://twemoji.maxcdn.com/2/svg/ae.svg"><img alt="#️⃣" class="emoji" draggable="false" src="https://twemoji.maxcdn.com/2/svg/23-20e3.svg">'
],
];
}
Expand Down

0 comments on commit 021b68b

Please sign in to comment.