Merge branch '0.8.x' into twitter-import

This commit is contained in:
Zach Copley 2009-04-16 15:00:58 -07:00
commit 6848e93cd5
157 changed files with 761 additions and 1036 deletions

View File

@ -59,7 +59,7 @@ class AccesstokenAction extends Action
try {
common_debug('getting request from env variables', __FILE__);
common_remove_magic_from_request();
$req = OAuthRequest::from_request();
$req = OAuthRequest::from_request('POST', common_locale_url('accesstoken'));
common_debug('getting a server', __FILE__);
$server = omb_oauth_server();
common_debug('fetching the access token', __FILE__);

View File

@ -25,7 +25,7 @@ require_once INSTALLDIR.'/lib/feedlist.php';
class AllAction extends ProfileAction
{
function isReadOnly()
function isReadOnly($args)
{
return true;
}
@ -69,6 +69,17 @@ class AllAction extends ProfileAction
sprintf(_('Feed for friends of %s (Atom)'), $this->user->nickname)));
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'all', array('nickname' => $this->user->nickname));
}
function showLocalNav()
{
$nav = new PersonalGroupNav($this);

View File

@ -134,8 +134,8 @@ class ApiAction extends Action
'favorites/favorites');
$fullname = "$this->api_action/$this->api_method";
// If the site is "private", all API methods except laconica/config
// If the site is "private", all API methods except laconica/config
// need authentication
if (common_config('site', 'private')) {
return $fullname != 'laconica/config' || false;
@ -180,11 +180,11 @@ class ApiAction extends Action
}
}
function isReadOnly()
function isReadOnly($args)
{
# NOTE: before handle(), can't use $this->arg
$apiaction = $_REQUEST['apiaction'];
$method = $_REQUEST['method'];
$apiaction = $args['apiaction'];
$method = $args['method'];
list($cmdtext, $fmt) = explode('.', $method);
static $write_methods = array(
@ -207,5 +207,4 @@ class ApiAction extends Action
return false;
}
}

View File

@ -98,7 +98,7 @@ class AvatarbynicknameAction extends Action
common_redirect($url, 302);
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -383,7 +383,7 @@ class AvatarsettingsAction extends AccountSettingsAction
{
parent::showStylesheets();
$jcropStyle =
common_path('theme/default/base/css/jquery.Jcrop.css?version='.LACONICA_VERSION);
common_path('theme/base/css/jquery.Jcrop.css?version='.LACONICA_VERSION);
$this->element('link', array('rel' => 'stylesheet',
'type' => 'text/css',

View File

@ -196,7 +196,7 @@ class DesignsettingsAction extends AccountSettingsAction
{
parent::showStylesheets();
$farbtasticStyle =
common_path('theme/default/base/css/farbtastic.css?version='.LACONICA_VERSION);
common_path('theme/base/css/farbtastic.css?version='.LACONICA_VERSION);
$this->element('link', array('rel' => 'stylesheet',
'type' => 'text/css',

View File

@ -108,7 +108,7 @@ class DocAction extends Action
return ucfirst($this->title);
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -85,7 +85,7 @@ class FavoritedAction extends Action
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return true;
}
@ -221,4 +221,15 @@ class FavoritedAction extends Action
$this->pagination($this->page > 1, $cnt > NOTICES_PER_PAGE,
$this->page, 'favorited');
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'favorited');
}
}

View File

@ -50,7 +50,7 @@ class FeaturedAction extends Action
{
var $page = null;
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -44,7 +44,7 @@ class FinishremotesubscribeAction extends Action
common_debug('stored request: '.print_r($omb,true), __FILE__);
common_remove_magic_from_request();
$req = OAuthRequest::from_request();
$req = OAuthRequest::from_request('POST', common_local_url('finishuserauthorization'));
$token = $req->get_parameter('oauth_token');

View File

@ -25,7 +25,7 @@ define('BOTH', 0);
class FoafAction extends Action
{
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -59,7 +59,7 @@ class GroupbyidAction extends Action
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -48,7 +48,7 @@ class GroupmembersAction extends Action
{
var $page = null;
function isReadOnly()
function isReadOnly($args)
{
return true;
}
@ -137,4 +137,15 @@ class GroupmembersAction extends Action
$this->page, 'groupmembers',
array('nickname' => $this->group->nickname));
}
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'groupmembers', array('nickname' => $this->group->nickname));
}
}

View File

@ -57,7 +57,7 @@ class groupRssAction extends Rss10Action
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -51,7 +51,7 @@ class GroupsAction extends Action
var $page = null;
var $profile = null;
function isReadOnly()
function isReadOnly($args)
{
return true;
}
@ -129,4 +129,15 @@ class GroupsAction extends Action
$gbm = new GroupsByMembersSection($this);
$gbm->show();
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'groups', array('nickname' => $this->group->nickname));
}
}

View File

@ -63,6 +63,17 @@ class InboxAction extends MailboxAction
}
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'inbox', array('nickname' => $this->user->nickname));
}
/**
* Retrieve the messages for this user and this page
*

View File

@ -27,7 +27,7 @@ class InviteAction extends Action
var $subbed = null;
var $sent = null;
function isReadOnly()
function isReadOnly($args)
{
return false;
}

View File

@ -55,7 +55,7 @@ class LoginAction extends Action
* @return boolean false
*/
function isReadOnly()
function isReadOnly($args)
{
return false;
}

View File

@ -52,7 +52,7 @@ class LogoutAction extends Action
*
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return false;
}

View File

@ -74,7 +74,7 @@ class MicrosummaryAction extends Action
print $user->nickname . ': ' . $notice->content;
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -184,11 +184,13 @@ class SearchNoticeListItem extends NoticeListItem {
function highlight($text, $terms)
{
/* Highligh search terms */
$pattern = '/('.implode('|', array_map('htmlspecialchars', $terms)).')/i';
$options = implode('|', array_map('preg_quote', array_map('htmlspecialchars', $terms),
array_fill(0, sizeof($terms), '/')));
$pattern = "/($options)/i";
$result = preg_replace($pattern, '<strong>\\1</strong>', $text);
/* Remove highlighting from inside links, loop incase multiple highlights in links */
$pattern = '/(href="[^"]*)<strong>('.implode('|', array_map('htmlspecialchars', $terms)).')<\/strong>([^"]*")/iU';
$pattern = '/(href="[^"]*)<strong>('.$options.')<\/strong>([^"]*")/iU';
do {
$result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count);
} while ($count);

View File

@ -92,7 +92,7 @@ class NoticesearchrssAction extends Rss10Action
return null;
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -124,7 +124,7 @@ class NudgeAction extends Action
}
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -84,7 +84,7 @@ class OpensearchAction extends Action
$this->endXML();
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -62,6 +62,17 @@ class OutboxAction extends MailboxAction
}
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'outbox', array('nickname' => $this->user->nickname));
}
/**
* retrieve the messages for this user and this page
*

View File

@ -28,7 +28,7 @@ class PostnoticeAction extends Action
parent::handle($args);
try {
common_remove_magic_from_request();
$req = OAuthRequest::from_request();
$req = OAuthRequest::from_request('POST', common_local_url('postnotice'));
# Note: server-to-server function!
$server = omb_oauth_server();
list($consumer, $token) = $server->verify_request($req);

View File

@ -56,7 +56,7 @@ class PublicAction extends Action
var $page = null;
function isReadOnly()
function isReadOnly($args)
{
return true;
}
@ -135,6 +135,17 @@ class PublicAction extends Action
_('Public Stream Feed (Atom)')));
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'public');
}
/**
* Extra head elements
*

View File

@ -102,7 +102,7 @@ class PublicrssAction extends Rss10Action
// nop
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -47,7 +47,7 @@ define('TAGS_PER_PAGE', 100);
class PublictagcloudAction extends Action
{
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -54,7 +54,7 @@ class PublicxrdsAction extends Action
*
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -138,6 +138,17 @@ class RepliesAction extends Action
return array(new Feed(Feed::RSS1, $rssurl, $rsstitle));
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'replies', array('nickname' => $this->user->nickname));
}
/**
* show the personal group nav
*
@ -196,7 +207,7 @@ class RepliesAction extends Action
$this->elementEnd('div');
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -83,7 +83,7 @@ class RepliesrssAction extends Rss10Action
return ($avatar) ? $avatar->url : null;
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -52,7 +52,7 @@ class RequesttokenAction extends Action
*
* @return boolean false
*/
function isReadOnly()
function isReadOnly($args)
{
return false;
}
@ -69,7 +69,7 @@ class RequesttokenAction extends Action
parent::handle($args);
try {
common_remove_magic_from_request();
$req = OAuthRequest::from_request();
$req = OAuthRequest::from_request('POST', common_local_url('requesttoken'));
$server = omb_oauth_server();
$token = $server->fetch_request_token($req);
print $token;

View File

@ -58,7 +58,7 @@ class ShowfavoritesAction extends Action
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return true;
}
@ -150,6 +150,18 @@ class ShowfavoritesAction extends Action
return array(new Feed(Feed::RSS1, $feedurl, $feedtitle));
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'showfavorites', array('nickname' => $this->user->nickname));
}
/**
* show the personal group nav
*

View File

@ -60,7 +60,7 @@ class ShowgroupAction extends Action
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return true;
}
@ -311,6 +311,17 @@ class ShowgroupAction extends Action
$this->group->nickname)));
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'showgroup', array('nickname' => $this->group->nickname));
}
/**
* Fill in the sidebar.
*

View File

@ -177,7 +177,7 @@ class ShowmessageAction extends MailboxAction
return '';
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -106,7 +106,7 @@ class ShownoticeAction extends Action
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -56,7 +56,7 @@ require_once INSTALLDIR.'/lib/feedlist.php';
class ShowstreamAction extends ProfileAction
{
function isReadOnly()
function isReadOnly($args)
{
return true;
}
@ -135,6 +135,17 @@ class ShowstreamAction extends ProfileAction
sprintf(_('FOAF for %s'), $this->user->nickname)));
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'showstream', array('nickname' => $this->user->nickname));
}
function extraHead()
{
// for remote subscriptions etc.

View File

@ -130,7 +130,7 @@ class SubscribersList extends ProfileList
$bf->show();
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -79,7 +79,7 @@ class SupAction extends Action
return $updates;
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -45,6 +45,13 @@ class TagAction extends Action
return true;
}
function showSections()
{
$pop = new PopularNoticeSection($this);
$pop->show();
}
function title()
{
if ($this->page == 1) {
@ -70,6 +77,17 @@ class TagAction extends Action
sprintf(_('Feed for tag %s'), $this->tag)));
}
/**
* Output document relationship links
*
* @return void
*/
function showRelationshipLinks()
{
$this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME
$this->page, 'tag', array('tag' => $this->tag));
}
function showPageNotice()
{
return sprintf(_('Messages tagged "%s", most recent first'), $this->tag);
@ -87,7 +105,7 @@ class TagAction extends Action
$this->page, 'tag', array('tag' => $this->tag));
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -65,7 +65,7 @@ class TagrssAction extends Rss10Action
return $c;
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -142,7 +142,7 @@ class TwitapisearchjsonAction extends TwitterapiAction
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -29,7 +29,7 @@ class UpdateprofileAction extends Action
parent::handle($args);
try {
common_remove_magic_from_request();
$req = OAuthRequest::from_request();
$req = OAuthRequest::from_request('POST', common_local_url('updateprofile'));
# Note: server-to-server function!
$server = omb_oauth_server();
list($consumer, $token) = $server->verify_request($req);

View File

@ -50,7 +50,7 @@ class UserbyidAction extends Action
*
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -52,7 +52,7 @@ class UsergroupsAction extends Action
var $page = null;
var $profile = null;
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -96,7 +96,7 @@ class UserrssAction extends Rss10Action
parent::initRss($limit);
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -52,7 +52,7 @@ class XrdsAction extends Action
*
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -18,7 +18,6 @@ $config['site']['server'] = 'localhost';
$config['site']['path'] = 'laconica';
#$config['site']['fancy'] = false;
#$config['site']['theme'] = 'default';
#$config['site']['skin'] = 'default';
#To enable the built-in mobile style sheet, defaults to false.
#$config['site']['mobile'] = true;
#For contact email, defaults to $_SERVER["SERVER_ADMIN"]

View File

@ -1,29 +1,28 @@
INSERT INTO notice_source
(code, name, url, created)
VALUES
('Do','Gnome Do','http://do.davebsd.com/wiki/index.php?title=Microblog_Plugin', now()),
('Facebook','Facebook','http://apps.facebook.com/identica/', now()),
('Gwibber','Gwibber','http://launchpad.net/gwibber', now()),
('HelloTxt','HelloTxt','http://hellotxt.com/', now()),
('IdentiFox','IdentiFox','http://www.bitbucket.org/uncryptic/identifox/', now()),
('LaTwit','LaTwit','http://latwit.mac65.com/', now()),
('Nambu','Nambu','http://www.nambu.com/', now()),
('Pikchur','Pikchur','http://www.pikchur.com/', now()),
('Ping.fm','Ping.fm','http://ping.fm/', now()),
('Twidge','Twidge','http://software.complete.org/twidge', now()),
('Updating.Me','Updating.Me','http://updating.me/', now()),
('adium', 'Adium', 'http://www.adiumx.com/', now()),
('betwittered','BeTwittered','http://www.32hours.com/betwitteredinfo/', now()),
('bti','bti','http://gregkh.github.com/bti/', now()),
('cliqset', 'Cliqset', 'http://www.cliqset.com/', now()),
('deskbar','Deskbar-Applet','http://www.gnome.org/projects/deskbar-applet/', now()),
('Do','Gnome Do','http://do.davebsd.com/wiki/index.php?title=Microblog_Plugin', now()),
('Facebook','Facebook','http://apps.facebook.com/identica/', now()),
('Gwibber','Gwibber','http://launchpad.net/gwibber', now()),
('HelloTxt','HelloTxt','http://hellotxt.com/', now()),
('identicatools','Laconica Tools','http://bitbucketlabs.net/laconica-tools/', now()),
('identichat','identichat','http://identichat.prosody.im/', now()),
('IdentiFox','IdentiFox','http://www.bitbucket.org/uncryptic/identifox/', now()),
('identitwitch','IdentiTwitch','http://richfish.org/identitwitch/', now()),
('LaTwit','LaTwit','http://latwit.mac65.com/', now()),
('maisha', 'Maisha', 'http://maisha.grango.org/', now()),
('mbpidgin','mbpidgin','http://code.google.com/p/microblog-purple/', now()),
('Mobidentica', 'Mobidentica', 'http://www.substanceofcode.com/software/mobidentica/', now()),
('moconica','Moconica','http://moconica.com/', now()),
('nambu','Nambu','http://www.nambu.com/', now()),
('peoplebrowsr', 'PeopleBrowsr', 'http://www.peoplebrowsr.com/', now()),
('Pikchur','Pikchur','http://www.pikchur.com/', now()),
('Ping.fm','Ping.fm','http://ping.fm/', now()),
('pocketwit','PockeTwit','http://code.google.com/p/pocketwit/', now()),
('posty','Posty','http://spreadingfunkyness.com/posty/', now()),
('royalewithcheese','Royale With Cheese','http://p.hellyeah.org/', now()),
@ -35,9 +34,11 @@ VALUES
('tarpipe','tarpipe','http://tarpipe.com/', now()),
('tjunar','Tjunar','http://nederflash.nl/boek/titels/tjunar-air', now()),
('tr.im','tr.im','http://tr.im/', now()),
('triklepost', 'Tricklepost', 'http://github.com/zcopley/tricklepost/tree/master', now()),
('tweenky','Tweenky','http://beta.tweenky.com/', now()),
('twhirl','Twhirl','http://www.twhirl.org/', now()),
('twibble','twibble','http://www.twibble.de/', now()),
('Twidge','Twidge','http://software.complete.org/twidge', now()),
('twidge','Twidge','http://software.complete.org/twidge', now()),
('twidroid','twidroid','http://www.twidroid.com/', now()),
('twittelator','Twittelator','http://www.stone.com/iPhone/Twittelator/', now()),
@ -47,6 +48,6 @@ VALUES
('twittertools','Twitter Tools','http://wordpress.org/extend/plugins/twitter-tools/', now()),
('twitux','Twitux','http://live.gnome.org/DanielMorales/Twitux', now()),
('twitvim','TwitVim','http://vim.sourceforge.net/scripts/script.php?script_id=2204', now()),
('Updating.Me','Updating.Me','http://updating.me/', now()),
('urfastr','urfastr','http://urfastr.net/', now()),
('adium', 'Adium', 'http://www.adiumx.com/', now()),
('yatca','Yatca','http://www.yatca.com/', now());

View File

@ -128,7 +128,7 @@ function main()
// XXX: find somewhere for this little block to live
if (common_config('db', 'mirror') && $action_obj->isReadOnly()) {
if (common_config('db', 'mirror') && $action_obj->isReadOnly($args)) {
if (is_array(common_config('db', 'mirror'))) {
// "load balancing", ha ha
$arr = common_config('db', 'mirror');

View File

@ -1,4 +1,22 @@
<?
<?php
/**
* Laconica - a distributed open-source microblogging tool
* Copyright (C) 2009, Controlez-Vous, Inc.
*
* 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/>.
*/
define('INSTALLDIR', dirname(__FILE__));
function main()
@ -19,12 +37,12 @@ function checkPrereqs()
{
if (file_exists(INSTALLDIR.'/config.php')) {
?><p class="error">Config file &quot;config.php&quot; already exists.</p>
<?
<?php
return false;
}
if (version_compare(PHP_VERSION, '5.0.0', '<')) {
?><p class="error">Require PHP version 5 or greater.</p><?
?><p class="error">Require PHP version 5 or greater.</p><?php
return false;
}
@ -34,23 +52,23 @@ function checkPrereqs()
foreach ($reqs as $req) {
if (!checkExtension($req)) {
?><p class="error">Cannot load required extension &quot;<?= $req ?>&quot;.</p><?
?><p class="error">Cannot load required extension &quot;<?php echo $req; ?>&quot;.</p><?php
return false;
}
}
if (!is_writable(INSTALLDIR)) {
?><p class="error">Cannot write config file to &quot;<?= INSTALLDIR ?>&quot;.</p>
?><p class="error">Cannot write config file to &quot;<?php echo INSTALLDIR; ?>&quot;.</p>
<p>On your server, try this command:</p>
<blockquote>chmod a+w <?= INSTALLDIR ?></blockquote>
<?
<blockquote>chmod a+w <?php echo INSTALLDIR; ?></blockquote>
<?php
return false;
}
if (!is_writable(INSTALLDIR.'/avatar/')) {
?><p class="error">Cannot write avatar directory &quot;<?= INSTALLDIR ?>/avatar/&quot;.</p>
?><p class="error">Cannot write avatar directory &quot;<?php echo INSTALLDIR; ?>/avatar/&quot;.</p>
<p>On your server, try this command:</p>
<blockquote>chmod a+w <?= INSTALLDIR ?>/avatar/</blockquote>
<blockquote>chmod a+w <?php echo INSTALLDIR; ?>/avatar/</blockquote>
<?
return false;
}
@ -211,7 +229,7 @@ function handlePost()
function writeConf($sitename, $sqlUrl)
{
$res = file_put_contents(INSTALLDIR.'/config.php',
"<?\n".
"<?php\n".
"\$config['site']['name'] = \"$sitename\";\n\n".
"\$config['db']['database'] = \"$sqlUrl\";\n\n");
return $res;
@ -247,9 +265,9 @@ function runDbScript($filename, $conn)
<div id="core">
<div id="content">
<h1>Install Laconica</h1>
<? main() ?>
<?php main(); ?>
</div>
</div>
</div>
</body>
</html>
</html>

View File

@ -124,6 +124,7 @@ class Action extends HTMLOutputter // lawsuit
$this->showShortcutIcon();
$this->showStylesheets();
$this->showScripts();
$this->showRelationshipLinks();
$this->showOpenSearch();
$this->showFeeds();
$this->showDescription();
@ -194,37 +195,33 @@ class Action extends HTMLOutputter // lawsuit
if (Event::handle('StartShowLaconicaStyles', array($this))) {
$this->element('link', array('rel' => 'stylesheet',
'type' => 'text/css',
'href' => theme_path('base/css/display.css') . '?version=' . LACONICA_VERSION,
'media' => 'screen, projection, tv'));
$this->element('link', array('rel' => 'stylesheet',
'type' => 'text/css',
'href' => skin_path('css/display.css') . '?version=' . LACONICA_VERSION,
'href' => theme_path('css/display.css', null) . '?version=' . LACONICA_VERSION,
'media' => 'screen, projection, tv'));
if (common_config('site', 'mobile')) {
$this->element('link', array('rel' => 'stylesheet',
'type' => 'text/css',
'href' => theme_path('base/css/mobile.css') . '?version=' . LACONICA_VERSION,
'href' => theme_path('css/mobile.css', 'base') . '?version=' . LACONICA_VERSION,
// TODO: "handheld" CSS for other mobile devices
'media' => 'only screen and (max-device-width: 480px)')); // Mobile WebKit
}
$this->element('link', array('rel' => 'stylesheet',
'type' => 'text/css',
'href' => theme_path('base/css/print.css') . '?version=' . LACONICA_VERSION,
'href' => theme_path('css/print.css', 'base') . '?version=' . LACONICA_VERSION,
'media' => 'print'));
Event::handle('EndShowLaconicaStyles', array($this));
}
if (Event::handle('StartShowUAStyles', array($this))) {
$this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
'href="'.theme_path('base/css/ie.css').'?version='.LACONICA_VERSION.'" /><![endif]');
'href="'.theme_path('css/ie.css', 'base').'?version='.LACONICA_VERSION.'" /><![endif]');
foreach (array(6,7) as $ver) {
if (file_exists(theme_file('base/css/ie'.$ver.'.css'))) {
if (file_exists(theme_file('css/ie'.$ver.'.css', 'base'))) {
// Yes, IE people should be put in jail.
$this->comment('[if lte IE '.$ver.']><link rel="stylesheet" type="text/css" '.
'href="'.theme_path('base/css/ie'.$ver.'.css').'?version='.LACONICA_VERSION.'" /><![endif]');
'href="'.theme_path('css/ie'.$ver.'.css', 'base').'?version='.LACONICA_VERSION.'" /><![endif]');
}
}
$this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
'href="'.skin_path('css/ie.css').'?version='.LACONICA_VERSION.'" /><![endif]');
'href="'.theme_path('css/ie.css', null).'?version='.LACONICA_VERSION.'" /><![endif]');
Event::handle('EndShowUAStyles', array($this));
}
Event::handle('EndShowStyles', array($this));
@ -264,6 +261,19 @@ class Action extends HTMLOutputter // lawsuit
}
}
/**
* Show document relationship links
*
* SHOULD overload
*
* @return nothing
*/
function showRelationshipLinks()
{
// output <link> elements with appropriate HTML4.01 link types:
// http://www.w3.org/TR/html401/types.html#type-links
}
/**
* Show OpenSearch headers
*
@ -791,9 +801,12 @@ class Action extends HTMLOutputter // lawsuit
*
* MAY override
*
* @param array $args other arguments
*
* @return boolean is read only action?
*/
function isReadOnly()
function isReadOnly($args)
{
return false;
}
@ -1041,4 +1054,36 @@ class Action extends HTMLOutputter // lawsuit
{
return null;
}
/**
* Generate document metadata for sequential navigation
*
* @param boolean $have_before is there something before?
* @param boolean $have_after is there something after?
* @param integer $page current page
* @param string $action current action
* @param array $args rest of query arguments
*
* @return nothing
*/
function sequenceRelationships($have_next, $have_previous, $page, $action, $args=null)
{
// Outputs machine-readable pagination in <link> elements.
// Pattern taken from $this->pagination() method.
// "next" is equivalent to "after"
if ($have_next) {
$pargs = array('page' => $page-1);
$this->element('link', array('rel' => 'next',
'href' => common_local_url($action, $args, $pargs),
'title' => _('Next')));
}
// "previous" is equivalent to "before"
if ($have_previous=true) { // FIXME
$pargs = array('page' => $page+1);
$this->element('link', array('rel' => 'prev',
'href' => common_local_url($action, $args, $pargs),
'title' => _('Previous')));
}
}
}

View File

@ -93,7 +93,7 @@ class ErrorAction extends Action
return $this->message;
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -76,7 +76,7 @@ class GalleryAction extends Action
return true;
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -232,7 +232,7 @@ class ResultItem
$this->profile_image_url = ($avatar) ?
$avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE);
$this->created_at = date('r', $this->notice->created);
$this->created_at = common_date_rfc2822($this->notice->created);
}
/**

View File

@ -67,7 +67,7 @@ class PeopleSearchResults extends ProfileList
return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
}
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -47,7 +47,7 @@ class PersonalAction extends Action
var $user = null;
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -50,17 +50,26 @@ class PopularNoticeSection extends NoticeSection
{
if (common_config('db', 'type') == 'pgsql') {
$weightexpr='sum(exp(-extract(epoch from (now() - fave.modified)) / %s))';
if (!empty($this->out->tag)) {
$tag = pg_escape_string($this->tag);
}
} else {
$weightexpr='sum(exp(-(now() - fave.modified) / %s))';
if (!empty($this->out->tag)) {
$tag = mysql_escape_string($this->out->tag);
}
}
$qry = 'SELECT notice.*, '.
$weightexpr . ' as weight ' .
'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
'GROUP BY notice.id,notice.profile_id,notice.content,notice.uri,' .
'notice.rendered,notice.url,notice.created,notice.modified,' .
'notice.reply_to,notice.is_local,notice.source ' .
'ORDER BY weight DESC';
$qry = "SELECT notice.*, $weightexpr as weight ";
if(isset($tag)) {
$qry .= 'FROM notice_tag, notice JOIN fave ON notice.id = fave.notice_id ' .
"WHERE notice.id = notice_tag.notice_id and '$tag' = notice_tag.tag";
} else {
$qry .= 'FROM notice JOIN fave ON notice.id = fave.notice_id';
}
$qry .= ' GROUP BY notice.id,notice.profile_id,notice.content,notice.uri,' .
'notice.rendered,notice.url,notice.created,notice.modified,' .
'notice.reply_to,notice.is_local,notice.source ' .
'ORDER BY weight DESC';
$offset = 0;
$limit = NOTICES_PER_SECTION + 1;

View File

@ -179,6 +179,11 @@ class ProfileAction extends Action
$this->element('h2', null, _('Statistics'));
// Other stats...?
$this->elementStart('dl', 'entity_user-id');
$this->element('dt', null, _('User ID'));
$this->element('dd', null, $this->profile->id);
$this->elementEnd('dl');
$this->elementStart('dl', 'entity_member-since');
$this->element('dt', null, _('Member since'));
$this->element('dd', null, date('j M Y',

View File

@ -51,7 +51,7 @@ class SearchAction extends Action
*
* @return boolean true
*/
function isReadOnly()
function isReadOnly($args)
{
return true;
}

View File

@ -99,7 +99,7 @@ class LinkbackPlugin extends Plugin
if (array_key_exists('X-Pingback', $result->headers)) {
$pb = $result->headers['X-Pingback'];
} else if (preg_match('/<link rel="pingback" href="([^"]+)" ?/?>/',
} else if (preg_match('/<link rel="pingback" href="([^"]+)" ?\/?>/',
$result->body,
$match)) {
$pb = $match[1];

83
scripts/triminboxes.php Normal file
View File

@ -0,0 +1,83 @@
#!/usr/bin/env php
<?php
/*
* Laconica - a distributed open-source microblogging tool
* Copyright (C) 2009, Control Yourself, Inc.
*
* 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/>.
*/
# Abort if called from a web server
if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
print "This script must be run from the command line\n";
exit(1);
}
ini_set("max_execution_time", "0");
ini_set("max_input_time", "0");
set_time_limit(0);
mb_internal_encoding('UTF-8');
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
define('LACONICA', true);
require_once(INSTALLDIR . '/lib/common.php');
$user = new User();
if ($argc > 1) {
$user->whereAdd('id > ' . $argv[1]);
}
$cnt = $user->find();
while ($user->fetch()) {
$inbox_entry = new Notice_inbox();
$inbox_entry->user_id = $user->id;
$inbox_entry->orderBy('created DESC');
$inbox_entry->limit(1000, 1);
$id = null;
if ($inbox_entry->find(true)) {
$id = $inbox_entry->notice_id;
}
$inbox_entry->free();
unset($inbox_entry);
if (is_null($id)) {
continue;
}
$start = microtime(true);
$old_inbox = new Notice_inbox();
$cnt = $old_inbox->query('DELETE from notice_inbox WHERE user_id = ' . $user->id . ' AND notice_id < ' . $id);
$old_inbox->free();
unset($old_inbox);
print "Deleted $cnt notices for $user->nickname ($user->id).\n";
$finish = microtime(true);
$delay = 3.0 * ($finish - $start);
print "Delaying $delay seconds...";
// Wait to let slaves catch up
usleep($delay * 1000000);
print "DONE.\n";
}

View File

@ -16,17 +16,17 @@
height: 101px;
}
.farbtastic .wheel {
background: url(../../../../js/farbtastic/wheel.png) no-repeat;
background: url(../../../js/farbtastic/wheel.png) no-repeat;
width: 195px;
height: 195px;
}
.farbtastic .overlay {
background: url(../../../../js/farbtastic/mask.png) no-repeat;
background: url(../../../js/farbtastic/mask.png) no-repeat;
}
.farbtastic .marker {
width: 17px;
height: 17px;
margin: -8px 0 0 -8px;
overflow: hidden;
background: url(../../../../js/farbtastic/marker.png) no-repeat;
background: url(../../../js/farbtastic/marker.png) no-repeat;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 820 B

After

Width:  |  Height:  |  Size: 820 B

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 673 B

After

Width:  |  Height:  |  Size: 673 B

View File

Before

Width:  |  Height:  |  Size: 777 B

After

Width:  |  Height:  |  Size: 777 B

View File

Before

Width:  |  Height:  |  Size: 331 B

After

Width:  |  Height:  |  Size: 331 B

View File

Before

Width:  |  Height:  |  Size: 73 B

After

Width:  |  Height:  |  Size: 73 B

View File

Before

Width:  |  Height:  |  Size: 74 B

After

Width:  |  Height:  |  Size: 74 B

View File

Before

Width:  |  Height:  |  Size: 88 B

After

Width:  |  Height:  |  Size: 88 B

View File

Before

Width:  |  Height:  |  Size: 75 B

After

Width:  |  Height:  |  Size: 75 B

View File

Before

Width:  |  Height:  |  Size: 73 B

After

Width:  |  Height:  |  Size: 73 B

View File

Before

Width:  |  Height:  |  Size: 82 B

After

Width:  |  Height:  |  Size: 82 B

View File

Before

Width:  |  Height:  |  Size: 76 B

After

Width:  |  Height:  |  Size: 76 B

View File

Before

Width:  |  Height:  |  Size: 79 B

After

Width:  |  Height:  |  Size: 79 B

View File

Before

Width:  |  Height:  |  Size: 79 B

After

Width:  |  Height:  |  Size: 79 B

View File

Before

Width:  |  Height:  |  Size: 85 B

After

Width:  |  Height:  |  Size: 85 B

View File

Before

Width:  |  Height:  |  Size: 77 B

After

Width:  |  Height:  |  Size: 77 B

View File

Before

Width:  |  Height:  |  Size: 329 B

After

Width:  |  Height:  |  Size: 329 B

View File

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -1240,3 +1240,311 @@ padding-top:160px;
#tag #form_notice {
display:none;
}
html,
body,
a:active {
background-color:#9AE4E8;
}
body {
font-family:'Lucida Grande',sans-serif;
background:#9AE4E8 url(../images/illustrations/illu_clouds-01.gif) 0 0 no-repeat;
color:#333333;
}
#core {
background:url(../images/illustrations/illu_arrow-up-01.gif) no-repeat 25px 0;
}
input, textarea, select, option {
font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
}
input, textarea, select,
.entity_remote_subscribe {
border-color:#aaa;
}
#filter_tags ul li {
border-color:#ddd;
}
.form_settings input.form_action-secondary {
background:none;
}
input.submit,
#form_notice.warning #notice_text-count,
#nav_register a,
.form_settings .form_note,
.entity_remote_subscribe {
background-color:#9BB43E;
}
input:focus, textarea:focus, select:focus,
#form_notice.warning #notice_data-text {
border-color:#9BB43E;
}
input.submit,
#nav_register a,
.entity_remote_subscribe {
color:#fff;
}
a,
div.notice-options input,
.form_user_block input.submit,
.form_user_unblock input.submit,
.entity_send-a-message a,
.form_user_nudge input.submit,
.entity_nudge p,
.form_settings input.form_action-secondary {
color:#0084B4;
}
.notice,
.profile {
border-top-color:#DDFFCC;
}
.section .profile {
border-top-color:#87B4C8;
}
#content .notice p.entry-content a:visited {
background-color:#fcfcfc;
}
#content .notice p.entry-content .vcard a {
background-color:#fcfffc;
}
#aside_primary {
background-color:#DDFFCC;
}
#notice_text-count {
color:#333;
}
#form_notice.warning #notice_text-count {
color:#000;
}
#form_notice.processing #notice_action-submit {
background:#fff url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%;
cursor:wait;
text-indent:-9999px;
}
#content,
#site_nav_local_views a,
#aside_primary {
border-color:#fff;
}
#content,
#site_nav_local_views .current a {
background-color:#fff;
}
#site_nav_local_views a {
background-color:rgba(135, 180, 200, 0.3);
}
#site_nav_local_views a:hover {
background-color:rgba(255, 255, 255, 0.7);
}
.error {
background-color:#F7E8E8;
}
.success {
background-color:#EFF3DC;
}
#anon_notice {
background-color:#FEFFDF;
color:#333;
border-color:#fff;
}
#showstream #anon_notice {
background-color:#FEFFDF;
}
#export_data li a {
background-repeat:no-repeat;
background-position:0 45%;
}
#export_data li a.rss {
background-image:url(../../base/images/icons/icon_rss.png);
}
#export_data li a.atom {
background-image:url(../../base/images/icons/icon_atom.png);
}
#export_data li a.foaf {
background-image:url(../../base/images/icons/icon_foaf.gif);
}
.entity_edit a,
.entity_send-a-message a,
.form_user_nudge input.submit,
.form_user_block input.submit,
.form_user_unblock input.submit,
.entity_nudge p {
background-position: 0 40%;
background-repeat: no-repeat;
background-color:transparent;
}
.form_group_join input.submit,
.form_group_leave input.submit
.form_user_subscribe input.submit,
.form_user_unsubscribe input.submit {
background-color:#9BB43E;
color:#fff;
}
.form_user_unsubscribe input.submit,
.form_group_leave input.submit {
background-color:#87B4C8;
}
.entity_edit a {
background-image:url(../images/icons/twotone/green/edit.gif);
}
.entity_send-a-message a {
background-image:url(../images/icons/twotone/green/quote.gif);
}
.entity_nudge p,
.form_user_nudge input.submit {
background-image:url(../images/icons/twotone/green/mail.gif);
}
.form_user_block input.submit,
.form_user_unblock input.submit {
background-image:url(../images/icons/twotone/green/shield.gif);
}
/* NOTICES */
.notices li.over {
background-color:#fcfcfc;
}
.notice-options .notice_reply a,
.notice-options form input.submit {
background-color:transparent;
}
.notice-options .notice_reply a {
background:transparent url(../images/icons/icon_reply.gif) no-repeat 0 45%;
}
.notice-options form.form_favor input.submit {
background:transparent url(../images/icons/icon_favourite.gif) no-repeat 0 45%;
}
.notice-options form.form_disfavor input.submit {
background:transparent url(../images/icons/icon_disfavourite.gif) no-repeat 0 45%;
}
.notice-options .notice_delete a {
background:transparent url(../images/icons/icon_trash.gif) no-repeat 0 45%;
}
.notices div.entry-content,
.notices div.notice-options {
opacity:0.4;
}
.notices li.hover div.entry-content,
.notices li.hover div.notice-options {
opacity:1;
}
div.entry-content {
color:#333;
}
div.notice-options a,
div.notice-options input {
font-family:sans-serif;
}
.notices li.hover {
background-color:#fcfcfc;
}
/*END: NOTICES */
#new_group a {
background:transparent url(../../base/images/icons/twotone/green/news.gif) no-repeat 0 45%;
}
.pagination .nav_prev a,
.pagination .nav_next a {
background-repeat:no-repeat;
border-color:#DDFFCC;
}
.pagination .nav_prev a {
background-image:url(../../base/images/icons/twotone/green/arrow-left.gif);
background-position:10% 45%;
}
.pagination .nav_next a {
background-image:url(../../base/images/icons/twotone/green/arrow-right.gif);
background-position:90% 45%;
}
/*--------------------------------------*/
#anon_notice {
background:url(../images/illustrations/illu_unicorn-01.png) no-repeat 0 0;
}
#showstream #anon_notice,
#content .notice p.entry-content a:visited,
content .notice p.entry-content .vcard a {
background-color:transparent;
}
#anon_notice p {
background-color:#FEFFDF;
border-color:#FFFF00;
}
#form_notice .form_note {
color:#CCC;
}
input.submit {
background-color:#eee;
color:#666;
}
.notices li.hover {
background-color:#F7F7F7;
}
.notice div.entry-content,
.notice div.entry-content a {
color:#999;
}
.notices div.entry-content,
.notices div.notice-options {
opacity:1;
}
#site_nav_local_views {
background-color:#DDFFCC;
}
#site_nav_local_views li,
#aside_primary {
border-color:#BDDCAD;
}
#site_nav_local_views a,
.aside .section h2 {
background-color:transparent;
border-color:transparent;
color:#4C4C4C;
}
#site_nav_local_views .current {
border-left-color:#fff;
}
#site_nav_local_views .current a,
#site_nav_global_primary,
#footer {
background-color:#fff;
}

View File

Before

Width:  |  Height:  |  Size: 820 B

After

Width:  |  Height:  |  Size: 820 B

View File

Before

Width:  |  Height:  |  Size: 701 B

After

Width:  |  Height:  |  Size: 701 B

View File

Before

Width:  |  Height:  |  Size: 397 B

After

Width:  |  Height:  |  Size: 397 B

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Some files were not shown because too many files have changed in this diff Show More