diff --git a/app.js b/app.js index 1a01eab..96d73b2 100644 --- a/app.js +++ b/app.js @@ -16,6 +16,7 @@ let countdown = 0; let serverLastFetch = null; let laraColor = null; let currentMoveIndex = -1; +let userSelectedGame = false; /** * Lädt die PGN-Datei und aktualisiert die Anzeige @@ -46,11 +47,11 @@ async function loadPGN() { return; } - // Finde die aktuelle/live Partie - const liveGame = getLiveGame(allLaraGames); - const targetGame = liveGame || getLatestGame(allLaraGames); - - currentGame = targetGame; + // Nur automatisch wechseln, wenn der Benutzer keine andere Partie ausgewählt hat + if (!userSelectedGame) { + const liveGame = getLiveGame(allLaraGames); + currentGame = liveGame || getLatestGame(allLaraGames); + } updateBoard(); updatePlayerInfo(); updateMovesList(); @@ -306,6 +307,7 @@ function updateAllGamesList() { `; entry.addEventListener('click', () => { + userSelectedGame = true; currentGame = game; updateBoard(); updatePlayerInfo(); diff --git a/pgn-parser.js b/pgn-parser.js index 7352c49..e02b315 100644 --- a/pgn-parser.js +++ b/pgn-parser.js @@ -66,21 +66,43 @@ function parseGameBlock(block) { function parseMoves(movesText) { const moves = []; - // Remove comments in curly braces - movesText = movesText.replace(/\{[^}]*\}/g, ''); + let clockWhite = null; + let clockBlack = null; + let color = 'w'; - // Remove move numbers - movesText = movesText.replace(/\d+\.\s*/g, ''); + const tokenRegex = /\d+\.\s*|\{[^}]*\}|\S+/g; + const tokens = movesText.match(tokenRegex) || []; - // Split into individual moves - const tokens = movesText.split(/\s+/).filter(t => t.trim()); - - for (const token of tokens) { + for (let i = 0; i < tokens.length; i++) { + let token = tokens[i].trim(); + if (['1-0', '0-1', '1/2-1/2', '*'].includes(token)) { - moves.push({ san: token, isResult: true }); - } else if (token.length > 0) { - moves.push({ san: token, isResult: false }); + moves.push({ san: token, isResult: true, whiteClock: clockWhite, blackClock: clockBlack }); + continue; } + + if (/^\d+\.$/.test(token)) continue; + + if (token.startsWith('{')) { + const clkMatch = token.match(/\[%clk\s+([\d:]+)\]/); + if (clkMatch && moves.length > 0) { + const lastMove = moves[moves.length - 1]; + if (!lastMove.isResult && lastMove.color) { + if (lastMove.color === 'w') { + clockWhite = clkMatch[1]; + } else { + clockBlack = clkMatch[1]; + } + lastMove.whiteClock = clockWhite; + lastMove.blackClock = clockBlack; + } + } + continue; + } + + const move = { san: token, isResult: false, whiteClock: clockWhite, blackClock: clockBlack, color }; + moves.push(move); + color = color === 'w' ? 'b' : 'w'; } return moves;