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">&nbsp;</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">&nbsp;</td><td class="empty">&nbsp;</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>

Reply via email to