diff options
Diffstat (limited to 'tdd-bootstrap.php')
-rw-r--r-- | tdd-bootstrap.php | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/tdd-bootstrap.php b/tdd-bootstrap.php new file mode 100644 index 0000000..210c0a0 --- /dev/null +++ b/tdd-bootstrap.php @@ -0,0 +1,183 @@ +<?php + +require_once('tdd-simple-html-dom.php'); + +class Protocol { + + function __construct($prefix, $round, $board) { + $this->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()); + $modified = 0; + + $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_score1 = $tr->find('td[class="bdc"]', 0); + $score1 = str_replace(' ', '', $td_score1->innertext); + + $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)) { + // if is played on the 1st table + if($score1) { + $deal = $this->deals_by_tables[$table]; + $insert = "<h4>Stół $table – Rozdanie {$deal->deal_num}</h4>" . $deal->html(); + $modified = 1; + } else { + $insert = '<p>...</p>'; + } + + $tr->outertext = '<tr><td colspan="7" style="border-bottom:1px solid #006;padding-top:30px;">' . $insert . '</td></tr>' . $tr->outertext; + } + $tr = @$tr->next_sibling(); + } + + if($modified) { + $header_tr2 = $header_tr->next_sibling(); + $header_tr->outertext = ''; + $header_tr2->outertext = ''; + $dom->find('/html/body/table/tr', 0)->outertext = ''; + } + + 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 = '<img src="images/S.gif" alt="S" /> '.$suits[0].'<br />'; + $str .= '<img src="images/H.gif" alt="H" /> '.$suits[1].'<br />'; + $str .= '<img src="images/D.gif" alt="D" /> '.$suits[2].'<br />'; + $str .= '<img src="images/C.gif" alt="C" /> '.$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 "<td class='an4'>{$ab[0]}</td> + <td class='an1'>{$ab[1]}</td> + <td class='an1'>{$ab[2]}</td> + <td class='an1'>{$ab[3]}</td> + <td class='an1'>{$ab[4]}</td> + <td class='an1'>{$ab[5]}</td>"; + } + + 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 <img src="images/$2.gif" alt="$2$3" /> $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]; + + // 1 in teamy -> 1 in pbn; 24 in teamy -> 1 in pbn; 25 in teamy -> 1 in pbn + $num_in_pbn = $board_in_teamy - $file_start_board + 1; + + 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; +} |