Skip to content

Commit 1dd65e7

Browse files
authored
Merge pull request #6680 from WoltLab/63-smiley-emoji-mapping
Add optional emoji mapping for smileys
2 parents 9588af0 + ce34dfb commit 1dd65e7

11 files changed

Lines changed: 67 additions & 2 deletions

File tree

wcfsetup/install/files/acp/database/update_com.woltlab.wcf_6.3_step1.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,9 @@
5757
->columns([
5858
DefaultFalseBooleanDatabaseTableColumn::create('showOnUserCard'),
5959
]),
60+
PartialDatabaseTable::create('wcf1_smiley')
61+
->columns([
62+
NotNullVarchar255DatabaseTableColumn::create('emoji')
63+
->defaultValue(''),
64+
]),
6065
];

wcfsetup/install/files/acp/templates/smileyAdd.tpl

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,28 @@
8080
<dt><label for="aliases">{lang}wcf.acp.smiley.aliases{/lang}</label></dt>
8181
<dd>
8282
<textarea id="aliases" name="aliases" cols="40" rows="10">{$aliases}</textarea>
83-
83+
8484
{if $errorField == 'aliases'}
8585
<small class="innerError">
8686
{lang}wcf.acp.smiley.aliases.error.{$errorType}{/lang}
8787
</small>
8888
{/if}
8989
</dd>
9090
</dl>
91+
92+
<dl{if $errorField == 'emoji'} class="formError"{/if}>
93+
<dt><label for="emoji">{lang}wcf.acp.smiley.emoji{/lang}</label></dt>
94+
<dd>
95+
<input type="text" id="emoji" name="emoji" value="{$emoji}" class="short" maxlength="64">
96+
97+
{if $errorField == 'emoji'}
98+
<small class="innerError">
99+
{lang}wcf.acp.smiley.emoji.error.{$errorType}{/lang}
100+
</small>
101+
{/if}
102+
<small>{lang}wcf.acp.smiley.emoji.description{/lang}</small>
103+
</dd>
104+
</dl>
91105

92106
<dl{if $errorField == 'showOrder'} class="formError"{/if}>
93107
<dt><label for="showOrder">{lang}wcf.global.showOrder{/lang}</label></dt>

wcfsetup/install/files/lib/acp/form/SmileyAddForm.class.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ class SmileyAddForm extends AbstractForm
8484
*/
8585
public $aliases = '';
8686

87+
/**
88+
* unicode emoji that replaces this smiley during message reprocessing
89+
*/
90+
public string $emoji = '';
91+
8792
/**
8893
* path to the smiley file
8994
* @var string
@@ -140,6 +145,7 @@ public function assignVariables()
140145
'categoryID' => $this->categoryID,
141146
'smileyCode' => $this->smileyCode,
142147
'aliases' => $this->aliases,
148+
'emoji' => $this->emoji,
143149
'smileyPath' => $this->smileyPath,
144150
'smileyPath2x' => $this->smileyPath2x,
145151
'categoryNodeList' => $this->categoryNodeTree->getIterator(),
@@ -187,6 +193,9 @@ public function readFormParameters()
187193
if (isset($_POST['aliases'])) {
188194
$this->aliases = StringUtil::unifyNewlines(StringUtil::trim($_POST['aliases']));
189195
}
196+
if (isset($_POST['emoji'])) {
197+
$this->emoji = StringUtil::trim($_POST['emoji']);
198+
}
190199
if (isset($_POST['smileyPath'])) {
191200
$this->smileyPath = FileUtil::removeLeadingSlash(StringUtil::trim($_POST['smileyPath']));
192201
}
@@ -217,6 +226,7 @@ public function save()
217226
'smileyTitle' => $this->smileyTitle,
218227
'smileyCode' => $this->smileyCode,
219228
'aliases' => $this->aliases,
229+
'emoji' => $this->emoji,
220230
'smileyPath' => $this->smileyPath,
221231
'smileyPath2x' => $this->smileyPath2x,
222232
'showOrder' => $this->showOrder,
@@ -246,6 +256,7 @@ public function save()
246256
$this->showOrder = 0;
247257
$this->smileyPath = $this->smileyPath2x = '';
248258
$this->aliases = '';
259+
$this->emoji = '';
249260
$this->uploadedFilename = $this->uploadedFilename2x = '';
250261

251262
I18nHandler::getInstance()->reset();

wcfsetup/install/files/lib/acp/form/SmileyEditForm.class.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public function save()
7777
'smileyTitle' => $this->smileyTitle,
7878
'smileyCode' => $this->smileyCode,
7979
'aliases' => $this->aliases,
80+
'emoji' => $this->emoji,
8081
'smileyPath' => $this->smileyPath,
8182
'smileyPath2x' => $this->smileyPath2x,
8283
'showOrder' => $this->showOrder,
@@ -106,6 +107,7 @@ public function readData()
106107

107108
$this->smileyCode = $this->smiley->smileyCode;
108109
$this->aliases = $this->smiley->aliases;
110+
$this->emoji = $this->smiley->emoji;
109111
$this->smileyPath = $this->smiley->smileyPath;
110112
$this->smileyPath2x = $this->smiley->smileyPath2x;
111113
$this->showOrder = $this->smiley->showOrder;

wcfsetup/install/files/lib/data/smiley/Smiley.class.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
* @property-read string $smileyCode code used for displaying the smiley
2424
* @property-read string $aliases alternative codes used for displaying the smiley
2525
* @property-read int $showOrder position of the smiley in relation to the other smileys in the same category
26+
* @property-read string $emoji unicode emoji that replaces this smiley when content is reprocessed
2627
*/
2728
class Smiley extends DatabaseObject implements ITitledObject
2829
{

wcfsetup/install/files/lib/system/html/input/node/HtmlInputNodeImg.class.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,18 @@ protected function handleSmiley(\DOMElement $element)
255255
$code = $element->getAttribute('alt');
256256

257257
$smiley = SmileyCache::getInstance()->getSmileyByCode($code);
258+
259+
// Migrate legacy smiley element to the mapped unicode emoji.
260+
if ($smiley !== null && $smiley->emoji !== '') {
261+
$element->parentNode->insertBefore(
262+
$element->ownerDocument->createTextNode($smiley->emoji),
263+
$element
264+
);
265+
$element->parentNode->removeChild($element);
266+
267+
return;
268+
}
269+
258270
if ($smiley === null || $this->smiliesFound === 50) {
259271
$element->parentNode->insertBefore($element->ownerDocument->createTextNode($code), $element);
260272
$element->parentNode->removeChild($element);

wcfsetup/install/files/lib/system/html/input/node/HtmlInputNodeTextParser.class.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,12 +607,19 @@ protected function parseSmiley(\DOMText $text, string $value)
607607
foreach ($smileyPatterns as $smileyPattern) {
608608
$value = \preg_replace_callback($smileyPattern, function ($matches) use ($text) {
609609
$smileyCode = $matches[0];
610+
$smiley = self::$smilies[$smileyCode];
611+
612+
// Replace smiley with mapped unicode emoji so legacy smiley codes
613+
// get migrated to native emojis whenever a message is reprocessed.
614+
if ($smiley->emoji !== '') {
615+
return $smiley->emoji;
616+
}
617+
610618
if ($this->smileyCount === 50) {
611619
return $smileyCode;
612620
}
613621

614622
$this->smileyCount++;
615-
$smiley = self::$smilies[$smileyCode];
616623
$element = $text->ownerDocument->createElement('img');
617624
$element->setAttribute('src', $smiley->getURL());
618625
$element->setAttribute('class', 'smiley');

wcfsetup/install/files/lib/system/html/output/node/HtmlOutputNodeImg.class.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ public function process(array $elements, AbstractHtmlNodeProcessor $htmlNodeProc
4141
$code = $element->getAttribute('alt');
4242

4343
$smiley = SmileyCache::getInstance()->getSmileyByCode($code);
44+
45+
// Render the mapped unicode emoji instead of the legacy smiley image.
46+
if ($smiley !== null && $smiley->emoji !== '') {
47+
$htmlNodeProcessor->replaceElementWithText($element, $smiley->emoji, false);
48+
continue;
49+
}
50+
4451
if ($smiley === null || $this->outputType === 'text/plain') {
4552
// output as raw code instead
4653
$htmlNodeProcessor->replaceElementWithText($element, ' ' . $code . ' ', false);

wcfsetup/install/lang/de.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2855,6 +2855,8 @@ Abschnitte dürfen nicht leer sein und nur folgende Zeichen enthalten: <kbd>[a-z
28552855
<item name="wcf.acp.smiley.smileyCode.error.notUnique"><![CDATA[Dieser Smiley-Code wird bereits von einem anderen Smiley verwendet]]></item>
28562856
<item name="wcf.acp.smiley.aliases"><![CDATA[Alternative Smiley-Codes]]></item>
28572857
<item name="wcf.acp.smiley.aliases.error.notUnique"><![CDATA[Mindestens ein alternativer Smiley-Code wird bereits von einem anderen Smiley verwendet]]></item>
2858+
<item name="wcf.acp.smiley.emoji"><![CDATA[Emoji]]></item>
2859+
<item name="wcf.acp.smiley.emoji.description"><![CDATA[Optionales Emoji, das diesen Smiley ersetzt, sobald eine bestehende Nachricht aktualisiert wird. Leer lassen, um den Smiley nicht zu ersetzen.]]></item>
28582860
<item name="wcf.acp.smiley.smileyPath"><![CDATA[Smiley-Pfad]]></item>
28592861
<item name="wcf.acp.smiley.smileyPath.description"><![CDATA[Der Smiley-Pfad wird relativ zu „{$__wcf->getPath()}“ interpretiert.]]></item>
28602862
<item name="wcf.acp.smiley.smileyPath.error.notFound"><![CDATA[Es wurde keine Datei unter dem angegebenen Pfad gefunden]]></item>

wcfsetup/install/lang/en.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2784,6 +2784,8 @@ If you have <strong>already bought the licenses for the listed apps</strong>, th
27842784
<item name="wcf.acp.smiley.smileyCode.error.notUnique"><![CDATA[This smiley code is already in use by another smiley.]]></item>
27852785
<item name="wcf.acp.smiley.aliases"><![CDATA[Alternative Smiley Codes]]></item>
27862786
<item name="wcf.acp.smiley.aliases.error.notUnique"><![CDATA[At least one alternative smiley code is already in use by another smiley.]]></item>
2787+
<item name="wcf.acp.smiley.emoji"><![CDATA[Emoji]]></item>
2788+
<item name="wcf.acp.smiley.emoji.description"><![CDATA[Optional emoji that replaces this smiley when an existing message is updated. Leave empty to keep the smiley unchanged.]]></item>
27872789
<item name="wcf.acp.smiley.smileyPath"><![CDATA[Smiley Path]]></item>
27882790
<item name="wcf.acp.smiley.smileyPath.description"><![CDATA[The smiley path is relative to “{$__wcf->getPath()}”.]]></item>
27892791
<item name="wcf.acp.smiley.smileyPath.error.notFound"><![CDATA[Unable to find a file on entered path.]]></item>

0 commit comments

Comments
 (0)