diff --git a/README.md b/README.md index 1c32578..74dbbc9 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,9 @@ Contrary to other file readers or writers, it is capable of processing very larg ## Installation -The Spout library can be installed directly from [Composer](https://getcomposer.org/). +### Composer (recommended) + +Spout can be installed directly from [Composer](https://getcomposer.org/). Add "box/spout" as a dependency in your project's composer.json file: ```json @@ -27,6 +29,19 @@ Then run the install command from Composer: php composer.phar install ``` +### Manual installation + +If you can't use Composer, no worries! You can still install Spout manually. + +> Before starting, make sure your system meets the [requirements](#requirements). + +1. Download the source code from the [Releases page](https://github.com/box/spout/releases) +2. Extract the downloaded content into your project. +3. Add this code to the top controller (index.php) or wherever it may be more appropriate: +```php +require_once '[PATH/TO]/src/Spout/Autoloader/autoload.php'; // don't forget to change the path! +``` + ## Requirements diff --git a/phpunit.xml b/phpunit.xml index 01178da..fc6d657 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -17,6 +17,9 @@ src/ + + src/Spout/Autoloader + diff --git a/src/Spout/Autoloader/Psr4Autoloader.php b/src/Spout/Autoloader/Psr4Autoloader.php new file mode 100644 index 0000000..649a732 --- /dev/null +++ b/src/Spout/Autoloader/Psr4Autoloader.php @@ -0,0 +1,150 @@ +prefixes[$prefix]) === false) { + $this->prefixes[$prefix] = array(); + } + + // retain the base directory for the namespace prefix + if ($prepend) { + array_unshift($this->prefixes[$prefix], $base_dir); + } else { + array_push($this->prefixes[$prefix], $base_dir); + } + } + + /** + * Loads the class file for a given class name. + * + * @param string $class The fully-qualified class name. + * @return mixed The mapped file name on success, or boolean false on + * failure. + */ + public function loadClass($class) + { + // the current namespace prefix + $prefix = $class; + + // work backwards through the namespace names of the fully-qualified + // class name to find a mapped file name + while (false !== $pos = strrpos($prefix, '\\')) { + + // retain the trailing namespace separator in the prefix + $prefix = substr($class, 0, $pos + 1); + + // the rest is the relative class name + $relative_class = substr($class, $pos + 1); + + // try to load a mapped file for the prefix and relative class + $mapped_file = $this->loadMappedFile($prefix, $relative_class); + if ($mapped_file) { + return $mapped_file; + } + + // remove the trailing namespace separator for the next iteration + // of strrpos() + $prefix = rtrim($prefix, '\\'); + } + + // never found a mapped file + return false; + } + + /** + * Load the mapped file for a namespace prefix and relative class. + * + * @param string $prefix The namespace prefix. + * @param string $relative_class The relative class name. + * @return mixed Boolean false if no mapped file can be loaded, or the + * name of the mapped file that was loaded. + */ + protected function loadMappedFile($prefix, $relative_class) + { + // are there any base directories for this namespace prefix? + if (isset($this->prefixes[$prefix]) === false) { + return false; + } + + // look through base directories for this namespace prefix + foreach ($this->prefixes[$prefix] as $base_dir) { + + // replace the namespace prefix with the base directory, + // replace namespace separators with directory separators + // in the relative class name, append with .php + $file = $base_dir + . str_replace('\\', '/', $relative_class) + . '.php'; + + // if the mapped file exists, require it + if ($this->requireFile($file)) { + // yes, we're done + return $file; + } + } + + // never found it + return false; + } + + /** + * If a file exists, require it from the file system. + * + * @param string $file The file to require. + * @return bool True if the file exists, false if not. + */ + protected function requireFile($file) + { + if (file_exists($file)) { + require $file; + return true; + } + return false; + } +} diff --git a/src/Spout/Autoloader/autoload.php b/src/Spout/Autoloader/autoload.php new file mode 100644 index 0000000..73ee519 --- /dev/null +++ b/src/Spout/Autoloader/autoload.php @@ -0,0 +1,15 @@ +register(); +$loader->addNamespace('Box\Spout', $srcBaseDirectory);