X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=www%2Fjs%2Fremoteglot.js;h=4ea184287805bdf2a201c7017e7b7837fc6f05dd;hp=21a995eea87a4073c7a92062ab8964e069baf340;hb=c94ef784672e9d51359abad6954fd52aef8ec15e;hpb=7695fce9c4cdd2a5070fb5123177405a3d0c27c7 diff --git a/www/js/remoteglot.js b/www/js/remoteglot.js index 21a995e..4ea1842 100644 --- a/www/js/remoteglot.js +++ b/www/js/remoteglot.js @@ -7,7 +7,7 @@ * @type {Number} * @const * @private */ -var SCRIPT_VERSION = 2016032000; +var SCRIPT_VERSION = 2016032201; /** * The current backend URL. @@ -48,6 +48,8 @@ var displayed_analysis_data = null; * name: string, * url: string, * id: string, + * score: =Object, + * result: =string, * }>} * @private */ @@ -644,8 +646,8 @@ var add_pv = function(start_fen, pretty_pv, move_num, toplay, score, start_displ /** * @param {number} line_num - * @param {number=} opt_limit - * @param {boolean=} opt_showlast + * @param {number=} opt_limit If set, show at most this number of moves. + * @param {boolean=} opt_showlast If limit is set, show the last moves instead of the first ones. */ var print_pv = function(line_num, opt_limit, opt_showlast) { var display_line = display_lines[line_num]; @@ -731,7 +733,7 @@ var update_history = function() { } else { $("#history").html( '(collapse) ' + - print_pv(0, 1, 'W')); + print_pv(0)); } } @@ -822,7 +824,11 @@ var update_refutation_lines = function() { var depth_td = document.createElement("td"); tr.appendChild(depth_td); $(depth_td).addClass("depth"); - $(depth_td).text("d" + line['depth']); + if (line['depth'] && line['depth'] >= 0) { + $(depth_td).text("d" + line['depth']); + } else { + $(depth_td).text("—"); + } var pv_td = document.createElement("td"); tr.appendChild(pv_td); @@ -884,13 +890,32 @@ var update_game_list = function(games) { var game_name = document.createTextNode(game['name']); if (game['url'] === backend_url) { + // This game. game_span.appendChild(game_name); + + var score; + if (current_analysis_data['position']['result']) { + score = " (" + current_analysis_data['position']['result'] + ")"; + } else { + score = " (" + format_short_score(current_analysis_data['score']) + ")"; + } + game_span.appendChild(document.createTextNode(score)); } else { + // Some other game. var game_a = document.createElement("a"); game_a.setAttribute("href", "#" + game['id']); game_a.appendChild(game_name); game_span.appendChild(game_a); + + var score; + if (game['result']) { + score = " (" + game['result'] + ")"; + } else { + score = " (" + format_short_score(game['score']) + ")"; + } + game_span.appendChild(document.createTextNode(score)); } + games_div.appendChild(game_span); } } @@ -908,7 +933,7 @@ var possibly_switch_game_from_hash = function() { for (var i = 0; i < current_games.length; ++i) { if (current_games[i]['id'] === hash) { if (backend_url !== current_games[i]['url']) { - switch_backend(current_games[i]['url']); + switch_backend(current_games[i]['url'], current_games[i]['hashurl']); } return; } @@ -937,11 +962,10 @@ var update_board = function() { if (current_data['games']) { current_games = current_data['games']; possibly_switch_game_from_hash(); - update_game_list(current_data['games']); } else { current_games = null; - update_game_list(null); } + update_game_list(current_games); // The headline. Names are always fetched from current_data; // the rest can depend a bit. @@ -1019,8 +1043,10 @@ var update_board = function() { // The contains a very brief headline. var title_elems = []; - if (data['score']) { - title_elems.push(format_short_score(data['score']).replace(/^ /, "")); + if (data['position'] && data['position']['result']) { + title_elems.push(data['position']['result']); + } else if (data['score']) { + title_elems.push(format_short_score(data['score'])); } if (last_move !== null) { title_elems.push(last_move); @@ -1069,7 +1095,7 @@ var update_board = function() { update_clock(); // The score. - if (current_display_line) { + if (current_display_line && !current_display_line_is_history) { if (current_display_line.score) { $("#score").text(format_long_score(current_display_line.score)); } else { @@ -1502,6 +1528,24 @@ var next_move = function() { } window['next_move'] = next_move; +var next_game = function() { + if (current_games === null) { + return; + } + + // Try to find the game we are currently looking at. + for (var game_num = 0; game_num < current_games.length; ++game_num) { + var game = current_games[game_num]; + if (game['url'] === backend_url) { + var next_game_num = (game_num + 1) % current_games.length; + switch_backend(current_games[next_game_num]['url'], current_games[next_game_num]['hashurl']); + return; + } + } + + // Couldn't find it; give up. +} + var update_historic_analysis = function() { if (!current_display_line_is_history) { return; @@ -1797,6 +1841,15 @@ var get_best_move = function(game, source, target, invert) { move_hash[moves[i].san] = moves[i]; } + // See if we're already exploring some line. + if (current_display_line && + current_display_move < current_display_line.pretty_pv.length - 1) { + var first_move = current_display_line.pretty_pv[current_display_move + 1]; + if (move_hash[first_move]) { + return move_hash[first_move]; + } + } + // History and PV take priority over the display lines. for (var i = 0; i < 2; ++i) { var line = display_lines[i]; @@ -1887,14 +1940,6 @@ var onSnapEnd = function(source, target) { } // End of dragging-related code. -var pad = function(val, num_digits) { - var s = val.toString(); - while (s.length < num_digits) { - s = " " + s; - } - return s; -} - var fmt_cp = function(v) { if (v === 0) { return "0.00"; @@ -1912,9 +1957,9 @@ var format_short_score = function(score) { } if (score[0] === 'm') { if (score[2]) { // Is a bound. - return score[2] + "\u00a0M" + pad(score[1], 3); + return score[2] + "\u00a0M " + score[1]; } else { - return "M" + pad(score[1], 3); + return "M " + score[1]; } } else if (score[0] === 'd') { return "TB draw"; @@ -1922,7 +1967,7 @@ var format_short_score = function(score) { if (score[2]) { // Is a bound. return score[2] + "\u00a0" + fmt_cp(score[1]); } else { - return pad(fmt_cp(score[1]), 5); + return fmt_cp(score[1]); } } return null; @@ -1995,7 +2040,7 @@ var compute_score_sort_key = function(score, invert) { /** * @param {string} new_backend_url */ -var switch_backend = function(new_backend_url) { +var switch_backend = function(new_backend_url, new_backend_hash_url) { // Stop looking at historic data. current_display_line = null; current_display_move = null; @@ -2025,6 +2070,7 @@ var switch_backend = function(new_backend_url) { // Request an immediate fetch with the new backend. backend_url = new_backend_url; + backend_hash_url = new_backend_hash_url; current_analysis_data = null; ims = 0; request_update(); @@ -2066,10 +2112,17 @@ var init = function() { redraw_arrows(); }); $(window).keyup(function(event) { - if (event.which == 39) { + if (event.which == 39) { // Left arrow. next_move(); - } else if (event.which == 37) { + } else if (event.which == 37) { // Right arrow. prev_move(); + } else if (event.which >= 49 && event.which <= 57) { // 1-9. + var num = event.which - 49; + if (current_games && current_games.length >= num) { + switch_backend(current_games[num]['url'], current_games[num]['hashurl']); + } + } else if (event.which == 78) { // N. + next_game(); } }); window.addEventListener('hashchange', possibly_switch_game_from_hash, false);