From ca411eef783d1b940eac8b492bb1da16e439d15d Mon Sep 17 00:00:00 2001 From: top Date: Mon, 29 Jan 2024 03:51:04 +0000 Subject: [PATCH] Adds the typing modifier (#221) Little messy, I'll clean this up in a follow-up. The entire modifier code needs a refactor tbh. Just makes the emote typing, nothing too complicated. Added a couple screenshots. Co-authored-by: Chuck Reviewed-on: https://fsdfsd.net/rDrama/rDrama/pulls/221 Co-authored-by: top Co-committed-by: top --- files/assets/css/main.css | 32 +++++++++++++++++++++++++- files/assets/images/typing-hands.webp | Bin 0 -> 20998 bytes files/assets/js/markdown.js | 16 +++++++++++-- files/helpers/sanitize.py | 15 +++++++++++- files/templates/formatting.html | 11 ++++++++- files/templates/modals/emoji.html | 4 ++++ 6 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 files/assets/images/typing-hands.webp diff --git a/files/assets/css/main.css b/files/assets/css/main.css index b1a435b61..881f8883d 100644 --- a/files/assets/css/main.css +++ b/files/assets/css/main.css @@ -5284,7 +5284,7 @@ textarea { } } .img, img[alt^="![]("], -.preview img:not(img[src^="/uid/"], img[src^="/pp/"], img[src$="/pic"], img[src$="/i/hand.webp"], img[src$="/i/talking.webp"], img[src*="/e/"]) { +.preview img:not(img[src^="/uid/"], img[src^="/pp/"], img[src$="/pic"], img[src$="/i/hand.webp"], img[src$="/i/talking.webp"], img[src$="/i/typing-hands.webp"], img[src*="/e/"]) { max-height: 150px !important; max-width: 100% !important; border-radius: 0.2rem !important; @@ -5446,6 +5446,12 @@ span > img[src$="/i/talking.webp"] { position: absolute; width: 70%; } +span > img[src$="/i/typing-hands.webp"] { + position: absolute; + width: 100%; + bottom: 0; + z-index: 1; +} span > img[src$="/i/hand.webp"] ~ img { animation: pat-pfp-anim 0.3s infinite; transform-origin: bottom center; @@ -5489,6 +5495,10 @@ span > img[src$="/i/talking.webp"]+img[src$="/i/hand.webp"]+img { bottom: calc(2px + 2%) !important; } +.typing-hands-preview { + bottom: calc(2px + 2%) !important; +} + span > img[src$="/i/love-foreground.webp"]+img[src$="/i/love-background.webp"]+img { position: absolute; z-index: 50; @@ -5499,6 +5509,26 @@ span > img[src$="/i/love-foreground.webp"]+img[src$="/i/love-background.webp"]+i transform: scaleX(-1) rotate(-10deg); } +span > img[src$="/i/love-foreground.webp"]+img[src$="/i/love-background.webp"]+img[src$="/i/typing-hands.webp"] { + position: absolute; + z-index: 51; + height: unset; + width: 50%; + bottom: -2%; + left: 33%; + transform: rotate(10deg); +} + +span > img[src$="/i/love-foreground.webp"]+img[src$="/i/love-background.webp"]+img+img { + position: absolute; + z-index: 50; + height: 60%; + width: 60%; + bottom: -2%; + left: 33%; + transform: scaleX(-1) rotate(-10deg); +} + span > img[src$="/i/love-foreground.webp"] { position: absolute; z-index: 100; diff --git a/files/assets/images/typing-hands.webp b/files/assets/images/typing-hands.webp new file mode 100644 index 0000000000000000000000000000000000000000..6188577f5e6c17725826295b26d4a292d1426b31 GIT binary patch literal 20998 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 literal 0 HcmV?d00001 diff --git a/files/assets/js/markdown.js b/files/assets/js/markdown.js index 6e4039979..640949f30 100644 --- a/files/assets/js/markdown.js +++ b/files/assets/js/markdown.js @@ -74,6 +74,7 @@ const MODIFIERS = { REVERSED_MODIFIER: 6, GENOCIDE: 7, LOVE: 8, + TYPING: 9, }; const findAllEmojiEndings = (word) => { @@ -121,6 +122,16 @@ const findAllEmojiEndings = (word) => { continue; } + if(currWord.endsWith('typing')) { + if(currEndings.indexOf(MODIFIERS.TYPING) !== -1) { + hasReachedNonModifer = true; + continue; + } + currWord = currWord.slice(0, -6); + currEndings.push(MODIFIERS.TYPING); + continue; + } + hasReachedNonModifer = true; } @@ -204,12 +215,13 @@ function markdown(t) { const imgClass = modifiers.has(MODIFIERS.REVERSED) && modifiers.has(MODIFIERS.REVERSED_MODIFIER) ? mirroredClass : '' const lovedClass = modifiers.has(MODIFIERS.LOVE) ? 'love-preview' : ''; - if ([MODIFIERS.TALKING, MODIFIERS.GENOCIDE, MODIFIERS.PAT, MODIFIERS.LOVE].some((modifer) => modifiers.has(modifer))) { + if ([MODIFIERS.TALKING, MODIFIERS.GENOCIDE, MODIFIERS.PAT, MODIFIERS.LOVE, MODIFIERS.TYPING].some((modifer) => modifiers.has(modifer))) { + const typingHtml = modifiers.has(MODIFIERS.TYPING) ? `` : ''; const talkingHtml = modifiers.has(MODIFIERS.TALKING) ? `` : ''; const patHtml = modifiers.has(MODIFIERS.PAT) ? `` : ''; const loveHtml = modifiers.has(MODIFIERS.LOVE) ? `` : ''; const url = modifiers.has(MODIFIERS.USER) ? `/@${emoji}/pic` : `${SITE_FULL_IMAGES}/e/${emoji}.webp`; - const modifierHtml = isTalkingFirst ? `${talkingHtml}${patHtml}${loveHtml}` : `${patHtml}${talkingHtml}${loveHtml}`; + const modifierHtml = isTalkingFirst ? `${talkingHtml}${patHtml}${loveHtml}${typingHtml}` : `${patHtml}${talkingHtml}${loveHtml}${typingHtml}`; input = input.replace(old, `${modifierHtml}`); } else { input = input.replace(old, ``); diff --git a/files/helpers/sanitize.py b/files/helpers/sanitize.py index 345c1bb6d..ebf5c238e 100644 --- a/files/helpers/sanitize.py +++ b/files/helpers/sanitize.py @@ -210,6 +210,14 @@ def find_all_emoji_endings(emoji): emoji = emoji[:-4] continue + if emoji.endswith('typing'): + if 'typing' in endings: + is_non_ending_found = True + continue + endings.append('typing') + emoji = emoji[:-6] + continue + is_non_ending_found = True if emoji.endswith('random'): @@ -254,6 +262,7 @@ def render_emoji(html, regexp, golden, emojis_used, b=False, is_title=False): is_talking_first = ending_modifiers.index('pat') > ending_modifiers.index('talking') if is_talking and is_patted else False is_loved = 'love' in ending_modifiers is_genocided = 'genocide' in ending_modifiers + is_typing = 'typing' in ending_modifiers is_user = emoji.startswith('@') end_modifier_length = 3 if is_patted else 0 @@ -261,6 +270,7 @@ def render_emoji(html, regexp, golden, emojis_used, b=False, is_title=False): hand_html = f'' if is_patted and emoji != 'marseyunpettable' else '' talking_html = f'' if is_talking else '' + typing_html = f'' if is_typing else '' loved_html = f':{old}::{old}:' genocide_attr = ' cide' if is_genocided else '' @@ -275,7 +285,10 @@ def render_emoji(html, regexp, golden, emojis_used, b=False, is_title=False): if is_loved: modifier_html = f'{modifier_html}{loved_html}' - if (is_patted and emoji != 'marseyunpettable') or is_talking or is_genocided or is_loved: + if is_typing: + modifier_html = f'{modifier_html}{typing_html}' + + if (is_patted and emoji != 'marseyunpettable') or is_talking or is_genocided or is_loved or is_typing: if path.isfile(f"files/assets/images/emojis/{emoji}.webp"): emoji_html = f'{modifier_html}{emoji_partial_pat.format(old, f"{SITE_FULL_IMAGES}/e/{emoji}.webp", attrs)}' elif is_user: diff --git a/files/templates/formatting.html b/files/templates/formatting.html index 007f0de26..74ff353bd 100644 --- a/files/templates/formatting.html +++ b/files/templates/formatting.html @@ -152,11 +152,20 @@ Talking Emojis :marseygasptalking: - + :marseygasptalking: + + Typing Emojis + :marseygasptyping: + + + :marseygasptyping: + + + Genocide Emojis :marseygaspgenocide: diff --git a/files/templates/modals/emoji.html b/files/templates/modals/emoji.html index c655de235..f7b9f66c6 100644 --- a/files/templates/modals/emoji.html +++ b/files/templates/modals/emoji.html @@ -46,6 +46,10 @@ +
+ + +