refactor: Extract well-known services

This commit is contained in:
syuilo 2020-08-07 11:27:37 +09:00
parent 2bdcd22ad4
commit 2d40a15d2b
3 changed files with 18 additions and 18 deletions

View File

@ -18,6 +18,7 @@
import Vue from 'vue'; import Vue from 'vue';
import { toUnicode } from 'punycode'; import { toUnicode } from 'punycode';
import { host as localHost } from '../config'; import { host as localHost } from '../config';
import { wellKnownServices } from '../../well-known-services';
export default Vue.extend({ export default Vue.extend({
props: { props: {
@ -37,12 +38,11 @@ export default Vue.extend({
}, },
computed: { computed: {
url(): string { url(): string {
switch (this.host) { const wellKnown = wellKnownServices.find(x => x[0] === this.host);
case 'twitter.com': if (wellKnown) {
case 'github.com': return wellKnown[1](this.username);
return `https://${this.host}/${this.username}`; } else {
default: return `/${this.canonical}`;
return `/${this.canonical}`;
} }
}, },
canonical(): string { canonical(): string {

View File

@ -3,6 +3,7 @@ import config from '../config';
import { intersperse } from '../prelude/array'; import { intersperse } from '../prelude/array';
import { MfmForest, MfmTree } from './prelude'; import { MfmForest, MfmTree } from './prelude';
import { IMentionedRemoteUsers } from '../models/entities/note'; import { IMentionedRemoteUsers } from '../models/entities/note';
import { wellKnownServices } from '../well-known-services';
export function toHtml(tokens: MfmForest | null, mentionedRemoteUsers: IMentionedRemoteUsers = []) { export function toHtml(tokens: MfmForest | null, mentionedRemoteUsers: IMentionedRemoteUsers = []) {
if (tokens == null) { if (tokens == null) {
@ -126,18 +127,13 @@ export function toHtml(tokens: MfmForest | null, mentionedRemoteUsers: IMentione
mention(token) { mention(token) {
const a = doc.createElement('a'); const a = doc.createElement('a');
const { username, host, acct } = token.node.props; const { username, host, acct } = token.node.props;
switch (host) { const wellKnown = wellKnownServices.find(x => x[0] === host);
case 'github.com': if (wellKnown) {
a.href = `https://github.com/${username}`; a.href = wellKnown[1](username);
break; } else {
case 'twitter.com': const remoteUserInfo = mentionedRemoteUsers.find(remoteUser => remoteUser.username === username && remoteUser.host === host);
a.href = `https://twitter.com/${username}`; a.href = remoteUserInfo ? (remoteUserInfo.url ? remoteUserInfo.url : remoteUserInfo.uri) : `${config.url}/${acct}`;
break; a.className = 'u-url mention';
default:
const remoteUserInfo = mentionedRemoteUsers.find(remoteUser => remoteUser.username === username && remoteUser.host === host);
a.href = remoteUserInfo ? (remoteUserInfo.url ? remoteUserInfo.url : remoteUserInfo.uri) : `${config.url}/${acct}`;
a.className = 'u-url mention';
break;
} }
a.textContent = acct; a.textContent = acct;
return a; return a;

View File

@ -0,0 +1,4 @@
export const wellKnownServices = [
['twitter.com', username => `https://twitter.com/${username}`],
['github.com', username => `https://github.com/${username}`],
] as [string, (username: string) => string][];