refactor: extract functions

This commit is contained in:
syuilo 2021-03-22 12:36:57 +09:00
parent 0e6fbdfa5b
commit 1f0abef084

View file

@ -13,6 +13,30 @@ type PopulatedEmoji = {
url: string; url: string;
}; };
function normalizeHost(src: string | undefined, noteUserHost: string | null): string | null {
// クエリに使うホスト
let host = src === '.' ? null // .はローカルホスト (ここがマッチするのはリアクションのみ)
: src === undefined ? noteUserHost // ノートなどでホスト省略表記の場合はローカルホスト (ここがリアクションにマッチすることはない)
: isSelfHost(src) ? null // 自ホスト指定
: (src || noteUserHost); // 指定されたホスト || ノートなどの所有者のホスト (こっちがリアクションにマッチすることはない)
host = toPunyNullable(host);
return host;
}
function parseEmojiStr(emojiName: string, noteUserHost: string | null) {
const match = emojiName.match(/^(\w+)(?:@([\w.-]+))?$/);
if (!match) return { name: null, host: null };
const name = match[1];
// ホスト正規化
const host = toPunyNullable(normalizeHost(match[2], noteUserHost));
return { name, host };
}
/** /**
* *
* @param emojiName (:, @. (decodeReactionで可能)) * @param emojiName (:, @. (decodeReactionで可能))
@ -20,18 +44,8 @@ type PopulatedEmoji = {
* @returns , nullは未マッチを意味する * @returns , nullは未マッチを意味する
*/ */
export async function populateEmoji(emojiName: string, noteUserHost: string | null): Promise<PopulatedEmoji | null> { export async function populateEmoji(emojiName: string, noteUserHost: string | null): Promise<PopulatedEmoji | null> {
const match = emojiName.match(/^(\w+)(?:@([\w.-]+))?$/); const { name, host } = parseEmojiStr(emojiName, noteUserHost);
if (!match) return null; if (name == null) return null;
const name = match[1];
// クエリに使うホスト
let host = match[2] === '.' ? null // .はローカルホスト (ここがマッチするのはリアクションのみ)
: match[2] === undefined ? noteUserHost // ノートなどでホスト省略表記の場合はローカルホスト (ここがリアクションにマッチすることはない)
: isSelfHost(match[2]) ? null // 自ホスト指定
: (match[2] || noteUserHost); // 指定されたホスト || ノートなどの所有者のホスト (こっちがリアクションにマッチすることはない)
host = toPunyNullable(host);
const queryOrNull = async () => (await Emojis.findOne({ const queryOrNull = async () => (await Emojis.findOne({
name, name,