function _define_property(obj, key, value) {
    if (key in obj) {
        Object.defineProperty(obj, key, {
            value: value,
            enumerable: true,
            configurable: true,
            writable: true
        });
    } else {
        obj[key] = value;
    }
    return obj;
}
function _object_spread(target) {
    for(var i = 1; i < arguments.length; i++){
        var source = arguments[i] != null ? arguments[i] : {};
        var ownKeys = Object.keys(source);
        if (typeof Object.getOwnPropertySymbols === "function") {
            ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
                return Object.getOwnPropertyDescriptor(source, sym).enumerable;
            }));
        }
        ownKeys.forEach(function(key) {
            _define_property(target, key, source[key]);
        });
    }
    return target;
}
function ownKeys(object, enumerableOnly) {
    var keys = Object.keys(object);
    if (Object.getOwnPropertySymbols) {
        var symbols = Object.getOwnPropertySymbols(object);
        if (enumerableOnly) {
            symbols = symbols.filter(function(sym) {
                return Object.getOwnPropertyDescriptor(object, sym).enumerable;
            });
        }
        keys.push.apply(keys, symbols);
    }
    return keys;
}
function _object_spread_props(target, source) {
    source = source != null ? source : {};
    if (Object.getOwnPropertyDescriptors) {
        Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
    } else {
        ownKeys(Object(source)).forEach(function(key) {
            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
        });
    }
    return target;
}
function _type_of(obj) {
    "@swc/helpers - typeof";
    return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
}
import rehypeRaw from "rehype-raw";
import { remark } from "remark";
import remarkGfm from "remark-gfm";
import remarkMath from "remark-math";
import remarkParse from "remark-parse";
import remarkRehype from "remark-rehype";
import { convertParagraphToImage, fixStrongWithSpecialChars } from "../remarkParse";
//@ts-ignore
import rehypeKatex from "rehype-katex";
import remarkFrontmatter from "remark-frontmatter";
import { EditorUtils } from "../../utils";
// 表格相关常量
export var MIN_TABLE_CELL_LENGTH = 5; // 表格单元格最小长度
export var tableRegex = /^\|.*\|\s*\n\|[-:| ]+\|/m;
// 创建 remark 实例用于 stringify
var stringifyObj = remark().use(remarkParse).use(fixStrongWithSpecialChars).use(convertParagraphToImage).use(remarkMath, {
    singleDollarTextMath: false
}).use(remarkRehype, {
    allowDangerousHtml: true
}).use(rehypeRaw).use(rehypeKatex).use(remarkGfm, {
    singleTilde: false
}) // 禁用单波浪线删除线
.use(remarkFrontmatter, [
    'yaml'
]);
var myRemark = {
    stringify: function(obj) {
        var mdStr = stringifyObj.stringify(obj);
        return mdStr;
    }
};
/**
 * 高级数字检查
 */ var advancedNumericCheck = function(value) {
    var numericPattern = /^[-+]?[0-9,]*\.?[0-9]+([eE][-+]?[0-9]+)?$/;
    return typeof value === 'number' || typeof value === 'string' && numericPattern.test(value);
};
/**
 * 判断是否为数字值
 */ var isNumericValue = function(value) {
    return typeof value === 'number' || !isNaN(parseFloat(value)) && isFinite(value) || advancedNumericCheck(value);
};
/**
 * 判断是否包含不完整输入
 * 如果一行中包含可能尚未完成的数字输入，返回 true
 */ var hasIncompleteNumericInput = function(values) {
    // 检查是否有可能是正在输入的不完整数字
    // 例如: '12.' 或 '0.' 或 '-' 或 仅有一个数字字符的情况
    return values.some(function(val) {
        if (typeof val !== 'string') return false;
        return val.endsWith('.') && /\d/.test(val) || // 以小数点结尾
        val === '-' || // 只有负号
        val === '+' || // 只有正号
        val.length === 1 && /\d/.test(val) // 只有一个数字
        ;
    });
};
/**
 * 规范化字段名，统一处理转义字符
 * 将 `index\_value` 转换为 `index_value`，确保字段名一致
 * @param fieldName - 原始字段名
 * @returns 规范化后的字段名
 */ export var normalizeFieldName = function(fieldName) {
    if (!fieldName) return fieldName;
    // 移除转义字符：将 `\_` 转换为 `_`，`\\` 转换为 `\`
    return fieldName.replace(/\\_/g, '_').replace(/\\\\/g, '\\').replace(/\\(?=")/g, '') // 移除转义的双引号
    .trim();
};
/**
 * 获取列对齐方式
 */ export var getColumnAlignment = function(data, columns) {
    if (!data.length) return [];
    // 缓存上一次的对齐结果，避免频繁切换
    var prevAlignments = [];
    return columns.map(function(col, index) {
        var values = data.map(function(row) {
            return row[col.dataIndex];
        }).filter(Boolean);
        values === null || values === void 0 ? void 0 : values.pop();
        // 如果检测到可能正在输入的数字，保持当前对齐状态
        if (hasIncompleteNumericInput(values)) {
            return prevAlignments[index] || null;
        }
        var alignment = values.every(isNumericValue) ? 'right' : null;
        prevAlignments[index] = alignment;
        return alignment;
    });
};
/**
 * 解析表格或图表
 * @param table - 表格 AST 节点
 * @param preNode - 前一个节点（可能包含配置信息）
 * @param plugins - 插件数组
 * @param parseNodes - 解析节点的函数，用于解析单元格内容
 * @param parserConfig - 解析配置
 * @returns 返回表格或图表节点
 */ export var parseTableOrChart = function(table, preNode, plugins, parseNodes, parserConfig) {
    var _table_children, _tableHeader_children, _table_children_slice, _table_children1, _table_align;
    var keyMap = new Map();
    var config = (preNode === null || preNode === void 0 ? void 0 : preNode.type) === 'code' && (preNode === null || preNode === void 0 ? void 0 : preNode.language) === 'html' && (preNode === null || preNode === void 0 ? void 0 : preNode.otherProps) ? preNode === null || preNode === void 0 ? void 0 : preNode.otherProps : parserConfig || {};
    var tableHeader = table === null || table === void 0 ? void 0 : (_table_children = table.children) === null || _table_children === void 0 ? void 0 : _table_children.at(0);
    var columns = (tableHeader === null || tableHeader === void 0 ? void 0 : (_tableHeader_children = tableHeader.children) === null || _tableHeader_children === void 0 ? void 0 : _tableHeader_children.map(function(node) {
        var _myRemark_stringify;
        return (_myRemark_stringify = myRemark.stringify({
            type: 'root',
            children: [
                node
            ]
        })) === null || _myRemark_stringify === void 0 ? void 0 : _myRemark_stringify.replace(/\n/g, '').trim();
    }).map(function(title) {
        // 先规范化字段名，统一处理转义字符
        var normalizedTitle = normalizeFieldName(title || ' ');
        return normalizedTitle;
    }).map(function(title, index) {
        if (keyMap.has(title)) {
            keyMap.set(title, keyMap.get(title) + '_' + index);
            return {
                title: title,
                dataIndex: title + '_' + index,
                key: title + '_' + index
            };
        }
        keyMap.set(title, title);
        return {
            title: title,
            dataIndex: title,
            key: title
        };
    })) || [];
    var dataSource = (table === null || table === void 0 ? void 0 : (_table_children1 = table.children) === null || _table_children1 === void 0 ? void 0 : (_table_children_slice = _table_children1.slice(1)) === null || _table_children_slice === void 0 ? void 0 : _table_children_slice.map(function(row) {
        var _row_children;
        return (_row_children = row.children) === null || _row_children === void 0 ? void 0 : _row_children.reduce(function(acc, cell, index) {
            var _myRemark_stringify_replace_replace_replace, _myRemark_stringify_replace_replace, _myRemark_stringify_replace, _myRemark_stringify;
            // 如果数据列数超出表头列数，舍弃多余的数据
            if (index >= columns.length) {
                return acc;
            }
            acc[columns[index].dataIndex] = (_myRemark_stringify = myRemark.stringify({
                type: 'root',
                children: [
                    cell
                ]
            })) === null || _myRemark_stringify === void 0 ? void 0 : (_myRemark_stringify_replace = _myRemark_stringify.replace(/\n/g, '')) === null || _myRemark_stringify_replace === void 0 ? void 0 : (_myRemark_stringify_replace_replace = _myRemark_stringify_replace.replace(/\\(?=")/g, '')) === null || _myRemark_stringify_replace_replace === void 0 ? void 0 : (_myRemark_stringify_replace_replace_replace = _myRemark_stringify_replace_replace.replace(/\\_/g, '')) === null || _myRemark_stringify_replace_replace_replace === void 0 ? void 0 : _myRemark_stringify_replace_replace_replace.trim();
            return acc;
        }, {});
    })) || [];
    if ((_table_align = table.align) === null || _table_align === void 0 ? void 0 : _table_align.every(function(item) {
        return !item;
    })) {
        var aligns = getColumnAlignment(dataSource, columns);
        table.align = aligns;
    }
    var aligns1 = table.align;
    /**
   * 将对象转换为数组（处理 {0: {...}, 1: {...}} 这种错误格式）
   * @param obj - 要转换的对象
   * @returns 转换后的数组，如果不是数字键对象则返回原对象
   */ var convertObjectToArray = function(obj) {
        if (!obj || (typeof obj === "undefined" ? "undefined" : _type_of(obj)) !== 'object' || Array.isArray(obj)) {
            return obj;
        }
        var keys = Object.keys(obj);
        // 检查是否所有键都是数字字符串（如 "0", "1", "2"）
        var allNumericKeys = keys.length > 0 && keys.every(function(key) {
            return /^\d+$/.test(key);
        });
        if (allNumericKeys) {
            // 按数字顺序排序并转换为数组
            var sortedKeys = keys.sort(function(a, b) {
                return parseInt(a, 10) - parseInt(b, 10);
            });
            return sortedKeys.map(function(key) {
                return obj[key];
            });
        }
        return obj;
    };
    // 如果 config 对象包含 config 属性（数组格式的配置），使用它
    // 否则使用 config 本身（对象格式的配置）
    var chartConfig = Array.isArray(config === null || config === void 0 ? void 0 : config.config) ? config.config : (config === null || config === void 0 ? void 0 : config.config) || config;
    // 如果 chartConfig 是对象且键都是数字（如 {0: {...}}），转换为数组
    chartConfig = convertObjectToArray(chartConfig);
    // 获取 chartType，支持多种配置格式
    var getChartType = function() {
        var _chartConfig_, _config_at, _config_at1;
        return (chartConfig === null || chartConfig === void 0 ? void 0 : chartConfig.chartType) || Array.isArray(chartConfig) && (chartConfig === null || chartConfig === void 0 ? void 0 : (_chartConfig_ = chartConfig[0]) === null || _chartConfig_ === void 0 ? void 0 : _chartConfig_.chartType) || (config === null || config === void 0 ? void 0 : config.chartType) || (config === null || config === void 0 ? void 0 : (_config_at1 = config.at) === null || _config_at1 === void 0 ? void 0 : (_config_at = _config_at1.call(config, 0)) === null || _config_at === void 0 ? void 0 : _config_at.chartType);
    };
    var chartType = getChartType();
    // 如果 chartType 为 "table"，将其视为不存在，按普通表格处理
    var isChart = chartType && chartType !== 'table';
    // 计算合并单元格信息
    var mergeCells = (config === null || config === void 0 ? void 0 : config.mergeCells) || [];
    // 创建合并单元格映射，用于快速查找
    var mergeMap = new Map();
    mergeCells === null || mergeCells === void 0 ? void 0 : mergeCells.forEach(function(param) {
        var row = param.row, col = param.col, rowSpan = param.rowSpan, rowspan = param.rowspan, colSpan = param.colSpan, colspan = param.colspan;
        var rawRowSpan = rowSpan || rowspan;
        var rawColSpan = colSpan || colspan;
        // 主单元格
        mergeMap.set("".concat(row, "-").concat(col), {
            rowSpan: rawRowSpan,
            colSpan: rawColSpan
        });
        // 被合并的单元格标记为隐藏
        for(var r = row; r < row + rawRowSpan; r++){
            for(var c = col; c < col + rawColSpan; c++){
                if (r !== row || c !== col) {
                    mergeMap.set("".concat(r, "-").concat(c), {
                        rowSpan: 1,
                        colSpan: 1,
                        hidden: true
                    });
                }
            }
        }
    });
    var children = table.children.map(function(r, l) {
        return {
            type: 'table-row',
            align: (aligns1 === null || aligns1 === void 0 ? void 0 : aligns1[l]) || undefined,
            children: r.children.map(function(c, i) {
                var _c_children;
                var mergeInfo = mergeMap.get("".concat(l, "-").concat(i));
                return _object_spread_props(_object_spread({
                    type: 'table-cell',
                    align: (aligns1 === null || aligns1 === void 0 ? void 0 : aligns1[i]) || undefined,
                    title: l === 0,
                    rows: l,
                    cols: i
                }, (mergeInfo === null || mergeInfo === void 0 ? void 0 : mergeInfo.rowSpan) && mergeInfo.rowSpan > 1 ? {
                    rowSpan: mergeInfo.rowSpan
                } : {}, (mergeInfo === null || mergeInfo === void 0 ? void 0 : mergeInfo.colSpan) && mergeInfo.colSpan > 1 ? {
                    colSpan: mergeInfo.colSpan
                } : {}, (mergeInfo === null || mergeInfo === void 0 ? void 0 : mergeInfo.hidden) ? {
                    hidden: true
                } : {}), {
                    children: ((_c_children = c.children) === null || _c_children === void 0 ? void 0 : _c_children.length) ? [
                        {
                            type: 'paragraph',
                            children: parseNodes(c.children, plugins, false, c, parserConfig)
                        }
                    ] : [
                        {
                            type: 'paragraph',
                            children: [
                                {
                                    text: ''
                                }
                            ]
                        }
                    ]
                });
            })
        };
    });
    var otherProps = _object_spread_props(_object_spread({}, isChart ? {
        config: chartConfig
    } : config), {
        columns: columns,
        dataSource: dataSource.map(function(item) {
            item === null || item === void 0 ? true : delete item.chartType;
            return _object_spread({}, item);
        })
    });
    var node = _object_spread_props(_object_spread({
        type: isChart ? 'chart' : 'table'
    }, table.finished !== undefined && {
        finished: table.finished
    }), {
        children: children,
        otherProps: otherProps
    });
    return EditorUtils.wrapperCardNode(node);
};
/**
 * 预处理 Markdown 表格换行符
 * @param markdown - 原始 Markdown 字符串
 * @returns 处理后的 Markdown 字符串
 */ export var preprocessMarkdownTableNewlines = function(markdown) {
    // 检查是否包含表格
    if (!tableRegex.test(markdown)) return markdown; // 如果没有表格，直接返回原始字符串
    // 处理表格结尾的换行符：
    // 1. 如果只有一个换行符，改成两个
    // 2. 如果有两个以上换行符，改成两个
    // 3. 如果已经是两个换行符，保持不变
    var processedMarkdown = markdown.replace(/(\|[^|\n]*\|)\n(?!\n|\|)/g, '$1\n\n').replace(/(\|[^|\n]*\|)\n{3,}(?!\|)/g, '$1\n\n');
    // 如果包含表格，处理换行符
    return processedMarkdown === null || processedMarkdown === void 0 ? void 0 : processedMarkdown.split('\n\n').map(function(line) {
        if (line.includes('```')) return line; // 如果包含代码块，直接返回原始字符串
        // 检查是否包含表格
        if (!tableRegex.test(line)) return line; // 如果没有表格，直接返回原始字符串
        // 匹配所有表格的行（确保我们在表格行内匹配换行符）
        return line.replace(/\|([^|]+)\|/g, function(match) {
            var _match_replaceAll;
            if (((_match_replaceAll = match.replaceAll('\n', '')) === null || _match_replaceAll === void 0 ? void 0 : _match_replaceAll.length) < MIN_TABLE_CELL_LENGTH) return match;
            // 只替换每个表格单元格内的换行符
            return match.split('\n').join('<br>');
        });
    }).join('\n\n');
};
