comparison vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php @ 12:7a779792577d

Update Drupal core to v8.4.5 (via Composer)
author Chris Cannam
date Fri, 23 Feb 2018 15:52:07 +0000
parents
children
comparison
equal deleted inserted replaced
11:bfffd8d7479a 12:7a779792577d
1 <?php
2 /**
3 * This file is part of phpDocumentor.
4 *
5 * For the full copyright and license information, please view the LICENSE
6 * file that was distributed with this source code.
7 *
8 * @copyright 2010-2015 Mike van Riel<mike@phpdoc.org>
9 * @license http://www.opensource.org/licenses/mit-license.php MIT
10 * @link http://phpdoc.org
11 */
12
13 namespace phpDocumentor\Reflection\DocBlock;
14
15 use phpDocumentor\Reflection\DocBlock\Tags\Example;
16
17 /**
18 * Class used to find an example file's location based on a given ExampleDescriptor.
19 */
20 class ExampleFinder
21 {
22 /** @var string */
23 private $sourceDirectory = '';
24
25 /** @var string[] */
26 private $exampleDirectories = [];
27
28 /**
29 * Attempts to find the example contents for the given descriptor.
30 *
31 * @param Example $example
32 *
33 * @return string
34 */
35 public function find(Example $example)
36 {
37 $filename = $example->getFilePath();
38
39 $file = $this->getExampleFileContents($filename);
40 if (!$file) {
41 return "** File not found : {$filename} **";
42 }
43
44 return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount()));
45 }
46
47 /**
48 * Registers the project's root directory where an 'examples' folder can be expected.
49 *
50 * @param string $directory
51 *
52 * @return void
53 */
54 public function setSourceDirectory($directory = '')
55 {
56 $this->sourceDirectory = $directory;
57 }
58
59 /**
60 * Returns the project's root directory where an 'examples' folder can be expected.
61 *
62 * @return string
63 */
64 public function getSourceDirectory()
65 {
66 return $this->sourceDirectory;
67 }
68
69 /**
70 * Registers a series of directories that may contain examples.
71 *
72 * @param string[] $directories
73 */
74 public function setExampleDirectories(array $directories)
75 {
76 $this->exampleDirectories = $directories;
77 }
78
79 /**
80 * Returns a series of directories that may contain examples.
81 *
82 * @return string[]
83 */
84 public function getExampleDirectories()
85 {
86 return $this->exampleDirectories;
87 }
88
89 /**
90 * Attempts to find the requested example file and returns its contents or null if no file was found.
91 *
92 * This method will try several methods in search of the given example file, the first one it encounters is
93 * returned:
94 *
95 * 1. Iterates through all examples folders for the given filename
96 * 2. Checks the source folder for the given filename
97 * 3. Checks the 'examples' folder in the current working directory for examples
98 * 4. Checks the path relative to the current working directory for the given filename
99 *
100 * @param string $filename
101 *
102 * @return string|null
103 */
104 private function getExampleFileContents($filename)
105 {
106 $normalizedPath = null;
107
108 foreach ($this->exampleDirectories as $directory) {
109 $exampleFileFromConfig = $this->constructExamplePath($directory, $filename);
110 if (is_readable($exampleFileFromConfig)) {
111 $normalizedPath = $exampleFileFromConfig;
112 break;
113 }
114 }
115
116 if (!$normalizedPath) {
117 if (is_readable($this->getExamplePathFromSource($filename))) {
118 $normalizedPath = $this->getExamplePathFromSource($filename);
119 } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) {
120 $normalizedPath = $this->getExamplePathFromExampleDirectory($filename);
121 } elseif (is_readable($filename)) {
122 $normalizedPath = $filename;
123 }
124 }
125
126 return $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : null;
127 }
128
129 /**
130 * Get example filepath based on the example directory inside your project.
131 *
132 * @param string $file
133 *
134 * @return string
135 */
136 private function getExamplePathFromExampleDirectory($file)
137 {
138 return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file;
139 }
140
141 /**
142 * Returns a path to the example file in the given directory..
143 *
144 * @param string $directory
145 * @param string $file
146 *
147 * @return string
148 */
149 private function constructExamplePath($directory, $file)
150 {
151 return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file;
152 }
153
154 /**
155 * Get example filepath based on sourcecode.
156 *
157 * @param string $file
158 *
159 * @return string
160 */
161 private function getExamplePathFromSource($file)
162 {
163 return sprintf(
164 '%s%s%s',
165 trim($this->getSourceDirectory(), '\\/'),
166 DIRECTORY_SEPARATOR,
167 trim($file, '"')
168 );
169 }
170 }