wumbo changes (proper mastodon API support and oauth login!)
This commit is contained in:
parent
b7c03381f7
commit
e17b26b075
20 changed files with 1935 additions and 1618 deletions
99
src/emoji.js
99
src/emoji.js
|
@ -1,93 +1,50 @@
|
|||
import Instance from './instance.js';
|
||||
import { Client } from './client/client.js';
|
||||
|
||||
const EMOJI_REGEX = /:[a-z0-9_\-]+:/g;
|
||||
|
||||
let emoji_cache = [];
|
||||
export const EMOJI_REGEX = /:[\w\-.]{0,32}@[\w\-.]{0,32}:/g;
|
||||
export const EMOJI_NAME_REGEX = /:[\w\-.]{0,32}:/g;
|
||||
|
||||
export default class Emoji {
|
||||
id;
|
||||
name;
|
||||
host;
|
||||
url;
|
||||
width;
|
||||
height;
|
||||
|
||||
static parse(data, host) {
|
||||
const instance = Instance.get_instance();
|
||||
let emoji = null;
|
||||
switch (instance.type) {
|
||||
case Instance.types.ICESHRIMP:
|
||||
emoji = Emoji.#parse_iceshrimp(data);
|
||||
break;
|
||||
case Instance.types.MASTODON:
|
||||
emoji = Emoji.#parse_mastodon(data);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (emoji !== null) emoji_cache.push(emoji);
|
||||
return emoji;
|
||||
constructor(id, name, host, url) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.host = host;
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
static #parse_iceshrimp(data, host) {
|
||||
let emoji = new Emoji()
|
||||
emoji.name = data.name.substring(1, data.name.search('@'));
|
||||
emoji.host = host;
|
||||
emoji.url = data.url;
|
||||
emoji.width = data.width;
|
||||
emoji.height = data.height;
|
||||
return emoji;
|
||||
}
|
||||
|
||||
static #parse_mastodon(data, host) {
|
||||
let emoji = new Emoji()
|
||||
emoji.name = data.shortcode;
|
||||
emoji.host = host;
|
||||
emoji.url = data.url;
|
||||
emoji.width = data.width;
|
||||
emoji.height = data.height;
|
||||
return emoji;
|
||||
}
|
||||
|
||||
get id() {
|
||||
return this.name + '@' + this.host;
|
||||
get html() {
|
||||
return `<img src="${this.url}" class="emoji" height="20" title="${this.name}" alt="${this.name}">`;
|
||||
}
|
||||
}
|
||||
|
||||
export function parse_text(text, ignore_instance) {
|
||||
export function parseText(text, host) {
|
||||
if (!text) return text;
|
||||
|
||||
let index = text.search(EMOJI_REGEX);
|
||||
let index = text.search(EMOJI_NAME_REGEX);
|
||||
if (index === -1) return text;
|
||||
index++;
|
||||
|
||||
// find the emoji name
|
||||
let length = 0;
|
||||
while (index + length < text.length && text[index + length] !== ':') length++;
|
||||
let emoji_name = ':' + text.substring(index, index + length) + ':';
|
||||
let length = text.substring(index + 1).search(':');
|
||||
if (length <= 0) return text;
|
||||
let emoji_name = text.substring(index + 1, index + length + 1);
|
||||
let emoji = Client.get().getEmoji(emoji_name + '@' + host);
|
||||
|
||||
// does this emoji exist?
|
||||
let emoji;
|
||||
for (let cached in emoji_cache) {
|
||||
if (cached.id === emoji_name) {
|
||||
emoji = cached;
|
||||
break;
|
||||
}
|
||||
if (emoji) {
|
||||
return text.substring(0, index) + emoji.html +
|
||||
parseText(text.substring(index + length + 2), host);
|
||||
}
|
||||
|
||||
if (!emoji) return text.substring(0, index + length) + parse_text(text.substring(index + length));
|
||||
|
||||
// replace emoji code with <img>
|
||||
const img = `<img src="${emoji.url}" class="emoji" width="26" height="26" title=":${emoji_name}:" alt="${emoji_name}">`;
|
||||
return text.substring(0, index - 1) + img +
|
||||
parse(text.substring(index + length + 1), emojis, ignore_instance);
|
||||
return text.substring(0, index + length + 1) +
|
||||
parseText(text.substring(index + length + 1), host);
|
||||
}
|
||||
|
||||
export function parse_one(reaction, emojis) {
|
||||
if (reaction == '❤') return '❤️'; // stupid heart unicode
|
||||
if (!reaction.startsWith(':') || !reaction.endsWith(':')) return reaction;
|
||||
for (let i = 0; i < emojis.length; i++) {
|
||||
if (emojis[i].name == reaction.substring(1, reaction.length - 1))
|
||||
return `<img src="${emojis[i].url}" class="emoji" width="26" height="26" title="${reaction}" alt="${emojis[i].name}">`;
|
||||
}
|
||||
return reaction;
|
||||
export function parseOne(emoji_id) {
|
||||
if (emoji_id == '❤') return '❤️'; // stupid heart unicode
|
||||
if (EMOJI_REGEX.exec(':' + emoji_id + ':')) return emoji_id;
|
||||
let cached_emoji = Client.get().getEmoji(emoji_id);
|
||||
if (!cached_emoji) return emoji_id;
|
||||
return cached_emoji.html;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue