summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Prodromou <evan@status.net>2010-10-18 11:29:52 -0400
committerEvan Prodromou <evan@status.net>2010-10-18 11:29:52 -0400
commit7c05b0dafc609e978040e5612f6f6a86b0bb6420 (patch)
treebdf880a247ce8ca86f648a878e3f90cfe160c010
parent505ac6eba0e671e8823b5102de3caa0e0040c2cf (diff)
options to nofollow external links in notices
-rw-r--r--actions/showfavorites.php14
-rw-r--r--actions/shownotice.php2
-rw-r--r--actions/showstream.php2
-rw-r--r--lib/default.php3
-rw-r--r--lib/dofollowlistitem.php88
-rw-r--r--lib/util.php14
6 files changed, 117 insertions, 6 deletions
diff --git a/actions/showfavorites.php b/actions/showfavorites.php
index d8042e91c..77b73711d 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
+{
+}
diff --git a/actions/shownotice.php b/actions/shownotice.php
index c5180568b..5fc863486 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.
diff --git a/actions/showstream.php b/actions/showstream.php
index e9f117afc..be61a7ce0 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()
{
diff --git a/lib/default.php b/lib/default.php
index fb032930b..375088130 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/dofollowlistitem.php b/lib/dofollowlistitem.php
new file mode 100644
index 000000000..80e2d0b0a
--- /dev/null
+++ b/lib/dofollowlistitem.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * widget for displaying a list of notices
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category UI
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @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 <evan@status.net>
+ * @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
diff --git a/lib/util.php b/lib/util.php
index c05fcf15a..5a94182bd 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);
}