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>