<?php
/**
 * Utility class to access OpenDocument spreadsheets read-only
 *
 * Requires PHP 5.2
 *
 * @version $Id: Calc_Reader.php,v 1.4 2007-09-02 20:50:12 marand Exp $
 * @license CeCILL 2.0
 * @copyright 2005-2006 Ouest Systemes Informatiques
 */

$erCalc_Reader = error_reporting(E_ALL | E_STRICT);

/**
 * Utility class to access OpenDocument spreadsheets read-only
 */
class Calc_Reader
  {
  const NS_TABLE  = "urn:oasis:names:tc:opendocument:xmlns:table:1.0";
  const NS_OFFICE = "urn:oasis:names:tc:opendocument:xmlns:office:1.0";

  /**
   * @var DOMDocument $xml
   */
  public $xml;

  /**
   * @var DOMXPath $xpath
   */
  public $xpath;

  function __construct($path)
    {
    $this->xml = new DOMDocument();
    $this->xml->preserveWhiteSpace = FALSE;
    $this->xml->load($path);

    $this->xpath = new DOMXPath($this->xml);
    $this->xpath->registerNameSpace('office', Calc_Reader::NS_OFFICE);
    $this->xpath->registerNameSpace('table', Calc_Reader::NS_TABLE);
    }

  /**
   * Return a DOMNodeList of the worksheets available in the document
   *
   * @return DOMNodeList
   */
  function getCalcSheets()
    {
    $sq = '//table:table';
    $list = $this->xpath->query($sq);
    unset($sq);

    return $list;
    }

  /**
   * Return the names of the worksheets available in the document
   *
   * @return array
   */
  function getCalcSheetNames()
    {
    $dnlSheets = $this->getCalcSheets();

    $ret = array();
    foreach ($dnlSheets as $node)
      {
      $ret[] = $node->getAttributeNS(Calc_Reader::NS_TABLE, 'name');
      }

    unset($dnlSheets);
    return $ret;
    }

  /**
   * Return the rows in the spreadsheet as a DOMNodeList
   * WARNING: this means ALL the rows, in all the sheets, not just the first sheet
   *
   * @param string $namedRange Optional name of range, notably Sheet name
   * @return DOMNodeList
   */
  function getRows ($namedRange = NULL)
    {
    $query = empty($namedRange)
      ? '//table:table-row'
      : '//table:table[@table:name="' . $namedRange . '"]/table:table-row';

    $ret = $this->xpath->query($query);
    unset($query);

    return $ret;
    }
  }

error_reporting($erCalc_Reader);
unset ($erCalc_Reader);