From 5c4c242ee24ee6c01c98324c2e48e3b4e9ea0294 Mon Sep 17 00:00:00 2001
From: marihachi <marihachi0620@gmail.com>
Date: Fri, 26 Mar 2021 10:02:24 +0900
Subject: [PATCH] toString

---
 src/index.ts | 53 +++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 36 insertions(+), 17 deletions(-)

diff --git a/src/index.ts b/src/index.ts
index 811dc1c..b13370b 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -19,59 +19,78 @@ function nodeStringify(node: MfmNode): string {
 			return toString(node.children).split('\n').map(line => `>${line}`).join('\n');
 		}
 		case 'search': {
-			break;
+			return node.props.content;
 		}
 		case 'blockCode': {
-			break;
+			return `\`\`\`${ node.props.lang ?? '' }\n${ node.props.code }\n\`\`\``;
 		}
 		case 'mathBlock': {
-			break;
+			return `\\[\n${ node.props.formula }\n\\]`;
 		}
 		case 'center': {
-			break;
+			return `<center>${ toString(node.children) }</center>`;
 		}
 		// inline
 		case 'emoji': {
-			break;
+			if (node.props.name) {
+				return `:${ node.props.name }:`;
+			}
+			else if (node.props.emoji) {
+				return node.props.emoji;
+			}
+			else {
+				return '';
+			}
 		}
 		case 'bold': {
-			break;
+			return `**${ toString(node.children) }**`;
 		}
 		case 'small': {
-			break;
+			return `<small>${ toString(node.children) }</small>`;
 		}
 		case 'italic': {
-			break;
+			return `<i>${ toString(node.children) }</i>`;
 		}
 		case 'strike': {
-			break;
+			return `~~${ toString(node.children) }~~`;
 		}
 		case 'inlineCode': {
-			break;
+			return `\`${ node.props.code }\``;
 		}
 		case 'mathInline': {
-			break;
+			return `\\(${ node.props.formula }\\)`;
 		}
 		case 'mention': {
-			break;
+			return node.props.acct;
 		}
 		case 'hashtag': {
-			break;
+			return `#${ node.props.hashtag }`;
 		}
 		case 'url': {
-			break;
+			return node.props.url;
 		}
 		case 'link': {
-			break;
+			const prefix = node.props.silent ? '?' : '';
+			return `${ prefix }[${ toString(node.children) }](${ node.props.url })`;
 		}
 		case 'fn': {
-			break;
+			const argFields = Object.keys(node.props.args).map(key => {
+				const value = node.props.args[key];
+				if (value === true) {
+					return key;
+				}
+				else {
+					return `${ key }=${ value }`;
+				}
+			});
+			const args = argFields.join(',');
+			return `[${ node.props.name }${ args } ${ toString(node.children) }]`;
 		}
 		case 'text': {
 			return node.props.text;
 		}
 	}
-	return '';
+	throw new Error('unknown mfm node');
 }
 
 export function toString(nodes: MfmNode[]): string {
-- 
GitLab