Files
dwroller/scripts/search-keywords.js
Alex caf8a03553 feat: Add scripts for upserting and validating bestiary data
- Implemented `upsert-allewis-from-5001.js` to fetch and update Allewis data from API.
- Created `upsert-missing-movement-from-5001.js` to fill missing movement and wounds data from API.
- Developed `upsert-missing-movement-from-pdfs.js` to extract movement and wounds from PDF text.
- Added `upsert-missing-profiles-from-pdfs.js` to fill missing profiles from PDF data.
- Introduced `upsert-missing-wounds-from-pdfs.js` to update wounds data from PDF sources.
- Created `validate-bestiary.js` to validate the structure of the bestiary JSON.
- Updated `BestiaryTab.jsx` component to display bestiary data with improved structure and search functionality.
- Added tests for `BestiaryTab` to ensure proper rendering and functionality.
2025-08-17 16:21:00 +02:00

35 lines
1.4 KiB
JavaScript

const fs = require('fs').promises;
const path = require('path');
const pdf = require('pdf-parse');
async function search(){
const dataDir = path.resolve(__dirname, '../data');
const outFile = path.resolve(__dirname, '../database/search-keywords.json');
const files = await fs.readdir(dataDir);
const pdfs = files.filter(f => f.toLowerCase().endsWith('.pdf'));
const keywords = ['alexei','drahj','transpired','transpired alteration','ryza','plasma pistol','custom ryza','xeno-filament','transpired circle'];
const results = [];
for(const pdfName of pdfs){
const filePath = path.join(dataDir, pdfName);
try{
const data = await fs.readFile(filePath);
const parsed = await pdf(data);
const text = parsed.text || '';
const pages = text.split('\f');
for(let i=0;i<pages.length;i++){
const pageText = pages[i];
const lower = pageText.toLowerCase();
for(const kw of keywords){
if(lower.includes(kw)){
results.push({pdf:pdfName,pageIndex:i,pageNumberApprox:i+1,keyword:kw,snippet: pageText.trim().slice(0,800).replace(/\s+/g,' ')});
}
}
}
}catch(err){ console.error('err', pdfName, err.message); }
}
await fs.writeFile(outFile, JSON.stringify({generatedAt: new Date().toISOString(), matches: results}, null, 2));
console.log('Wrote', outFile, 'matches:', results.length);
}
search().catch(err=>{ console.error(err); process.exit(2); });