summaryrefslogtreecommitdiff
path: root/src/remote
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-06-21 01:21:57 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-06-21 01:21:57 +0900
commit79d1bf30a49e1fd1ef1f8b743a9aff84d104fb89 (patch)
treeed8f50f01cc50cf851dc0d0f399ed7e0f514f6c6 /src/remote
parentDisable transitions to avoid memory leak (diff)
downloadsharkey-79d1bf30a49e1fd1ef1f8b743a9aff84d104fb89.tar.gz
sharkey-79d1bf30a49e1fd1ef1f8b743a9aff84d104fb89.tar.bz2
sharkey-79d1bf30a49e1fd1ef1f8b743a9aff84d104fb89.zip
リモートユーザーのHTMLで表現されたプロフィールをMFMに変換するように
Diffstat (limited to 'src/remote')
-rw-r--r--src/remote/activitypub/misc/get-note-html.ts4
-rw-r--r--src/remote/activitypub/models/note.ts74
-rw-r--r--src/remote/activitypub/models/person.ts9
3 files changed, 7 insertions, 80 deletions
diff --git a/src/remote/activitypub/misc/get-note-html.ts b/src/remote/activitypub/misc/get-note-html.ts
index 0ceecdd00b..8df440930b 100644
--- a/src/remote/activitypub/misc/get-note-html.ts
+++ b/src/remote/activitypub/misc/get-note-html.ts
@@ -1,6 +1,6 @@
import { INote } from '../../../models/note';
-import toHtml from '../../../text/html';
-import parse from '../../../text/parse';
+import toHtml from '../../../mfm/html';
+import parse from '../../../mfm/parse';
import config from '../../../config';
export default function(note: INote) {
diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts
index b0fe045e6d..85a8f89bc8 100644
--- a/src/remote/activitypub/models/note.ts
+++ b/src/remote/activitypub/models/note.ts
@@ -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) {
diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts
index 42ee5a27df..f233346395 100644
--- a/src/remote/activitypub/models/person.ts
+++ b/src/remote/activitypub/models/person.ts
@@ -1,5 +1,4 @@
import * as mongo from 'mongodb';
-import { JSDOM } from 'jsdom';
import { toUnicode } from 'punycode';
import * as debug from 'debug';
@@ -11,6 +10,7 @@ import { resolveImage } from './image';
import { isCollectionOrOrderedCollection, IObject, IPerson } from '../type';
import { IDriveFile } from '../../../models/drive-file';
import Meta from '../../../models/meta';
+import htmlToMFM from '../../../mfm/html-to-mfm';
const log = debug('misskey:activitypub');
@@ -80,7 +80,6 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
]);
const host = toUnicode(finger.subject.replace(/^.*?@/, '')).toLowerCase();
- const summaryDOM = JSDOM.fragment(person.summary);
// Create user
let user: IRemoteUser;
@@ -89,7 +88,7 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
avatarId: null,
bannerId: null,
createdAt: Date.parse(person.published) || null,
- description: summaryDOM.textContent,
+ description: htmlToMFM(person.summary),
followersCount,
followingCount,
notesCount,
@@ -211,8 +210,6 @@ export async function updatePerson(value: string | IObject, resolver?: Resolver)
)
]);
- const summaryDOM = JSDOM.fragment(person.summary);
-
// アイコンとヘッダー画像をフェッチ
const [avatar, banner] = (await Promise.all<IDriveFile>([
person.icon,
@@ -231,7 +228,7 @@ export async function updatePerson(value: string | IObject, resolver?: Resolver)
bannerId: banner ? banner._id : null,
avatarUrl: avatar && avatar.metadata.isMetaOnly ? avatar.metadata.url : null,
bannerUrl: banner && banner.metadata.isMetaOnly ? banner.metadata.url : null,
- description: summaryDOM.textContent,
+ description: htmlToMFM(person.summary),
followersCount,
followingCount,
notesCount,