-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
111 lines (98 loc) · 3.9 KB
/
script.js
File metadata and controls
111 lines (98 loc) · 3.9 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
let saintData = {};
let saintIndex = [];
let foundKey = [];
const today = document.getElementById('today');
const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
const d = new Date();
const todaysDate = d.getUTCDate().toString().padStart(2, '0') + ' ' + months[d.getUTCMonth()];
const trailingDatePattern = /-\d{1,2}-(january|february|march|april|may|june|july|august|september|october|november|december)$/i;
function normalizeNameSlug(name) {
return name.replace(trailingDatePattern, '');
}
function capitalize(str) {
str = str.replace(/\b\w+\b/g, word => {
if (/^(M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$/i.test(word)) {
return word.toUpperCase();
}
return word;
});
str = str.replace(/\b\w/g, char => char.toUpperCase());
return str;
}
function suggestMatches(input) {
const normalized = input.toLowerCase();
return saintIndex
.filter(entry => entry.name.includes(normalized) || normalized.includes(entry.name));
}
async function parse() {
const res = await fetch('novena.csv');
const csv = await res.text();
csv.trim().split('\n').forEach(line => {
const [name, feast, start_date, end_date, leap_start, leap_end] = line.split(',');
const normalizedName = normalizeNameSlug(name);
const key = name.toLowerCase();
const displayname = capitalize(normalizedName).replace(/-/g, ' ');
if (start_date === todaysDate) {
foundKey.push(key)
}
saintData[key] = { displayname, feast, start_date, end_date, leap_start, leap_end };
saintIndex.push({
key,
display: normalizedName.replace(/-/g, ' '),
name: normalizedName.replace(/-/g, ' ')
});
});
}
async function load() {
await parse();
renderSaintInfo(today, foundKey);
}
document.getElementById('search').addEventListener('keydown', e => {
if (e.key === 'Enter') {
const query = e.target.value.trim().toLowerCase().replace(/\s+/g, '-');
const exact = saintData[query];
const output = document.getElementById('result');
if (exact) {
renderSaintInfo(output, exact);
} else {
const matches = suggestMatches(e.target.value.trim());
if (matches.length === 1) {
renderSaintInfo(output, saintData[matches[0].key]);
} else if (matches.length > 1) {
output.innerHTML = `<strong>Did you mean:</strong><ul>` +
matches.map(entry => `<li onclick="handleSuggestionClick('${entry.key}')">${entry.display}</li>`).join('') +
`</ul>`;
} else {
output.textContent = 'Saint not found.';
}
}
}
});
function renderSaintInfo(output, result) {
if (Array.isArray(result)) {
output.innerHTML = `<strong>Novenas you can start today:</strong><br>`
for (let i = 0; i < result.length; i++) {
today.innerHTML += `${saintData[result[i]].displayname}<br>`
}
today.innerHTML += `
<strong>Feast Day:</strong> ${saintData[result[0]].feast}<br>
<strong>Novena Starts:</strong> ${saintData[result[0]].start_date}<br>
<strong>Novena Ends:</strong> ${saintData[result[0]].end_date}` +
(saintData[result[0]].leap_start ? `<br><strong>Leap Year start:</strong> ${saintData[result[0]].leap_start}<br>
<strong>Leap Year end:</strong> ${saintData[result[0]].leap_end}` : '');
} else {
output.innerHTML = `
${result.displayname}<br>
<strong>Feast Day:</strong> ${result.feast}<br>
<strong>Novena Starts:</strong> ${result.start_date}<br>
<strong>Novena Ends:</strong> ${result.end_date}` +
(result.leap_start ? `<br><strong>Leap Year start:</strong> ${result.leap_start}<br>
<strong>Leap Year end:</strong> ${result.leap_end}` : '');
}
}
function handleSuggestionClick(key) {
const saint = saintData[key];
const output = document.getElementById('result');
if (saint) renderSaintInfo(output, saint);
}
load();