-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest-parser.js
More file actions
137 lines (116 loc) · 3.91 KB
/
test-parser.js
File metadata and controls
137 lines (116 loc) · 3.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// Test script to validate the rules parsing
const fs = require('fs');
const path = require('path');
// Copy the parsing function from the API route
function parseRules(content) {
const lines = content.split('\n');
const rules = [];
let currentRule = null;
let currentContent = [];
for (let i = 0; i < lines.length; i++) {
const line = lines[i].trim();
// Match rule headers like "702.19. Trample" or "101. The Magic Golden Rules"
const ruleHeaderMatch = line.match(/^(\d+(?:\.\d+)?)\.\s+(.+)$/);
if (ruleHeaderMatch) {
// Save previous rule if it exists
if (currentRule) {
currentRule.content = currentContent.join('\n').trim();
if (currentRule.content) {
rules.push(currentRule);
}
}
// Start new rule
currentRule = {
id: ruleHeaderMatch[1],
title: `${ruleHeaderMatch[1]}. ${ruleHeaderMatch[2]}`,
content: ''
};
currentContent = [];
} else if (currentRule && line) {
// Add content to current rule
currentContent.push(line);
// Look ahead to see if we're about to hit another main rule
const nextLineIndex = i + 1;
if (nextLineIndex < lines.length) {
const nextLine = lines[nextLineIndex].trim();
const isNextRuleHeader = nextLine.match(/^(\d+(?:\.\d+)?)\.\s+(.+)$/);
// If the next line starts a new main rule (3 digits), save current rule
if (isNextRuleHeader && nextLine.match(/^\d{3}\.\s+/)) {
currentRule.content = currentContent.join('\n').trim();
if (currentRule.content) {
rules.push(currentRule);
}
currentRule = null;
currentContent = [];
}
}
}
}
// Don't forget the last rule
if (currentRule) {
currentRule.content = currentContent.join('\n').trim();
if (currentRule.content) {
rules.push(currentRule);
}
}
return rules;
}
function searchRules(rules, query) {
const searchTerm = query.toLowerCase().trim();
if (!searchTerm) return [];
const results = [];
for (const rule of rules) {
let relevance = 0;
const titleLower = rule.title.toLowerCase();
const contentLower = rule.content.toLowerCase();
// High relevance for title matches
if (titleLower.includes(searchTerm)) {
relevance += 10;
}
// Medium relevance for content matches
if (contentLower.includes(searchTerm)) {
relevance += 1;
}
// Extra relevance for exact word matches
const wordBoundaryRegex = new RegExp(`\\b${searchTerm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`, 'i');
if (wordBoundaryRegex.test(rule.title)) {
relevance += 20;
}
if (wordBoundaryRegex.test(rule.content)) {
relevance += 5;
}
if (relevance > 0) {
results.push({ ...rule, relevance });
}
}
// Sort by relevance and return top 5 results
return results
.sort((a, b) => b.relevance - a.relevance)
.slice(0, 5)
.map((result) => ({
id: result.id,
title: result.title,
content: result.content
}));
}
// Test the parsing
const rulesPath = path.join(__dirname, 'RULES.txt');
const rulesContent = fs.readFileSync(rulesPath, 'utf-8');
const rules = parseRules(rulesContent);
console.log(`Parsed ${rules.length} rules`);
// Test search for trample
const trampleResults = searchRules(rules, 'trample');
console.log('\nTrample search results:');
trampleResults.forEach((result, index) => {
console.log(`${index + 1}. ${result.title}`);
console.log(`Content preview: ${result.content.substring(0, 100)}...`);
console.log('---');
});
// Test search for flying
const flyingResults = searchRules(rules, 'flying');
console.log('\nFlying search results:');
flyingResults.forEach((result, index) => {
console.log(`${index + 1}. ${result.title}`);
console.log(`Content preview: ${result.content.substring(0, 100)}...`);
console.log('---');
});