|
344 | 344 | } |
345 | 345 |
|
346 | 346 | async function load() { |
347 | | - const files = ['site.json', 'members.json', 'events.json', 'projects.json', 'posts.json']; |
| 347 | + const files = ['site.json', 'members.jsonc', 'events.json', 'projects.json', 'posts.json']; |
348 | 348 | try { |
349 | 349 | const results = await Promise.all(files.map(async (file) => { |
350 | 350 | const response = await fetch(`data/${file}`); |
351 | 351 | if (!response.ok) throw new Error(`${file}: ${response.status}`); |
352 | | - return response.json(); |
| 352 | + return parseJsonc(await response.text()); |
353 | 353 | })); |
354 | 354 | [state.site, state.members, state.events, state.projects, state.posts] = results; |
355 | 355 | state.members = Array.isArray(state.members) ? state.members : []; |
|
364 | 364 | } |
365 | 365 | } |
366 | 366 |
|
| 367 | + function parseJsonc(content) { |
| 368 | + let output = ''; |
| 369 | + let inString = false; |
| 370 | + let escaped = false; |
| 371 | + |
| 372 | + for (let index = 0; index < content.length; index += 1) { |
| 373 | + const character = content[index]; |
| 374 | + const nextCharacter = content[index + 1]; |
| 375 | + |
| 376 | + if (inString) { |
| 377 | + output += character; |
| 378 | + if (escaped) escaped = false; |
| 379 | + else if (character === '\\') escaped = true; |
| 380 | + else if (character === '"') inString = false; |
| 381 | + continue; |
| 382 | + } |
| 383 | + |
| 384 | + if (character === '"') { |
| 385 | + inString = true; |
| 386 | + output += character; |
| 387 | + } else if (character === '/' && nextCharacter === '/') { |
| 388 | + while (index < content.length && content[index] !== '\n') index += 1; |
| 389 | + output += '\n'; |
| 390 | + } else if (character === '/' && nextCharacter === '*') { |
| 391 | + index += 2; |
| 392 | + while (index < content.length && !(content[index] === '*' && content[index + 1] === '/')) index += 1; |
| 393 | + index += 1; |
| 394 | + } else { |
| 395 | + output += character; |
| 396 | + } |
| 397 | + } |
| 398 | + |
| 399 | + return JSON.parse(output); |
| 400 | + } |
| 401 | + |
367 | 402 | byId('language-toggle').addEventListener('click', () => { lang = lang === 'pt' ? 'en' : 'pt'; render(); }); |
368 | 403 | load(); |
369 | 404 | })(); |
0 commit comments