* Author URI: http://sgaul.de
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
if (function_exists('add_filter')) {
add_filter('get_comment_author_link', 'fmy_removeChosenSingleQuotedNofollowAttributesFromText');
add_filter('get_comment_text', 'fmy_removeChosenNofollowAttributesFromText');
}
function fmy_removeChosenNofollowAttributesFromText($text, $attributeDelimiter = '"') {
$fmf = new FollowMyFriends(
new FMF_AnchorStartingTagFactory($attributeDelimiter)
);
return $fmf->removeNofollowFromFriendlyLinks($text);
}
function fmy_removeChosenSingleQuotedNofollowAttributesFromText($text) {
return fmy_removeChosenNofollowAttributesFromText($text, "'");
}
class FollowMyFriends {
public $friendlyUrls = array(
'http://sgaul.de',
'http://www.georf.de',
'http://picomol.de'
);
private $finder;
private $tagFactory;
public function __construct($tagFactory) {
$this->finder = new FMF_AnchorTagFinder();
$this->tagFactory = $tagFactory;
}
public function removeNofollowFromFriendlyLinks($text) {
$tagStrings = $this->finder->findTagsInText($text);
foreach ($tagStrings as $tagString) {
$tag = $this->tagFactory->getInstance($tagString);
foreach ($this->friendlyUrls as $url) {
if (strpos($tag->getHref(), $url) === 0) {
$tag->setRel('external');
$text = str_replace($tagString, $tag->__toString(), $text);
}
}
}
return $text;
}
}
class FMF_AnchorTagFinder {
/**
* Find tags, e.g. ""
*/
public function findTagsInText($text) {
$tags = array();
$parts = explode('<', $text);
foreach ($parts as $i => $part) {
if ($i == 0) {
continue;
}
if ($this->startsWith($part, 'a ')) {
$tag = '<' . $part;
$tag = $this->extractBeginningTag($tag);
if ($tag !== null) {
$tags[] = $tag;
}
}
}
return $tags;
}
public function startsWith($haystack, $needle) {
return (strpos($haystack, $needle) === 0);
}
/**
* Get the tag from the beginning of a string
* "Foo..." => ""
*/
public function extractBeginningTag($htmlFramgent) {
$parts = explode('>', $htmlFramgent);
if (count($parts) > 1) {
return $parts[0] . '>';
} else {
return null;
}
}
}
class FMF_AnchorStartingTagFactory {
private $attributeDelimiter;
public function __construct($attributeDelimiter) {
$this->attributeDelimiter = $attributeDelimiter;
}
public function getInstance($tagString) {
return new FMF_AnchorStartingTag($tagString, $this->attributeDelimiter);
}
}
class FMF_AnchorStartingTag {
private $tag;
private $attributeDelimiter;
public function __construct($tag, $attributeDelimiter) {
$this->tag = $tag;
$this->attributeDelimiter = $attributeDelimiter;
}
public function getHref() {
if (preg_match(
'/href=' . $this->attributeDelimiter . '([^' . $this->attributeDelimiter . ']*)' . $this->attributeDelimiter . '/',
$this->tag, $result)) {
return $result[1];
}
return null;
}
public function getRel() {
if (preg_match(
'/rel=' . $this->attributeDelimiter . '([^' . $this->attributeDelimiter . ']*)' . $this->attributeDelimiter . '/',
$this->tag, $result)) {
return $result[1];
}
return null;
}
public function setRel($value) {
if ($value != null) {
$value = 'rel=' . $this->attributeDelimiter . $value . $this->attributeDelimiter;
}
$this->tag = str_replace(
'rel=' . $this->attributeDelimiter . $this->getRel() . $this->attributeDelimiter,
$value,
$this->tag
);
}
public function __toString() {
return $this->tag;
}
}