diff options
| author | Oni-Men <sensyaheis@gmail.com> | 2020-03-06 22:51:50 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-06 22:51:50 +0900 |
| commit | a471e4b7831ed71975301579365ae32472c9005a (patch) | |
| tree | 1001a771b6ed9dd6f0979144edb28e146a8d0121 /src/mfm | |
| parent | チャートInsert時にロックをかけるように (#6100) (diff) | |
| download | misskey-a471e4b7831ed71975301579365ae32472c9005a.tar.gz misskey-a471e4b7831ed71975301579365ae32472c9005a.tar.bz2 misskey-a471e4b7831ed71975301579365ae32472c9005a.zip | |
MFMをテキストに戻す (#6131)
* Disable Nyaize in quote
* mfmを文字列に戻す、nyaizeにmfmを使用
* Revert "Disable Nyaize in quote"
This reverts commit 1b238905a5535267d32d7e1aec8afd8bb07b0619.
* refactor
* use return type as string
Diffstat (limited to 'src/mfm')
| -rw-r--r-- | src/mfm/toString.ts | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/mfm/toString.ts b/src/mfm/toString.ts new file mode 100644 index 0000000000..5b53105b32 --- /dev/null +++ b/src/mfm/toString.ts @@ -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(); +} |