38 lines
1.4 KiB
TypeScript
38 lines
1.4 KiB
TypeScript
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: [] };
|
|
}
|
|
};
|