| 50 | }; |
| 51 | |
| 52 | export function loadCorpus(dir: string): Corpus { |
| 53 | const corpusDir = path.join(dir, 'corpus'); |
| 54 | const entries: Entry[] = []; |
| 55 | const topics: string[] = []; |
| 56 | for (const file of fs.readdirSync(corpusDir).sort()) { |
| 57 | if (!file.endsWith('.json')) continue; |
| 58 | const data = JSON.parse(fs.readFileSync(path.join(corpusDir, file), 'utf8')); |
| 59 | topics.push(data.topic); |
| 60 | for (const e of data.entries) entries.push({ ...e, topic: data.topic }); |
| 61 | } |
| 62 | // Deterministic global order (ids are unique across topics) |
| 63 | entries.sort((a, b) => a.id.localeCompare(b.id)); |
| 64 | const declarations: Declarations = JSON.parse( |
| 65 | fs.readFileSync(path.join(dir, 'declarations.json'), 'utf8') |
| 66 | ); |
| 67 | return { entries, declarations, topics }; |
| 68 | } |
| 69 | |
| 70 | /** |
| 71 | * Compatibility re-declarations: heads (CE built-ins or declarations.json |