From ca26edbfce9203539bc4f88f1f16a79180fbfbe0 Mon Sep 17 00:00:00 2001 From: Aya Morisawa Date: Wed, 30 Jan 2019 15:00:05 +0900 Subject: Rename html-to-mfm to fromHtml --- src/mfm/fromHtml.ts | 81 +++++++++++++++++++++++++++++++++ src/mfm/html-to-mfm.ts | 81 --------------------------------- src/remote/activitypub/models/note.ts | 4 +- src/remote/activitypub/models/person.ts | 8 ++-- 4 files changed, 87 insertions(+), 87 deletions(-) create mode 100644 src/mfm/fromHtml.ts delete mode 100644 src/mfm/html-to-mfm.ts diff --git a/src/mfm/fromHtml.ts b/src/mfm/fromHtml.ts new file mode 100644 index 0000000000..1441f97d94 --- /dev/null +++ b/src/mfm/fromHtml.ts @@ -0,0 +1,81 @@ +const parse5 = require('parse5'); +import { URL } from 'url'; + +export default function(html: string): string { + if (html == null) return null; + + const dom = parse5.parseFragment(html); + + let text = ''; + + for (const n of dom.childNodes) { + 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); + const rel = node.attrs.find((x: any) => x.name == 'rel'); + const href = node.attrs.find((x: any) => x.name == 'href'); + + // ハッシュタグ / hrefがない / txtがURL + if ((rel && rel.value.match('tag') !== null) || !href || href.value == txt) { + text += txt; + // メンション + } else if (txt.startsWith('@') && !(rel && rel.value.match(/^me /))) { + const part = txt.split('@'); + + if (part.length == 2) { + //#region ホスト名部分が省略されているので復元する + const acct = `${txt}@${(new URL(href.value)).hostname}`; + text += acct; + //#endregion + } else if (part.length == 3) { + text += txt; + } + // その他 + } else { + text += `[${txt}](${href.value})`; + } + break; + + case 'p': + text += '\n\n'; + if (node.childNodes) { + for (const n of node.childNodes) { + analyze(n); + } + } + break; + + default: + if (node.childNodes) { + for (const n of node.childNodes) { + analyze(n); + } + } + break; + } + } +} diff --git a/src/mfm/html-to-mfm.ts b/src/mfm/html-to-mfm.ts deleted file mode 100644 index 1441f97d94..0000000000 --- a/src/mfm/html-to-mfm.ts +++ /dev/null @@ -1,81 +0,0 @@ -const parse5 = require('parse5'); -import { URL } from 'url'; - -export default function(html: string): string { - if (html == null) return null; - - const dom = parse5.parseFragment(html); - - let text = ''; - - for (const n of dom.childNodes) { - 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); - const rel = node.attrs.find((x: any) => x.name == 'rel'); - const href = node.attrs.find((x: any) => x.name == 'href'); - - // ハッシュタグ / hrefがない / txtがURL - if ((rel && rel.value.match('tag') !== null) || !href || href.value == txt) { - text += txt; - // メンション - } else if (txt.startsWith('@') && !(rel && rel.value.match(/^me /))) { - const part = txt.split('@'); - - if (part.length == 2) { - //#region ホスト名部分が省略されているので復元する - const acct = `${txt}@${(new URL(href.value)).hostname}`; - text += acct; - //#endregion - } else if (part.length == 3) { - text += txt; - } - // その他 - } else { - text += `[${txt}](${href.value})`; - } - break; - - case 'p': - text += '\n\n'; - if (node.childNodes) { - for (const n of node.childNodes) { - analyze(n); - } - } - break; - - default: - if (node.childNodes) { - for (const n of node.childNodes) { - analyze(n); - } - } - break; - } - } -} diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts index dd0083340c..f93e3d4c60 100644 --- a/src/remote/activitypub/models/note.ts +++ b/src/remote/activitypub/models/note.ts @@ -9,7 +9,7 @@ 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'; +import fromHtml from '../../../mfm/fromHtml'; import Emoji, { IEmoji } from '../../../models/emoji'; import { ITag } from './tag'; import { toUnicode } from 'punycode'; @@ -110,7 +110,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false const cw = note.summary === '' ? null : note.summary; // テキストのパース - const text = note._misskey_content ? note._misskey_content : htmlToMFM(note.content); + const text = note._misskey_content ? note._misskey_content : fromHtml(note.content); // vote if (reply && reply.poll && text != null) { diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index c7a76b4bd6..192c73c03c 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -9,7 +9,7 @@ import { resolveImage } from './image'; import { isCollectionOrOrderedCollection, isCollection, IPerson } from '../type'; import { IDriveFile } from '../../../models/drive-file'; import Meta from '../../../models/meta'; -import htmlToMFM from '../../../mfm/html-to-mfm'; +import fromHtml from '../../../mfm/fromHtml'; import usersChart from '../../../chart/users'; import { URL } from 'url'; import { resolveNote, extractEmojis } from './note'; @@ -150,7 +150,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise