MFMをテキストに戻す (#6131)
* Disable Nyaize in quote * mfmを文字列に戻す、nyaizeにmfmを使用 * Revert "Disable Nyaize in quote" This reverts commit 1b238905a5535267d32d7e1aec8afd8bb07b0619. * refactor * use return type as string
This commit is contained in:
parent
20ac7e62e9
commit
a471e4b783
3 changed files with 117 additions and 36 deletions
112
src/mfm/toString.ts
Normal file
112
src/mfm/toString.ts
Normal file
|
@ -0,0 +1,112 @@
|
|||
import { MfmForest, MfmTree } from './prelude';
|
||||
import { nyaize } from '../misc/nyaize';
|
||||
|
||||
export type RestoreOptions = {
|
||||
doNyaize?: boolean;
|
||||
};
|
||||
|
||||
export function toString(tokens: MfmForest | null, opts?: RestoreOptions): string {
|
||||
|
||||
if (tokens === null) return '';
|
||||
|
||||
function appendChildren(children: MfmForest, opts?: RestoreOptions): string {
|
||||
return children.map(t => handlers[t.node.type](t, opts)).join('');
|
||||
}
|
||||
|
||||
const handlers: { [key: string]: (token: MfmTree, opts?: RestoreOptions) => string } = {
|
||||
bold(token, opts) {
|
||||
return `**${appendChildren(token.children, opts)}**`;
|
||||
},
|
||||
|
||||
big(token, opts) {
|
||||
return `***${appendChildren(token.children, opts)}***`;
|
||||
},
|
||||
|
||||
small(token, opts) {
|
||||
return `<small>${appendChildren(token.children, opts)}</small>`;
|
||||
},
|
||||
|
||||
strike(token, opts) {
|
||||
return `~~${appendChildren(token.children, opts)}~~`;
|
||||
},
|
||||
|
||||
italic(token, opts) {
|
||||
return `<i>${appendChildren(token.children, opts)}</i>`;
|
||||
},
|
||||
|
||||
motion(token, opts) {
|
||||
return `<motion>${appendChildren(token.children, opts)}</motion>`;
|
||||
},
|
||||
|
||||
spin(token, opts) {
|
||||
return `<spin>${appendChildren(token.children, opts)}</spin>`;
|
||||
},
|
||||
|
||||
jump(token, opts) {
|
||||
return `<jump>${appendChildren(token.children, opts)}</jump>`;
|
||||
},
|
||||
|
||||
flip(token, opts) {
|
||||
return `<flip>${appendChildren(token.children, opts)}</flip>`;
|
||||
},
|
||||
|
||||
blockCode(token) {
|
||||
return `\`\`\`${token.node.props.lang || ''}\n${token.node.props.code}\n\`\`\`\n`;
|
||||
},
|
||||
|
||||
center(token, opts) {
|
||||
return `<center>${appendChildren(token.children, opts)}</center>`;
|
||||
},
|
||||
|
||||
emoji(token) {
|
||||
return (token.node.props.emoji ? token.node.props.emoji : `:${token.node.props.name}:`);
|
||||
},
|
||||
|
||||
hashtag(token) {
|
||||
return `#${token.node.props.hashtag}`;
|
||||
},
|
||||
|
||||
inlineCode(token) {
|
||||
return `\`${token.node.props.code}\``;
|
||||
},
|
||||
|
||||
mathInline(token) {
|
||||
return `\\(${token.node.props.formula}\\)`;
|
||||
},
|
||||
|
||||
mathBlock(token) {
|
||||
return `\\[${token.node.props.formula}\\]`;
|
||||
},
|
||||
|
||||
link(token, opts) {
|
||||
return `[${appendChildren(token.children, opts)}](${token.node.props.url})`;
|
||||
},
|
||||
|
||||
mention(token) {
|
||||
return token.node.props.canonical;
|
||||
},
|
||||
|
||||
quote(token) {
|
||||
return `${appendChildren(token.children, {doNyaize: false}).replace(/^/gm,'>').trim()}\n`;
|
||||
},
|
||||
|
||||
title(token, opts) {
|
||||
return `[${appendChildren(token.children, opts)}]\n`;
|
||||
},
|
||||
|
||||
text(token, opts) {
|
||||
return (opts && opts.doNyaize) ? nyaize(token.node.props.text) : token.node.props.text;
|
||||
},
|
||||
|
||||
url(token) {
|
||||
return `<${token.node.props.url}>`;
|
||||
},
|
||||
|
||||
search(token, opts) {
|
||||
const query = token.node.props.query;
|
||||
return `${(opts && opts.doNyaize ? nyaize(query) : query)} [search]\n`;
|
||||
}
|
||||
};
|
||||
|
||||
return appendChildren(tokens, { doNyaize: (opts && opts.doNyaize) || false }).trim();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue