diff --git a/src/panel/webview.ts b/src/panel/webview.ts index 0d7d1ab..75fdc58 100644 --- a/src/panel/webview.ts +++ b/src/panel/webview.ts @@ -12,8 +12,8 @@ interface PanelMessage { origin?: 'hover' | 'panel'; } -function esc(str: string): string { - return str.replace(/&/g, '&').replace(//g, '"').replace(/"/g, '"'); +export function esc(str: string): string { + return str.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } function svgIcon(): string { diff --git a/src/rules/converters/excel-converter.ts b/src/rules/converters/excel-converter.ts index e58c354..9d2cbb3 100644 --- a/src/rules/converters/excel-converter.ts +++ b/src/rules/converters/excel-converter.ts @@ -6,8 +6,8 @@ import { buildSystemPrompt } from './prompt-builder'; import type { CustomRule } from '../../types'; import { t } from '../../i18n/messages'; -function buildMarkdownTable(rows: Record[], sheetName: string): string { - const keys = Object.keys(rows[0]); +export function buildMarkdownTable(rows: Record[], sheetName: string): string { + const keys = [...new Set(rows.flatMap(row => Object.keys(row)))]; const header = `| ${keys.join(' | ')} |`; const separator = `| ${keys.map(() => '---').join(' | ')} |`; const dataLines = rows.map(row => { @@ -17,6 +17,20 @@ function buildMarkdownTable(rows: Record[], sheetName: string): return [`## ${sheetName}`, header, separator, ...dataLines].join('\n'); } +export function renderWorkbookToMarkdown(workbook: XLSX.WorkBook): string | null { + const parts: string[] = []; + for (const sheetName of workbook.SheetNames) { + const sheet = workbook.Sheets[sheetName]; + if (!sheet) { continue; } + const rows = XLSX.utils.sheet_to_json>(sheet); + if (rows.length === 0) { + continue; + } + parts.push(buildMarkdownTable(rows, sheetName)); + } + return parts.length === 0 ? null : parts.join('\n\n'); +} + export class ExcelConverter implements RuleConverter { supportedExtensions = ['.xlsx', '.xls']; @@ -35,30 +49,20 @@ export class ExcelConverter implements RuleConverter { return null; } - let parts: string[]; + let combined: string | null; try { - parts = []; - for (const sheetName of workbook.SheetNames) { - const sheet = workbook.Sheets[sheetName]; - if (!sheet) { continue; } - const rows = XLSX.utils.sheet_to_json>(sheet); - if (rows.length === 0) { - continue; - } - parts.push(buildMarkdownTable(rows, sheetName)); - } + combined = renderWorkbookToMarkdown(workbook); } catch (err) { const msg = err instanceof Error ? err.message : String(err); vscode.window.showErrorMessage(t('import.excelReadFail', { 0: msg })); return null; } - if (parts.length === 0) { + if (combined === null) { vscode.window.showErrorMessage(t('import.excelNoData')); return null; } - const combined = parts.join('\n\n'); return convertContentWithAI(combined, context, buildSystemPrompt('spreadsheet', existingRules)); } } diff --git a/tests/coverage/index.html b/tests/coverage/index.html index 1d28e82..14156a8 100644 --- a/tests/coverage/index.html +++ b/tests/coverage/index.html @@ -23,30 +23,30 @@
- 48.24% + 48.55% Statements - 5570/11546 + 5630/11596
- 77.97% + 78.22% Branches - 524/672 + 546/698
- 43.66% + 44.84% Functions - 155/355 + 161/359
- 48.24% + 48.55% Lines - 5570/11546 + 5630/11596
@@ -95,17 +95,17 @@ src/activation - +
- 14.03% - 122/869 + 14.02% + 122/870 100% 1/1 10% 1/10 - 14.03% - 122/869 + 14.02% + 122/870 @@ -125,32 +125,32 @@ src/ai - -
+ +
- 20.52% - 173/843 - 75.86% - 22/29 - 31.03% - 9/29 - 20.52% - 173/843 + 21.76% + 187/859 + 77.14% + 27/35 + 35.48% + 11/31 + 21.76% + 187/859 src/ai/providers - +
- 97.55% - 239/245 - 83.72% - 36/43 + 97.81% + 268/274 + 87.71% + 50/57 100% - 10/10 - 97.55% - 239/245 + 13/13 + 97.81% + 268/274 @@ -185,17 +185,17 @@ src/fix - -
+ +
- 73.11% - 680/930 - 67.48% - 110/163 - 69.38% - 34/49 - 73.11% - 680/930 + 72.04% + 670/930 + 64.51% + 100/155 + 68.08% + 32/47 + 72.04% + 670/930 @@ -260,17 +260,17 @@ src/panel - -
+ +
- 11.88% - 68/572 + 12.41% + 71/572 100% - 2/2 - 10.52% - 2/19 - 11.88% - 68/572 + 3/3 + 15.78% + 3/19 + 12.41% + 71/572 @@ -290,17 +290,17 @@ src/rules/converters - -
+ +
- 72.69% - 647/890 - 92.85% - 13/14 - 34.48% - 10/29 - 72.69% - 647/890 + 75.05% + 671/894 + 92.59% + 25/27 + 40% + 12/30 + 75.05% + 671/894 @@ -371,7 +371,7 @@