summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README9
-rw-r--r--actions/showgroup.php46
-rwxr-xr-xclasses/User_group.php13
-rw-r--r--lib/action.php2
-rw-r--r--lib/common.php32
-rw-r--r--lib/profileminilist.php4
-rw-r--r--lib/util.php5
-rw-r--r--theme/base/css/display.css52
-rw-r--r--theme/base/css/ie.css5
-rw-r--r--theme/base/css/ie6.css5
-rw-r--r--theme/base/css/ie7.css5
-rw-r--r--theme/identica/css/display.css23
-rw-r--r--theme/identica/css/ie.css9
-rw-r--r--theme/identica/logo.pngbin2215 -> 4988 bytes
14 files changed, 137 insertions, 73 deletions
diff --git a/README b/README
index 7526b3a12..0c605151b 100644
--- a/README
+++ b/README
@@ -745,6 +745,15 @@ edit any other file in the directory, like lib/common.php (where most
of the defaults are defined), you will lose your configuration options
in any upgrade, and you will wish that you had been more careful.
+Starting with version 0.7.1, you can put config files in the
+/etc/laconica/ directory on your server, if it exists. Config files
+will be included in this order:
+
+* /etc/laconica/laconica.php - server-wide config
+* /etc/laconica/<servername>.php - for a virtual host
+* /etc/laconica/<servername>_<pathname>.php - for a path
+* INSTALLDIR/config.php - for a particular implementation
+
Almost all configuration options are made through a two-dimensional
associative array, cleverly named $config. A typical configuration
line will be:
diff --git a/actions/showgroup.php b/actions/showgroup.php
index c29b7d426..468990e7b 100644
--- a/actions/showgroup.php
+++ b/actions/showgroup.php
@@ -333,6 +333,7 @@ class ShowgroupAction extends Action
function showSections()
{
$this->showMembers();
+ $this->showStatistics();
$cloud = new GroupTagCloudSection($this, $this->group);
$cloud->show();
}
@@ -356,12 +357,10 @@ class ShowgroupAction extends Action
$this->element('h2', null, _('Members'));
- if ($member) {
- $pml = new ProfileMiniList($member, null, $this);
- $cnt = $pml->show();
- if ($cnt == 0) {
- $this->element('p', null, _('(None)'));
- }
+ $pml = new ProfileMiniList($member, null, $this);
+ $cnt = $pml->show();
+ if ($cnt == 0) {
+ $this->element('p', null, _('(None)'));
}
if ($cnt == MEMBERS_PER_SECTION) {
@@ -373,6 +372,41 @@ class ShowgroupAction extends Action
$this->elementEnd('div');
}
+ /**
+ * Show some statistics
+ *
+ * @return void
+ */
+
+ function showStatistics()
+ {
+ // XXX: WORM cache this
+ $members = $this->group->getMembers();
+ $members_count = 0;
+ /** $member->count() doesn't work. */
+ while ($members->fetch()) {
+ $members_count++;
+ }
+
+ $this->elementStart('div', array('id' => 'entity_statistics',
+ 'class' => 'section'));
+
+ $this->element('h2', null, _('Statistics'));
+
+ $this->elementStart('dl', 'entity_created');
+ $this->element('dt', null, _('Created'));
+ $this->element('dd', null, date('j M Y',
+ strtotime($this->group->created)));
+ $this->elementEnd('dl');
+
+ $this->elementStart('dl', 'entity_members');
+ $this->element('dt', null, _('Members'));
+ $this->element('dd', null, (is_int($members_count)) ? $members_count : '0');
+ $this->elementEnd('dl');
+
+ $this->elementEnd('div');
+ }
+
function showAnonymousMessage()
{
$m = sprintf(_('**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
diff --git a/classes/User_group.php b/classes/User_group.php
index 5b5b102c7..522dd8143 100755
--- a/classes/User_group.php
+++ b/classes/User_group.php
@@ -74,16 +74,17 @@ class User_group extends Memcached_DataObject
'WHERE group_member.group_id = %d ' .
'ORDER BY group_member.created DESC ';
- if (common_config('db','type') == 'pgsql') {
- $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
- } else {
- $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+ if ($limit != null) {
+ if (common_config('db','type') == 'pgsql') {
+ $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+ } else {
+ $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+ }
}
$members = new Profile();
- $cnt = $members->query(sprintf($qry, $this->id));
-
+ $members->query(sprintf($qry, $this->id));
return $members;
}
diff --git a/lib/action.php b/lib/action.php
index dcd24fb60..587d2ab13 100644
--- a/lib/action.php
+++ b/lib/action.php
@@ -162,6 +162,8 @@ class Action extends HTMLOutputter // lawsuit
'media' => 'screen, projection, tv'));
$this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
'href="'.theme_path('css/ie.css', 'base').'?version='.LACONICA_VERSION.'" /><![endif]');
+ $this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
+ 'href="'.theme_path('css/ie.css', null).'?version='.LACONICA_VERSION.'" /><![endif]');
foreach (array(6,7) as $ver) {
if (file_exists(theme_file('ie'.$ver.'.css'))) {
// Yes, IE people should be put in jail.
diff --git a/lib/common.php b/lib/common.php
index a2f9b9bfe..825ba0ff7 100644
--- a/lib/common.php
+++ b/lib/common.php
@@ -50,14 +50,23 @@ require_once('DB/DataObject/Cast.php'); # for dates
require_once(INSTALLDIR.'/lib/language.php');
+// try to figure out where we are
+
+$_server = array_key_exists('SERVER_NAME', $_SERVER) ?
+ strtolower($_SERVER['SERVER_NAME']) :
+ null;
+$_path = array_key_exists('SCRIPT_NAME', $_SERVER) ?
+ substr($_SERVER['SCRIPT_NAME'], 1, strrpos($_SERVER['SCRIPT_NAME'], '/') - 1) :
+ null;
+
// default configuration, overwritten in config.php
$config =
array('site' =>
array('name' => 'Just another Laconica microblog',
- 'server' => 'localhost',
+ 'server' => $_server,
'theme' => 'default',
- 'path' => '/',
+ 'path' => $_path,
'logfile' => null,
'fancy' => false,
'locale_path' => INSTALLDIR.'/locale',
@@ -150,7 +159,24 @@ if (function_exists('date_default_timezone_set')) {
date_default_timezone_set('UTC');
}
-require_once(INSTALLDIR.'/config.php');
+// From most general to most specific:
+// server-wide, then vhost-wide, then for a path,
+// finally for a dir (usually only need one of the last two).
+
+$_config_files = array('/etc/laconica/laconica.php',
+ '/etc/laconica/'.$_server.'.php');
+
+if (strlen($_path) > 0) {
+ $_config_files[] = '/etc/laconica/'.$_server.'_'.$_path.'.php';
+}
+
+$_config_files[] = INSTALLDIR.'/config.php';
+
+foreach ($_config_files as $_config_file) {
+ if (file_exists($_config_file)) {
+ include_once($_config_file);
+ }
+}
require_once('Validate.php');
require_once('markdown.php');
diff --git a/lib/profileminilist.php b/lib/profileminilist.php
index 56b768419..81cd7aed5 100644
--- a/lib/profileminilist.php
+++ b/lib/profileminilist.php
@@ -69,9 +69,7 @@ class ProfileMiniList extends ProfileList
function showProfile()
{
$this->out->elementStart('li', 'vcard');
- $this->out->elementStart('a', array('title' => ($this->profile->fullname) ?
- $this->profile->fullname :
- $this->profile->nickname,
+ $this->out->elementStart('a', array('title' => $this->profile->getBestName(),
'href' => $this->profile->profileurl,
'rel' => 'contact member',
'class' => 'url'));
diff --git a/lib/util.php b/lib/util.php
index 3314cdfa0..07e124811 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -370,8 +370,6 @@ function common_canonical_email($email)
return $email;
}
-define('URL_REGEX', '^|[ \t\r\n])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|aim|webcal):(([A-Za-z0-9$_.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&~=%-]*))?([A-Za-z0-9$_+!*();/?:~-]))');
-
function common_render_content($text, $notice)
{
$r = common_render_text($text);
@@ -388,7 +386,8 @@ function common_render_text($text)
$r = htmlspecialchars($text);
$r = preg_replace('/[\x{0}-\x{8}\x{b}-\x{c}\x{e}-\x{19}]/', '', $r);
- $r = preg_replace_callback('@https?://[^\]>\s]+@', 'common_render_uri_thingy', $r);
+ $r = preg_replace_callback('@(ftp|http|https|mms|rtsp|gopher|news|nntp|telnet|wais|file|prospero|webcal|xmpp|irc)://[^\]>\s]+@', 'common_render_uri_thingy', $r);
+ $r = preg_replace_callback('@(mailto|aim|tel):[^\]>\s]+@', 'common_render_uri_thingy', $r); // Pseudo-protocols don't require '//' after ':'.
$r = preg_replace('/(^|\s+)#([A-Za-z0-9_\-\.]{1,64})/e', "'\\1#'.common_tag_link('\\2')", $r);
// XXX: machine tags
return $r;
diff --git a/theme/base/css/display.css b/theme/base/css/display.css
index 166044c71..809c1ba6f 100644
--- a/theme/base/css/display.css
+++ b/theme/base/css/display.css
@@ -507,50 +507,43 @@ position:relative;
width:475px;
min-height:123px;
float:left;
-margin-bottom:17px;
+margin-bottom:18px;
margin-left:0;
}
.entity_profile dt,
#entity_statistics dt {
font-weight:bold;
}
+.entity_profile dd {
+display:inline;
+}
+
.entity_profile .entity_depiction {
float:left;
-position:absolute;
-top:0;
-left:0;
width:96px;
+margin-right:18px;
+margin-bottom:18px;
}
+
.entity_profile .entity_fn,
.entity_profile .entity_nickname,
.entity_profile .entity_location,
.entity_profile .entity_url,
.entity_profile .entity_note,
.entity_profile .entity_tags {
-float:left;
-clear:left;
margin-left:113px;
-width:322px;
margin-bottom:4px;
+width:322px;
}
.entity_profile .entity_fn,
.entity_profile .entity_nickname {
-width:auto;
-clear:none;
-}
-
-.entity_profile .entity_fn {
margin-left:11px;
-margin-right:4px;
-}
-.entity_profile .entity_fn .fn {
+display:inline;
font-weight:bold;
-font-style:normal;
}
-.entity_profile .nickname {
-font-style:italic;
-font-weight:bold;
+.entity_profile .entity_nickname {
+margin-left:0;
}
.entity_profile .entity_fn dd:before {
@@ -568,13 +561,14 @@ display:none;
.entity_profile h2 {
display:none;
}
+
/* entity_profile */
/*entity_actions*/
.entity_actions {
float:right;
-
+margin-left:28px;
}
.entity_actions h2 {
display:none;
@@ -796,6 +790,7 @@ text-decoration:underline;
.notice .entry-title {
float:left;
width:100%;
+overflow:auto;
}
#shownotice .notice .entry-title {
font-size:2.2em;
@@ -1024,21 +1019,18 @@ display:block;
text-decoration:none;
font-weight:bold;
padding:7px;
-border:1px dotted #D1D9E4;
-border-bottom:0;
+border-width:1px;
+border-style:solid;
+-moz-border-radius:7px;
+-webkit-border-radius:7px;
+border-radius:7px;
}
.pagination .nav_prev a {
--moz-border-radius-topright:7px;
--webkit-border-top-right-radius:7px;
-padding-left:20px;
-border-left:0;
+padding-left:30px;
}
.pagination .nav_next a {
--moz-border-radius-topleft:7px;
--webkit-border-top-left-radius:7px;
-padding-right:20px;
-border-right:0;
+padding-right:30px;
}
/* END: NOTICE */
diff --git a/theme/base/css/ie.css b/theme/base/css/ie.css
index 08b027b59..45176a201 100644
--- a/theme/base/css/ie.css
+++ b/theme/base/css/ie.css
@@ -9,7 +9,6 @@ margin-top:3px;
height:16px;
text-align:right;
text-indent:0;
-color:#fff;
width:24px;
}
@@ -24,7 +23,3 @@ margin-left:-7px;
.notice div.entry-content .timestamp a {
margin-right:4px;
}
-
-.entity_profile .entity_nickname {
-padding-right:3px;
-}
diff --git a/theme/base/css/ie6.css b/theme/base/css/ie6.css
index 4a2316903..10b31cbcb 100644
--- a/theme/base/css/ie6.css
+++ b/theme/base/css/ie6.css
@@ -4,5 +4,8 @@
.entity_profile .entity_url,
.entity_profile .entity_note,
.entity_profile .entity_tags {
-margin-left:55px;
+margin-left:0;
+}
+.entity_profile .entity_depiction {
+margin-bottom:123px;
}
diff --git a/theme/base/css/ie7.css b/theme/base/css/ie7.css
deleted file mode 100644
index a6ee001e2..000000000
--- a/theme/base/css/ie7.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/* IE7 specific styles */
-
-#form_notice textarea {
-width:370px;
-}
diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css
index 15c22148d..beb5a2c13 100644
--- a/theme/identica/css/display.css
+++ b/theme/identica/css/display.css
@@ -40,12 +40,12 @@ input.submit,
#nav_register a,
.form_settings .form_note,
.entity_remote_subscribe {
-background-color:#A9BF4F;
+background-color:#9BB43E;
}
input:focus, textarea:focus, select:focus,
#form_notice.warning #notice_data-text {
-border-color:#A9BF4F;
+border-color:#9BB43E;
}
input.submit,
#nav_register a,
@@ -65,11 +65,11 @@ color:#002E6E;
.notice,
.profile {
-border-top-color:#D1D9E4;
+border-top-color:#CEE1E9;
}
.section .notice,
.section .profile {
-border-top-color:#97BFD1;
+border-top-color:#87B4C8;
}
@@ -116,7 +116,7 @@ background-color:#fff;
}
#site_nav_local_views a {
-background-color:rgba(151, 191, 209, 0.3);
+background-color:rgba(135, 180, 200, 0.3);
}
#site_nav_local_views a:hover {
background-color:rgba(255, 255, 255, 0.7);
@@ -134,13 +134,13 @@ background-color:#EFF3DC;
#anon_notice {
-background-color:#97BFD1;
+background-color:#87B4C8;
color:#fff;
border-color:#fff;
}
#showstream #anon_notice {
-background-color:#A9BF4F;
+background-color:#9BB43E;
}
@@ -177,12 +177,12 @@ background-color:transparent;
.form_group_leave input.submit
.form_user_subscribe input.submit,
.form_user_unsubscribe input.submit {
-background-color:#A9BF4F;
+background-color:#9BB43E;
color:#fff;
}
.form_user_unsubscribe input.submit,
.form_group_leave input.submit {
-background-color:#97BFD1;
+background-color:#87B4C8;
}
.entity_send-a-message a {
@@ -274,12 +274,13 @@ background:transparent url(../images/icons/twotone/green/news.gif) no-repeat 0 4
.pagination .nav_prev a,
.pagination .nav_next a {
background-repeat:no-repeat;
+border-color:#CEE1E9;
}
.pagination .nav_prev a {
background-image:url(../images/icons/twotone/green/arrow-left.gif);
-background-position:0 45%;
+background-position:10% 45%;
}
.pagination .nav_next a {
background-image:url(../images/icons/twotone/green/arrow-right.gif);
-background-position:100% 45%;
+background-position:90% 45%;
}
diff --git a/theme/identica/css/ie.css b/theme/identica/css/ie.css
new file mode 100644
index 000000000..2f463bb44
--- /dev/null
+++ b/theme/identica/css/ie.css
@@ -0,0 +1,9 @@
+/* IE specific styles */
+
+.notice-options input.submit {
+color:#fff;
+}
+
+#site_nav_local_views a {
+background-color:#D0DFE7;
+}
diff --git a/theme/identica/logo.png b/theme/identica/logo.png
index cee36799e..7c68b34f6 100644
--- a/theme/identica/logo.png
+++ b/theme/identica/logo.png
Binary files differ