diff --git a/src/applications/phriction/markup/PhrictionRemarkupRule.php b/src/applications/phriction/markup/PhrictionRemarkupRule.php --- a/src/applications/phriction/markup/PhrictionRemarkupRule.php +++ b/src/applications/phriction/markup/PhrictionRemarkupRule.php @@ -16,7 +16,15 @@ } public function markupDocumentLink(array $matches) { - $link = trim($matches[1]); + // If the link contains an anchor, separate that off first. + $parts = explode('#', trim($matches[1]), 2); + if (count($parts) == 2) { + $link = $parts[0]; + $anchor = $parts[1]; + } else { + $link = $parts[0]; + $anchor = null; + } // Handle relative links. if ((substr($link, 0, 2) === './') || (substr($link, 0, 3) === '../')) { @@ -67,6 +75,7 @@ $metadata[] = array( 'token' => $token, 'link' => $link, + 'anchor' => $anchor, 'explicitName' => $name, ); $engine->setTextMetadata(self::KEY_RULE_PHRICTION_LINK, $metadata); @@ -140,12 +149,13 @@ } } - $uri = new PhutilURI($link); - $slug = $uri->getPath(); - $fragment = $uri->getFragment(); - $slug = PhabricatorSlug::normalize($slug); - $slug = PhrictionDocument::getSlugURI($slug); - $href = (string)id(new PhutilURI($slug))->setFragment($fragment); + $uri = new PhutilURI($link); + $slug = $uri->getPath(); + $slug = PhabricatorSlug::normalize($slug); + $slug = PhrictionDocument::getSlugURI($slug); + + $anchor = idx($spec, 'anchor'); + $href = (string)id(new PhutilURI($slug))->setFragment($anchor); $text_mode = $this->getEngine()->isTextMode(); $mail_mode = $this->getEngine()->isHTMLMailMode(); diff --git a/src/infrastructure/markup/PhabricatorMarkupEngine.php b/src/infrastructure/markup/PhabricatorMarkupEngine.php --- a/src/infrastructure/markup/PhabricatorMarkupEngine.php +++ b/src/infrastructure/markup/PhabricatorMarkupEngine.php @@ -42,7 +42,7 @@ private $objects = array(); private $viewer; private $contextObject; - private $version = 15; + private $version = 16; private $engineCaches = array(); private $auxiliaryConfig = array();