diff --git a/libs/ContentTypes/Markdown/LinkRenderer.php b/libs/ContentTypes/Markdown/LinkRenderer.php index d25bf74..edc013d 100644 --- a/libs/ContentTypes/Markdown/LinkRenderer.php +++ b/libs/ContentTypes/Markdown/LinkRenderer.php @@ -58,11 +58,13 @@ class LinkRenderer extends \League\CommonMark\Inline\Renderer\LinkRenderer throw new LinkNotFoundException("Could not locate file '$url'"); } - protected function isValidUrl($url) { + protected function isValidUrl($url) + { return !empty($url) && $url[0] != '#'; } - protected function isExternalUrl($url) { + protected function isExternalUrl($url) + { return preg_match('|^(?:[a-z]+:)?//|', $url); } @@ -101,10 +103,15 @@ class LinkRenderer extends \League\CommonMark\Inline\Renderer\LinkRenderer return $element; } + // if there's a hash component in the url, ensure we + // don't put that part through the resolver. + $urlAndHash = explode("#", $url); + $url = $urlAndHash[0]; + try { $file = $this->resolveInternalFile($url); $url = DauxHelper::getRelativePath($this->daux->getCurrentPage()->getUrl(), $file->getUrl()); - } catch(LinkNotFoundException $e) { + } catch (LinkNotFoundException $e) { if ($this->daux->isStatic()) { throw $e; } @@ -112,6 +119,10 @@ class LinkRenderer extends \League\CommonMark\Inline\Renderer\LinkRenderer $element->setAttribute('class', 'broken'); } + if (isset($urlAndHash[1])) { + $url .= "#" . $urlAndHash[1]; + } + $element->setAttribute('href', $url); return $element; diff --git a/tests/ContentTypes/Markdown/LinkRendererTest.php b/tests/ContentTypes/Markdown/LinkRendererTest.php index 8c5fa3b..af84842 100644 --- a/tests/ContentTypes/Markdown/LinkRendererTest.php +++ b/tests/ContentTypes/Markdown/LinkRendererTest.php @@ -45,6 +45,9 @@ class LinkRendererTest extends \PHPUnit_Framework_TestCase ['Link', '[Link](./Button)', 'Widgets/Page.html'], ['Link', '[Link](!Widgets/Button)', 'Widgets/Page.html'], + ['Link', '[Link](./Button#Test)', 'Widgets/Page.html'], + ['Link', '[Link](!Widgets/Button#Test)', 'Widgets/Page.html'], + // /Content/Page ['Link', '[Link](../Widgets/Button.md)', 'Content/Page.html'], ['Link', '[Link](!Widgets/Button)', 'Content/Page.html'],