-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathPostScanner.php
65 lines (53 loc) · 1.5 KB
/
PostScanner.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
namespace Swiftmade\Blogdown;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Config;
class PostScanner
{
const Extensions = [
'.md',
'.md.php',
'.blade.php',
'.md.blade.php',
];
public function __invoke()
{
$index = collect(File::files($this->blogFolder()))
->filter(function ($file) {
return preg_match($this->extensionMatcher(), $file);
})
->map(function ($path) {
return MetaParser::parse($path);
});
$this->checkForDuplicates($index);
return $index->keyBy('slug');
}
protected function checkForDuplicates($index)
{
$diff = array_diff(
$index->pluck('slug')->toArray(),
$index->pluck('slug')
->unique()
->toArray()
);
if (! empty($diff)) {
throw new \Exception('Blogdown duplicate slug: /' . $diff[0]);
}
}
protected function extensionMatcher()
{
$extensions = collect(self::Extensions)
->map(function ($ext) {
return preg_quote($ext);
})
->join('|');
return '/' . $extensions . '$/';
}
protected function blogFolder()
{
if (app()->runningUnitTests()) {
return __DIR__ . '/../tests/fixtures';
}
return resource_path('views/' . Config::get('blogdown.blog_folder'));
}
}