summaryrefslogtreecommitdiff
path: root/bidding_data.py
blob: 46639a80370d78b80ee4c7efa0723cf41b6717f4 (plain)
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import csv, sys, json, glob, re
from os import path
from bs4 import BeautifulSoup as bs4

bidding_data = []

with file(sys.argv[1]) as bidding_file:
    bidding_csv = csv.reader(bidding_file)
    for line in bidding_csv:
        bidding_data.append(line)

sitting_data = []

with file(sys.argv[2]) as sitting_file:
    sitting_csv = csv.reader(sitting_file)
    for line in sitting_csv:
        sitting_data.append(line)

round_lineups = {}

for sitting in sitting_data[1:]:
    round_no = int(sitting[2])
    table_no = sitting[0] + '_' + sitting[1]
    if not round_lineups.has_key(round_no):
        round_lineups[round_no] = {}
    round_lineups[round_no][table_no] = sorted([int(sitting[3]), int(sitting[4])])

bids = {}

for bid in bidding_data[1:]:
    board_no = int(bid[4])
    round_no = int(bid[3])
    table_no = bid[1] + '_' + bid[2]
    bid_counter = int(bid[5])
    bid_erased = int(bid[10])
    if not bids.has_key(board_no):
        bids[board_no] = {}
    if not bids[board_no].has_key(table_no):
        bids[board_no][table_no] = {}
    if not bids[board_no][table_no].has_key(round_no):
        bids[board_no][table_no][round_no] = {}
    if bid_erased == 1:
        if bids[board_no][table_no][round_no].has_key(bid_counter):
            if bids[board_no][table_no][round_no][bid_counter]['direction'] == bid[6]:
                bids[board_no][table_no][round_no].pop(bid_counter, None)
    else:
        bids[board_no][table_no][round_no][bid_counter] = {'direction': bid[6], 'bid': bid[7] }

tournament_path_prefix = sys.argv[3] + '.html'

output_path = path.dirname(tournament_path_prefix)
tournament_prefix = path.splitext(path.realpath(tournament_path_prefix))[0]

directions = ['W', 'N', 'E', 'S']

def format_bidding(bidding):
    html_output = '<table>'
    html_output = html_output + '<tr>'
    for dir in directions:
        html_output = html_output + '<th>' + dir + '</th>'
    html_output = html_output + '</tr>'
    for bid_round in bidding:
        html_output = html_output + '<tr>'
        for bid in bid_round:
            bid_match = re.match(r'(\d)([SHDCN])', bid)
            if bid_match:
		        bid = bid_match.group(1) + '<img src="images/' + bid_match.group(2) + '.gif" />'
            html_output = html_output + '<td>' + bid + '</td>'
        html_output = html_output + '</tr>'
    html_output = html_output + '</table>'
    return html_output

for board_no, board_data in bids.items():
    for table_no, table_data in board_data.items():
        for round_no, round_data in table_data.items():
            bidding = sorted(round_data)
            dealer = round_data[bidding[0]]['direction']
            bidding_table = [[], [], [], []]
            for bid_index in bidding:
                bid = round_data[bid_index]
                bidding_table[directions.index(bid['direction'])].append(bid['bid'])
                last_bidder = bid['direction']
            for pos in range(0, directions.index(dealer)):
                bidding_table[pos].insert(0, '')
            for pos in range(directions.index(last_bidder), len(directions)):
                bidding_table[pos].append('')
            bidding_table = map(list, zip(*bidding_table))
            # TODO: file_number, a nie deal_number
            bidding_file_path = tournament_prefix + '_bidding_' + str(board_no) + '_' + '_'.join(map(str, round_lineups[round_no][table_no])) + '.txt'
            with file(bidding_file_path, 'w') as bidding_file:
                bidding_file.write(format_bidding(bidding_table))

tournament_files_match = re.compile(re.escape(tournament_prefix) + '([0-9]{3})\.html')
tournament_files = [f for f in glob.glob(tournament_prefix + '*.html') if re.search(tournament_files_match, f)]

deal_numbers = {}

for tournament_file in tournament_files:
    file_number = re.match(tournament_files_match, tournament_file).group(1)
    with file(tournament_file, 'r+') as board_html:
        board_content = bs4(board_html, from_encoding='utf-8')
        header_scripts = board_content.select('head script')
        jquery_scripts = [script for script in header_scripts if script['src'] == 'javas/jquery.js']
        if not len(jquery_scripts):
            board_content.head.append(bs4('<script src="javas/jquery.js" type="text/javascript"></script>').script)
        bidding_scripts = [script for script in header_scripts if script['src'] == 'javas/bidding.js']
        if not len(bidding_scripts):
            board_content.head.append(bs4('<script src="javas/bidding.js" type="text/javascript"></script>').script)
        board_number = board_content.select('h4')[0].contents[0].strip().replace('ROZDANIE ', '')
        deal_numbers[file_number] = board_number
        board_html.seek(0)
        board_html.write(board_content.prettify('utf-8', formatter='html'))
    board_text_path = path.splitext(tournament_file)[0] + '.txt'
    with file(board_text_path, 'r+') as board_text:
        board_text_content = bs4(board_text, from_encoding='iso-8859-2')
        for row in board_text_content.select('tr'):
            cells = row.select('td')
            if len(cells) == 11:
                pair_numbers = sorted([int(cells[1].contents[0]), int(cells[2].contents[0])])
                bidding_link = bs4('<a href="#" class="biddingLink">[lic]</a>')
                # TODO: file_number, a nie deal_number
                bidding_link.a['data-bidding-link'] = path.basename(tournament_prefix) + '_bidding_' + str(deal_numbers[file_number]) + '_' + '_'.join(map(str, pair_numbers)) + '.txt'
                for link in cells[3].select('a.biddingLink'):
                    link.extract()
                cells[3].append(bidding_link)
        board_text.seek(0)
        board_text.write(board_text_content.table.prettify('iso-8859-2', formatter='html'))