Merge pull request #36 from box/fix_zip_path_windows

Fix issue with directory separators for zip:// on Windows
This commit is contained in:
Adrien Loison 2015-05-12 21:08:38 -07:00
commit 935ba1fb5e
5 changed files with 38 additions and 8 deletions

View File

@ -93,7 +93,7 @@ class SharedStringsHelper
$this->tempFilePointer = null; $this->tempFilePointer = null;
$escaper = new \Box\Spout\Common\Escaper\XLSX(); $escaper = new \Box\Spout\Common\Escaper\XLSX();
$sharedStringsFilePath = 'zip://' . $this->filePath . '#' . self::SHARED_STRINGS_XML_FILE_PATH; $sharedStringsFilePath = $this->getSharedStringsFilePath();
if ($xmlReader->open($sharedStringsFilePath, null, LIBXML_NONET) === false) { if ($xmlReader->open($sharedStringsFilePath, null, LIBXML_NONET) === false) {
throw new IOException('Could not open "' . self::SHARED_STRINGS_XML_FILE_PATH . '".'); throw new IOException('Could not open "' . self::SHARED_STRINGS_XML_FILE_PATH . '".');
} }
@ -143,6 +143,15 @@ class SharedStringsHelper
$xmlReader->close(); $xmlReader->close();
} }
/**
* @return string The path to the shared strings XML file, working cross-platforms
*/
protected function getSharedStringsFilePath()
{
$sharedStringsXmlFilePath = str_replace('/', DIRECTORY_SEPARATOR, self::SHARED_STRINGS_XML_FILE_PATH);
return 'zip://' . $this->filePath . '#' . $sharedStringsXmlFilePath;
}
/** /**
* Removes nodes that should not be read, like the pronunciation of the Kanji characters. * Removes nodes that should not be read, like the pronunciation of the Kanji characters.
* By keeping them, their text content would be added to the read string. * By keeping them, their text content would be added to the read string.

View File

@ -186,7 +186,8 @@ class WorksheetHelper
*/ */
protected function getFileAsXMLElementWithNamespace($xmlFilePath, $mainNamespace) protected function getFileAsXMLElementWithNamespace($xmlFilePath, $mainNamespace)
{ {
$xmlContents = $this->globalFunctionsHelper->file_get_contents('zip://' . $this->filePath . '#' . $xmlFilePath); $normalizedXmlFilePath = str_replace('/', DIRECTORY_SEPARATOR, $xmlFilePath);
$xmlContents = $this->globalFunctionsHelper->file_get_contents('zip://' . $this->filePath . '#' . $normalizedXmlFilePath);
$xmlElement = new \SimpleXMLElement($xmlContents); $xmlElement = new \SimpleXMLElement($xmlContents);
$xmlElement->registerXPathNamespace('ns', $mainNamespace); $xmlElement->registerXPathNamespace('ns', $mainNamespace);

View File

@ -32,11 +32,13 @@ class Worksheet
} }
/** /**
* @return string Path of the XML file containing the worksheet data, without the leading slash * @return string Path of the XML file containing the worksheet data,
* without the leading slash and working cross-platforms.
*/ */
public function getDataXmlFilePath() public function getDataXmlFilePath()
{ {
return ltrim($this->dataXmlFilePath, '/'); $dataXmlFilePath = ltrim($this->dataXmlFilePath, '/');
return str_replace('/', DIRECTORY_SEPARATOR, $dataXmlFilePath);
} }
/** /**

View File

@ -90,9 +90,18 @@ class SheetTest extends \PHPUnit_Framework_TestCase
*/ */
private function assertSheetNameEquals($expectedName, $resourcePath, $message = '') private function assertSheetNameEquals($expectedName, $resourcePath, $message = '')
{ {
$pathToWorkbookFile = $resourcePath . '#xl/workbook.xml'; $pathToWorkbookFile = $resourcePath . $this->normalizePath('#xl/workbook.xml');
$xmlContents = file_get_contents('zip://' . $pathToWorkbookFile); $xmlContents = file_get_contents('zip://' . $pathToWorkbookFile);
$this->assertContains('<sheet name="' . $expectedName . '"', $xmlContents, $message); $this->assertContains('<sheet name="' . $expectedName . '"', $xmlContents, $message);
} }
/**
* @param string $path
* @return string The path with the correct directory separators, as defined for the current platform
*/
private function normalizePath($path)
{
return str_replace('/', DIRECTORY_SEPARATOR, $path);
}
} }

View File

@ -408,7 +408,7 @@ class XLSXTest extends \PHPUnit_Framework_TestCase
private function assertInlineDataWasWrittenToSheet($fileName, $sheetIndex, $inlineData, $message = '') private function assertInlineDataWasWrittenToSheet($fileName, $sheetIndex, $inlineData, $message = '')
{ {
$resourcePath = $this->getGeneratedResourcePath($fileName); $resourcePath = $this->getGeneratedResourcePath($fileName);
$pathToSheetFile = $resourcePath . '#xl/worksheets/sheet' . $sheetIndex . '.xml'; $pathToSheetFile = $resourcePath . $this->normalizePath('#xl/worksheets/sheet' . $sheetIndex . '.xml');
$xmlContents = file_get_contents('zip://' . $pathToSheetFile); $xmlContents = file_get_contents('zip://' . $pathToSheetFile);
$this->assertContains((string)$inlineData, $xmlContents, $message); $this->assertContains((string)$inlineData, $xmlContents, $message);
@ -424,7 +424,7 @@ class XLSXTest extends \PHPUnit_Framework_TestCase
private function assertInlineDataWasNotWrittenToSheet($fileName, $sheetIndex, $inlineData, $message = '') private function assertInlineDataWasNotWrittenToSheet($fileName, $sheetIndex, $inlineData, $message = '')
{ {
$resourcePath = $this->getGeneratedResourcePath($fileName); $resourcePath = $this->getGeneratedResourcePath($fileName);
$pathToSheetFile = $resourcePath . '#xl/worksheets/sheet' . $sheetIndex . '.xml'; $pathToSheetFile = $resourcePath . $this->normalizePath('#xl/worksheets/sheet' . $sheetIndex . '.xml');
$xmlContents = file_get_contents('zip://' . $pathToSheetFile); $xmlContents = file_get_contents('zip://' . $pathToSheetFile);
$this->assertNotContains((string)$inlineData, $xmlContents, $message); $this->assertNotContains((string)$inlineData, $xmlContents, $message);
@ -439,9 +439,18 @@ class XLSXTest extends \PHPUnit_Framework_TestCase
private function assertSharedStringWasWritten($fileName, $sharedString, $message = '') private function assertSharedStringWasWritten($fileName, $sharedString, $message = '')
{ {
$resourcePath = $this->getGeneratedResourcePath($fileName); $resourcePath = $this->getGeneratedResourcePath($fileName);
$pathToSharedStringsFile = $resourcePath . '#xl/sharedStrings.xml'; $pathToSharedStringsFile = $resourcePath . $this->normalizePath('#xl/sharedStrings.xml');
$xmlContents = file_get_contents('zip://' . $pathToSharedStringsFile); $xmlContents = file_get_contents('zip://' . $pathToSharedStringsFile);
$this->assertContains($sharedString, $xmlContents, $message); $this->assertContains($sharedString, $xmlContents, $message);
} }
/**
* @param string $path
* @return string The path with the correct directory separators, as defined for the current platform
*/
private function normalizePath($path)
{
return str_replace('/', DIRECTORY_SEPARATOR, $path);
}
} }