Mercurial > hg > isophonics-drupal-site
diff core/lib/Drupal/Component/Gettext/PoStreamWriter.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/lib/Drupal/Component/Gettext/PoStreamWriter.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,157 @@ +<?php + +namespace Drupal\Component\Gettext; + +/** + * Defines a Gettext PO stream writer. + */ +class PoStreamWriter implements PoWriterInterface, PoStreamInterface { + + /** + * URI of the PO stream that is being written. + * + * @var string + */ + private $_uri; + + /** + * The Gettext PO header. + * + * @var \Drupal\Component\Gettext\PoHeader + */ + private $_header; + + /** + * File handle of the current PO stream. + * + * @var resource + */ + private $_fd; + + /** + * Gets the PO header of the current stream. + * + * @return \Drupal\Component\Gettext\PoHeader + * The Gettext PO header. + */ + public function getHeader() { + return $this->_header; + } + + /** + * Set the PO header for the current stream. + * + * @param \Drupal\Component\Gettext\PoHeader $header + * The Gettext PO header to set. + */ + public function setHeader(PoHeader $header) { + $this->_header = $header; + } + + /** + * Gets the current language code used. + * + * @return string + * The language code. + */ + public function getLangcode() { + return $this->_langcode; + } + + /** + * Set the language code. + * + * @param string $langcode + * The language code. + */ + public function setLangcode($langcode) { + $this->_langcode = $langcode; + } + + /** + * {@inheritdoc} + */ + public function open() { + // Open in write mode. Will overwrite the stream if it already exists. + $this->_fd = fopen($this->getURI(), 'w'); + // Write the header at the start. + $this->writeHeader(); + } + + /** + * Implements Drupal\Component\Gettext\PoStreamInterface::close(). + * + * @throws Exception + * If the stream is not open. + */ + public function close() { + if ($this->_fd) { + fclose($this->_fd); + } + else { + throw new Exception('Cannot close stream that is not open.'); + } + } + + /** + * Write data to the stream. + * + * @param string $data + * Piece of string to write to the stream. If the value is not directly a + * string, casting will happen in writing. + * + * @throws Exception + * If writing the data is not possible. + */ + private function write($data) { + $result = fwrite($this->_fd, $data); + if ($result === FALSE) { + throw new Exception('Unable to write data: ' . substr($data, 0, 20)); + } + } + + /** + * Write the PO header to the stream. + */ + private function writeHeader() { + $this->write($this->_header); + } + + /** + * {@inheritdoc} + */ + public function writeItem(PoItem $item) { + $this->write($item); + } + + /** + * {@inheritdoc} + */ + public function writeItems(PoReaderInterface $reader, $count = -1) { + $forever = $count == -1; + while (($count-- > 0 || $forever) && ($item = $reader->readItem())) { + $this->writeItem($item); + } + } + + /** + * Implements Drupal\Component\Gettext\PoStreamInterface::getURI(). + * + * @throws Exception + * If the URI is not set. + */ + public function getURI() { + if (empty($this->_uri)) { + throw new Exception('No URI set.'); + } + return $this->_uri; + } + + /** + * {@inheritdoc} + */ + public function setURI($uri) { + $this->_uri = $uri; + } + +}