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 -------------------------------------------------- 2 files changed, 81 insertions(+), 81 deletions(-) create mode 100644 src/mfm/fromHtml.ts delete mode 100644 src/mfm/html-to-mfm.ts (limited to 'src/mfm') 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; - } - } -} -- cgit v1.2.3-freya