Update smart-indexer.js

This commit is contained in:
2025-12-07 21:06:40 +08:00
committed by GitHub
parent 24ee90df1d
commit 6bdaa9b029

View File

@@ -1,36 +1,35 @@
export function generateIndex(data, role, tableName = "") { export function generateIndex(data, headers, role, tableName = "") {
if (!Array.isArray(data) || data.length === 0) { if (!Array.isArray(data) || data.length === 0 || !Array.isArray(headers) || headers.length === 0) {
return ""; return "";
} }
const headers = Object.keys(data[0]); const indexColumnIndices = identifyIndexColumns(data, headers);
if (headers.length === 0) return ""; const indexColumnHeaders = indexColumnIndices.map(i => headers[i]);
const indexColumns = identifyIndexColumns(data, headers);
let indexLines = []; let indexLines = [];
indexLines.push(`| ${indexColumns.join(' | ')} |`); indexLines.push(`| ${indexColumnHeaders.join(' | ')} |`);
indexLines.push(`| ${indexColumns.map(() => '---').join(' | ')} |`); indexLines.push(`| ${indexColumnHeaders.map(() => '---').join(' | ')} |`);
let processedData = [...data]; let processedData = [...data];
const firstColKey = headers[0]; const firstColIndex = 0;
const firstColVal = data[0] ? data[0][firstColKey] : ''; const firstColHeader = headers[firstColIndex];
const isIndexCol = (firstColKey && (firstColKey.includes('索引') || firstColKey.includes('Index'))) || const firstColVal = data[0] ? data[0][firstColIndex] : '';
const isIndexCol = (firstColHeader && (firstColHeader.includes('索引') || firstColHeader.includes('Index'))) ||
(typeof firstColVal === 'string' && /^\s*M\d+/.test(firstColVal)) || (typeof firstColVal === 'string' && /^\s*M\d+/.test(firstColVal)) ||
(tableName && (tableName.includes('总结') || tableName.includes('大纲'))); (tableName && (tableName.includes('总结') || tableName.includes('大纲')));
if (isIndexCol) { if (isIndexCol) {
processedData.sort((a, b) => { processedData.sort((a, b) => {
const valA = String(a[firstColKey] || ''); const valA = String(a[firstColIndex] || '');
const valB = String(b[firstColKey] || ''); const valB = String(b[firstColIndex] || '');
return valA.localeCompare(valB, undefined, { numeric: true }); return valA.localeCompare(valB, undefined, { numeric: true });
}); });
} }
for (const row of processedData) { for (const row of processedData) {
const lineParts = indexColumns.map(col => { const lineParts = indexColumnIndices.map(colIndex => {
let val = row[col]; let val = row[colIndex];
if (val === undefined || val === null) return ""; if (val === undefined || val === null) return "";
val = String(val).trim(); val = String(val).trim();
if (val.length > 15) val = val.substring(0, 12) + "..."; if (val.length > 15) val = val.substring(0, 12) + "...";
@@ -43,19 +42,20 @@ export function generateIndex(data, role, tableName = "") {
} }
function identifyIndexColumns(data, headers) { function identifyIndexColumns(data, headers) {
if (headers.length <= 2) return headers; if (headers.length <= 2) return headers.map((_, i) => i);
const candidates = []; const candidates = [];
const maxColumns = 3; const maxColumns = 3;
for (const header of headers) { for (let i = 0; i < headers.length; i++) {
if (candidates.length >= maxColumns) break; if (candidates.length >= maxColumns) break;
const header = headers[i];
let totalLen = 0; let totalLen = 0;
let count = 0; let count = 0;
for (const row of data) { for (const row of data) {
if (row[header]) { if (row[i]) {
totalLen += String(row[header]).length; totalLen += String(row[i]).length;
count++; count++;
} }
} }
@@ -65,12 +65,12 @@ function identifyIndexColumns(data, headers) {
const isBlacklisted = /desc|bio|detail|history|经历|描述|详情/i.test(header); const isBlacklisted = /desc|bio|detail|history|经历|描述|详情/i.test(header);
if (!isLongText && !isBlacklisted) { if (!isLongText && !isBlacklisted) {
candidates.push(header); candidates.push(i);
} }
} }
if (candidates.length === 0) { if (candidates.length === 0) {
return headers.slice(0, Math.min(headers.length, maxColumns)); return headers.map((_, i) => i).slice(0, Math.min(headers.length, maxColumns));
} }
return candidates; return candidates;