From 46fa26502b285213f3438abb1e3bd1482eb55bf5 Mon Sep 17 00:00:00 2001 From: Mario Date: Sat, 9 Mar 2024 20:53:18 +0000 Subject: [PATCH] more work on emojis --- Zotlabs/Lib/Activity.php | 27 ++++++++-- Zotlabs/Lib/ThreadItem.php | 2 +- Zotlabs/Module/Emoji.php | 60 ++++++++++++++++++++++ Zotlabs/Module/Item.php | 28 ++++++++++ Zotlabs/Module/React.php | 25 +++++++-- Zotlabs/Module/Smilies.php | 16 ++---- images/emoji/1f37e.png | Bin 1205 -> 0 bytes images/emoji/1f44f.png | Bin 1456 -> 0 bytes images/emoji/1f48b.png | Bin 842 -> 0 bytes images/emoji/1f606.png | Bin 901 -> 0 bytes images/emoji/1f607.png | Bin 935 -> 0 bytes images/emoji/1f608.png | Bin 1078 -> 0 bytes images/emoji/1f60a.png | Bin 812 -> 0 bytes images/emoji/1f61c.png | Bin 1061 -> 0 bytes images/emoji/1f61e.png | Bin 757 -> 0 bytes images/emoji/1f62e.png | Bin 575 -> 0 bytes images/emoji/1f634.png | Bin 1075 -> 0 bytes images/emoji/2665.png | Bin 435 -> 0 bytes images/emoji/README | 9 +++- images/emoji/astonished_face.png | Bin 0 -> 4130 bytes images/emoji/bottle_with_popping_cork.png | Bin 0 -> 4780 bytes images/emoji/clapping_hands.png | Bin 0 -> 5377 bytes images/emoji/disappointed_face.png | Bin 0 -> 3504 bytes images/emoji/grinning_face.png | Bin 0 -> 3449 bytes images/emoji/kiss_mark.png | Bin 0 -> 4603 bytes images/emoji/red_heart.png | Bin 0 -> 1839 bytes images/emoji/sleeping_face.png | Bin 0 -> 4538 bytes images/emoji/slightly_smiling_face.png | Bin 0 -> 2872 bytes images/emoji/smiling_face_with_halo.png | Bin 0 -> 4102 bytes images/emoji/smiling_face_with_horns.png | Bin 0 -> 4554 bytes images/emoji/winking_face_with_tongue.png | Bin 0 -> 3989 bytes include/items.php | 7 +-- include/network.php | 8 +-- include/text.php | 55 +++++++++++++++++++- view/css/conversation.css | 12 +++-- view/js/autocomplete.js | 6 +-- 36 files changed, 217 insertions(+), 38 deletions(-) create mode 100644 Zotlabs/Module/Emoji.php delete mode 100644 images/emoji/1f37e.png delete mode 100644 images/emoji/1f44f.png delete mode 100644 images/emoji/1f48b.png delete mode 100644 images/emoji/1f606.png delete mode 100644 images/emoji/1f607.png delete mode 100644 images/emoji/1f608.png delete mode 100644 images/emoji/1f60a.png delete mode 100644 images/emoji/1f61c.png delete mode 100644 images/emoji/1f61e.png delete mode 100644 images/emoji/1f62e.png delete mode 100644 images/emoji/1f634.png delete mode 100644 images/emoji/2665.png create mode 100644 images/emoji/astonished_face.png create mode 100644 images/emoji/bottle_with_popping_cork.png create mode 100644 images/emoji/clapping_hands.png create mode 100644 images/emoji/disappointed_face.png create mode 100644 images/emoji/grinning_face.png create mode 100644 images/emoji/kiss_mark.png create mode 100644 images/emoji/red_heart.png create mode 100644 images/emoji/sleeping_face.png create mode 100644 images/emoji/slightly_smiling_face.png create mode 100644 images/emoji/smiling_face_with_halo.png create mode 100644 images/emoji/smiling_face_with_horns.png create mode 100644 images/emoji/winking_face_with_tongue.png diff --git a/Zotlabs/Lib/Activity.php b/Zotlabs/Lib/Activity.php index 43f7386e7..e19499c56 100644 --- a/Zotlabs/Lib/Activity.php +++ b/Zotlabs/Lib/Activity.php @@ -642,7 +642,7 @@ class Activity { break; case 'Emoji': - $ret[] = ['ttype' => TERM_EMOJI, 'url' => $t['icon']['url'], 'term' => escape_tags($t['name'])]; + $ret[] = ['ttype' => TERM_EMOJI, 'url' => $t['id'], 'term' => escape_tags($t['name']), 'imgurl' => $t['icon']['url']]; break; default: @@ -677,6 +677,10 @@ class Activity { $ret[] = ['type' => 'Bookmark', 'href' => $t['url'], 'name' => $t['term']]; break; + case TERM_EMOJI: + $ret[] = ['type' => 'Emoji', 'id' => $t['url'], 'name' => $t['term'], 'icon' => ['type' => 'Image', 'url' => $t['imgurl']]]; + break; + default: break; } @@ -976,10 +980,12 @@ class Activity { return []; } +/* this should not be needed $t = self::encode_taxonomy($i); if ($t) { $ret['tag'] = $t; } +*/ $a = self::encode_attachment($i, true); if ($a) { @@ -997,6 +1003,7 @@ class Activity { ]; call_hooks('encode_activity', $hookinfo); + return $hookinfo['encoded']; } @@ -2179,9 +2186,17 @@ class Activity { // Pleroma reactions $t = trim(self::get_textfield($act->data, 'content')); + $content['content'] = $t; + // Unicode emojis if (grapheme_strlen($t) === 1) { - $content['content'] = $t; + $content['content'] = '

' . $t . '

'; + } + + $a = self::decode_taxonomy($act->data); + + if ($a) { + $s['term'] = $a; } } } @@ -2885,7 +2900,13 @@ class Activity { if (isset($item['term']) && !PConfig::Get($channel['channel_id'], 'system', 'no_smilies')) { foreach ($item['term'] as $t) { if ($t['ttype'] === TERM_EMOJI) { - $item['body'] = str_replace($t['term'], '[img class="smiley emoji custom-emoji" alt="' . $t['term'] . '" title="' . $t['term'] . '"]' . $t['url'] . '[/img]', $item['body']); + $class = 'emoji'; + $shortname = ':' . trim($t['term'], ':') . ':'; + if (is_solo_string($shortname, $item['body'])) { + $class .= ' single-emoji'; + } + + $item['body'] = str_replace($shortname, '[img class="' . $class . '" alt="' . $t['term'] . '" title="' . $t['term'] . '"]' . ($t['imgurl'] ?: $t['url']) . '[/img]', $item['body']); } } } diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php index 42d76bf17..8f364e945 100644 --- a/Zotlabs/Lib/ThreadItem.php +++ b/Zotlabs/Lib/ThreadItem.php @@ -19,7 +19,7 @@ class ThreadItem { private $comment_box_template = 'comment_item.tpl'; private $commentable = false; // list of supported reaction emojis - a site can over-ride this via config system.reactions - private $reactions = ['1f60a','1f44f','1f37e','1f48b','1f61e','2665','1f606','1f62e','1f634','1f61c','1f607','1f608']; + private $reactions = ['slightly_smiling_face','clapping_hands','bottle_with_popping_cork','kiss_mark','disappointed_face','red_heart','grinning_face','astonished_face','sleeping_face','winking_face_with_tongue','smiling_face_with_halo','smiling_face_with_horns']; private $toplevel = false; private $children = array(); private $parent = null; diff --git a/Zotlabs/Module/Emoji.php b/Zotlabs/Module/Emoji.php new file mode 100644 index 000000000..595c9fc60 --- /dev/null +++ b/Zotlabs/Module/Emoji.php @@ -0,0 +1,60 @@ + z_root() . '/emoji/' . $shortname, + 'type' => 'Emoji', + 'name' => $emoji['shortname'], + 'updated' => $last_modified, + 'icon' => [ + 'type' => 'Image', + 'mediaType' => $image['mime'], + 'url' => z_root() . '/' . $emoji['filepath'] + ] + ]; + + as_return_and_die($obj); + } + + header('Content-Type: ' . $image['mime']); + echo file_get_contents($emoji['filepath']); + killme(); + } + +} diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php index 5c802f557..b158ed4e0 100644 --- a/Zotlabs/Module/Item.php +++ b/Zotlabs/Module/Item.php @@ -938,6 +938,30 @@ class Item extends Controller { } } + if (preg_match_all('/(\:(\w|\+|\-)+\:)(?=|[\!\.\?]|$)/', $body, $match)) { + // emoji shortcodes + $emojis = get_emojis(); + foreach ($match[0] as $mtch) { + $shortname = trim($mtch, ':'); + + if (!isset($emojis[$shortname])) { + continue; + } + + $emoji = $emojis[$shortname]; + + $post_tags[] = [ + 'uid' => $profile_uid, + 'ttype' => TERM_EMOJI, + 'otype' => TERM_OBJ_POST, + 'term' => trim($mtch), + 'url' => z_root() . '/emoji/' . $shortname, + 'imgurl' => z_root() . '/' . $emoji['filepath'] + ]; + } + } + + // BBCODE end alert } @@ -958,6 +982,10 @@ class Item extends Controller { } } + + + + if ($orig_post) { // preserve original tags $t = q("select * from term where oid = %d and otype = %d and uid = %d and ttype in ( %d, %d, %d )", diff --git a/Zotlabs/Module/React.php b/Zotlabs/Module/React.php index 6a3b525b2..e04b9b257 100644 --- a/Zotlabs/Module/React.php +++ b/Zotlabs/Module/React.php @@ -24,7 +24,15 @@ class React extends Controller { return; } - $emoji = $_REQUEST['emoji']; + $shortname = $_REQUEST['emoji']; + + $emojis = get_emojis(); + + if (!isset($emojis[$shortname])) { + return; + } + + $emoji = $emojis[$shortname]; if (!$emoji) { return; @@ -62,10 +70,19 @@ class React extends Controller { $n['uuid'] = $uuid; $n['mid'] = z_root() . '/item/' . $uuid; $n['verb'] = 'Create'; - $n['body'] = '[zmg=32x32]' . z_root() . '/images/emoji/' . $emoji . '.png[/zmg]'; + $n['body'] = $emoji['shortname']; //'[img class="emoji single-emoji"]' . z_root() . '/' . $emoji['filepath'] . '[/img]'; $n['author_xchan'] = $channel['channel_hash']; - $n['obj'] = Activity::fetch_item(['id' => $item['mid']]); - $n['obj_type'] = ((array_path_exists('obj/type', $n)) ? $n['obj']['type'] : EMPTY_STR); + // $n['obj'] = Activity::fetch_item(['id' => $i[0]['mid']]); + // $n['obj_type'] = ((array_path_exists('obj/type', $n)) ? $n['obj']['type'] : EMPTY_STR); + + $n['term'][] = [ + 'uid' => $channel['channel_id'], + 'ttype' => TERM_EMOJI, + 'otype' => TERM_OBJ_POST, + 'term' => $emoji['shortname'], + 'url' => z_root() . '/emoji/' . $shortname, + 'imgurl' => z_root() . '/' . $emoji['filepath'] + ]; $x = item_store($n); diff --git a/Zotlabs/Module/Smilies.php b/Zotlabs/Module/Smilies.php index efac07f84..7dde8c834 100644 --- a/Zotlabs/Module/Smilies.php +++ b/Zotlabs/Module/Smilies.php @@ -4,18 +4,8 @@ namespace Zotlabs\Module; class Smilies extends \Zotlabs\Web\Controller { - function get() { - if (\App::$argv[1]==="json"){ - $tmp = list_smilies(); - $results = array(); - for($i = 0; $i < count($tmp['texts']); $i++) { - $results[] = array('text' => $tmp['texts'][$i], 'icon' => $tmp['icons'][$i]); - } - json_return_and_die($results); - } - else { - return smilies('',true); - } + function init() { + json_return_and_die(get_emojis()); } - + } diff --git a/images/emoji/1f37e.png b/images/emoji/1f37e.png deleted file mode 100644 index 285a79a93d0010483d48b4adf5c92d573f112966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1205 zcmV;m1WNmfP)(axD(tVi_H4&2(H1M#vOt?1a}DT5ZobyJHe%_IX%^Ps=1Z@ zM?-c0AywbZY-Fpx)33ZO9eBI{n< z$wDJKLj9H02#F|7zBci7aIB|?ze%E2zrD?!Bk#LpFFUI z&`@i$08%ENg3$VR1yY~I3!n@o2w4?We5N2_9RyH7cp1QpXD^bkoV!H5altZm-|_R* z84I`4A=D3DBO@C4c>gx{DS$x}R_L8Pq$8jV6arO3swLTANC7A-fE-9r`z9|y)gyoc z&;m#qL_+{E2tnXm04bN(UE%B{F$F+f!LEXY1>o=1)cUs_wTHT3`L^ouQwP+;C+#yH z#w!n9PXXj?)TgPi1cTlNK&^l2@D7RwMB>_mcTpD{yw|_F0hK1xDu%^Yt{GA$V5c=8;Vo=+{9E75~LTW9Ja+>;llc!x>3{v8ocb*&^edLPtv!`y< zVMM%ZJaO7U*|1X#Ky>lVX|mDCN`ju>c=@1IU!7He*u@P_4b%kGUzPXk5K>S82?PsJ zfe7LmP(bQu>#V)7nvWI*LQXnQeFgfJBd8Lsjin-gblRtU)q0R=t zB|;Es_yUH?dqvNw<(q&wk%P$f5Mq#lVv^ls5R&PNE1AZ9gXe>qn=l^3kILS6e^j zBR@zQ-jjUIkC9$(x%&pX+#3V9`qpGDfO~H`K>hW}8O~Nf3~GY}AxK!u(;_FPdv{(t zl3AlXFL!m@-2-C*eD%gjy7isz27JV?+4eSSnhqh78L5h-IXaNHo;+HIVBfD@9t;J@ z4Iz;BQ8)`AG$BN`^ytgS|M>(eBVL4}g$PSA%uDC3`J~OaLVq1mg1Z zmW21;d|>^_%g3v~Kb2gXQ-NeopIuZPHBghJq5%6T1nL@-=Ii&4S7v1y_DcwZlax7w6O<1A%WLq?4(DJ&swEL?=TI zLSF(96IHwN?LonEljOvE|T=@4Fi z_P|_Eb-J%(#GhHKvvUXhzwUPlGnFaEjO0IjZG5Mx&mZVn>2e5l8}fv;mdIQUAZtaw zIRxoq08xwbP2C}KF@&l`d4dMU%EbU=%kp$gN8cx|1rW3?kN53qHg~ZKivL2MaCA-3 zzC7XTlvuSaPvou!FxalV`>R3$s?N#tv7oc^d`7^bNay4!fRI%{cjWnih~=w3DCw3w z+bL2A4#+zYLWks=Lx6O*QK&Y`~s4qX2LK>V8+ TCuShc00000NkvXXu0mjfPp~a7 diff --git a/images/emoji/1f44f.png b/images/emoji/1f44f.png deleted file mode 100644 index b0ffe9289205ea061876135e7c61613218447aa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1456 zcmV;h1yA~kP)BCA>%T6E7$&j8X@^?Qw8qu13B?zJ3j54l6?@UTOthjEAIVJ6rF$-vLp05%RQ z`NYA52q5YOIijR|-k;G;iYTeHL_gv>sCATQZ9vby;}R?-I& zQmA^&4EEcbnhs+Hscl#vAfmrP3{FWb;)#QCusx&@V~9bfqz@z|jn?!==ynuC{4=|@ zCB!`#2vg9y8b$s=4p)NIBOLGb^GnMa2p8aChe};p4oT4_K-9IvhC|vTG%nw}bl(g} zhLAh7Dk!s#=P}X9n*pRCNaOs@r2XmHMSRYnQ*sX*UTMYa^S`~mnifU&`^V-DMEL%( zIs4CN*E1qynkfEqWMz=Yw4(_CVj)s)lNKUexO>X}@oo|p!86D&Z<%X2Y&aN)+#$LA z{Kw}X9wdA;0YHq2tm_6{0i-1U{qjaeh>Z&`tc^LsnS=Gvb#(L4?69?!_jp7Cn^|{A z9omQt2*K$7`slhKA&~yz$pwow*f_K1?=NpOyLT^wu#f!o)>I3>YlxV6)#O_PHepU~ zPIqe@K&mrl_v>q`R@UHSW{t~)|B3MRt+U-{|NiEh-c+@(UhP>QU)?%q&umW#A=>N^ zePn^GVM^lH_ph_x?JQjJ{Bu2TDOlgEf_&2_E;#+f3O0rsM+RUswAo?PKfkaf28rJh zT=S1xbMlep%g;ZtIgRxwts+BhR-XRA53gP0KMc{A$buXbS%?JzWDQjkc=p#D^C*LE z7Kj&AE`pe!Pkwi64rv^0eWckzIFy2{p~~p@53jc{$lcp#ur8E!W?$1Lod1f{zhefQ zq*@;!W~Z1L#N2{7_spt2$4{K=Wd&&Ti{M%iHmhoVc#qEsgG6gptwHHPG;-SPlog=u zU_<~-8^h0GgJO2PaP*vk640DGS}O8h8xJWrmV^X&9x zk%bKMYoTe)<(!K`dbwiX0A>BeC z6D0`Z#EEkT0CDg&xpnHp!?A0=^0NinCPr!zgT%vptE-0)oxn6HhKaieWCws&3ImnT zaaEVO&Qhmz*B`PZBb30Jr2Z^*9sx1ZA%Yl(v}dRlMtt-dz5W9u=JE=y-QA1;0000< KMNUMnLSTY@cd?oP diff --git a/images/emoji/1f48b.png b/images/emoji/1f48b.png deleted file mode 100644 index 85e6dcfc4e8d980bf57d9139f51f1e058025336f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 842 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!rUm$fxB}^u?(QU^Gwz-*y(8cH z#9Z_Af9(?uWB?IR@UeH;1FsMW7e9Hy!yBmhvWM?0pQuY7K2N;E&v|$~_l~^c>G!}Z z6sULC^$W9rE;A|#@(X5AXmAkte?GzB{`~jr3j+H0-)~U3|Ng(j`SwJ*8l8u8UFodws6`ZG|%zDkpYsdaBo z>v<=xwKguLB?r}x-99?4OZeTR!@_#+9-Z9F{UC0S&pgw{@b#LkdQPhgYz_bZp1s}0 ztM!{ExOP@`%_$HwI_rA5_LfuYAw@0ok1g7dc{&K%?$>e2+X0L97D4)U6IT<%Z zq!Rk}C@`$MxUpx8l!WBN)^r;u{hdMoZ!r}IZFD+&VtL8LoBWO&AAepFdEm>H`2B)> z8>aDpaS0YV@Z$%|n%B*tCR6@6!jRY5Wt{ zEMB;7)u|Ka&$wjvmhb!h?q6-}^?xT% zZw1rruDr{0q&M82$5_q7vtgxLbD>!7^aI37ecBw8 z+`9*TCl&fV4Sted^fU6n+fPXu4}3EB^6-VmigUgR3keRsY@+-}@!#+F>}QszcmDdH Sv>%xC7(8A5T-G@yGywpB?UQ)` diff --git a/images/emoji/1f606.png b/images/emoji/1f606.png deleted file mode 100644 index d94e9505ba176f74e3e16640a429eb14953eb3a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 901 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!b_Mu^xB}__chiYPZ%)VG+!_A$ zO7gMg{?n?h)BMy6!nG?C^v`by?kO^#-(vshQ1qU8-p!fDD|?+cPjhe15BU1!)Bpef zd#YkLFQ1&^qaNd`9__3i=cevwuI6K^=5L{v;Gv%AsUGR19%8GO?5!SVr&bW4J14?p zPjuYfw7ma?^)o{~HYWss&99mt?Qtw6?oDpVv`FWkaNEVN-kb-zp1&l>FPOogVE+F9 z0q+GG?mP4=oZql9XdVLtQ?{pzV@L(#nTxJWEQTB`2l~FWy!cMiA! z;*&n`sRet)cqBGWdUD8Dm0P6f(Yh&x%f#fgMBSHs3=w|ws+ntXa=Ukk=eariC(N;n zk6)-RwWN<#(nRufyor?QnUGnbf3!@rufIFpty}9Z&x#g(}lBY zk|D3e=le=ConANe$ug}>+qs-$M+mq0y3*!rTxKiMr+@SuWYi1?(o0WQgWMDAbsL6uSZdmNp{u|8I1!QpKN>}a;A0Sh6525 zT+df&m7be;+;V!@)Z(?fOb@l}tJ7fc%v74?k#dTq;gxouILG9pPX*7aoQj>1;+SCg zFQ0K~rq#_5##}?;)yp|TW;AUeefS^}YB(%>>7VOPMzv74$tef#fx`+_}xPkjF7eEoKRZN7cQzP~SiKmW;Sv!kPa{+FVdQ&MBb@08QMYUH||9 diff --git a/images/emoji/1f607.png b/images/emoji/1f607.png deleted file mode 100644 index 57f5151124fbb01644beda0259b718ef61cde2f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!wg>oxxB_XfmH&xEp=-W1@4T?| z@aAJ@r(e3zo4Dak&gRD(j;*?Tx#j=e^cUBw`t}~1d0_9CTZQG@ZbHo5eQE(vB~TVW zy16sFr^r0bPknxi{hQPA$CmpSglj)K6y2O@JgwS#^ECI$1pTj9lK0H>UfJt>enW7z z;;wZ-r|Xsk`2{mLC>S)X-~ayq`2c~0{`>z?LBah0`{(xuyjR$NKjFMVf%_>&DFz0n zB2O2`kP5~yJ;S(}dZ$jvyzdhcY6=r7-eMTdh~cFj0vRI)}}ds*2w`%`yaQ$I+_ zpS`lS#ayzDyW;F7u83_fmVD{A+!GqxYWiYL=j{c`v7#Z?%=(IHy?tC|>qF~1n=I`2 z@04D@{VmrS4L+5IoH^ItM`o?v8uZgE$>E*GmL~s=rCZhY4n6k_-D@E*z0T^+`kx+m zq~=e|*M483mbd*-@}`@cq+>fQ_tlklH-zq9tDRN6-8UKu7t7w`!=;I z@BGMj6jBXac7U*#9QR~9hFVDQL zbXxJ8Q=IYEqX&n#%dxM{XW`*+yVc9lR?%>Hvu6~;2IIXm;_Xjzo{uqcV4PgJ?(*p` z*ETS|SuuZd4||BofuyB(*C@PfJz~(Fmt&G}TO;Dmz3YemA7r-E^;vRW^Ki(&IZt+r zU7kMO_p95+D1$xA$91%lef| zUOa!gB|PZQg$uo{b-TB1{POuzc0%~2bEl6T+V}g|u@HCLUwij{EiC-|`0>AQ-@aB= z)pdpE$8LFqAdFBpMNELlJ${glDqFm ze7Wy?WWV6igRLrOi%LG}_%_`x6p68rVGT|ZVw@@3WGQzD7)MKa(deq|*lulhH-C#rft+gCRQ^Rb9bD$VY8377 zvI-Pfk$GWC_hV_PD~=C57mJJS$@s#<)HTCAZEt6w* zESOF9*Elgt9Ly-+omBpOgXC1{g-0Dc%YVmh++ExzdG+pG&!b`=POYE+|Jb7K_a8xyABAU2W))6a66qILIZe$oM)~nlW0t~${#_>fXIXFM zOiC9x^LOIiDck?JEGlkSj;!!p~wX$uWcchPp-eA z)fnc$xTa`RRu?l@2D9wCj0vFyuIw4zOePCXhZ<(uu6yO*CMdf(c#9>RX$Z7Te^$wvaP5lsx|?$tF9<3pI8KZ6I9AkJ zJ^3Wd_b~5YnMYoC-`&%&QQ@@w$5VM~t8Js1BhH(tmq?AKjzs8LsUll6hx%-p7WuGjN zvv)i6(l+y)>(>R>RbKwp-1Xs+Eo=4q@`*YR#XofmIeqqCuFPsNPicL>qI_Tf#P|o( tkL!QA{8aqc+t1v8Dt`UkzwiHA>*MX~a%Q%Ns{r!`gQu&X%Q~loCIDK6GI;<1 diff --git a/images/emoji/1f60a.png b/images/emoji/1f60a.png deleted file mode 100644 index aac1a424ad4e8d344dbac828b85fc4d85b9d9714..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 812 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!rUm$fxB}__chiYPH+P0ltF|r( z*FLt~Kg~~levAFrE6FQ+otra__ssJ?zajX|>G(&7qI-(WH&1i_e;uuoFc=mexv{woOY!6l! z9y!95?0tM|uKxS~1<{d*3OuhAoUU7b^T+v?2A{gWF>~`SFfSD^v7X-hj-5wG=f!;M zDgn0#BCXBE$J%+aHhy^WA(5qbQDX5|WsA%!1+tGh=Oh}f+gr?Y?vPd8<4h*m_md6M z3K-4)<^EGInAlmX?^dvI;?}wcNhPkX1sglo)MqG~q)l+-&It%UP;%^N4wsmr^Y6FghReMw>v|iSRr(&3OgVCpW5?8xhw~U; zUE`RL%k-q&VSQ;sl!xPQZ;mTzS+cTJ2f#ZgKB42R>PX&>t$M&u}w%ort)3~Q9_Uo18o+9%-n-)&1wrG+$MPZor0-`pAg|I3B{h4mj(%N|AM%x|&(l2P#^yJ}^x^RL|MJ@dRD9g2P#U--YZ z`v2sL_bDa+XO;cmTJZl`=BM=X{};0UuPgdrQTP8!=Ktlz`zGwH0{YgsB*-tA!JuIN z{{I2*1sd)<^edbPd4X)Of8Cc$_ZS$M=6bp~hEy<~xqQ9pkpU0uh1MrYRmWSjs@fO+ z|35!B@Qvi`q(|Fr{h52#&HnQG|5Pt_#VH0J%m1u0Zaly&m@+9Wy|{AEl=G>RuRLeD zC$zKwX{*hgPpseHb^loL!oq!J56h{g+x68aba+%=saCo1^&h7yBmbf=CI3?^H0}4b zeyp3CwKiET_X6Z<}Uj z8!P6+f{to(uB-AMMM?h}R#(Ua4-m1doL-1$h} z&t>;j$pe*Jm8~AO%QnpH;nj;-7yq%w_U?kae%C+WZdjq6Yr5gB*sPxqEg5PvGY`MD zWca$y_Ut{zj4h=<*YN#k=*#$)wz+yO(+~C^o25_2XKdfJ|A36zw!N3w!)ATBmN}AfcexXu=UBpJAHE_a^Utf%W7UZ#d>Pq}JpXBwBb({*O?k1Iic>vrE?xaR%GmACW1TNaqy@HFgo zVCR#qZ2Ql|taN_i!fcacZY}E$C&wqdG~akGY;&CR>E(_GFU4!0FWsVlD%I_at(P66 YcH6;*EMt3JU=CpLboFyt=akR{0P^EGlK=n! diff --git a/images/emoji/1f61e.png b/images/emoji/1f61e.png deleted file mode 100644 index efe4e67e23cc6690e2af681643741146b8184af4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 757 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!x&nMcT!HleyXi!tCx^pcor;=K zqcO2mG=&_U#}$ZndjY8WS-`y zKCRmN=Faf>E%pWB+Rd59j}Aqj-w<4xpnq(+|C`hCo2R+2>~-FCu165)8vc?XzhDM~ zg8BRZ2fP<(xbM)faDKzapm_`oOx&I>jv*C{XRm*6TC5BXSS`1cMdgU>-YDC7J`bZWpZqcP7bl~t z(M#R=zK+>em;3AZ_CA~SJ)+_RQ~ts~PdN6p@T_@N*c6aId4obi!veb=TZ2a@=O2~f zIlJ^dzr^dh#mf?Mw66I-;1yoj%yQ4+*eu2$b^r4d7QH**?lAqr#w7>aH*qUZXkk3c zXu{zbv_4R;WX-iHmjqg$?T=Z%;P6@|kL5MOPxwDGeysmncezvHs!r3jGVu=oL(1G` z(HT>VPp$0!dv@M4K0A#c?6Yp?|FJqE7`0)^(qs;)hZCnwa}qxF_i;#D{=(ziWS*_O zQ`pt8t1{8}%jc)3Zm4tEN$!q2S8DucLtdJs!b3srh6Yh3J|bkJF{AaN~+mD06cE8-vay)HZyTi2@iE^!XS zq$4}Joo!}c_MVn1v+w9<``93x`LY$Wo0n}~$QT#UBd}-5%)*b0veHtvY)rhoZ?0}_ zT5I~Md$+GdOZO*T>rh^I_tpo2bB2?Tq?<6@{dP|BP$2sj_MT|Nuj}I@zm@8`EB7ZX zvwx(bb58CpOXp0Rz0bb2>-3YAj=l?x=`QNMG b{(o6wL{oM*Fvzb5rWgiKS3j3^P6n#=qn$BMm9!$<;5J|c1CHQ^9zOJ#>PJ#I~)@q%$8(2q`}pr#$~A4b4J9z zO>5o^_eo5dmxu2VlDk--{=$JS) zh%#+#Y7spV{=Y#b&PyPiR#LylRVoYqTZxPg=b5r!!NT6VHdME@6(B zRkVEOrT4Ity}s(%!kArml{i@MzfpYq;~B%ts^xFKGH#1$N)4XS{UGVB(jn9QhSu8} zUzoo%FJXW2kG-a*q5En~<&^6MPg11<Pwq6_w&z@}<^3lTh1E))lJ>J49!azcQJ>+drGhV+zN?S(+?v9MkoaR)|W7a*I|e zZ9QW7>9C;f#;}x=EsqN(E}dQ(d3gP-oK*Zm(mvE}|Nd!54ka->j-f$4##i(^OyRJjvvuo2tR}a5m`(RHd?{}C z^rmU6k6=gAvI8wbN_JDVXKhK0nsCC1_t?C^ij`sedc_?BSDRnSo8cy>tiLpU+5*og z_akAuuQ8s?dbV5RZ~UPb2g7T5c-v|_zVuv7=bR+(-!Nm533H}V+GlZ*c_&VZHa1o5 zZau`5bUJj(@jZI_rD-SDKAvxG=2mxqioC-0cNZ+~`agbBbKfnG!)dYaW5Z-7&#c4+ ze21i#UXyRGz1pl&`s7X2l{%UA%wJCYQ#^Q$!9rw_O^(3SpE*XYiH(cwC-3dseo;j4 z$&a_Z^8>wQTUPr07TD<<;UHwYAy79_OEw@pp>h7_uy_~A+3ObWZCf<)24luzgQ<@r zKPz$H+*`%%%)OOcOhf8hgMRq(i|ifUU#@aaGtNF)qxg~|w(536%2vrFZaprYDU3={ z>&0Rrlgjz~#VzLP{S>x|NT|QF>(0-AOxF3^KUd7M{`p;e zLgYh+@8TcMuPd4K)B1Try616#UX|(-J|He;d$y&%NcO_XONU)5)@^I3 zu~RxkCw^I3&mTKbA*LwVo&bsJdM#vR%!w?nJFW*Pow!ZFkpoy`6{H$!t4|C5Qba>(3=f`Eq~h%I~>Q zUlM40YtO&U{Tj29-Co+;yqx}g@%(*Z+ot<%oc~Jxu2lbv>xaekfZ2w@)78&qol`;+ E0KAJ7xc~qF diff --git a/images/emoji/2665.png b/images/emoji/2665.png deleted file mode 100644 index 638cb72dc4e6d09f22662e6e607516f4310d3f0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!j01c^T!Hles7jI$`z;e)pfsbuwG$)z`;(AMg|5(IZqeIkcwMxuN|D!qQJv)!A*+CZSK$i z>*pr%P1cR{;tjulbAp3`XI?G=7w!D8PT)EBZ$^S`FwaSmwH@h!rwf(uh@yI&W&99#Qo^>N! z=(ig8g9JgbUAimGcIB=Rx+|o`$Ix(qk@3J8M&pLL%q10UQ!n@i?0sRjuT|)GpQWvxCo`o7xiXS(LFudmqyU+D# zMY&Hs^he+0+a@pi)Vkr@ rK7niZL=WAnc242B;mRb}A1ojCT6y<+pG%j3!N}n0>gTe~DWM4fQ|H80 diff --git a/images/emoji/README b/images/emoji/README index ab478b753..6ac43096d 100644 --- a/images/emoji/README +++ b/images/emoji/README @@ -1,2 +1,7 @@ -These files supplied by emojione. License is CC BY 4.0. Attribution is required for commercial use. -See http://emojione.com +Images are provided by Emojitwo formerly Emojione +https://emojitwo.github.io +https://www.emojione.com + +Creative Commons Attribution International 4.0 (CC-BY 4.0) +https://creativecommons.org/licenses/by/4.0/legalcode + diff --git a/images/emoji/astonished_face.png b/images/emoji/astonished_face.png new file mode 100644 index 0000000000000000000000000000000000000000..6f326e925b5f6ab4978b14912fee493253a2a785 GIT binary patch literal 4130 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 literal 0 HcmV?d00001 diff --git a/images/emoji/bottle_with_popping_cork.png b/images/emoji/bottle_with_popping_cork.png new file mode 100644 index 0000000000000000000000000000000000000000..90ddd0e0381b4bd4f6c2c0d4c1535a93da9caa08 GIT binary patch literal 4780 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 O4M0UvQ{k%|Jp4bz4a*b& literal 0 HcmV?d00001 diff --git a/images/emoji/red_heart.png b/images/emoji/red_heart.png new file mode 100644 index 0000000000000000000000000000000000000000..f05141f788f5b0df9964693372ffac83459754a6 GIT binary patch literal 1839 zcmb7^do+}39LEQ_guxc2L79?F7mZTMikgPZX3#ViGh>8iGS-Zk(To{t>J(9%OC@wc zt`TjCE*Qiq8`dP6bVXN|a;dPg&pz)=IeX6jwdXwV^E|)b@ALisp7Wmfc@w=ox1n`0 zx+oM1O>!qv;3`EP9St~t>Pel1iw2)SqUz}AJni-Bf#K}E?*4of$|3=I)RNzfuwZh5 zz|~K%GlDG;21T(@LZQ%>!~2CF6110P8xghV><1?d3Z=f;+k@%~VE~6z3VeLPW+`B^ zfsYiBxL_B|L;|)H1PG8!@IF9?86lFViI5C42Ke)V51hroCmJxszz;I}fS&{~g@7gj zej*SM3m76miv_+hfDsG)V}LJYphO4)#DFeDvH^*&xHSD^XY|un}5IG()LHYyyIbKm*R2v(`V0LyzJ@id-eLw+jsB#2mTx! z`tWghWc1VLFXI!Fe@%Uz{<|hN5MCmUbP{n3)pWs7!*t->Xq5JF`%r^XWEjWcY8HhU zPwCcRWhSzz&c>Hoe$puO=(x7beI(aD_M8ok*q34CY>d}Gj(*|{XtJ~r!xvoPjq0ht zqdsmhH%Msg-Rsb)`QmYR$HIk2-GIY^&^^!RGT--<(dvpm2RmRabQ1Q5GUiK}iO-#FhHv1nyymTr%HpTd7*|}^x4+#HHgeK% zZrP%gpbwE@f=FlTX=W~)JC?#G8Lpe++EOPRiyOO8g_kh}2184|tt|3wr;p+L zD;=Ua@fR(l2V#sssf>JnAU8*RNPJ%K>O_ZG=L%+`2BeK^h^!=KAmSln8*;VHF54CCB6?cEZ4M}7uro3$TJ#(^Cbyd=wx{g+I?J)tH5Dd z8#Vn-oC+}BHJ`G-2=zRJ;)%VFrF&st#1F339l`CsXVYZYEXFnYG`ra};jM3_88626 z+Ah+>-3?$SrKaFHrwBxBwHtPE$`Ko)+3rBf(RQpPnGi0$98XwzB>ahv=0wX8oHnjr z;oePDdxU*+(3C4IHRWV+s;%=SN2(;c{rQ2Mii+k>*4(N&nNGf;r3SP82SQ8Fq>>%U zW|e)+mO0nkL>r9<^SGFtCdKx%0+THdlB~F?B7@~wp~tj}aRWJM0<&26E4jsW5y7C6 zL>qj0y19P|EnF|^q^zhww#E5jyPQyzl%lx2{kq3H^U$7T`QmB4TvASU`b32~X4P#s zJ$)*n;vTO<@Ss56o65@?WSa8DM9uNO_f6p|`+=tm@Qv5-=)|r@ zE7?4Zd|cmSN!PtgirlH7!aYkmS;1##@h87f5}L>GfkQ@>VHeOVPEC7|d0h>Q%U6Z8 zerzK674?~qnd;pRTIz+r%OE7*2}{l{Dj6B#`L&NVn4UggdU%sMmpbevM_0R>ZOa&H z3Vz(*o7al3*>R}tk^Y*3F2kudmwHm%6~gg#TWglwQfTj(XTEH89qOQy c$+HA%$0-qEqwJ75@MnV}xq1@I3A+yc1K5Y00RR91 literal 0 HcmV?d00001 diff --git a/images/emoji/sleeping_face.png b/images/emoji/sleeping_face.png new file mode 100644 index 0000000000000000000000000000000000000000..9e524b9b473e44df7663b2aad2b2888a42698739 GIT binary patch literal 4538 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 Y0GcIw(_`0_AOHXW07*qoM6N<$g5tllO8@`> literal 0 HcmV?d00001 diff --git a/images/emoji/slightly_smiling_face.png b/images/emoji/slightly_smiling_face.png new file mode 100644 index 0000000000000000000000000000000000000000..281e068e44270fafdeec7a2e2a74334037619cff GIT binary patch literal 2872 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 literal 0 HcmV?d00001 diff --git a/images/emoji/winking_face_with_tongue.png b/images/emoji/winking_face_with_tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..e786f0e472e93098a6f362e944754c38fee10d68 GIT binary patch literal 3989 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 literal 0 HcmV?d00001 diff --git a/include/items.php b/include/items.php index e26366af5..a5a23650e 100644 --- a/include/items.php +++ b/include/items.php @@ -1999,14 +1999,15 @@ function item_store($arr, $allow_exec = false, $deliver = true) { if(($terms) && (is_array($terms))) { foreach($terms as $t) { - q("insert into term (uid,oid,otype,ttype,term,url) - values(%d,%d,%d,%d,'%s','%s') ", + q("insert into term (uid,oid,otype,ttype,term,url,imgurl) + values(%d,%d,%d,%d,'%s','%s','%s') ", intval($arr['uid']), intval($current_post), intval(TERM_OBJ_POST), intval($t['ttype']), dbesc($t['term']), - dbesc($t['url']) + dbesc($t['url']), + dbesc($t['imgurl'] ?? ''), ); } diff --git a/include/network.php b/include/network.php index d41ba198d..a5c14f9d1 100644 --- a/include/network.php +++ b/include/network.php @@ -423,7 +423,7 @@ function json_return_and_die($x, $content_type = 'application/json') { killme(); } -function as_return_and_die($obj, $channel) { +function as_return_and_die($obj, $channel = []) { $ret = Activity::build_packet($obj, $channel); logger('data: ' . jindent($ret), LOGGER_DATA); @@ -433,8 +433,10 @@ function as_return_and_die($obj, $channel) { $headers['Digest'] = HTTPSig::generate_digest_header($ret); $headers['(request-target)'] = strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI']; - $h = HTTPSig::create_sig($headers, $channel['channel_prvkey'], channel_url($channel)); - HTTPSig::set_headers($h); + if ($channel) { + $h = HTTPSig::create_sig($headers, $channel['channel_prvkey'], channel_url($channel)); + HTTPSig::set_headers($h); + } echo $ret; killme(); diff --git a/include/text.php b/include/text.php index 26bf94828..baf1f770b 100644 --- a/include/text.php +++ b/include/text.php @@ -1270,6 +1270,33 @@ function sslify($s) { return $s; } +function get_emojis() { + $emojis = [ + // Reactions (emojitwo emojis) + 'astonished_face' => ['shortname' => ':astonished_face:', 'filepath' => 'images/emoji/astonished_face.png'], + 'bottle_with_popping_cork' => ['shortname' => ':bottle_with_popping_cork:', 'filepath' => 'images/emoji/bottle_with_popping_cork.png'], + 'clapping_hands' => ['shortname' => ':clapping_hands:', 'filepath' => 'images/emoji/clapping_hands.png'], + 'disappointed_face' => ['shortname' => ':disappointed_face:', 'filepath' => 'images/emoji/disappointed_face.png'], + 'grinning_face' => ['shortname' => ':grinning_face:', 'filepath' => 'images/emoji/grinning_face.png'], + 'kiss_mark' => ['shortname' => ':kiss_mark:', 'filepath' => 'images/emoji/kiss_mark.png'], + 'red_heart' => ['shortname' => ':red_heart:', 'filepath' => 'images/emoji/red_heart.png'], + 'sleeping_face' => ['shortname' => ':sleeping_face:', 'filepath' => 'images/emoji/sleeping_face.png'], + 'slightly_smiling_face' => ['shortname' => ':slightly_smiling_face:', 'filepath' => 'images/emoji/slightly_smiling_face.png'], + 'smiling_face_with_halo' => ['shortname' => ':smiling_face_with_halo:', 'filepath' => 'images/emoji/smiling_face_with_halo.png'], + 'smiling_face_with_horns' => ['shortname' => ':smiling_face_with_horns:', 'filepath' => 'images/emoji/smiling_face_with_horns.png'], + 'winking_face_with_tongue' => ['shortname' => ':winking_face_with_tongue:', 'filepath' => 'images/emoji/winking_face_with_tongue.png'], + + 'facepalm' => ['shortname' => ':facepalm:', 'filepath' => 'images/emoticons/smiley-facepalm.gif'] + ]; + + call_hooks('get_emojis', $emojis); + + return $emojis; +} + +function is_solo_string(string $emoji, string $body) : bool { + return empty(trim(str_replace($emoji, '', $body, $count))) && $count === 1; +} /** * @brief Function to list all smilies, both internal and from addons. @@ -1386,10 +1413,34 @@ function smilies($s, $sample = false) { || (local_channel() && intval(get_pconfig(local_channel(), 'system', 'no_smilies')))) return $s; + $s = preg_replace_callback('{<(pre|code)>.*?}ism', 'smile_shield', $s); $s = preg_replace_callback('/<[a-z]+ .*?>/ism', 'smile_shield', $s); + if (preg_match_all('/(\:(\w|\+|\-)+\:)(?=|[\!\.\?]|$)/', $s, $match)) { + // emoji shortcodes + $emojis = get_emojis(); + foreach ($match[0] as $mtch) { + $name = trim($mtch, ':'); + if (!isset($emojis[$name])) { + continue; + } + + $emoji = $emojis[$name]; + + $class = 'emoji'; + if (is_solo_string($mtch, $s)) { + $class .= ' single-emoji'; + } + + $img = '' . $emoji['shortname'] . ''; + + string_replace($emoji['shortname'], $img, $s); + } + } + +/* $params = list_smilies(); $params['string'] = $s; @@ -1400,9 +1451,9 @@ function smilies($s, $sample = false) { } } else { $params['string'] = preg_replace_callback('/<(3+)/','preg_heart',$params['string']); - $s = str_replace($params['texts'],$params['icons'],$params['string']); + $s = str_replace($params['texts'], $params['icons'], $params['string']); } - +*/ $s = preg_replace_callback('//ism', 'smile_unshield', $s); diff --git a/view/css/conversation.css b/view/css/conversation.css index 3af51d102..54b12ac16 100644 --- a/view/css/conversation.css +++ b/view/css/conversation.css @@ -299,13 +299,17 @@ code.inline-code { text-decoration: overline; } -img.smiley.emoji { - height: .9em; +img.emoji { + height: 1rem; vertical-align: baseline; - margin-bottom: -.1em; + margin-bottom: -.1rem; } -img.smiley.emoji:hover { +img.emoji.single-emoji { + height: 2rem; +} + +img.emoji:not(.single-emoji):hover { transform: scale(2); transition: transform .1s ease-out; filter: drop-shadow(0px 0px 1px rgba(0, 0, 0, .5)); diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js index 8edd8dafa..7d6ddb1c4 100644 --- a/view/js/autocomplete.js +++ b/view/js/autocomplete.js @@ -45,7 +45,7 @@ function contact_format(item) { } function smiley_format(item) { - return ""; + return ""; } function bbco_format(item) { @@ -193,8 +193,8 @@ function string2bb(element) { match: /(^|\s)(:[a-z0-9_:]{2,})$/, index: 2, cache: true, - search: function(term, callback) { $.getJSON('/smilies/json').done(function(data) { callback($.map(data, function(entry) { return entry.text.indexOf(term.substr(1)) !== -1 ? entry : null; })); }); }, - replace: function(item) { return "$1" + item.text + ' '; }, + search: function(term, callback) { $.getJSON('/smilies/json').done(function(data) { callback($.map(data, function(entry) { return entry.shortname.indexOf(term.substr(1)) !== -1 ? entry : null; })); }); }, + replace: function(item) { return "$1" + item.shortname + ' '; }, context: function(text) { return text.toLowerCase(); }, template: smiley_format };