diff options
37 files changed, 1015 insertions, 504 deletions
@@ -2,8 +2,8 @@ README ------ -StatusNet 0.9.0 ("Stand") -4 Mar 2010 +StatusNet 0.9.1 ("Everybody Hurts") +28 Mar 2010 This is the README file for StatusNet, the Open Source microblogging platform. It includes installation instructions, descriptions of @@ -77,57 +77,34 @@ for additional terms. New this version ================ -This is a major feature release since version 0.8.3, released Feb 1 -2010. It is the final release version of 0.9.0, replacing any beta -versions. +This is a minor bug and feature release since version 0.9.0 released 4 +March 2010. + +Because of fixes to OStatus bugs, it is highly recommended that all +public sites upgrade to the new version immediately. Notable changes this version: -- Support for the new distributed status update standard OStatus - <http://ostatus.org>, based on PubSubHubbub, Salmon, Webfinger, - and Activity Streams. -- Support for location using the Geolocation API. Notices are (optionally) - marked with lat-long information with geo microformats, and can be shown - on a map. -- No fixed content size. Notice size is configurable, from 1 to - unlimited number of characters. Default is still 140! -- An authorization framework, allowing different levels of users. -- A Web-based administration panel. -- A moderation system that lets site moderators sandbox, silence, - or delete uncooperative users. -- A flag system that lets users flag profiles for moderator review. -- Support for OAuth <http://oauth.net> authentication in the Twitter - API. -- User roles system that lets the owner of the site to assign - administrator and moderator roles to other users. -- A pluggable authentication system. -- An authentication plugin for LDAP servers. -- Many features that were core in 0.8.x are now plugins, such - as OpenID, Twitter integration, Facebook integration -- A much-improved offline processing system -- In-browser "realtime" updates using a number of realtime - servers (Meteor, Orbited, Cometd) -- A plugin to provide an interface optimized for mobile browsers -- Support for Facebook Connect -- Support for logging in with a Twitter account -- Vastly improved translation with additional languages and - translation in plugins -- Support for all-SSL instances -- Core support for "repeats" (like Twitter's "retweets") -- Pluggable caching system, with plugins for Memcached, - APC, XCache, and a disk-based cache -- Plugin to support RSSCloud -- A framework for adding advertisements to a public site, - and plugins for Google AdSense and OpenX server -- Plugins to throttle excessive subscriptions and registrations. -- A plugin to blacklist particular URLs or nicknames. - -There are also literally thousands of bugs fixed and minor features -added. A full changelog is available at http://status.net/wiki/StatusNet_0.9.0. - -Under the covers, the software has a vastly improved plugin and -extension mechanism that makes writing powerful and flexible additions -to the core functionality much easier. +- Twitter bridge truncates and links back to original for long + notices. +- Changed "Home" link in main menu to "Personal". +- A new memcached plugin (using pecl/memcached versus pecl/memcache) +- Opt-in subscription to update@status.net +- Script to run commands on behalf of a user. +- Better Web UI for long notices. +- A plugin to open external links in their own window or tab +- Fixes to Salmon protocol for compatibility with other systems. +- Updates to latest ActivityStreams definition. +- Twitpic-compatible API for image upload. +- Background deletion of user accounts. +- Better support for HTTP basic authentication with CGI/FastCGI +- Better discovery on OStatus +- Support for PuSH-enabled RSS 2.0 feeds +- OpenID-only mode +- OpenID blacklist/whitelist +- OStatus unit tests + +A full changelog is available at http://status.net/wiki/StatusNet_0.9.1. Prerequisites ============= @@ -239,9 +216,9 @@ especially if you've previously installed PHP/MySQL packages. 1. Unpack the tarball you downloaded on your Web server. Usually a command like this will work: - tar zxf statusnet-0.9.0.tar.gz + tar zxf statusnet-0.9.1.tar.gz - ...which will make a statusnet-0.9.0 subdirectory in your current + ...which will make a statusnet-0.9.1 subdirectory in your current directory. (If you don't have shell access on your Web server, you may have to unpack the tarball on your local computer and FTP the files to the server.) @@ -249,7 +226,7 @@ especially if you've previously installed PHP/MySQL packages. 2. Move the tarball to a directory of your choosing in your Web root directory. Usually something like this will work: - mv statusnet-0.9.0 /var/www/statusnet + mv statusnet-0.9.1 /var/www/statusnet This will make your StatusNet instance available in the statusnet path of your server, like "http://example.net/statusnet". "microblog" or @@ -664,7 +641,7 @@ with this situation. If you've been using StatusNet 0.7, 0.6, 0.5 or lower, or if you've been tracking the "git" version of the software, you will probably want to upgrade and keep your existing data. There is no automated -upgrade procedure in StatusNet 0.9.0. Try these step-by-step +upgrade procedure in StatusNet 0.9.1. Try these step-by-step instructions; read to the end first before trying them. 0. Download StatusNet and set up all the prerequisites as if you were @@ -685,7 +662,7 @@ instructions; read to the end first before trying them. 5. Once all writing processes to your site are turned off, make a final backup of the Web directory and database. 6. Move your StatusNet directory to a backup spot, like "statusnet.bak". -7. Unpack your StatusNet 0.9.0 tarball and move it to "statusnet" or +7. Unpack your StatusNet 0.9.1 tarball and move it to "statusnet" or wherever your code used to be. 8. Copy the config.php file and avatar directory from your old directory to your new directory. @@ -1522,7 +1499,7 @@ repository (see below), and you get a compilation error ("unexpected T_STRING") in the browser, check to see that you don't have any conflicts in your code. -If you upgraded to StatusNet 0.9.0 without reading the "Notice +If you upgraded to StatusNet 0.9.1 without reading the "Notice inboxes" section above, and all your users' 'Personal' tabs are empty, read the "Notice inboxes" section above. diff --git a/actions/showgroup.php b/actions/showgroup.php index 5704b13d1..a0d05ba37 100644 --- a/actions/showgroup.php +++ b/actions/showgroup.php @@ -221,7 +221,8 @@ class ShowgroupAction extends GroupDesignAction function showGroupProfile() { - $this->elementStart('div', 'entity_profile vcard author'); + $this->elementStart('div', array('id' => 'i', + 'class' => 'entity_profile vcard author')); $this->element('h2', null, _('Group profile')); diff --git a/actions/subscriptions.php b/actions/subscriptions.php index ba6171ef4..7b10b3425 100644 --- a/actions/subscriptions.php +++ b/actions/subscriptions.php @@ -196,12 +196,30 @@ class SubscriptionsListItem extends SubscriptionListItem $this->out->hidden('token', common_session_token()); $this->out->hidden('profile', $this->profile->id); if (common_config('xmpp', 'enabled')) { - $this->out->checkbox('jabber', _('Jabber'), $sub->jabber); + $attrs = array('name' => 'jabber', + 'type' => 'checkbox', + 'class' => 'checkbox', + 'id' => 'jabber-'.$this->profile->id); + if ($sub->jabber) { + $attrs['checked'] = 'checked'; + } + + $this->out->element('input', $attrs); + $this->out->element('label', array('for' => 'jabber-'.$this->profile->id), _('Jabber')); } else { $this->out->hidden('jabber', $sub->jabber); } if (common_config('sms', 'enabled')) { - $this->out->checkbox('sms', _('SMS'), $sub->sms); + $attrs = array('name' => 'sms', + 'type' => 'checkbox', + 'class' => 'checkbox', + 'id' => 'sms-'.$this->profile->id); + if ($sub->sms) { + $attrs['checked'] = 'checked'; + } + + $this->out->element('input', $attrs); + $this->out->element('label', array('for' => 'sms-'.$this->profile->id), _('SMS')); } else { $this->out->hidden('sms', $sub->sms); } diff --git a/classes/User.php b/classes/User.php index 8ad2ec63d..659ec9467 100644 --- a/classes/User.php +++ b/classes/User.php @@ -670,8 +670,12 @@ class User extends Memcached_DataObject function delete() { - $profile = $this->getProfile(); - $profile->delete(); + try { + $profile = $this->getProfile(); + $profile->delete(); + } catch (UserNoProfileException $unp) { + common_log(LOG_INFO, "User {$this->nickname} has no profile; continuing deletion."); + } $related = array('Fave', 'Confirm_address', @@ -679,6 +683,7 @@ class User extends Memcached_DataObject 'Foreign_link', 'Invitation', ); + Event::handle('UserDeleteRelated', array($this, &$related)); foreach ($related as $cls) { diff --git a/js/util.js b/js/util.js index 3efda0d7b..1320d11b4 100644 --- a/js/util.js +++ b/js/util.js @@ -61,10 +61,8 @@ var SN = { // StatusNet U: { // Utils FormNoticeEnhancements: function(form) { - form_id = form.attr('id'); - if (jQuery.data(form[0], 'ElementData') === undefined) { - MaxLength = $('#'+form_id+' #'+SN.C.S.NoticeTextCount).text(); + MaxLength = form.find('#'+SN.C.S.NoticeTextCount).text(); if (typeof(MaxLength) == 'undefined') { MaxLength = SN.C.I.MaxLength; } @@ -72,7 +70,7 @@ var SN = { // StatusNet SN.U.Counter(form); - NDT = $('#'+form_id+' #'+SN.C.S.NoticeDataText); + NDT = form.find('#'+SN.C.S.NoticeDataText); NDT.bind('keyup', function(e) { SN.U.Counter(form); @@ -83,11 +81,11 @@ var SN = { // StatusNet }); } else { - $('#'+form_id+' #'+SN.C.S.NoticeTextCount).text(jQuery.data(form[0], 'ElementData').MaxLength); + form.find('#'+SN.C.S.NoticeTextCount).text(jQuery.data(form[0], 'ElementData').MaxLength); } - if ($('body')[0].id != 'conversation') { - $('#'+form_id+' textarea').focus(); + if ($('body')[0].id != 'conversation' && window.location.hash.length === 0) { + form.find('textarea').focus(); } }, @@ -105,7 +103,6 @@ var SN = { // StatusNet Counter: function(form) { SN.C.I.FormNoticeCurrent = form; - form_id = form.attr('id'); var MaxLength = jQuery.data(form[0], 'ElementData').MaxLength; @@ -113,8 +110,8 @@ var SN = { // StatusNet return; } - var remaining = MaxLength - $('#'+form_id+' #'+SN.C.S.NoticeDataText).val().length; - var counter = $('#'+form_id+' #'+SN.C.S.NoticeTextCount); + var remaining = MaxLength - form.find('#'+SN.C.S.NoticeDataText).val().length; + var counter = form.find('#'+SN.C.S.NoticeTextCount); if (remaining.toString() != counter.text()) { if (!SN.C.I.CounterBlackout || remaining === 0) { @@ -174,7 +171,6 @@ var SN = { // StatusNet FormNoticeXHR: function(form) { SN.C.I.NoticeDataGeo = {}; - form_id = form.attr('id'); form.append('<input type="hidden" name="ajax" value="1"/>'); form.ajaxForm({ dataType: 'xml', @@ -403,58 +399,72 @@ var SN = { // StatusNet return; } - $.fn.jOverlay.options = { - method : 'GET', - data : '', - url : '', - color : '#000', - opacity : '0.6', - zIndex : 9999, - center : false, - imgLoading : $('address .url')[0].href+'theme/base/images/illustrations/illu_progress_loading-01.gif', - bgClickToClose : true, - success : function() { - $('#jOverlayContent').append('<button class="close">×</button>'); - $('#jOverlayContent button').click($.closeOverlay); - }, - timeout : 0, - autoHide : true, - css : {'max-width':'542px', 'top':'5%', 'left':'32.5%'} - }; - - notice.find('a.attachment').click(function() { - var attachId = ($(this).attr('id').substring('attachment'.length + 1)); - if (attachId) { - $().jOverlay({url: $('address .url')[0].href+'attachment/' + attachId + '/ajax'}); - return false; - } - }); + var attachment_more = notice.find('.attachment.more'); + if (attachment_more.length > 0) { + $(attachment_more[0]).click(function() { + var m = $(this); + m.addClass(SN.C.S.Processing); + $.get(m.attr('href')+'/ajax', null, function(data) { + m.parent('.entry-content').html($(data).find('#attachment_view .entry-content').html()); + }); - if ($('#shownotice').length == 0) { - var t; - notice.find('a.thumbnail').hover( - function() { - var anchor = $(this); - $('a.thumbnail').children('img').hide(); - anchor.closest(".entry-title").addClass('ov'); - - if (anchor.children('img').length === 0) { - t = setTimeout(function() { - $.get($('address .url')[0].href+'attachment/' + (anchor.attr('id').substring('attachment'.length + 1)) + '/thumbnail', null, function(data) { - anchor.append(data); - }); - }, 500); - } - else { - anchor.children('img').show(); - } + return false; + }); + } + else { + $.fn.jOverlay.options = { + method : 'GET', + data : '', + url : '', + color : '#000', + opacity : '0.6', + zIndex : 9999, + center : false, + imgLoading : $('address .url')[0].href+'theme/base/images/illustrations/illu_progress_loading-01.gif', + bgClickToClose : true, + success : function() { + $('#jOverlayContent').append('<button class="close">×</button>'); + $('#jOverlayContent button').click($.closeOverlay); }, - function() { - clearTimeout(t); - $('a.thumbnail').children('img').hide(); - $(this).closest('.entry-title').removeClass('ov'); + timeout : 0, + autoHide : true, + css : {'max-width':'542px', 'top':'5%', 'left':'32.5%'} + }; + + notice.find('a.attachment').click(function() { + var attachId = ($(this).attr('id').substring('attachment'.length + 1)); + if (attachId) { + $().jOverlay({url: $('address .url')[0].href+'attachment/' + attachId + '/ajax'}); + return false; } - ); + }); + + if ($('#shownotice').length == 0) { + var t; + notice.find('a.thumbnail').hover( + function() { + var anchor = $(this); + $('a.thumbnail').children('img').hide(); + anchor.closest(".entry-title").addClass('ov'); + + if (anchor.children('img').length === 0) { + t = setTimeout(function() { + $.get($('address .url')[0].href+'attachment/' + (anchor.attr('id').substring('attachment'.length + 1)) + '/thumbnail', null, function(data) { + anchor.append(data); + }); + }, 500); + } + else { + anchor.children('img').show(); + } + }, + function() { + clearTimeout(t); + $('a.thumbnail').children('img').hide(); + $(this).closest('.entry-title').removeClass('ov'); + } + ); + } } }, diff --git a/lib/action.php b/lib/action.php index 491d7d481..09113a598 100644 --- a/lib/action.php +++ b/lib/action.php @@ -198,8 +198,7 @@ class Action extends HTMLOutputter // lawsuit if (Event::handle('StartShowStatusNetStyles', array($this)) && Event::handle('StartShowLaconicaStyles', array($this))) { - $this->cssLink('css/display.css',null,'screen, projection, tv'); - $this->cssLink('css/print.css','base','print'); + $this->cssLink('css/display.css',null, 'screen, projection, tv, print'); Event::handle('EndShowStatusNetStyles', array($this)); Event::handle('EndShowLaconicaStyles', array($this)); } diff --git a/lib/activity.php b/lib/activity.php index f9192c6b8..5d6230c6d 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -179,6 +179,17 @@ class Activity $this->actor = new ActivityObject($actorEl); + // Cliqset has bad actor IDs (just nickname of user). We + // work around it by getting the author data and using its + // id instead + + if (!preg_match('/^\w+:/', $this->actor->id)) { + $authorEl = ActivityUtils::child($entry, 'author'); + if (!empty($authorEl)) { + $authorObj = new ActivityObject($authorEl); + $this->actor->id = $authorObj->id; + } + } } else if (!empty($feed) && $subjectEl = $this->_child($feed, self::SUBJECT)) { diff --git a/lib/activityobject.php b/lib/activityobject.php index 34d1b9170..677a48197 100644 --- a/lib/activityobject.php +++ b/lib/activityobject.php @@ -177,10 +177,7 @@ class ActivityObject $this->type = self::PERSON; // XXX: is this fair? $this->title = $this->_childContent($element, self::NAME); - $id = $this->_childContent($element, self::URI); - if (ActivityUtils::validateUri($id)) { - $this->id = $id; - } + $this->id = $this->_childContent($element, self::URI); if (empty($this->id)) { $email = $this->_childContent($element, self::EMAIL); @@ -193,15 +190,6 @@ class ActivityObject private function _fromAtomEntry($element) { - if ($element->localName == 'actor') { - // Old-fashioned <activity:actor>... - // First pull anything from <author>, then we'll add on top. - $author = ActivityUtils::child($element->parentNode, 'author'); - if ($author) { - $this->_fromAuthor($author); - } - } - $this->type = $this->_childContent($element, Activity::OBJECTTYPE, Activity::SPEC); @@ -209,11 +197,6 @@ class ActivityObject $this->type = ActivityObject::NOTE; } - $id = $this->_childContent($element, self::ID); - if (ActivityUtils::validateUri($id)) { - $this->id = $id; - } - $this->summary = ActivityUtils::childHtmlContent($element, self::SUMMARY); $this->content = ActivityUtils::getContent($element); @@ -226,6 +209,12 @@ class ActivityObject $this->source = $this->_getSource($element); $this->link = ActivityUtils::getPermalink($element); + + $this->id = $this->_childContent($element, self::ID); + + if (empty($this->id) && !empty($this->link)) { // fallback if there's no ID + $this->id = $this->link; + } } // @fixme rationalize with Activity::_fromRssItem() diff --git a/lib/attachmentlist.php b/lib/attachmentlist.php index fe38281af..43f836e15 100644 --- a/lib/attachmentlist.php +++ b/lib/attachmentlist.php @@ -248,9 +248,7 @@ class Attachment extends AttachmentListItem $this->out->elementStart('div', array('id' => 'attachment_view', 'class' => 'hentry')); $this->out->elementStart('div', 'entry-title'); - $this->out->elementStart('a', $this->linkAttr()); - $this->out->element('span', null, $this->linkTitle()); - $this->out->elementEnd('a'); + $this->out->element('a', $this->linkAttr(), $this->linkTitle()); $this->out->elementEnd('div'); $this->out->elementStart('div', 'entry-content'); @@ -296,7 +294,7 @@ class Attachment extends AttachmentListItem } function linkAttr() { - return array('class' => 'external', 'href' => $this->attachment->url); + return array('rel' => 'external', 'href' => $this->attachment->url); } function linkTitle() { @@ -332,6 +330,15 @@ class Attachment extends AttachmentListItem $this->out->element('param', array('name' => 'autoStart', 'value' => 1)); $this->out->elementEnd('object'); break; + + case 'text/html': + if ($this->attachment->filename) { + // Locally-uploaded HTML. Scrub and display inline. + $this->showHtmlFile($this->attachment); + break; + } + // Fall through to default. + default: $this->showFallback(); } @@ -361,6 +368,59 @@ class Attachment extends AttachmentListItem } } + protected function showHtmlFile(File $attachment) + { + $body = $this->scrubHtmlFile($attachment); + if ($body) { + $this->out->raw($body); + } + } + + /** + * @return mixed false on failure, HTML fragment string on success + */ + protected function scrubHtmlFile(File $attachment) + { + $path = File::path($attachment->filename); + if (!file_exists($path) || !is_readable($path)) { + common_log(LOG_ERR, "Missing local HTML attachment $path"); + return false; + } + $raw = file_get_contents($path); + + // Normalize... + $dom = new DOMDocument(); + if(!$dom->loadHTML($raw)) { + common_log(LOG_ERR, "Bad HTML in local HTML attachment $path"); + return false; + } + + // Remove <script>s or htmlawed will dump their contents into output! + // Note: removing child nodes while iterating seems to mess things up, + // hence the double loop. + $scripts = array(); + foreach ($dom->getElementsByTagName('script') as $script) { + $scripts[] = $script; + } + foreach ($scripts as $script) { + common_log(LOG_DEBUG, $script->textContent); + $script->parentNode->removeChild($script); + } + + // Trim out everything outside the body... + $body = $dom->saveHTML(); + $body = preg_replace('/^.*<body[^>]*>/is', '', $body); + $body = preg_replace('/<\/body[^>]*>.*$/is', '', $body); + + require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; + $config = array('safe' => 1, + 'deny_attribute' => 'id,style,on*', + 'comment' => 1); // remove comments + $scrubbed = htmLawed($body, $config); + + return $scrubbed; + } + function showFallback() { // If we don't know how to display an attachment inline, we probably diff --git a/lib/common.php b/lib/common.php index 334a88ffd..8d2e6b420 100644 --- a/lib/common.php +++ b/lib/common.php @@ -22,10 +22,10 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } //exit with 200 response, if this is checking fancy from the installer if (isset($_REQUEST['p']) && $_REQUEST['p'] == 'check-fancy') { exit; } -define('STATUSNET_VERSION', '0.9.0'); +define('STATUSNET_VERSION', '0.9.1'); define('LACONICA_VERSION', STATUSNET_VERSION); // compatibility -define('STATUSNET_CODENAME', 'Stand'); +define('STATUSNET_CODENAME', 'Everybody Hurts'); define('AVATAR_PROFILE_SIZE', 96); define('AVATAR_STREAM_SIZE', 48); diff --git a/lib/noticelist.php b/lib/noticelist.php index 811b7e4f1..0d4cd4dd9 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -443,7 +443,8 @@ class NoticeListItem extends Widget $name); } else { $xstr = new XMLStringer(false); - $xstr->elementStart('a', array('href' => $url)); + $xstr->elementStart('a', array('href' => $url, + 'rel' => 'external')); $xstr->element('abbr', array('class' => 'geo', 'title' => $latlon), $name); diff --git a/lib/profilelist.php b/lib/profilelist.php index d970e605a..3e5513895 100644 --- a/lib/profilelist.php +++ b/lib/profilelist.php @@ -213,7 +213,7 @@ class ProfileListItem extends Widget { if (!empty($this->profile->location)) { $this->out->text(' '); - $this->out->elementStart('span', 'location'); + $this->out->elementStart('span', 'label'); $this->out->raw($this->highlight($this->profile->location)); $this->out->elementEnd('span'); } diff --git a/lib/subscriptionlist.php b/lib/subscriptionlist.php index e1207774f..fc8f33f2e 100644 --- a/lib/subscriptionlist.php +++ b/lib/subscriptionlist.php @@ -113,12 +113,13 @@ class SubscriptionListItem extends ProfileListItem $this->out->elementStart('ul', 'tags xoxo'); foreach ($tags as $tag) { $this->out->elementStart('li'); - $this->out->element('span', 'mark_hash', '#'); - $this->out->element('a', array('rel' => 'tag', - 'href' => common_local_url($this->action->trimmed('action'), - array('nickname' => $this->owner->nickname, - 'tag' => $tag))), - $tag); + // Avoid space by using raw output. + $pt = '<span class="mark_hash">#</span><a rel="tag" href="' . + common_local_url($this->action->trimmed('action'), + array('nickname' => $this->owner->nickname, + 'tag' => $tag)) . + '">' . $tag . '</a>'; + $this->out->raw($pt); $this->out->elementEnd('li'); } $this->out->elementEnd('ul'); diff --git a/lib/userprofile.php b/lib/userprofile.php index 2c3b1ea45..ca060842b 100644 --- a/lib/userprofile.php +++ b/lib/userprofile.php @@ -71,7 +71,8 @@ class UserProfile extends Widget { if (Event::handle('StartProfilePageProfileSection', array(&$this->out, $this->profile))) { - $this->out->elementStart('div', 'entity_profile vcard author'); + $this->out->elementStart('div', array('id' => 'i', + 'class' => 'entity_profile vcard author')); $this->out->element('h2', null, _('User profile')); if (Event::handle('StartProfilePageProfileElements', array(&$this->out, $this->profile))) { diff --git a/plugins/Blacklist/BlacklistPlugin.php b/plugins/Blacklist/BlacklistPlugin.php index c2b60b7d2..adc4d9d7e 100644 --- a/plugins/Blacklist/BlacklistPlugin.php +++ b/plugins/Blacklist/BlacklistPlugin.php @@ -49,32 +49,26 @@ class BlacklistPlugin extends Plugin public $urls = array(); public $canAdmin = true; - private $_nicknamePatterns = array(); - private $_urlPatterns = array(); - - /** - * Initialize the plugin - * - * @return void - */ - - function initialize() + function _getNicknamePatterns() { $confNicknames = $this->_configArray('blacklist', 'nicknames'); $dbNicknames = Nickname_blacklist::getPatterns(); - $this->_nicknamePatterns = array_merge($this->nicknames, - $confNicknames, - $dbNicknames); + return array_merge($this->nicknames, + $confNicknames, + $dbNicknames); + } + function _getUrlPatterns() + { $confURLs = $this->_configArray('blacklist', 'urls'); $dbURLs = Homepage_blacklist::getPatterns(); - $this->_urlPatterns = array_merge($this->urls, - $confURLs, - $dbURLs); + return array_merge($this->urls, + $confURLs, + $dbURLs); } /** @@ -265,7 +259,9 @@ class BlacklistPlugin extends Plugin private function _checkUrl($url) { - foreach ($this->_urlPatterns as $pattern) { + $patterns = $this->_getUrlPatterns(); + + foreach ($patterns as $pattern) { if (preg_match("/$pattern/", $url)) { return false; } @@ -286,7 +282,9 @@ class BlacklistPlugin extends Plugin private function _checkNickname($nickname) { - foreach ($this->_nicknamePatterns as $pattern) { + $patterns = $this->_getNicknamePatterns(); + + foreach ($patterns as $pattern) { if (preg_match("/$pattern/", $nickname)) { return false; } diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index c985fb4bc..f183bc7ae 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -102,7 +102,8 @@ class OStatusPlugin extends Plugin */ function onStartEnqueueNotice($notice, &$transports) { - $transports[] = 'ostatus'; + // put our transport first, in case there's any conflict (like OMB) + array_unshift($transports, 'ostatus'); return true; } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index c7e3b0509..34bff548d 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -550,14 +550,22 @@ class Ostatus_profile extends Memcached_DataObject } $shortSummary = common_shorten_links($summary); if (Notice::contentTooLong($shortSummary)) { - $url = common_shorten_url(common_local_url('attachment', - array('attachment' => $attachment->id))); + $url = common_shorten_url($sourceUrl); $shortSummary = substr($shortSummary, 0, Notice::maxContent() - (mb_strlen($url) + 2)); - $shortSummary .= '… ' . $url; - $content = $shortSummary; - $rendered = common_render_text($content); + $content = $shortSummary . ' ' . $url; + + // We mark up the attachment link specially for the HTML output + // so we can fold-out the full version inline. + $attachUrl = common_local_url('attachment', + array('attachment' => $attachment->id)); + $rendered = common_render_text($shortSummary) . + '<a href="' . htmlspecialchars($attachUrl) .'"'. + ' class="attachment more"' . + ' title="'. htmlspecialchars(_m('Show more')) . '">' . + '…' . + '</a>'; } } @@ -1667,10 +1675,18 @@ class Ostatus_profile extends Memcached_DataObject throw new Exception("Couldn't find a valid profile for '$addr'"); } + /** + * Store the full-length scrubbed HTML of a remote notice to an attachment + * file on our server. We'll link to this at the end of the cropped version. + * + * @param string $title plaintext for HTML page's title + * @param string $rendered HTML fragment for HTML page's body + * @return File + */ function saveHTMLFile($title, $rendered) { $final = sprintf("<!DOCTYPE html>\n<html><head><title>%s</title></head>". - '<body><div>%s</div></body></html>', + '<body>%s</body></html>', htmlspecialchars($title), $rendered); diff --git a/plugins/OpenExternalLinkTarget/OpenExternalLinkTargetPlugin.php b/plugins/OpenExternalLinkTarget/OpenExternalLinkTargetPlugin.php index ebb0189e0..6756f1993 100644 --- a/plugins/OpenExternalLinkTarget/OpenExternalLinkTargetPlugin.php +++ b/plugins/OpenExternalLinkTarget/OpenExternalLinkTargetPlugin.php @@ -45,7 +45,7 @@ class OpenExternalLinkTargetPlugin extends Plugin { function onEndShowScripts($action) { - $action->inlineScript('$("a[rel~=external]").click(function(){ window.open(this.href); return false; });'); + $action->inlineScript('$("a[rel~=external]:not([class~=attachment])").live("click", function(){ window.open(this.href); return false; });'); return true; } diff --git a/plugins/Realtime/realtimeupdate.js b/plugins/Realtime/realtimeupdate.js index 0f7a680d7..2e5851ae5 100644 --- a/plugins/Realtime/realtimeupdate.js +++ b/plugins/Realtime/realtimeupdate.js @@ -130,7 +130,7 @@ RealtimeUpdate = { user = data['user']; html = data['html'].replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/&/g,'&'); source = data['source'].replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/&/g,'&'); -console.log(data); + ni = "<li class=\"hentry notice\" id=\"notice-"+unique+"\">"+ "<div class=\"entry-title\">"+ "<span class=\"vcard author\">"+ diff --git a/scripts/command.php b/scripts/command.php index 6041b02eb..7b1d651e4 100755 --- a/scripts/command.php +++ b/scripts/command.php @@ -20,8 +20,8 @@ define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); -$shortoptions = 'i:n:'; -$longoptions = array('id=', 'nickname='); +$shortoptions = 'i:n:o'; +$longoptions = array('id=', 'nickname=', 'owner'); $helptext = <<<END_OF_USERROLE_HELP command.php [options] [command line] @@ -29,13 +29,12 @@ Perform commands on behalf of a user, such as sub, unsub, join, drop -i --id ID of the user -n --nickname nickname of the user + -o --owner use the site owner END_OF_USERROLE_HELP; require_once INSTALLDIR.'/scripts/commandline.inc'; - - function interpretCommand($user, $body) { $inter = new CommandInterpreter(); @@ -50,8 +49,6 @@ function interpretCommand($user, $body) } } - - if (have_option('i', 'id')) { $id = get_option_value('i', 'id'); $user = User::staticGet('id', $id); @@ -66,6 +63,12 @@ if (have_option('i', 'id')) { print "Can't find user with nickname '$nickname'\n"; exit(1); } +} else if (have_option('o', 'owner')) { + $user = User::siteOwner(); + if (empty($user)) { + print "Site has no owner.\n"; + exit(1); + } } else { print "You must provide either an ID or a nickname.\n\n"; print $helptext; diff --git a/tests/ActivityParseTests.php b/tests/ActivityParseTests.php index fec8829eb..4563da914 100644 --- a/tests/ActivityParseTests.php +++ b/tests/ActivityParseTests.php @@ -22,14 +22,14 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase $this->assertFalse(empty($act)); - $this->assertEquals($act->time, 1243860840); - $this->assertEquals($act->verb, ActivityVerb::POST); + $this->assertEquals(1243860840, $act->time); + $this->assertEquals(ActivityVerb::POST, $act->verb); $this->assertFalse(empty($act->objects[0])); - $this->assertEquals($act->objects[0]->title, 'Punctuation Changeset'); - $this->assertEquals($act->objects[0]->type, 'http://versioncentral.example.org/activity/changeset'); - $this->assertEquals($act->objects[0]->summary, 'Fixing punctuation because it makes it more readable.'); - $this->assertEquals($act->objects[0]->id, 'tag:versioncentral.example.org,2009:/change/1643245'); + $this->assertEquals('Punctuation Changeset', $act->objects[0]->title); + $this->assertEquals('http://versioncentral.example.org/activity/changeset', $act->objects[0]->type); + $this->assertEquals('Fixing punctuation because it makes it more readable.', $act->objects[0]->summary); + $this->assertEquals('tag:versioncentral.example.org,2009:/change/1643245', $act->objects[0]->id); } public function testExample3() @@ -46,22 +46,22 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase $act = new Activity($entry, $feed); $this->assertFalse(empty($act)); - $this->assertEquals($act->time, 1071340202); - $this->assertEquals($act->link, 'http://example.org/2003/12/13/atom03.html'); + $this->assertEquals(1071340202, $act->time); + $this->assertEquals('http://example.org/2003/12/13/atom03.html', $act->link); $this->assertEquals($act->verb, ActivityVerb::POST); $this->assertFalse(empty($act->actor)); - $this->assertEquals($act->actor->type, ActivityObject::PERSON); - $this->assertEquals($act->actor->title, 'John Doe'); - $this->assertEquals($act->actor->id, 'mailto:johndoe@example.com'); + $this->assertEquals(ActivityObject::PERSON, $act->actor->type); + $this->assertEquals('John Doe', $act->actor->title); + $this->assertEquals('mailto:johndoe@example.com', $act->actor->id); $this->assertFalse(empty($act->objects[0])); - $this->assertEquals($act->objects[0]->type, ActivityObject::NOTE); - $this->assertEquals($act->objects[0]->id, 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a'); - $this->assertEquals($act->objects[0]->title, 'Atom-Powered Robots Run Amok'); - $this->assertEquals($act->objects[0]->summary, 'Some text.'); - $this->assertEquals($act->objects[0]->link, 'http://example.org/2003/12/13/atom03.html'); + $this->assertEquals(ActivityObject::NOTE, $act->objects[0]->type); + $this->assertEquals('urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', $act->objects[0]->id); + $this->assertEquals('Atom-Powered Robots Run Amok', $act->objects[0]->title); + $this->assertEquals('Some text.', $act->objects[0]->summary); + $this->assertEquals('http://example.org/2003/12/13/atom03.html', $act->objects[0]->link); $this->assertFalse(empty($act->context)); diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 782d3dc71..f48bdf55e 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -7,6 +7,7 @@ * @link http://status.net/ */ +@media screen, projection, tv { * { margin:0; padding:0; } img { display:block; border:0; } a abbr { cursor: pointer; border-bottom:0; } @@ -857,6 +858,9 @@ display:inline; display:inline; margin-right:7px; } +.entity_tags li:before { +content:'\0009'; +} .aside .section { margin-bottom:29px; @@ -925,7 +929,7 @@ display:inline; } .profile .entity_profile .fn, -.profile .entity_profile .location { +.profile .entity_profile .label { margin-left:11px; margin-bottom:4px; width:auto; @@ -1284,7 +1288,18 @@ height:16px; position:relative; padding-left:16px; } -#attachments .attachment { +.notice .attachment.more { +text-indent:-9999px; +width:16px; +height:16px; +display:inline-block; +overflow:hidden; +vertical-align:middle; +margin-left:4px; +} + +#attachments .attachment, +.notice .attachment.more { padding-left:0; } .notice .attachment img { @@ -1326,7 +1341,7 @@ margin-bottom:0; padding:11px; min-height:auto; } -#jOverlayContent .external span { +#jOverlayContent .entry-title { display:block; margin-bottom:11px; } @@ -1677,3 +1692,34 @@ width:auto; #bookmarklet #wrap { min-width:0; } + +}/*end of @media screen, projection, tv*/ + + +@media print { +a:after { background-color:#FFFFFF; } +a:not([href^="#"]):after { content:" <"attr(href)"> "; } +img { border:none; } +p { orphans: 2; widows: 1; } + +#site_nav_global_primary, +#site_nav_local_views, +#form_notice, +.pagination, +#site_nav_global_secondary, +.entity_actions, +.notice-options, +#aside_primary, +.form_subscription_edit .submit { +display:none; +} +.timestamp dt, .timestamp dd, +.device dt, .device dd { +display:inline; +} +.profiles li, +.notices li { +margin-bottom:18px; +} + +}/*end of @media print*/ diff --git a/theme/base/css/print.css b/theme/base/css/print.css deleted file mode 100644 index 094d07fed..000000000 --- a/theme/base/css/print.css +++ /dev/null @@ -1,36 +0,0 @@ -/** theme: base - * - * @package StatusNet - * @author Sarven Capadisli <csarven@status.net> - * @copyright 2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -a:after { background-color:#fff; } -a:not([href^="#"]):after { content:" ( "attr(href)" ) "; } - -img { border:none; } -p { orphans: 2; widows: 1; } - -#site_nav_global_primary, -#site_nav_local_views, -#form_notice, -.pagination, -#site_nav_global_secondary, -.entity_actions, -.notice-options, -#aside_primary, -.form_subscription_edit .submit { -display:none; -} - -.timestamp dt, .timestamp dd, -.device dt, .device dd { -display:inline; -} - -.profiles li, -.notices li { -margin-bottom:18px; -} diff --git a/theme/base/css/thickbox.css b/theme/base/css/thickbox.css deleted file mode 100644 index d24b9bedf..000000000 --- a/theme/base/css/thickbox.css +++ /dev/null @@ -1,163 +0,0 @@ -/* ----------------------------------------------------------------------------------------------------------------*/ -/* ---------->>> global settings needed for thickbox <<<-----------------------------------------------------------*/ -/* ----------------------------------------------------------------------------------------------------------------*/ -*{padding: 0; margin: 0;} - -/* ----------------------------------------------------------------------------------------------------------------*/ -/* ---------->>> thickbox specific link and font settings <<<------------------------------------------------------*/ -/* ----------------------------------------------------------------------------------------------------------------*/ -#TB_window { - font: 12px Arial, Helvetica, sans-serif; - color: #333333; -} - -#TB_secondLine { - font: 10px Arial, Helvetica, sans-serif; - color:#666666; -} - -#TB_window a:link {color: #666666;} -#TB_window a:visited {color: #666666;} -#TB_window a:hover {color: #000;} -#TB_window a:active {color: #666666;} -#TB_window a:focus{color: #666666;} - -/* ----------------------------------------------------------------------------------------------------------------*/ -/* ---------->>> thickbox settings <<<-----------------------------------------------------------------------------*/ -/* ----------------------------------------------------------------------------------------------------------------*/ -#TB_overlay { - position: fixed; - z-index:100; - top: 0px; - left: 0px; - height:100%; - width:100%; -} - -.TB_overlayMacFFBGHack {background: url(macFFBgHack.png) repeat;} -.TB_overlayBG { - background-color:#000; - filter:alpha(opacity=75); - -moz-opacity: 0.75; - opacity: 0.75; -} - -* html #TB_overlay { /* ie6 hack */ - position: absolute; - height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); -} - -#TB_window { - position: fixed; - background: #ffffff; - z-index: 102; - color:#000000; - display:none; - border: 4px solid #525252; - text-align:left; - top:50%; - left:50%; -} - -* html #TB_window { /* ie6 hack */ -position: absolute; -margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); -} - -#TB_window img#TB_Image { - display:block; - margin: 15px 0 0 15px; - border-right: 1px solid #ccc; - border-bottom: 1px solid #ccc; - border-top: 1px solid #666; - border-left: 1px solid #666; -} - -#TB_caption{ - height:25px; - padding:7px 30px 10px 25px; - float:left; -} - -#TB_closeWindow{ - height:25px; - padding:11px 25px 10px 0; - float:right; -} - -#TB_closeAjaxWindow{ - padding:7px 10px 5px 0; - margin-bottom:1px; - text-align:right; - float:right; -} - -#TB_ajaxWindowTitle{ - float:left; - padding:7px 0 5px 10px; - margin-bottom:1px; -} - -#TB_title{ - background-color:#e8e8e8; - height:27px; -} - -#TB_ajaxContent{ - clear:both; - padding:2px 15px 15px 15px; - overflow:auto; - text-align:left; - line-height:1.4em; -} - -#TB_ajaxContent.TB_modal{ - padding:15px; -} - -#TB_ajaxContent p{ - padding:5px 0px 5px 0px; -} - -#TB_load{ - position: fixed; - display:none; - height:13px; - width:208px; - z-index:103; - top: 50%; - left: 50%; - margin: -6px 0 0 -104px; /* -height/2 0 0 -width/2 */ -} - -* html #TB_load { /* ie6 hack */ -position: absolute; -margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); -} - -#TB_HideSelect{ - z-index:99; - position:fixed; - top: 0; - left: 0; - background-color:#fff; - border:none; - filter:alpha(opacity=0); - -moz-opacity: 0; - opacity: 0; - height:100%; - width:100%; -} - -* html #TB_HideSelect { /* ie6 hack */ - position: absolute; - height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); -} - -#TB_iframeContent{ - clear:both; - border:none; - margin-bottom:-1px; - margin-top:1px; - _margin-bottom:1px; -} diff --git a/theme/base/images/icons/icons-01.gif b/theme/base/images/icons/icons-01.gif Binary files differindex bf0f1230e..e0850aa88 100644 --- a/theme/base/images/icons/icons-01.gif +++ b/theme/base/images/icons/icons-01.gif diff --git a/theme/biz/css/base.css b/theme/biz/css/base.css index 2c2ab33a0..f5efdb49c 100644 --- a/theme/biz/css/base.css +++ b/theme/biz/css/base.css @@ -1,12 +1,13 @@ /** theme: biz base * * @package StatusNet - * @author Sarven Capadisli <csarven@status.net> + * @author Sarven Capadisli <csarven@status.net> * @copyright 2009 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ +@media screen, projection, tv { * { margin:0; padding:0; } img { display:block; border:0; } a abbr { cursor: pointer; border-bottom:0; } @@ -848,7 +849,8 @@ margin-right:11px; /* NOTICE */ .notice, -.profile { +.profile, +.application { position:relative; padding-top:11px; padding-bottom:11px; @@ -861,10 +863,15 @@ border-top-style:dotted; .notices li { list-style-type:none; } -.notices li.hover { -border-radius:4px; --moz-border-radius:4px; --webkit-border-radius:4px; +.notices .notices { +margin-top:7px; +margin-left:2%; +width:98%; +float:left; +} +.mark-top { +border-top-width:1px; +border-top-style:solid; } /* NOTICES */ @@ -995,25 +1002,22 @@ text-transform:lowercase; .dialogbox { position:absolute; -top:-4px; -right:29px; +top:-1px; +right:-1px; z-index:9; -min-width:199px; float:none; -background-color:#FFF; padding:11px; border-radius:7px; -moz-border-radius:7px; -webkit-border-radius:7px; border-style:solid; border-width:1px; -border-color:#DDDDDD; --moz-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); } .dialogbox legend { display:block !important; margin-right:18px; +margin-bottom:18px; } .dialogbox button.close { @@ -1022,11 +1026,22 @@ right:3px; top:3px; } +.dialogbox .form_guide { +font-weight:normal; +padding:0; +} + .dialogbox .submit_dialogbox { font-weight:bold; text-indent:0; min-width:46px; } +.dialogbox input { +padding-left:4px; +} +.dialogbox fieldset { +margin-bottom:0; +} #wrap form.processing input.submit, .entity_actions a.processing, @@ -1102,6 +1117,104 @@ width:16px; height:16px; } +.notice .attachment { +position:relative; +padding-left:16px; +} +.notice .attachment.more { +text-indent:-9999px; +width:16px; +height:16px; +display:inline-block; +overflow:hidden; +vertical-align:middle; +margin-left:4px; +} + +#attachments .attachment, +.notice .attachment.more { +padding-left:0; +} +.notice .attachment img { +position:absolute; +top:18px; +left:0; +z-index:99; +} +#shownotice .notice .attachment img { +position:static; +} + +#attachments { +clear:both; +float:left; +width:100%; +margin-top:18px; +} +#attachments dt { +font-weight:bold; +font-size:1.3em; +margin-bottom:4px; +} + +#attachments ol li { +margin-bottom:18px; +list-style-type:decimal; +float:left; +clear:both; +} + +#jOverlayContent, +#jOverlayContent #content, +#jOverlayContent #content_inner { +width: auto !important; +margin-bottom:0; +} +#jOverlayContent #content { +padding:11px; +min-height:auto; +} +#jOverlayContent .entry-title { +display:block; +margin-bottom:11px; +} +#jOverlayContent button { +position:absolute; +top:0; +right:0; +} +#jOverlayContent h1 { +max-width:425px; +} +#jOverlayContent #content { +border-radius:7px; +-moz-border-radius:7px; +-webkit-border-radius:7px; +} +#jOverlayLoading { +top:5%; +left:40%; +} +#attachment_view img { +max-width:480px; +max-height:480px; +} +#attachment_view #oembed_info { +margin-top:11px; +} +#attachment_view #oembed_info dt, +#attachment_view #oembed_info dd { +float:left; +} +#attachment_view #oembed_info dt { +clear:left; +margin-right:11px; +font-weight:bold; +} +#attachment_view #oembed_info dt:after { +content: ":"; +} + #usergroups #new_group { float: left; margin-right: 2em; @@ -1358,3 +1471,34 @@ display:none; .guide { clear:both; } + +}/*end of @media screen, projection, tv*/ + + +@media print { +a:after { background-color:#FFFFFF; } +a:not([href^="#"]):after { content:" <"attr(href)"> "; } +img { border:none; } +p { orphans: 2; widows: 1; } + +#site_nav_global_primary, +#site_nav_local_views, +#form_notice, +.pagination, +#site_nav_global_secondary, +.entity_actions, +.notice-options, +#aside_primary, +.form_subscription_edit .submit { +display:none; +} +.timestamp dt, .timestamp dd, +.device dt, .device dd { +display:inline; +} +.profiles li, +.notices li { +margin-bottom:18px; +} + +}/*end of @media print*/ diff --git a/theme/biz/css/display.css b/theme/biz/css/display.css index f133ac30b..ea09ef4c0 100644 --- a/theme/biz/css/display.css +++ b/theme/biz/css/display.css @@ -7,8 +7,9 @@ * @link http://status.net/ */ -@import url(base.css); +@import url(base.css) screen, projection, tv, print; +@media screen, projection, tv { html { background-color:#144A6E; } @@ -22,7 +23,7 @@ background:#144A6E url(../images/illustrations/illu_pattern-01.png) repeat-x; } address { -margin-right:7.18%; +margin-right:5.7%; } input, textarea, select { @@ -205,15 +206,26 @@ button.close, .form_user_unsubscribe input.submit, .form_group_join input.submit, .form_user_subscribe input.submit, +.form_remote_authorize input.submit, .entity_subscribe a, .entity_moderation p, .entity_sandbox input.submit, .entity_silence input.submit, .entity_delete input.submit, +.entity_role p, +.entity_role_administrator input.submit, +.entity_role_moderator input.submit, .notice-options .repeated, .form_notice label[for=notice_data-geo], button.minimize, -.form_reset_key input.submit { +.form_reset_key input.submit, +.entity_clear input.submit, +.entity_flag input.submit, +.entity_flag p, +.entity_subscribe input.submit, +#realtime_play, +#realtime_pause, +#realtime_popup { background-image:url(../../base/images/icons/icons-01.gif); background-repeat:no-repeat; background-color:transparent; @@ -241,7 +253,9 @@ border-color:#FFFFFF; #content, #site_nav_local_views .current a, .entity_send-a-message .form_notice, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.entity_role:hover ul, +.dialogbox { background-color:#FFFFFF; } @@ -352,12 +366,37 @@ background-position: 5px -1511px; .form_reset_key input.submit { background-position: 5px -1973px; } +.entity_clear input.submit { +background-position: 5px -2039px; +} +.entity_flag input.submit, +.entity_flag p { +background-position: 5px -2105px; +} +.entity_subscribe input.accept { +background-position: 5px -2171px; +} +.entity_subscribe input.reject { +background-position: 5px -2237px; +} +#realtime_play { +background-position: 0 -2308px; +} +#realtime_pause { +background-position: 0 -2374px; +} +#realtime_popup { +background-position: 0 -1714px; +} /* NOTICES */ .notice .attachment { background-position:0 -394px; } +.notice .attachment.more { +background-position:0 -2770px; +} #attachments .attachment { background:none; } @@ -380,14 +419,19 @@ background-position:0 -1582px; background-position:0 -1648px; } +.notices .attachment.more, .notices div.entry-content, .notices div.notice-options { opacity:0.4; } +.notices li:hover .attachment.more, .notices li:hover div.entry-content, .notices li:hover div.notice-options { opacity:1; } +.opaque { +opacity:1 !important; +} div.notice-options a, div.notice-options input { font-family:sans-serif; diff --git a/theme/biz/logo.png b/theme/biz/logo.png Binary files differindex 550d373fe..cf1839194 100644 --- a/theme/biz/logo.png +++ b/theme/biz/logo.png diff --git a/theme/cloudy/css/display.css b/theme/cloudy/css/display.css index 285c2ad83..caea5cf44 100644 --- a/theme/cloudy/css/display.css +++ b/theme/cloudy/css/display.css @@ -7,6 +7,7 @@ * @link http://status.net/ */ +@media screen, projection, tv { * { margin:0; padding:0; } img { display:block; border:0; } a abbr { cursor: pointer; border-bottom:0; } @@ -872,7 +873,7 @@ display:inline; } .profile .entity_profile .fn, -.profile .entity_profile .location { +.profile .entity_profile .label { margin-left:11px; margin-bottom:4px; width:auto; @@ -900,7 +901,8 @@ margin-right:11px; /* NOTICE */ .notice, -.profile { +.profile, +.application { position:relative; padding-top:11px; padding-bottom:11px; @@ -1031,25 +1033,22 @@ left:0; .dialogbox { position:absolute; -top:-4px; -right:29px; +top:-1px; +right:-1px; z-index:9; -min-width:199px; float:none; -background-color:#FFF; padding:11px; border-radius:7px; -moz-border-radius:7px; -webkit-border-radius:7px; border-style:solid; border-width:1px; -border-color:#DDDDDD; --moz-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); } .dialogbox legend { display:block !important; margin-right:18px; +margin-bottom:18px; } .dialogbox button.close { @@ -1058,9 +1057,21 @@ right:3px; top:3px; } +.dialogbox .form_guide { +font-weight:normal; +padding:0; +} + .dialogbox .submit_dialogbox { -text-indent:0; font-weight:bold; +text-indent:0; +min-width:46px; +} +.dialogbox input { +padding-left:4px; +} +.dialogbox fieldset { +margin-bottom:0; } .notice-options { @@ -1554,7 +1565,8 @@ display:none; } #public #core, -#showstream #core { +#showstream #core, +#showgroup #core { margin-top:10em; } #public.user_in #core, @@ -1651,7 +1663,8 @@ background-color:transparent; } #wrap form.processing input.submit, -.entity_actions a.processing { +#core a.processing, +.dialogbox.processing .submit_dialogbox { background:#FFFFFF url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%; cursor:wait; text-indent:-9999px; @@ -1806,7 +1819,9 @@ border-color:#FFFFFF; #content, #site_nav_local_views .current a, .entity_send-a-message .form_notice, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.entity_role:hover ul, +.dialogbox { background-color:#FFFFFF; } @@ -1938,6 +1953,9 @@ background-position: 0 -1714px; .notice .attachment { background-position:0 -394px; } +.notice .attachment.more { +background-position:0 -2770px; +} #attachments .attachment { background:none; } @@ -1960,10 +1978,12 @@ background-position:0 -1582px; background-position:0 -1648px; } +.notices .attachment.more, .notices div.entry-content, .notices div.notice-options { opacity:0.4; } +.notices li:hover .attachment.more, .notices li:hover div.entry-content, .notices li:hover div.notice-options { opacity:1; @@ -2098,4 +2118,33 @@ border-left-color:#FFFFFF; #footer { background-color:#FFFFFF; } +}/*end of @media screen, projection, tv*/ + + +@media print { +a:after { background-color:#FFFFFF; } +a:not([href^="#"]):after { content:" <"attr(href)"> "; } +img { border:none; } +p { orphans: 2; widows: 1; } + +#site_nav_global_primary, +#site_nav_local_views, +#form_notice, +.pagination, +#site_nav_global_secondary, +.entity_actions, +.notice-options, +#aside_primary, +.form_subscription_edit .submit { +display:none; +} +.timestamp dt, .timestamp dd, +.device dt, .device dd { +display:inline; +} +.profiles li, +.notices li { +margin-bottom:18px; +} +}/*end of @media print*/ diff --git a/theme/cloudy/logo.png b/theme/cloudy/logo.png Binary files differindex 550d373fe..cf1839194 100644 --- a/theme/cloudy/logo.png +++ b/theme/cloudy/logo.png diff --git a/theme/default/css/display.css b/theme/default/css/display.css index d92a53965..5e3748cb7 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -7,8 +7,9 @@ * @link http://status.net/ */ -@import url(../../base/css/display.css); +@import url(../../base/css/display.css) screen, projection, tv, print; +@media screen, projection, tv { body, a:active { background-color:#CEE1E9; @@ -213,7 +214,7 @@ background-color:transparent; } #wrap form.processing input.submit, -.entity_actions a.processing, +#core a.processing, .dialogbox.processing .submit_dialogbox { background:#FFFFFF url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%; } @@ -410,6 +411,9 @@ background-position: 0 -1714px; .notice .attachment { background-position:0 -394px; } +.notice .attachment.more { +background-position:0 -2770px; +} #attachments .attachment { background:none; } @@ -432,10 +436,12 @@ background-position:0 -1582px; background-position:0 -1648px; } +.notices .attachment.more, .notices div.entry-content, .notices div.notice-options { opacity:0.4; } +.notices li:hover .attachment.more, .notices li:hover div.entry-content, .notices li:hover div.notice-options { opacity:1; @@ -443,6 +449,7 @@ opacity:1; .opaque { opacity:1 !important; } +.attachment.more, .notice-options a, .notice-options input { font-family:sans-serif; @@ -450,6 +457,12 @@ box-shadow:3px 3px 3px rgba(194, 194, 194, 0.3); -moz-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.3); -webkit-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.3); } +.attachment.more:focus { +box-shadow:none; +-moz-box-shadow:none; +-webkit-box-shadow:none; +outline:none; +} #content .notices li:hover, #content .applications li:hover, #content tbody tr:hover { @@ -504,3 +517,4 @@ background-position:90% 47%; background-position:10% 47%; } +}/*end of @media screen, projection, tv*/ diff --git a/theme/h4ck3r/css/base.css b/theme/h4ck3r/css/base.css index 18ea742a5..4c0e74218 100644 --- a/theme/h4ck3r/css/base.css +++ b/theme/h4ck3r/css/base.css @@ -7,6 +7,7 @@ * @link http://status.net/ */ +@media screen, projection, tv { * { margin:0; padding:0; } img { display:block; border:0; } a abbr { cursor: pointer; border-bottom:0; } @@ -700,7 +701,8 @@ margin-right:11px; /* NOTICE */ .notice, -.profile { +.profile, +.application { position:relative; padding-top:11px; padding-bottom:11px; @@ -708,11 +710,21 @@ clear:both; float:left; width:100%; border-top-width:1px; -border-top-style:dashed; +border-top-style:dotted; } .notices li { list-style-type:none; } +.notices .notices { +margin-top:7px; +margin-left:2%; +width:98%; +float:left; +} +.mark-top { +border-top-width:1px; +border-top-style:solid; +} /* NOTICES */ @@ -812,74 +824,248 @@ text-transform:lowercase; } -.notice-options { -padding-left:2%; +.notice .notice-options a, +.notice .notice-options input { float:left; -width:50%; +font-size:1.025em; +} + +.notice div.entry-content .timestamp { +display:inline-block; +} + +.entry-content .repeat { +display:block; +} +.entry-content .repeat .photo { +float:none; +margin-right:1px; +position:relative; +top:4px; +left:0; +} + +.dialogbox { +position:absolute; +top:-1px; +right:-1px; +z-index:9; +float:none; +padding:11px; +border-radius:7px; +-moz-border-radius:7px; +-webkit-border-radius:7px; +border-style:solid; +border-width:1px; +} + +.dialogbox legend { +display:block !important; +margin-right:18px; +margin-bottom:18px; +} + +.dialogbox button.close { +position:absolute; +right:3px; +top:3px; +} + +.dialogbox .form_guide { +font-weight:normal; +padding:0; +} + +.dialogbox .submit_dialogbox { +font-weight:bold; +text-indent:0; +min-width:46px; +} +.dialogbox input { +padding-left:4px; +} +.dialogbox fieldset { +margin-bottom:0; +} + +#wrap form.processing input.submit, +.entity_actions a.processing, +.dialogbox.processing .submit_dialogbox { +cursor:wait; +outline:none; +text-indent:-9999px; +} + +.form_repeat.dialogbox { +top:-4px; +right:29px; +min-width:199px; +} + +.notice-options { position:relative; font-size:0.95em; -width:12.5%; +width:113px; float:right; +margin-top:3px; +margin-right:4px; } .notice-options a { float:left; } -.notice-options .notice_delete, .notice-options .notice_reply, +.notice-options .form_repeat, .notice-options .form_favor, -.notice-options .form_disfavor { -position:absolute; -top:0; +.notice-options .form_disfavor, +.notice-options .repeated { +float:left; +margin-left:14.2%; } .notice-options .form_favor, .notice-options .form_disfavor { -left:0; -} -.notice-options .notice_reply { -left:29px; -} -.notice-options .notice_delete { -right:0; -} -.notice-options .notice_reply dt { -display:none; +margin-left:0; } - .notice-options input, -.notice-options a { +.notice-options a, +.notice-options .repeated { text-indent:-9999px; outline:none; } - -.notice-options .notice_reply a, .notice-options input.submit { display:block; border:0; } -.notice-options .notice_reply a, -.notice-options .notice_delete a { +.notice-options .notice_reply, +.notice-options .notice_delete { text-decoration:none; -padding-left:16px; } - +.notice .notice-options .notice_delete { +float:right; +} .notice-options form input.submit { width:16px; -padding:2px 0; +height:16px; +padding:0; +border-radius:0; +-moz-border-radius:0; +-webkit-border-radius:0; } - -.notice-options .notice_delete dt, +.notice-options .form_repeat legend, .notice-options .form_favor legend, .notice-options .form_disfavor legend { display:none; } -.notice-options .notice_delete fieldset, +.notice-options .form_repeat fieldset, .notice-options .form_favor fieldset, .notice-options .form_disfavor fieldset { border:0; padding:0; } +.notice-options a, +.notice-options .repeated { +width:16px; +height:16px; +} + + +.notice .attachment { +position:relative; +padding-left:16px; +} +.notice .attachment.more { +text-indent:-9999px; +width:16px; +height:16px; +display:inline-block; +overflow:hidden; +vertical-align:middle; +margin-left:4px; +} + +#attachments .attachment, +.notice .attachment.more { +padding-left:0; +} +.notice .attachment img { +position:absolute; +top:18px; +left:0; +z-index:99; +} +#shownotice .notice .attachment img { +position:static; +} + +#attachments { +clear:both; +float:left; +width:100%; +margin-top:18px; +} +#attachments dt { +font-weight:bold; +font-size:1.3em; +margin-bottom:4px; +} + +#attachments ol li { +margin-bottom:18px; +list-style-type:decimal; +float:left; +clear:both; +} +#jOverlayContent, +#jOverlayContent #content, +#jOverlayContent #content_inner { +width: auto !important; +margin-bottom:0; +} +#jOverlayContent #content { +padding:11px; +min-height:auto; +} +#jOverlayContent .entry-title { +display:block; +margin-bottom:11px; +} +#jOverlayContent button { +position:absolute; +top:0; +right:0; +} +#jOverlayContent h1 { +max-width:425px; +} +#jOverlayContent #content { +border-radius:7px; +-moz-border-radius:7px; +-webkit-border-radius:7px; +} +#jOverlayLoading { +top:5%; +left:40%; +} +#attachment_view img { +max-width:480px; +max-height:480px; +} +#attachment_view #oembed_info { +margin-top:11px; +} +#attachment_view #oembed_info dt, +#attachment_view #oembed_info dd { +float:left; +} +#attachment_view #oembed_info dt { +clear:left; +margin-right:11px; +font-weight:bold; +} +#attachment_view #oembed_info dt:after { +content: ":"; +} #usergroups #new_group { float: left; @@ -1137,3 +1323,34 @@ display:none; .guide { clear:both; } + +}/*end of @media screen, projection, tv*/ + + +@media print { +a:after { background-color:#FFFFFF; } +a:not([href^="#"]):after { content:" <"attr(href)"> "; } +img { border:none; } +p { orphans: 2; widows: 1; } + +#site_nav_global_primary, +#site_nav_local_views, +#form_notice, +.pagination, +#site_nav_global_secondary, +.entity_actions, +.notice-options, +#aside_primary, +.form_subscription_edit .submit { +display:none; +} +.timestamp dt, .timestamp dd, +.device dt, .device dd { +display:inline; +} +.profiles li, +.notices li { +margin-bottom:18px; +} + +}/*end of @media print*/ diff --git a/theme/h4ck3r/css/display.css b/theme/h4ck3r/css/display.css index 58b3f242a..276659dce 100644 --- a/theme/h4ck3r/css/display.css +++ b/theme/h4ck3r/css/display.css @@ -7,8 +7,9 @@ * @link http://status.net/ */ -@import url(base.css); +@import url(base.css) screen, projection, tv, print; +@media screen, projection, tv { html, body, a:active { @@ -199,14 +200,19 @@ background:transparent url(../../base/images/icons/twotone/green/disfavourite.gi background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-repeat 0 45%; } +.notices .attachment.more, .notices div.entry-content, .notices div.notice-options { opacity:0.4; } -.notices li.hover div.entry-content, -.notices li.hover div.notice-options { +.notices li:hover .attachment.more, +.notices li:hover div.entry-content, +.notices li:hover div.notice-options { opacity:1; } +.opaque { +opacity:1 !important; +} div.entry-content { color:#ccc; } @@ -234,3 +240,5 @@ background-position:10% 45%; background-image:url(../../base/images/icons/twotone/green/arrow-right.gif); background-position:90% 45%; } + +}/*end of @media screen, projection, tv*/ diff --git a/theme/h4ck3r/logo.png b/theme/h4ck3r/logo.png Binary files differindex 550d373fe..cf1839194 100644 --- a/theme/h4ck3r/logo.png +++ b/theme/h4ck3r/logo.png diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index 59cb3c38a..440dd8be2 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -7,8 +7,9 @@ * @link http://status.net/ */ -@import url(../../base/css/display.css); +@import url(../../base/css/display.css) screen, projection, tv, print; +@media screen, projection, tv { body, a:active { background-color:#F0F2F5; @@ -214,7 +215,7 @@ background-color:transparent; } #wrap form.processing input.submit, -.entity_actions a.processing, +#core a.processing, .dialogbox.processing .submit_dialogbox { background:#FFFFFF url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%; } @@ -409,6 +410,9 @@ background-position: 0 -1714px; .notice .attachment { background-position:0 -394px; } +.notice .attachment.more { +background-position:0 -2770px; +} #attachments .attachment { background:none; } @@ -431,10 +435,12 @@ background-position:0 -1582px; background-position:0 -1648px; } +.notices .attachment.more, .notices div.entry-content, .notices div.notice-options { opacity:0.4; } +.notices li:hover .attachment.more, .notices li:hover div.entry-content, .notices li:hover div.notice-options { opacity:1; @@ -442,6 +448,7 @@ opacity:1; .opaque { opacity:1 !important; } +.attachment.more, .notice-options a, .notice-options input { font-family:sans-serif; @@ -449,6 +456,12 @@ box-shadow:3px 3px 3px rgba(194, 194, 194, 0.3); -moz-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.3); -webkit-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.3); } +.attachment.more:focus { +box-shadow:none; +-moz-box-shadow:none; +-webkit-box-shadow:none; +outline:none; +} #content .notices li:hover, #content .applications li:hover, #content tbody tr:hover { @@ -503,3 +516,4 @@ background-position:90% 47%; background-position:10% 47%; } +}/*end of @media screen, projection, tv*/ diff --git a/theme/pigeonthoughts/css/base.css b/theme/pigeonthoughts/css/base.css index 2814260bd..bc2e24dc5 100644 --- a/theme/pigeonthoughts/css/base.css +++ b/theme/pigeonthoughts/css/base.css @@ -7,6 +7,7 @@ * @link http://status.net/ */ +@media screen, projection, tv { * { margin:0; padding:0; } img { display:block; border:0; } a abbr { cursor: pointer; border-bottom:0; } @@ -791,25 +792,30 @@ margin-right:11px; /* NOTICE */ .notice, -.profile { +.profile, +.application { position:relative; -padding:11px 2%; +padding-top:11px; +padding-bottom:11px; clear:both; float:left; -width:95.7%; -border-width:1px; -border-style:solid; -margin-bottom:11px; +width:100%; +border-top-width:1px; +border-top-style:dotted; } .notices li { list-style-type:none; } .notices .notices { margin-top:7px; -margin-left:5%; -width:95%; +margin-left:2%; +width:98%; float:left; } +.mark-top { +border-top-width:1px; +border-top-style:solid; +} #aside_primary .notice, #aside_primary .profile { @@ -969,36 +975,38 @@ outline:none; text-indent:-9999px; } +.form_repeat.dialogbox { +top:-4px; +right:29px; +min-width:199px; +} + .notice-options { position:relative; font-size:0.95em; -width:90px; +width:113px; float:right; -margin-right:11px; +margin-top:3px; +margin-right:4px; } - .notice-options a { float:left; } -.notice-options .notice_delete, .notice-options .notice_reply, +.notice-options .form_repeat, .notice-options .form_favor, -.notice-options .form_disfavor { -position:absolute; -top:0; +.notice-options .form_disfavor, +.notice-options .repeated { +float:left; +margin-left:14.2%; } .notice-options .form_favor, .notice-options .form_disfavor { -left:0; -} -.notice-options .notice_reply { -left:29px; -} -.notice-options .notice_delete { -right:0; +margin-left:0; } .notice-options input, -.notice-options a { +.notice-options a, +.notice-options .repeated { text-indent:-9999px; outline:none; } @@ -1009,27 +1017,51 @@ border:0; .notice-options .notice_reply, .notice-options .notice_delete { text-decoration:none; -padding-left:16px; +} +.notice .notice-options .notice_delete { +float:right; } .notice-options form input.submit { width:16px; -padding:2px 0; +height:16px; +padding:0; +border-radius:0; +-moz-border-radius:0; +-webkit-border-radius:0; } +.notice-options .form_repeat legend, .notice-options .form_favor legend, .notice-options .form_disfavor legend { display:none; } +.notice-options .form_repeat fieldset, .notice-options .form_favor fieldset, .notice-options .form_disfavor fieldset { border:0; padding:0; } +.notice-options a, +.notice-options .repeated { +width:16px; +height:16px; +} .notice .attachment { position:relative; padding-left:16px; } -#attachments .attachment { +.notice .attachment.more { +text-indent:-9999px; +width:16px; +height:16px; +display:inline-block; +overflow:hidden; +vertical-align:middle; +margin-left:4px; +} + +#attachments .attachment, +.notice .attachment.more { padding-left:0; } .notice .attachment img { @@ -1383,3 +1415,34 @@ display:none; .guide { clear:both; } + +}/*end of @media screen, projection, tv*/ + + +@media print { +a:after { background-color:#FFFFFF; } +a:not([href^="#"]):after { content:" <"attr(href)"> "; } +img { border:none; } +p { orphans: 2; widows: 1; } + +#site_nav_global_primary, +#site_nav_local_views, +#form_notice, +.pagination, +#site_nav_global_secondary, +.entity_actions, +.notice-options, +#aside_primary, +.form_subscription_edit .submit { +display:none; +} +.timestamp dt, .timestamp dd, +.device dt, .device dd { +display:inline; +} +.profiles li, +.notices li { +margin-bottom:18px; +} + +}/*end of @media print*/ diff --git a/theme/pigeonthoughts/css/display.css b/theme/pigeonthoughts/css/display.css index dfeb01b48..e584683fc 100644 --- a/theme/pigeonthoughts/css/display.css +++ b/theme/pigeonthoughts/css/display.css @@ -7,8 +7,9 @@ * @link http://status.net/ */ -@import url(base.css); +@import url(base.css) screen, projection, tv, print; +@media screen, projection, tv { html { background:url(../images/illustrations/illu_pigeons-01.png) no-repeat 0 100%; } @@ -140,7 +141,6 @@ background-color:transparent; color:#000000; } - .aside .section { border-color:#FFFFFF; background-color:#FFFFFF; @@ -172,6 +172,11 @@ color:#7F1114; color:#FFFFFF; } +.aside .section .dialogbox { +color:#000000; +} + + .section .profile { border-top-color:#87B4C8; @@ -245,7 +250,7 @@ background-color:transparent; #wrap form.processing input.submit, -.entity_actions a.processing, +#core a.processing, .dialogbox.processing .submit_dialogbox { background:#FFFFFF url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%; } @@ -253,6 +258,13 @@ background:#FFFFFF url(../../base/images/icons/icon_processing.gif) no-repeat 47 background-image:none; } +.entity_send-a-message .form_notice, +.entity_moderation:hover ul, +.entity_role:hover ul, +.dialogbox { +background-color:#FFFFFF; +} + #content, #site_nav_local_views a { border-color:#FFFFFF; @@ -413,6 +425,9 @@ background-position: 0 -1714px; .notice .attachment { background-position:0 -394px; } +.notice .attachment.more { +background-position:0 -2770px; +} #attachments .attachment { background:none; } @@ -435,15 +450,19 @@ background-position:0 -1582px; background-position:0 -1648px; } - +.notices .attachment.more, .notices div.entry-content, .notices div.notice-options { opacity:0.4; } +.notices li:hover .attachment.more, .notices li:hover div.entry-content, .notices li:hover div.notice-options { opacity:1; } +.opaque { +opacity:1 !important; +} div.entry-content { color:#333333; } @@ -496,3 +515,4 @@ background-position:90% 47%; background-position:10% 47%; } +}/*end of @media screen, projection, tv*/ |