From a07a76171bd0123df6dcb1dfa3dba660188052c3 Mon Sep 17 00:00:00 2001 From: vonavi Date: Sat, 6 Sep 2014 14:13:45 +0400 Subject: [PATCH] Script 'tour-parse' was re-written from scratch. --- tour-parse | 98 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 60 insertions(+), 38 deletions(-) diff --git a/tour-parse b/tour-parse index a5c6cfe..dc5a871 100755 --- a/tour-parse +++ b/tour-parse @@ -1,50 +1,72 @@ #!/usr/bin/env bash +# Copyright 2014 Vladimir Ivanov +# Distributed under the terms of the GNU General Public License v2 -YEAR=2014 -TOURNAMENT=3-fallenleaves -SCRIPT_PATH=`dirname $0` +REPO_DIR= -# Regexps to parse the result of game -date='([0-9]{2}\.[0-9]{2}\.[0-9]{4})' -white='(.+)' -black='(.+)' -result='((1|0|0\.5):(1|0|0\.5))' +# Specify the tournament here +TOURNAMENT= -# Directories to search `tour_info' in -if [[ $# != 0 ]]; then - tour_dirs=() - for number in "$@"; do - # Change tour numbers: '1' -> '01', '2' -> '02', and so on - number=$(printf "%02g" "$number") +function parse_setup { + [[ -z $REPO_DIR ]] && REPO_DIR=`dirname "$0"` + # Convert REPO_DIR to an absolute path + [[ ! $REPO_DIR =~ ^/ ]] && REPO_DIR=$(cd ${REPO_DIR}; pwd) - tour_dirs+=("$SCRIPT_PATH"/"$YEAR"/"$TOURNAMENT"/tours/"$number") - done -else - tour_dirs=("$SCRIPT_PATH"/"$YEAR"/"$TOURNAMENT"/tours/*) -fi + # If no tournament given, set it to the last one + if [[ -z $TOURNAMENT ]]; then + local year_dir=$(ls -1 -d ${REPO_DIR}/[0-9][0-9][0-9][0-9]/ | tail -1) + TOURNAMENT=$(ls -1 -d ${year_dir}[0-9]-*/ | tail -1 \ + | sed -E "s|${REPO_DIR}/(.*)|\1|") + # Remove the trailing slash + TOURNAMENT=${TOURNAMENT%/} + fi +} -for dir in "${tour_dirs[@]}"; do - number=$(printf "%01g" ${dir:(-2)}) # remove the leading `0' if any - - echo "- number: ${number}" - echo " games:" - - # Add a newline at the end of `tour_info' to parse the last line - tour_info=$(cat "$dir/tour_info" && echo) +function parse_tour_info { + # Add a newline at the end of 'tour_info' to parse the last line + local tour_info=$(cat "${REPO_DIR}/${TOURNAMENT}/tours/${tour}/tour_info"; echo) + local date_re="[0-9?]{2}\.[0-9?]{2}\.[0-9?]{4}" + local res_re="(1-0|1/2|0-1)" while read line; do - # Parsed data of game: date a[1], white player a[2], black - # player a[6], and the result a[3] - data=( $(echo "$line" | gawk --re-interval \ - 'match($0, /'${date}' [-—] '${white}' '${result}' '${black}'/, a) \ - { print a[1], a[2], a[6], a[3] }') ) + if [[ $line =~ ^($date_re)\ +([^\ ]+)\ +-\ +([^\ ]+)(\ +$res_re)? ]]; then + local date=${BASH_REMATCH[1]} + local white=${BASH_REMATCH[2]} + local black=${BASH_REMATCH[3]} + local result=${BASH_REMATCH[5]} - if [[ ${#data[@]} != 0 ]]; then - echo " - date: ${data[0]}" - echo " white: ${data[1]}" - echo " black: ${data[2]}" - echo " result: '${data[3]}'" - echo + [[ $date =~ \? ]] && date= + # Change the representation of result + [[ $result == 1/2 ]] && result=1/2-1/2 + + local round=$(echo "($tour - 1)/($ply_count - 1) + 1" | bc) + parse_to_ini + ((game_counter += 1)) fi done <<< "$tour_info" +} + +function parse_to_ini { + echo "[game${game_counter}]" + echo "round = $round" + echo "date = $date" + echo "white = $white" + echo "black = $black" + echo "result = '$result'" + echo +} + +parse_setup +# Configuration file for players +ply_ini=${REPO_DIR}/${TOURNAMENT}/players.ini + +ply_count=$(grep "^\[player" "$ply_ini" | wc -l) +tour_seq=$(ls -1 -d ${REPO_DIR}/${TOURNAMENT}/tours/[0-9][0-9]/ \ + | sed -E "s|${REPO_DIR}/${TOURNAMENT}/tours/([0-9]{2})/|\1|") + +game_counter=1 +for tour in $tour_seq; do + parse_tour_info done + +exit 0