import type { SourceExtractor } from '../domain/source-extraction'; function safeId(value: string): string { return value.replace(/[^a-zA-Z0-9_-]/g, '-'); } export const genericTableSourceExtractor: SourceExtractor = { id: 'generic-table-source-extractor', version: '1.0.0', fallback: true, detect(document) { const count = document.tables.length; return count ? { score: 0.1, evidence: [`${count} kompatible Tabellenansicht(en) vorhanden.`] } : { score: 0, evidence: [] }; }, extract(document) { const candidates = document.tables.flatMap(table => { const header = table.headerCandidates[0]; return table.rows .filter(row => row.index !== header?.rowIndex && row.cells.some(cell => cell.decodedValue.trim())) .map(row => ({ version: 1 as const, id: `candidate-${safeId(table.id)}-${row.index}`, source: { fileName: document.file.name, tableIndex: table.index, rowIndex: row.index }, fields: row.cells.map(cell => ({ key: `column-${cell.source.columnIndex ?? 0}`, label: header?.headers[cell.source.columnIndex ?? 0] || `Spalte ${(cell.source.columnIndex ?? 0) + 1}`, originalValue: cell.rawValue, decodedValue: cell.decodedValue, source: { ...cell.source, fileName: document.file.name } })) })); }); return { version: 1, candidates, diagnostics: [] }; } };