import * as fs from 'fs'; import * as path from 'path'; /** * Extract relevant HTML snippets from large iRacing HTML files for selector verification. * Focuses on Steps 8-12 (Cars and Track sections). */ const FILES_TO_EXTRACT = [ '08-set-cars.html', '09-add-a-car.html', '11-set-track.html', '12-add-a-track.html' ]; const PATTERNS_TO_FIND = [ // Step 8: Add Car button patterns /id="set-cars"[\s\S]{0,5000}/i, /]*btn[^>]*icon-plus[\s\S]{0,500}<\/a>/gi, /]*>Add[\s\S]{0,200}<\/button>/gi, // Step 9: Add Car modal patterns /id="add-car-modal"[\s\S]{0,5000}/i, /]*modal[\s\S]{0,3000}Car[\s\S]{0,3000}<\/div>/gi, /placeholder="Search"[\s\S]{0,500}/gi, /]*btn-primary[^>]*>Select[\s\S]{0,200}<\/a>/gi, // Step 11: Add Track button patterns /id="set-track"[\s\S]{0,5000}/i, /]*btn[^>]*icon-plus[\s\S]{0,500}Track[\s\S]{0,500}<\/a>/gi, // Step 12: Add Track modal patterns /id="add-track-modal"[\s\S]{0,5000}/i, /]*modal[\s\S]{0,3000}Track[\s\S]{0,3000}<\/div>/gi, ]; interface ExtractedSnippet { file: string; pattern: string; snippet: string; lineNumber?: number; } async function extractSnippets(): Promise { const sourceDir = path.join(process.cwd(), 'resources/iracing-hosted-sessions'); const outputDir = path.join(process.cwd(), 'debug-screenshots'); // Ensure output directory exists if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } const allSnippets: ExtractedSnippet[] = []; for (const fileName of FILES_TO_EXTRACT) { const filePath = path.join(sourceDir, fileName); console.log(`Processing ${fileName}...`); // Read file in chunks to avoid memory issues const content = fs.readFileSync(filePath, 'utf-8'); const fileSize = content.length; console.log(` File size: ${(fileSize / 1024 / 1024).toFixed(2)} MB`); // Extract snippets for each pattern for (const pattern of PATTERNS_TO_FIND) { const matches = content.match(pattern); if (matches) { for (const match of matches) { const lineNumber = content.substring(0, content.indexOf(match)).split('\n').length; allSnippets.push({ file: fileName, pattern: pattern.source, snippet: match.substring(0, 1000), // Limit snippet size lineNumber }); } } } console.log(` Found ${allSnippets.filter(s => s.file === fileName).length} snippets`); } // Write results to file const outputPath = path.join(outputDir, 'selector-snippets-extraction.json'); fs.writeFileSync( outputPath, JSON.stringify(allSnippets, null, 2), 'utf-8' ); console.log(`\nExtracted ${allSnippets.length} total snippets to ${outputPath}`); // Also create a readable report const reportPath = path.join(outputDir, 'selector-snippets-report.md'); let report = '# Selector Snippets Extraction Report\n\n'; for (const file of FILES_TO_EXTRACT) { const fileSnippets = allSnippets.filter(s => s.file === file); report += `## ${file}\n\n`; report += `Found ${fileSnippets.length} snippets\n\n`; for (const snippet of fileSnippets) { report += `### Pattern: \`${snippet.pattern.substring(0, 50)}...\`\n\n`; report += `Line ${snippet.lineNumber}\n\n`; report += '```html\n'; report += snippet.snippet; report += '\n```\n\n'; } } fs.writeFileSync(reportPath, report, 'utf-8'); console.log(`Readable report written to ${reportPath}`); } extractSnippets().catch(console.error);