リモートユーザーのHTMLで表現されたプロフィールをMFMに変換するように

This commit is contained in:
syuilo
2018-06-21 01:21:57 +09:00
parent 3633d7ada1
commit 79d1bf30a4
29 changed files with 90 additions and 92 deletions

View File

@ -1,5 +1,4 @@
import * as mongo from 'mongodb';
const parse5 = require('parse5');
import * as debug from 'debug';
import config from '../../../config';
@ -10,79 +9,10 @@ import { INote as INoteActivityStreamsObject, IObject } from '../type';
import { resolvePerson, updatePerson } from './person';
import { resolveImage } from './image';
import { IRemoteUser, IUser } from '../../../models/user';
import htmlToMFM from '../../../mfm/html-to-mfm';
const log = debug('misskey:activitypub');
function parse(html: string): string {
const dom = parse5.parseFragment(html);
let text = '';
dom.childNodes.forEach((n: any) => analyze(n));
return text.trim();
function getText(node: any) {
if (node.nodeName == '#text') return node.value;
if (node.childNodes) {
return node.childNodes.map((n: any) => getText(n)).join('');
}
return '';
}
function analyze(node: any) {
switch (node.nodeName) {
case '#text':
text += node.value;
break;
case 'br':
text += '\n';
break;
case 'a':
const txt = getText(node);
// メンション
if (txt.startsWith('@')) {
const part = txt.split('@');
if (part.length == 2) {
//#region ホスト名部分が省略されているので復元する
const href = new URL(node.attrs.find((x: any) => x.name == 'href').value);
const acct = txt + '@' + href.hostname;
text += acct;
break;
//#endregion
} else if (part.length == 3) {
text += txt;
break;
}
}
if (node.childNodes) {
node.childNodes.forEach((n: any) => analyze(n));
}
break;
case 'p':
text += '\n\n';
if (node.childNodes) {
node.childNodes.forEach((n: any) => analyze(n));
}
break;
default:
if (node.childNodes) {
node.childNodes.forEach((n: any) => analyze(n));
}
break;
}
}
}
/**
* Noteをフェッチします。
*
@ -158,7 +88,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
const reply = note.inReplyTo ? await resolveNote(note.inReplyTo, resolver) : null;
// テキストのパース
const text = parse(note.content);
const text = htmlToMFM(note.content);
// ユーザーの情報が古かったらついでに更新しておく
if (actor.updatedAt == null || Date.now() - actor.updatedAt.getTime() > 1000 * 60 * 60 * 24) {