<?php
/**
 * Utility class to access OpenDocument spreadsheets read-only
 *
 * Requires PHP 5.3
 *
 * @license CeCILL 2.0
 * @copyright 2005-2012 Ouest Systemes Informatiques
 */

namespace OSInet\Open_Document\Calc;


/**
 * Utility class to access OpenDocument spreadsheets read-only
 */
class 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', self::NS_OFFICE);
    $this->xpath->registerNameSpace('table', self::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(self::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;
  }
}