From 90a53f6cde1e3344483953b8f0ce894227e919d6 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 18 Oct 2010 11:05:03 -0400 Subject: [PATCH 1/5] add rel='nofollow' to external links --- lib/default.php | 3 ++- lib/util.php | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/default.php b/lib/default.php index fb032930b2..3750881303 100644 --- a/lib/default.php +++ b/lib/default.php @@ -317,7 +317,8 @@ $default = 'nofollow' => array('subscribers' => true, 'members' => true, - 'peopletag' => true), + 'peopletag' => true, + 'external' => 'always'), // Options: 'sometimes', 'never', default = 'always' 'http' => // HTTP client settings when contacting other sites array('ssl_cafile' => false, // To enable SSL cert validation, point to a CA bundle (eg '/usr/lib/ssl/certs/ca-certificates.crt') 'curl' => false, // Use CURL backend for HTTP fetches if available. (If not, PHP's socket streams will be used.) diff --git a/lib/util.php b/lib/util.php index c05fcf15a2..5a94182bda 100644 --- a/lib/util.php +++ b/lib/util.php @@ -145,7 +145,6 @@ function common_switch_locale($language=null) textdomain("statusnet"); } - function common_timezone() { if (common_logged_in()) { @@ -860,7 +859,8 @@ function common_linkify($url) { $longurl = $url; } } - $attrs = array('href' => $canon, 'title' => $longurl, 'rel' => 'external'); + + $attrs = array('href' => $canon, 'title' => $longurl); $is_attachment = false; $attachment_id = null; @@ -896,6 +896,16 @@ function common_linkify($url) { $attrs['id'] = "attachment-{$attachment_id}"; } + // Whether to nofollow + + $nf = common_config('nofollow', 'external'); + + if ($nf == 'never') { + $attrs['rel'] = 'external'; + } else { + $attrs['rel'] = 'nofollow external'; + } + return XMLStringer::estring('a', $attrs, $url); } From f713b9f0fd78949fef46cdad00c78493dc0e0fc1 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 18 Oct 2010 11:21:00 -0400 Subject: [PATCH 2/5] superclass for noticelistitems that strip rel=nofollow when nofollow|external=sometimes --- lib/dofollowlistitem.php | 88 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 lib/dofollowlistitem.php diff --git a/lib/dofollowlistitem.php b/lib/dofollowlistitem.php new file mode 100644 index 0000000000..80e2d0b0a7 --- /dev/null +++ b/lib/dofollowlistitem.php @@ -0,0 +1,88 @@ +. + * + * @category UI + * @package StatusNet + * @author Evan Prodromou + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/noticelist.php'; + +/** + * StatusNet, the distributed open-source microblogging tool + * + * Widget superclass for notice list items that remove rel=nofollow + * + * When nofollow|external = 'sometimes', notices get rendered and saved + * with rel=nofollow for external links. We want to remove that relationship + * on some pages (profile, single notice, faves). This superclass for + * some noticelistitems will strip that bit of code out when showing + * notice content + * + * @category UI + * @package StatusNet + * @author Evan Prodromou + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +class DoFollowListItem extends NoticeListItem +{ + /** + * show the content of the notice + * + * Trims out the rel=nofollow for external links + * if nofollow|external = 'sometimes' + * + * @return void + */ + + function showContent() + { + // FIXME: URL, image, video, audio + $this->out->elementStart('p', array('class' => 'entry-content')); + + if (!empty($this->notice->rendered)) { + $html = $this->notice->rendered; + } else { + $html = common_render_content($this->notice->content, $this->notice); + } + + if (common_config('nofollow', 'external') == 'sometimes') { + // remove the nofollow part + // XXX: cache the results here + + $html = preg_replace('/rel="(.*)nofollow ?/', 'rel="\1', $html); + } + + $this->out->raw($html); + + $this->out->elementEnd('p'); + } +} \ No newline at end of file From f550fefebfa53c95ad6603dc1655e53a3960c885 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 18 Oct 2010 11:28:15 -0400 Subject: [PATCH 3/5] When nofollow|external=sometimes, do follow on profile page --- actions/showstream.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/showstream.php b/actions/showstream.php index e9f117afc4..be61a7ce0d 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -275,7 +275,7 @@ class ProfileNoticeList extends NoticeList } } -class ProfileNoticeListItem extends NoticeListItem +class ProfileNoticeListItem extends DoFollowListItem { function showAuthor() { From 5329c5001cefeca2301ca28b2a75b6970197558b Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 18 Oct 2010 11:28:22 -0400 Subject: [PATCH 4/5] When nofollow|external=sometimes, do follow on notice page --- actions/shownotice.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/shownotice.php b/actions/shownotice.php index c5180568b3..5fc863486c 100644 --- a/actions/shownotice.php +++ b/actions/shownotice.php @@ -311,7 +311,7 @@ class ShownoticeAction extends OwnerDesignAction } } -class SingleNoticeItem extends NoticeListItem +class SingleNoticeItem extends DoFollowListItem { /** * recipe function for displaying a single notice. From 0e443c524f61fca5d923e69a118a75338a18bf5d Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 18 Oct 2010 11:28:31 -0400 Subject: [PATCH 5/5] When nofollow|external=sometimes, do follow on favorites page --- actions/showfavorites.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/actions/showfavorites.php b/actions/showfavorites.php index d8042e91c7..77b73711d2 100644 --- a/actions/showfavorites.php +++ b/actions/showfavorites.php @@ -227,7 +227,7 @@ class ShowfavoritesAction extends OwnerDesignAction function showContent() { - $nl = new NoticeList($this->notice, $this); + $nl = new FavoritesNoticeList($this->notice, $this); $cnt = $nl->show(); if (0 == $cnt) { @@ -244,3 +244,15 @@ class ShowfavoritesAction extends OwnerDesignAction } } +class FavoritesNoticeList extends NoticeList +{ + function newListItem($notice) + { + return new FavoritesNoticeListItem($notice, $this->out); + } +} + +// All handled by superclass +class FavoritesNoticeListItem extends DoFollowListItem +{ +}