Skip to content

Commit

Permalink
FIX SiteTreeLinkTracking_Parser should use the getAnchorsOnPage (#2697)
Browse files Browse the repository at this point in the history
Currently, the SiteTreeLinkTracking_Parser only checks the page's content for anchors.
As a result, any anchors that have been added or modified by the updateAnchorsOnPage extension in the getAnchorsOnPage method are marked ss-broken.

This change updates SiteTreeLinkTracking_Parser to get the anchors from the getAnchorsOnPage function on SiteTree. This will allow for more consistent RegEx matching and allow the updateAnchorsOnPage extension to be used when checking for broken links.
  • Loading branch information
kevin-hine-innis committed Nov 3, 2021
1 parent e7c49fa commit bcbeb6d
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 2 deletions.
3 changes: 1 addition & 2 deletions code/Model/SiteTreeLinkTracking_Parser.php
Expand Up @@ -68,8 +68,7 @@ public function process(HTMLValue $htmlValue)
$broken = true;
} elseif (!empty($matches['anchor'])) {
// Ensure anchor isn't broken on target page
$anchor = preg_quote($matches['anchor'], '/');
$broken = !preg_match("/(name|id)=\"{$anchor}\"/", $page->Content);
$broken = !in_array($matches['anchor'], $page->getAnchorsOnPage());
} else {
$broken = false;
}
Expand Down
8 changes: 8 additions & 0 deletions tests/php/Model/SiteTreeLinkTrackingTest.php
Expand Up @@ -3,6 +3,7 @@
namespace SilverStripe\CMS\Tests\Model;

use Page;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\CMS\Model\SiteTreeLinkTracking_Parser;
use SilverStripe\Control\Director;
use SilverStripe\Dev\SapphireTest;
Expand Down Expand Up @@ -31,6 +32,8 @@ protected function isBroken($content)

public function testParser()
{
SiteTree::add_extension(Page::class, SiteTreeLinkTracking_Extension::class);

// Shortcodes
$this->assertTrue($this->isBroken('<a href="[sitetree_link,id=123]">link</a>'));
$this->assertTrue($this->isBroken('<a href="[sitetree_link,id=123]#no-such-anchor">link</a>'));
Expand All @@ -52,6 +55,7 @@ public function testParser()
$this->assertFalse($this->isBroken('<a id="anchor">anchor</a>'));
$this->assertTrue($this->isBroken('<a href="##anchor">anchor</a>'));


$page = new Page();
$page->Content = '<a name="yes-name-anchor">name</a><a id="yes-id-anchor">id</a>';
$page->write();
Expand All @@ -60,6 +64,10 @@ public function testParser()
$this->assertFalse($this->isBroken("<a href=\"[sitetree_link,id=$page->ID]#yes-name-anchor\">link</a>"));
$this->assertFalse($this->isBroken("<a href=\"[sitetree_link,id=$page->ID]#yes-id-anchor\">link</a>"));
$this->assertTrue($this->isBroken("<a href=\"[sitetree_link,id=$page->ID]#http://invalid-anchor.com\"></a>"));

// Anchors Via updateAnchorsOnPage Extension
$this->assertFalse($this->isBroken("<a href=\"[sitetree_link,id=$page->ID]#extension-anchor\">link</a>"));
$this->assertTrue($this->isBroken("<a href=\"[sitetree_link,id=$page->ID]#no-such-anchor\"></a>"));
}

protected function highlight($content)
Expand Down
18 changes: 18 additions & 0 deletions tests/php/Model/SiteTreeLinkTracking_Extension.php
@@ -0,0 +1,18 @@
<?php

namespace SilverStripe\CMS\Tests\Model;

use SilverStripe\Dev\TestOnly;
use SilverStripe\ORM\DataExtension;

class SiteTreeLinkTracking_Extension extends DataExtension implements TestOnly
{
public function updateAnchorsOnPage(&$anchors)
{
array_push(
$anchors,
'extension-anchor',
'extension-anchor-1'
);
}
}

0 comments on commit bcbeb6d

Please sign in to comment.