diff --git a/app/SculpinKernel.php b/app/SculpinKernel.php index 6196bef..4755b50 100644 --- a/app/SculpinKernel.php +++ b/app/SculpinKernel.php @@ -1,7 +1,7 @@ allSources() as $source) { $filename = $source->filename(); - if ($this->endsWith($filename, '.md') || $this->endsWith($filename, '.html.twig')) { + + $isSuitable = $filename === 'sitemap.xml' + || $this->endsWith($filename, '.md') + || $this->endsWith($filename, '.html.twig') + ; + + if ($isSuitable) { yield $source; } } diff --git a/bundle/SiteMapBundle/DependencyInjection/SiteMapExtension.php b/bundle/SiteMapBundle/DependencyInjection/SiteMapExtension.php new file mode 100644 index 0000000..cb7eb72 --- /dev/null +++ b/bundle/SiteMapBundle/DependencyInjection/SiteMapExtension.php @@ -0,0 +1,20 @@ +load('services.xml'); + } +} diff --git a/bundle/SiteMapBundle/Resources/config/services.xml b/bundle/SiteMapBundle/Resources/config/services.xml new file mode 100644 index 0000000..3118598 --- /dev/null +++ b/bundle/SiteMapBundle/Resources/config/services.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/bundle/SiteMapBundle/SiteMapBundle.php b/bundle/SiteMapBundle/SiteMapBundle.php new file mode 100644 index 0000000..01186c9 --- /dev/null +++ b/bundle/SiteMapBundle/SiteMapBundle.php @@ -0,0 +1,9 @@ + 'saveSourceSet', + ]; + } + + /** + * Before run. + * + * @param SourceSetEvent $sourceSetEvent Source Set Event + */ + public function saveSourceSet(SourceSetEvent $sourceSetEvent) + { + $this->sources = $sourceSetEvent->sourceSet(); + } + + protected function buildSiteMap() + { + if (!empty($this->siteMap)) { + return $this->siteMap; + } + + $siteMap = []; + + /** @var \Sculpin\Core\Source\FileSource $source */ + foreach ($this->sources->allSources() as $source) { + $data = $source->data()->export(); + + if (empty($data) || $source->useFileReference()) { + continue; + } + + $siteMapData = $data['sitemap'] ?? []; + + if (isset($siteMapData['_exclude'])) { + continue; + } + + $loc = $data['canonical'] ?? $data['url']; + + if (is_callable([$source, 'file'])) { + $lastmod = date(DATE_W3C, $source->file()->getMTime()); + } else { + $lastmod = date(DATE_W3C); + } + + $url = [ + 'loc' => $loc, + 'lastmod' => $lastmod, + ]; + + if (isset($data['sitemap'])) { + $url = array_merge($url, $data['sitemap']); + } + + $siteMap[$url['loc']] = $url; + } + + $this->siteMap = $siteMap; + + return $this->siteMap; + } + + /** + * Provide data. + * + * @return array + */ + public function provideData(): array + { + $this->buildSiteMap(); + + return $this->siteMap; + } +} diff --git a/source/sitemap.xml b/source/sitemap.xml index e0c3512..b587919 100644 --- a/source/sitemap.xml +++ b/source/sitemap.xml @@ -11,7 +11,7 @@ sitemap: {# Last slash for pretty url #} - {{ site.url }}{{ url.loc != '/.' ? (url.loc ~ '/') : '' }} + {{ site.url }}{{ url.loc != '/.' ? (url.loc|trim('/', side='right') ~ '/') : '' }} {{ url.lastmod }}