prefix = $prefix;
$this->round = $round;
$this->board = $board;
$this->deals_by_tables = array();
if(!file_exists($this->get_filename())) {
throw new Exception('file not found: ' . $this->get_filename());
}
}
function get_filename() {
return $this->prefix . $this->round . 'b-' . $this->board . '.html';
}
function set_deal($table, $deal) {
$this->deals_by_tables[$table] = $deal;
}
function output() {
$content = file_get_contents($this->get_filename());
$dom = str_get_html($content);
$header_td1 = $dom->find("/html/body/table/tr/td[class=\"bdcc12\"]", 0);
$header_tr = $header_td1->parent;
$tr = @$header_tr->next_sibling();
while($tr) {
$td = $tr->find('td/a', 0);
$table = trim($td->innertext);
$table = str_replace(' ', '', $table);
$table = (int)$table;
if($table && array_key_exists($table, $this->deals_by_tables)) {
$contract1 = trim(str_replace(' ', '', $tr->find('td[class="bdc"]', 0)->innertext));
$score1 = trim(str_replace(' ', '', end($tr->find('td'))->innertext));
$contract2 = trim(str_replace(' ', '', $tr->next_sibling()->find('td[class="bdc"]', 0)->innertext));
$score2 = trim(str_replace(' ', '', end($tr->next_sibling()->find('td'))->innertext));
$deal = $this->deals_by_tables[$table];
$insert = "Stół $table – Rozdanie {$deal->deal_num} ";
// if is played on both tables of a match
// note that the contract field for arbitral scores starts with 'A' (e.g. 'ARB' or 'AAA')
if(($score1 !== '' || strpos($contract1, 'A') === 0)
&& ($score2 !== '' || strpos($contract2, 'A') === 0)) {
$insert .= $deal->html();
} else {
$insert .= '
...
';
}
$tr->outertext = '' . $tr->outertext;
}
$tr = @$tr->next_sibling();
}
$header_tr2 = $header_tr->next_sibling();
$header_tr->outertext = '';
$header_tr2->outertext = '';
$dom->find('/html/body/table/tr', 0)->outertext = '';
$head = $dom->find('/html/head', 0);
$head->innertext .= ' '
. ''
. '';
// replacing meta http-equiv refresh with a javascript refresh to preserve hash in the result page
$meta = $head->find('meta');
foreach ($meta as $metaTag) {
if ($metaTag->hasAttribute('http-equiv') && strtolower($metaTag->getAttribute('http-equiv')) == 'refresh') {
$head->innertext = str_replace($metaTag->outertext, '', $head->innertext) . '';
break;
}
}
print $dom->outertext;
}
}
class NoSuchDealNumber extends Exception {
}
class Deal {
function __construct($filename, $num_in_pbn) {
$this->deal_num = $num_in_pbn;
$this->_parse($filename, $num_in_pbn);
}
function _parse($filename, $num_in_pbn) {
$pbn = file_get_contents($filename);
$start = strpos($pbn, '[Board "' . $num_in_pbn . '"]');
if($start === false) {
throw new NoSuchDealNumber($num_in_pbn);
}
$pbn = substr($pbn, $start + 5);
$stop = strpos($pbn,'[Board "');
if($stop != false) {
$pbn = substr($pbn, 0, $stop);
}
preg_match('|Dealer "([NESW])"|', $pbn, $m);
$this->dealer = $m[1];
preg_match('|Vulnerable "([^"]+)"|', $pbn, $m);
$this->vuln = $m[1];
if($this->vuln == 'None') {
$this->vuln = '-';
} else if($this->vuln == 'All') {
$this->vuln = 'Obie';
}
preg_match('|Ability "([^"]+)"|', $pbn, $m);
if($m[1]) {
$this->ability = explode(' ',$m[1]);
}
preg_match('|Minimax "([^"]+)"|', $pbn, $m);
$this->minimax = $m[1];
preg_match('|Deal "(N:)?([^"]+)"|', $pbn, $m);
$this->hands = explode(' ',$m[2]);
}
function html() {
ob_start();
include('tdd-handrecord-tpl.php');
return ob_get_clean();
}
function format_hand($hand_num) {
$hand = $this->hands[$hand_num];
$hand = str_replace('T','10',$hand);
$suits = explode('.',$hand);
$str = ' '.$suits[0].' ';
$str .= ' '.$suits[1].' ';
$str .= ' '.$suits[2].' ';
$str .= ' '.$suits[3];
return $str;
}
function format_ability($ability_num) {
$ability = $this->ability[$ability_num];
$ab = array($ability[0], $ability[2], $ability[3], $ability[4], $ability[5], $ability[6]);
foreach($ab as $k=>$v) {
switch($v) {
case 'A': $ab[$k] = '10'; break;
case 'B': $ab[$k] = '11'; break;
case 'C': $ab[$k] = '12'; break;
case 'D': $ab[$k] = '13'; break;
}
}
return "{$ab[0]}
{$ab[1]}
{$ab[2]}
{$ab[3]}
{$ab[4]}
{$ab[5]} ";
}
function format_minimax() {
$minimax = $this->minimax;
$minimax = preg_replace('|^(..)D(.+)|','$1x$2', $minimax);
$minimax = preg_replace('|^(..)R(.+)|','$1xx$2', $minimax);
$minimax = preg_replace('|^(.)N(.+)|','$1NT$2', $minimax);
$minimax = preg_replace('/(\d)([SHDCN])(T?)(x*)([NESW])(.*)/','$1 $4 $5, $6', $minimax);
return $minimax;
}
}
function load_deals_for_tables($prefix, $round, $board_in_teamy) {
$deals_by_tables = array();
$prefix = preg_quote($prefix);
$filename_regex = "/$prefix-r$round-t(\d+)-b(\d+).pbn/";
foreach(scandir('.') as $filename) {
if(preg_match($filename_regex, $filename, $match)) {
$file_table = $match[1];
$file_start_board = $match[2];
$first_num_in_pbn = array();
preg_match('/\[Board "(\d+)"\]/', file_get_contents($filename), $first_num_in_pbn);
$first_num_in_pbn = $first_num_in_pbn ? intval($first_num_in_pbn[1]) : 1;
// 1 in teamy -> 1 in pbn; 24 in teamy -> 24 in pbn; 25 in teamy -> 1 in pbn
// if PBN doesn't starts with Board 1, it's been adjusted
$num_in_pbn = $board_in_teamy - $file_start_board + $first_num_in_pbn;
try {
$deal = new Deal($filename, $num_in_pbn);
$deals_by_tables[$file_table] = $deal;
} catch (NoSuchDealNumber $e) {
// ignore if the deal does not exist in the file
}
}
}
return $deals_by_tables;
}