From 853e8a993ca1152f3952dcb2d8f53278fed841be Mon Sep 17 00:00:00 2001 From: Arne Blankerts Date: Tue, 28 Apr 2015 01:11:31 +0200 Subject: [PATCH] Config option added to allow specification of source file encoding in case auto detection doesn't work. Fixed #212 --- src/collector/Collector.php | 15 +++++++++++---- src/collector/SourceFileIterator.php | 11 +++++++++-- src/collector/project/SourceFile.php | 16 ++++++++++++---- src/config/CollectorConfig.php | 7 +++++++ src/config/skeleton.xml | 3 ++- src/shared/Factory.php | 3 ++- 6 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/collector/Collector.php b/src/collector/Collector.php index 50b34632..6667ab01 100644 --- a/src/collector/Collector.php +++ b/src/collector/Collector.php @@ -67,15 +67,22 @@ class Collector { */ private $backend; + /** + * @var string + */ + private $encoding; /** - * @param ProgressLogger $logger - * @param Project $project + * @param ProgressLogger $logger + * @param Project $project + * @param BackendInterface $backend + * @param $encoding */ - public function __construct(ProgressLogger $logger, Project $project, BackendInterface $backend) { + public function __construct(ProgressLogger $logger, Project $project, BackendInterface $backend, $encoding) { $this->logger = $logger; $this->project = $project; $this->backend = $backend; + $this->encoding = $encoding; } /** @@ -88,7 +95,7 @@ public function run(DirectoryScanner $scanner) { $srcDir = $this->project->getSourceDir(); $this->logger->log("Scanning directory '{$srcDir}' for files to process\n"); - $iterator = new SourceFileIterator($scanner($srcDir), $srcDir); + $iterator = new SourceFileIterator($scanner($srcDir), $srcDir, $this->encoding); foreach($iterator as $file) { $needsProcessing = $this->project->addFile($file); if (!$needsProcessing) { diff --git a/src/collector/SourceFileIterator.php b/src/collector/SourceFileIterator.php index e84551ad..fecf2d55 100644 --- a/src/collector/SourceFileIterator.php +++ b/src/collector/SourceFileIterator.php @@ -7,17 +7,24 @@ class SourceFileIterator implements \Iterator { private $iterator; private $srcDir; + private $encoding; - public function __construct(\Iterator $iterator, $srcDir) { + /** + * @param \Iterator $iterator + * @param FileInfo $srcDir + * @param string $encoding + */ + public function __construct(\Iterator $iterator, FileInfo $srcDir, $encoding) { $this->iterator = $iterator; $this->srcDir = $srcDir; + $this->encoding = $encoding; } /** * @return SourceFile */ public function current() { - return new SourceFile($this->iterator->current()->getPathname(), $this->srcDir); + return new SourceFile($this->iterator->current()->getPathname(), $this->srcDir, $this->encoding); } /** diff --git a/src/collector/project/SourceFile.php b/src/collector/project/SourceFile.php index 773a14f9..673d94bd 100644 --- a/src/collector/project/SourceFile.php +++ b/src/collector/project/SourceFile.php @@ -23,9 +23,15 @@ class SourceFile extends FileInfo { */ private $srcDir; - public function __construct($file_name, FileInfo $srcDir = NULL) { + /** + * @var + */ + private $encoding; + + public function __construct($file_name, FileInfo $srcDir = NULL, $encoding = 'auto') { parent::__construct($file_name); $this->srcDir = $srcDir; + $this->encoding = $encoding; } /** @@ -44,10 +50,12 @@ public function getSource() { return ''; } - $info = new \finfo(); - $encoding = $info->file((string)$this, FILEINFO_MIME_ENCODING); + if ($this->encoding == 'auto') { + $info = new \finfo(); + $this->encoding = $info->file((string)$this, FILEINFO_MIME_ENCODING); + } try { - $source = iconv($encoding, 'UTF-8//TRANSLIT', $source); + $source = iconv($this->encoding, 'UTF-8//TRANSLIT', $source); } catch (\ErrorException $e) { throw new SourceFileException('Encoding error - conversion to UTF-8 failed', SourceFileException::BadEncoding, $e); } diff --git a/src/config/CollectorConfig.php b/src/config/CollectorConfig.php index 5464d57c..dd0a54a8 100644 --- a/src/config/CollectorConfig.php +++ b/src/config/CollectorConfig.php @@ -75,6 +75,13 @@ public function getSourceDirectory() { return $this->project->getSourceDirectory(); } + /** + * @return string + */ + public function getFileEncoding() { + return $this->ctx->getAttribute('encoding', 'auto'); + } + public function isPublicOnlyMode() { if ($this->ctx->hasAttribute('publiconly')) { return $this->ctx->getAttribute('publiconly', 'false') === 'true'; diff --git a/src/config/skeleton.xml b/src/config/skeleton.xml index 247802d6..9a2c9fda 100644 --- a/src/config/skeleton.xml +++ b/src/config/skeleton.xml @@ -35,9 +35,10 @@ --> - + + diff --git a/src/shared/Factory.php b/src/shared/Factory.php index f2edc110..86cad2b7 100644 --- a/src/shared/Factory.php +++ b/src/shared/Factory.php @@ -199,7 +199,8 @@ public function getCollector(CollectorConfig $config) { $config->getSourceDirectory(), $config->getWorkDirectory() ), - $this->getBackendFactory()->getInstanceFor($config->getBackend()) + $this->getBackendFactory()->getInstanceFor($config->getBackend()), + $config->getFileEncoding() ); }