Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. ExampleFinder.php

class ExampleFinder

Class used to find an example file's location based on a given ExampleDescriptor.

Hierarchy

  • class \phpDocumentor\Reflection\DocBlock\ExampleFinder

Expanded class hierarchy of ExampleFinder

File

vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php, line 32

Namespace

phpDocumentor\Reflection\DocBlock
View source
class ExampleFinder {
    private string $sourceDirectory = '';
    
    /** @var string[] */
    private array $exampleDirectories = [];
    
    /**
     * Attempts to find the example contents for the given descriptor.
     */
    public function find(Example $example) : string {
        $filename = $example->getFilePath();
        $file = $this->getExampleFileContents($filename);
        if ($file === null) {
            return sprintf('** File not found : %s **', $filename);
        }
        return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount()));
    }
    
    /**
     * Registers the project's root directory where an 'examples' folder can be expected.
     */
    public function setSourceDirectory(string $directory = '') : void {
        $this->sourceDirectory = $directory;
    }
    
    /**
     * Returns the project's root directory where an 'examples' folder can be expected.
     */
    public function getSourceDirectory() : string {
        return $this->sourceDirectory;
    }
    
    /**
     * Registers a series of directories that may contain examples.
     *
     * @param string[] $directories
     */
    public function setExampleDirectories(array $directories) : void {
        $this->exampleDirectories = $directories;
    }
    
    /**
     * Returns a series of directories that may contain examples.
     *
     * @return string[]
     */
    public function getExampleDirectories() : array {
        return $this->exampleDirectories;
    }
    
    /**
     * Attempts to find the requested example file and returns its contents or null if no file was found.
     *
     * This method will try several methods in search of the given example file, the first one it encounters is
     * returned:
     *
     * 1. Iterates through all examples folders for the given filename
     * 2. Checks the source folder for the given filename
     * 3. Checks the 'examples' folder in the current working directory for examples
     * 4. Checks the path relative to the current working directory for the given filename
     *
     * @return string[] all lines of the example file
     */
    private function getExampleFileContents(string $filename) : ?array {
        $normalizedPath = null;
        foreach ($this->exampleDirectories as $directory) {
            $exampleFileFromConfig = $this->constructExamplePath($directory, $filename);
            if (is_readable($exampleFileFromConfig)) {
                $normalizedPath = $exampleFileFromConfig;
                break;
            }
        }
        if ($normalizedPath === null) {
            if (is_readable($this->getExamplePathFromSource($filename))) {
                $normalizedPath = $this->getExamplePathFromSource($filename);
            }
            elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) {
                $normalizedPath = $this->getExamplePathFromExampleDirectory($filename);
            }
            elseif (is_readable($filename)) {
                $normalizedPath = $filename;
            }
        }
        $lines = $normalizedPath !== null && is_readable($normalizedPath) ? file($normalizedPath) : false;
        return $lines !== false ? $lines : null;
    }
    
    /**
     * Get example filepath based on the example directory inside your project.
     */
    private function getExamplePathFromExampleDirectory(string $file) : string {
        return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file;
    }
    
    /**
     * Returns a path to the example file in the given directory..
     */
    private function constructExamplePath(string $directory, string $file) : string {
        return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file;
    }
    
    /**
     * Get example filepath based on sourcecode.
     */
    private function getExamplePathFromSource(string $file) : string {
        return sprintf('%s%s%s', trim($this->getSourceDirectory(), '\\/'), DIRECTORY_SEPARATOR, trim($file, '"'));
    }

}

Members

Title Sort descending Modifiers Object type Summary
ExampleFinder::$exampleDirectories private property @var string[]
ExampleFinder::$sourceDirectory private property
ExampleFinder::constructExamplePath private function Returns a path to the example file in the given directory..
ExampleFinder::find public function Attempts to find the example contents for the given descriptor.
ExampleFinder::getExampleDirectories public function Returns a series of directories that may contain examples.
ExampleFinder::getExampleFileContents private function Attempts to find the requested example file and returns its contents or null if no file was found.
ExampleFinder::getExamplePathFromExampleDirectory private function Get example filepath based on the example directory inside your project.
ExampleFinder::getExamplePathFromSource private function Get example filepath based on sourcecode.
ExampleFinder::getSourceDirectory public function Returns the project's root directory where an 'examples' folder can be expected.
ExampleFinder::setExampleDirectories public function Registers a series of directories that may contain examples.
ExampleFinder::setSourceDirectory public function Registers the project's root directory where an 'examples' folder can be expected.

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal