bjori Sun Aug 5 22:50:04 2007 UTC Added files: /phd/tests/xhtml 002.phpt /phd/tests/xhtml/data 002.xml
Modified files: /phd/formats xhtml.php /phd/include PhDFormat.class.php Log: - Fixed Livedocs bug#39030 (table with colname (colspec problem)) - Add test
http://cvs.php.net/viewvc.cgi/phd/formats/xhtml.php?r1=1.10&r2=1.11&diff_format=u Index: phd/formats/xhtml.php diff -u phd/formats/xhtml.php:1.10 phd/formats/xhtml.php:1.11 --- phd/formats/xhtml.php:1.10 Sun Aug 5 18:54:57 2007 +++ phd/formats/xhtml.php Sun Aug 5 22:50:04 2007 @@ -1,5 +1,5 @@ <?php -/* $Id: xhtml.php,v 1.10 2007/08/05 18:54:57 bjori Exp $ */ +/* $Id: xhtml.php,v 1.11 2007/08/05 22:50:04 bjori Exp $ */ class XHTMLPhDFormat extends PhDFormat { protected $map = array( /* {{{ */ @@ -353,6 +353,7 @@ } public function format_row($open, $name) { if ($open) { + PhDFormat::initRow(); $valign = PhDFormat::valign(); return sprintf('<tr valign="%s">', $valign); } @@ -370,10 +371,17 @@ if ($open) { $attrs = PhDFormat::getColspec(PhDFormat::getAttributes()); + $retval = ""; + if (isset($attrs["colname"])) { + for($i=PhDFormat::getEntryOffset($attrs); $i>0; --$i) { + $retval .= '<td class="empty"> </td>'; + } + } + $colspan = PhDFormat::colspan($attrs); $rowspan = PhDFormat::rowspan($attrs); $moreattrs = self::parse_table_entry_attributes($attrs); - return sprintf('<td colspan="%d" rowspan="%d" %s>', $colspan, $rowspan, $moreattrs); + return sprintf('%s<td colspan="%d" rowspan="%d" %s>', $retval, $colspan, $rowspan, $moreattrs); } return "</td>"; } http://cvs.php.net/viewvc.cgi/phd/include/PhDFormat.class.php?r1=1.3&r2=1.4&diff_format=u Index: phd/include/PhDFormat.class.php diff -u phd/include/PhDFormat.class.php:1.3 phd/include/PhDFormat.class.php:1.4 --- phd/include/PhDFormat.class.php:1.3 Sun Aug 5 18:54:57 2007 +++ phd/include/PhDFormat.class.php Sun Aug 5 22:50:04 2007 @@ -1,5 +1,5 @@ <?php -/* $Id: PhDFormat.class.php,v 1.3 2007/08/05 18:54:57 bjori Exp $ */ +/* $Id: PhDFormat.class.php,v 1.4 2007/08/05 22:50:04 bjori Exp $ */ abstract class PhDFormat { private $reader; @@ -87,6 +87,20 @@ $valign = self::readAttribute("valign"); return $valign ? $valign : "middle"; } + public function initRow() { + $this->TABLE["next_colnum"] = 1; + } + public function getEntryOffset(array $attrs) { + $curr = $this->TABLE["next_colnum"]; + foreach($this->TABLE["colspec"] as $col => $spec) { + if ($spec["colname"] == $attrs["colname"]) { + $colnum = $spec["colnum"]; + $this->TABLE["next_colnum"] += $colnum-$curr; + return $colnum-$curr; + } + } + return -1; + } public function colspan(array $attrs) { if (isset($attrs["namest"])) { foreach($this->TABLE["colspec"] as $colnum => $spec) { @@ -99,8 +113,11 @@ continue; } } - return $to-$from+1; + $colspan = $to-$from+1; + $this->TABLE["next_colnum"] += $colspan; + return $colspan; } + $this->TABLE["next_colnum"]++; return 1; } public function rowspan($attrs) { http://cvs.php.net/viewvc.cgi/phd/tests/xhtml/002.phpt?view=markup&rev=1.1 Index: phd/tests/xhtml/002.phpt +++ phd/tests/xhtml/002.phpt --TEST-- CALS Table rendering#002 --FILE-- <?php /* $Id: 002.phpt,v 1.1 2007/08/05 22:50:04 bjori Exp $ */ require "include/PhDReader.class.php"; require "include/PhDFormat.class.php"; require "formats/xhtml.php"; $reader = new PhDReader(dirname(__FILE__) ."/data/002.xml"); $format = new XHTMLPhDFormat($reader, array(), array()); $map = $format->getMap(); while($reader->read()) { $type = $reader->nodeType; $name = $reader->name; switch($type) { case XMLReader::ELEMENT: case XMLReader::END_ELEMENT: $open = $type == XMLReader::ELEMENT; $funcname = "format_$name"; if (isset($map[$name])) { $tag = $map[$name]; if (is_array($tag)) { $tag = $reader->notXPath($tag); } if (strncmp($tag, "format_", 7)) { $retval = $format->transformFromMap($open, $tag, $name); break; } $funcname = $tag; } $retval = $format->{$funcname}($open, $name); break; case XMLReader::TEXT: $retval = htmlspecialchars($reader->value, ENT_QUOTES); break; case XMLReader::CDATA: $retval = $format->CDATA($reader->value); break; case XMLReader::COMMENT: case XMLReader::WHITESPACE: case XMLReader::SIGNIFICANT_WHITESPACE: case XMLReader::DOC_TYPE: /* swallow it */ continue 2; default: trigger_error("Don't know how to handle {$name} {$type}", E_USER_ERROR); return; } echo $retval, "\n"; } $reader->close(); ?> --EXPECT-- <div id="function.db2-set-option" class="article"> <table border="5"> <h1 class="title"> Resource-Parameter Matrix </h1> <colgroup> <col align="center" /> <col align="center" /> <col align="center" /> <col align="center" /> <col align="center" /> <thead valign="middle"> <tr valign="middle"> <th colspan="1"> Key </th> <th colspan="1"> Value </th> <th colspan="3"> Resource Type </th> </tr> </thead> <tbody valign="middle"> <tr valign="middle"> <td class="empty"> </td><td class="empty"> </td><td colspan="1" rowspan="1" align="left"> Connection </td> <td colspan="1" rowspan="1" align="left"> Statement </td> <td colspan="1" rowspan="1" align="left"> Result Set </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> autocommit </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_AUTOCOMMIT_ON </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> autocommit </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_AUTOCOMMIT_OFF </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> cursor </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_SCROLLABLE </span> </td> <td colspan="1" rowspan="1" align="left"> - </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> cursor </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_FORWARD_ONLY </span> </td> <td colspan="1" rowspan="1" align="left"> - </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> binmode </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_BINARY </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> binmode </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_CONVERT </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> binmode </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_PASSTHRU </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> db2_attr_case </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_CASE_LOWER </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> db2_attr_case </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_CASE_UPPER </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> db2_attr_case </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_CASE_NATURAL </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> deferred_prepare </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_DEFERRED_PREPARE_ON </span> </td> <td colspan="1" rowspan="1" align="left"> - </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> deferred_prepare </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_DEFERRED_PREPARE_OFF </span> </td> <td colspan="1" rowspan="1" align="left"> - </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> i5_fetch_only </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_I5_FETCH_ON </span> </td> <td colspan="1" rowspan="1" align="left"> - </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> i5_fetch_only </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> DB2_I5_FETCH_OFF </span> </td> <td colspan="1" rowspan="1" align="left"> - </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> userid </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> SQL_ATTR_INFO_USERID </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> acctstr </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> SQL_ATTR_INFO_ACCTSTR </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> applname </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> SQL_ATTR_INFO_APPLNAME </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> wrkstnname </td> <td colspan="1" rowspan="1" align="left"> <span class="literal"> SQL_ATTR_INFO_WRKSTNNAME </span> </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> X </td> <td colspan="1" rowspan="1" align="left"> - </td> </tr> </tbody> </colgroup> </table> </div> http://cvs.php.net/viewvc.cgi/phd/tests/xhtml/data/002.xml?view=markup&rev=1.1 Index: phd/tests/xhtml/data/002.xml +++ phd/tests/xhtml/data/002.xml <?xml version="1.0" encoding="iso-8859-1"?> <!-- $Revision: 1.1 $ --> <article xmlns="http://docbook.org/ns/docbook" xml:id="function.db2-set-option"> <table> <title>Resource-Parameter Matrix</title> <tgroup cols="5"> <colspec colnum="1" colname="col1" align="center" /> <colspec colnum="2" colname="col2" align="center" /> <colspec colnum="3" colname="col3" align="center" /> <colspec colnum="4" colname="col4" align="center" /> <colspec colnum="5" colname="col5" align="center" /> <thead> <row> <entry morerows="1">Key</entry> <entry morerows="1">Value</entry> <entry namest="col3" nameend="col5">Resource Type</entry> </row> </thead> <tbody> <row> <entry colname="col3">Connection</entry> <entry colname="col4">Statement</entry> <entry colname="col5">Result Set</entry> </row> <row> <entry>autocommit</entry> <entry><literal>DB2_AUTOCOMMIT_ON</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">-</entry> <entry colname="col5">-</entry> </row> <row> <entry>autocommit</entry> <entry><literal>DB2_AUTOCOMMIT_OFF</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">-</entry> <entry colname="col5">-</entry> </row> <row> <entry>cursor</entry> <entry><literal>DB2_SCROLLABLE</literal></entry> <entry colname="col3">-</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>cursor</entry> <entry><literal>DB2_FORWARD_ONLY</literal></entry> <entry colname="col3">-</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>binmode</entry> <entry><literal>DB2_BINARY</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>binmode</entry> <entry><literal>DB2_CONVERT</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>binmode</entry> <entry><literal>DB2_PASSTHRU</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>db2_attr_case</entry> <entry><literal>DB2_CASE_LOWER</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>db2_attr_case</entry> <entry><literal>DB2_CASE_UPPER</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>db2_attr_case</entry> <entry><literal>DB2_CASE_NATURAL</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>deferred_prepare</entry> <entry><literal>DB2_DEFERRED_PREPARE_ON</literal></entry> <entry colname="col3">-</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>deferred_prepare</entry> <entry><literal>DB2_DEFERRED_PREPARE_OFF</literal></entry> <entry colname="col3">-</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>i5_fetch_only</entry> <entry><literal>DB2_I5_FETCH_ON</literal></entry> <entry colname="col3">-</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>i5_fetch_only</entry> <entry><literal>DB2_I5_FETCH_OFF</literal></entry> <entry colname="col3">-</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>userid</entry> <entry><literal>SQL_ATTR_INFO_USERID</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>acctstr</entry> <entry><literal>SQL_ATTR_INFO_ACCTSTR</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>applname</entry> <entry><literal>SQL_ATTR_INFO_APPLNAME</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> <row> <entry>wrkstnname</entry> <entry><literal>SQL_ATTR_INFO_WRKSTNNAME</literal></entry> <entry colname="col3">X</entry> <entry colname="col4">X</entry> <entry colname="col5">-</entry> </row> </tbody> </tgroup> </table> </article>