"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.inspectOne = exports.stringifyTree = exports.stringifyNode = exports.mergeText = void 0;
const node_1 = require("../node");
function mergeText(nodes) {
const dest = [];
const storedChars = [];
function generateText() {
if (storedChars.length > 0) {
dest.push((0, node_1.TEXT)(storedChars.join('')));
storedChars.length = 0;
}
}
const flatten = nodes.flat(1);
for (const node of flatten) {
if (typeof node === 'string') {
storedChars.push(node);
}
else if (!Array.isArray(node) && node.type === 'text') {
storedChars.push(node.props.text);
}
else {
generateText();
dest.push(node);
}
}
generateText();
return dest;
}
exports.mergeText = mergeText;
function stringifyNode(node) {
var _a;
switch (node.type) {
case 'quote': {
return stringifyTree(node.children).split('\n').map(line => `> ${line}`).join('\n');
}
case 'search': {
return node.props.content;
}
case 'blockCode': {
return `\`\`\`${(_a = node.props.lang) !== null && _a !== void 0 ? _a : ''}\n${node.props.code}\n\`\`\``;
}
case 'mathBlock': {
return `\\[\n${node.props.formula}\n\\]`;
}
case 'center': {
return `
\n${stringifyTree(node.children)}\n`;
}
case 'emojiCode': {
return `:${node.props.name}:`;
}
case 'unicodeEmoji': {
return node.props.emoji;
}
case 'bold': {
return `**${stringifyTree(node.children)}**`;
}
case 'small': {
return `${stringifyTree(node.children)}`;
}
case 'italic': {
return `${stringifyTree(node.children)}`;
}
case 'strike': {
return `~~${stringifyTree(node.children)}~~`;
}
case 'inlineCode': {
return `\`${node.props.code}\``;
}
case 'mathInline': {
return `\\(${node.props.formula}\\)`;
}
case 'mention': {
return node.props.acct;
}
case 'hashtag': {
return `#${node.props.hashtag}`;
}
case 'url': {
if (node.props.brackets) {
return `<${node.props.url}>`;
}
else {
return node.props.url;
}
}
case 'link': {
const prefix = node.props.silent ? '?' : '';
return `${prefix}[${stringifyTree(node.children)}](${node.props.url})`;
}
case 'fn': {
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.length > 0) ? '.' + argFields.join(',') : '';
return `$[${node.props.name}${args} ${stringifyTree(node.children)}]`;
}
case 'plain': {
return `\n${stringifyTree(node.children)}\n`;
}
case 'text': {
return node.props.text;
}
}
throw new Error('unknown mfm node');
}
exports.stringifyNode = stringifyNode;
var stringifyState;
(function (stringifyState) {
stringifyState[stringifyState["none"] = 0] = "none";
stringifyState[stringifyState["inline"] = 1] = "inline";
stringifyState[stringifyState["block"] = 2] = "block";
})(stringifyState || (stringifyState = {}));
function stringifyTree(nodes) {
const dest = [];
let state = stringifyState.none;
for (const node of nodes) {
let pushLf = true;
if ((0, node_1.isMfmBlock)(node)) {
if (state === stringifyState.none) {
pushLf = false;
}
state = stringifyState.block;
}
else {
if (state === stringifyState.none || state === stringifyState.inline) {
pushLf = false;
}
state = stringifyState.inline;
}
if (pushLf) {
dest.push((0, node_1.TEXT)('\n'));
}
dest.push(node);
}
return dest.map(n => stringifyNode(n)).join('');
}
exports.stringifyTree = stringifyTree;
function inspectOne(node, action) {
action(node);
if (node.children != null) {
for (const child of node.children) {
inspectOne(child, action);
}
}
}
exports.inspectOne = inspectOne;