bjori Sun Aug 5 18:54:57 2007 UTC Added files: /phd/tests/xhtml 001.phpt /phd/tests/xhtml/data 001-1.xml
Modified files: /phd/formats xhtml.php /phd/include PhDFormat.class.php Log: - Fix colspan logic - Fix regression in last commit - Implement tfoot - Add test
http://cvs.php.net/viewvc.cgi/phd/formats/xhtml.php?r1=1.9&r2=1.10&diff_format=u Index: phd/formats/xhtml.php diff -u phd/formats/xhtml.php:1.9 phd/formats/xhtml.php:1.10 --- phd/formats/xhtml.php:1.9 Sun Aug 5 17:47:09 2007 +++ phd/formats/xhtml.php Sun Aug 5 18:54:57 2007 @@ -1,5 +1,5 @@ <?php -/* $Id: xhtml.php,v 1.9 2007/08/05 17:47:09 bjori Exp $ */ +/* $Id: xhtml.php,v 1.10 2007/08/05 18:54:57 bjori Exp $ */ class XHTMLPhDFormat extends PhDFormat { protected $map = array( /* {{{ */ @@ -94,6 +94,8 @@ 'systemitem' => 'format_systemitem', 'table' => 'format_table', 'term' => 'span', + 'tfoot' => 'format_th', + 'thead' => 'format_th', 'title' => array( /* DEFAULT */ 'h1', 'legalnotice' => 'h4', @@ -311,31 +313,36 @@ } return "</colgroup>\n"; } + private function parse_table_entry_attributes($attrs) { + $retval = sprintf('align="%s"', $attrs["align"]); + if ($attrs["align"] == "char" && isset($attrs["char"])) { + $retval .= sprintf(' char="%s"', htmlspecialchars($attrs["char"], ENT_QUOTES)); + if (isset($attrs["charoff"])) { + $retval .= sprintf(' charoff="%s"', htmlspecialchars($attrs["charoff"], ENT_QUOTES)); + } + } + if (isset($attrs["valign"])) { + $retval .= sprintf(' valign="%s"', $attrs["valign"]); + } + if (isset($attrs["colwidth"])) { + $retval .= sprintf(' width="%d"', $attrs["colwidth"]); + } + return $retval; + } public function format_colspec($open, $name) { if ($open) { - $colspec = PhDFormat::colspec(); + $attrs = self::parse_table_entry_attributes(PhDFormat::colspec(PhDFormat::getAttributes())); - $moreattr = ""; - if ($colspec["align"] == "char" && isset($colspec["char"])) { - $moreattr .= sprintf(' char="%s"', htmlspecialchars($colspec["char"], ENT_QUOTES)); - if (isset($colspec["charoff"])) { - $moreattr .= sprintf(' charoff="%s"', htmlspecialchars($colspec["charoff"], ENT_QUOTES)); - } - } - if (isset($colspec["colwidth"])) { - $moreattr .= sprintf(' width="%d"', $colspec["colwidth"]); - } - - return sprintf('<col align="%s"%s />', $colspec["align"], $moreattr); + return sprintf('<col %s />', $attrs); } /* noop */ } - public function format_thead($open, $name) { + public function format_th($open, $name) { if ($open) { $valign = PhDFormat::valign(); - return sprintf('<thead valign="%s">', $valign); + return sprintf('<%s valign="%s">', $name, $valign); } - return "</thead>\n"; + return "</$name>\n"; } public function format_tbody($open, $name) { if ($open) { @@ -353,16 +360,20 @@ } public function format_th_entry($open, $name) { if ($open) { - $colspan = PhDFormat::colspan(); + $attrs = PhDFormat::getAttributes(); + $colspan = PhDFormat::colspan($attrs); return sprintf('<th colspan="%d">', $colspan); } return '</th>'; } public function format_entry($open, $name) { if ($open) { - $colspan = PhDFormat::colspan(); - $rowspan = PhDFormat::rowspan(); - return sprintf('<td colspan="%d" rowspan="%d">', $colspan, $rowspan); + $attrs = PhDFormat::getColspec(PhDFormat::getAttributes()); + + $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 "</td>"; } http://cvs.php.net/viewvc.cgi/phd/include/PhDFormat.class.php?r1=1.2&r2=1.3&diff_format=u Index: phd/include/PhDFormat.class.php diff -u phd/include/PhDFormat.class.php:1.2 phd/include/PhDFormat.class.php:1.3 --- phd/include/PhDFormat.class.php:1.2 Sun Aug 5 17:47:08 2007 +++ phd/include/PhDFormat.class.php Sun Aug 5 18:54:57 2007 @@ -1,5 +1,5 @@ <?php -/* $Id: PhDFormat.class.php,v 1.2 2007/08/05 17:47:08 bjori Exp $ */ +/* $Id: PhDFormat.class.php,v 1.3 2007/08/05 18:54:57 bjori Exp $ */ abstract class PhDFormat { private $reader; @@ -69,37 +69,45 @@ return $attrs; } - public function colspec() { + public function colspec(array $attrs) { + $colspec = self::getColSpec($attrs); + $this->TABLE["colspec"][$colspec["colnum"]] = $colspec; + return $colspec; + } + public function getColspec(array $attrs) { /* defaults */ $defaults["colname"] = count($this->TABLE["colspec"])+1; $defaults["colnum"] = count($this->TABLE["colspec"])+1; $defaults["align"] = "left"; - $attrs = self::getAttributes(); - $colspec = array_merge($defaults, $this->TABLE["defaults"], $attrs); - - $this->TABLE["colspec"][$colspec["colnum"]] = $colspec; - return $colspec; + return array_merge($defaults, $this->TABLE["defaults"], $attrs); } + public function valign() { $valign = self::readAttribute("valign"); return $valign ? $valign : "middle"; } - public function colspan() { - if ($start = $this->readAttribute("namest")) { - $from = array_search($start, $this->TABLE["colspec"]); - $end = $this->readAttribute("nameend"); - $to = array_search($end, $this->TABLE["colspec"]); - return $end-$to; + public function colspan(array $attrs) { + if (isset($attrs["namest"])) { + foreach($this->TABLE["colspec"] as $colnum => $spec) { + if ($spec["colname"] == $attrs["namest"]) { + $from = $spec["colnum"]; + continue; + } + if ($spec["colname"] == $attrs["nameend"]) { + $to = $spec["colnum"]; + continue; + } + } + return $to-$from+1; } return 1; } - public function rowspan() { - $rows = 1; - if ($morerows = $this->readAttribute("morerows")) { - $rows += $morerows; + public function rowspan($attrs) { + if (isset($attrs["morerows"])) { + return $attrs["morerows"]+1; } - return $rows; + return 1; } } http://cvs.php.net/viewvc.cgi/phd/tests/xhtml/001.phpt?view=markup&rev=1.1 Index: phd/tests/xhtml/001.phpt +++ phd/tests/xhtml/001.phpt --TEST-- CALS Table rendering --FILE-- <?php /* $Id: 001.phpt,v 1.1 2007/08/05 18:54:57 bjori Exp $ */ require "include/PhDReader.class.php"; require "include/PhDFormat.class.php"; require "formats/xhtml.php"; $reader = new PhDReader(dirname(__FILE__) ."/data/001-1.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="" class="article"> <h1 class="title"> Example table </h1> <table border="5"> <h1 class="title"> Sample CALS Table </h1> <colgroup> <col align="left" /> <col align="left" /> <col align="left" /> <col align="left" /> <thead valign="middle"> <tr valign="middle"> <th colspan="2"> Horizontal Span </th> <th colspan="1"> a3 </th> <th colspan="1"> a4 </th> <th colspan="1"> a5 </th> </tr> </thead> <tfoot valign="middle"> <tr valign="middle"> <th colspan="1"> f1 </th> <th colspan="1"> f2 </th> <th colspan="1"> f3 </th> <th colspan="1"> f4 </th> <th colspan="1"> f5 </th> </tr> </tfoot> <tbody valign="middle"> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> b1 </td> <td colspan="1" rowspan="1" align="left"> b2 </td> <td colspan="1" rowspan="1" align="left"> b3 </td> <td colspan="1" rowspan="1" align="left"> b4 </td> <td colspan="1" rowspan="2" align="left" valign="middle"> <p class="para"> Vertical Span </p> </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> c1 </td> <td colspan="2" rowspan="2" align="center" valign="bottom"> Span Both </td> <td colspan="1" rowspan="1" align="left"> c4 </td> </tr> <tr valign="middle"> <td colspan="1" rowspan="1" align="left"> d1 </td> <td colspan="1" rowspan="1" align="left"> d4 </td> <td colspan="1" rowspan="1" align="left"> d5 </td> </tr> </tbody> </colgroup> </table> </div> http://cvs.php.net/viewvc.cgi/phd/tests/xhtml/data/001-1.xml?view=markup&rev=1.1 Index: phd/tests/xhtml/data/001-1.xml +++ phd/tests/xhtml/data/001-1.xml <?xml version="1.0" encoding="utf-8"?> <!-- copy&paste from http://www.docbook.org/tdg5/en/html/cals.table.html --> <article xmlns='http://docbook.org/ns/docbook'> <title>Example table</title> <table xml:id="ex.calstable" frame='all'> <title>Sample CALS Table</title> <tgroup cols='5' align='left' colsep='1' rowsep='1'> <colspec colname='c1'/> <colspec colname='c2'/> <colspec colname='c3'/> <colspec colnum='5' colname='c5'/> <thead> <row> <entry namest="c1" nameend="c2" align="center">Horizontal Span</entry> <entry>a3</entry> <entry>a4</entry> <entry>a5</entry> </row> </thead> <tfoot> <row> <entry>f1</entry> <entry>f2</entry> <entry>f3</entry> <entry>f4</entry> <entry>f5</entry> </row> </tfoot> <tbody> <row> <entry>b1</entry> <entry>b2</entry> <entry>b3</entry> <entry>b4</entry> <entry morerows='1' valign='middle'><para>Vertical Span</para></entry> </row> <row> <entry>c1</entry> <entry namest="c2" nameend="c3" align='center' morerows='1' valign='bottom'>Span Both</entry> <entry>c4</entry> </row> <row> <entry>d1</entry> <entry>d4</entry> <entry>d5</entry> </row> </tbody> </tgroup> </table> </article>