Enable fancy (pretty) URLs. Auto-detection failed, it depends on Javascript.
-
@@ -295,13 +295,13 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
Install Laconica
-
+
-
-
-
+
+
+
diff --git a/js/util.js b/js/util.js
index 31d9eb4f54..b1b6ec82bd 100644
--- a/js/util.js
+++ b/js/util.js
@@ -17,9 +17,29 @@
*/
$(document).ready(function(){
- $('.attachments').click(function() {$().jOverlay({zIndex:999, success:function(html) {$('.attachment').click(function() {$().jOverlay({url:$(this).attr('href') + '/ajax'}); return false; });
- }, url:$(this).attr('href') + '/ajax'}); return false; });
- $('.attachment').click(function() {$().jOverlay({url:$(this).attr('href') + '/ajax'}); return false; });
+ $('a.attachment').click(function() {$().jOverlay({url: $('address .url')[0].href+'/attachment/' + ($(this).attr('id').substring('attachment'.length + 1)) + '/ajax'}); return false; });
+ $("a.thumbnail").hover(
+ function() {
+ var anchor = $(this);
+ $("a.thumbnail").children('img').remove();
+
+ setTimeout(function() {
+ anchor.closest(".entry-title").addClass('ov');
+ $.get($('address .url')[0].href+'/attachment/' + (anchor.attr('id').substring('attachment'.length + 1)) + '/thumbnail', null, function(data) {
+ anchor.append(data);
+ });
+ }, 250);
+
+ setTimeout(function() {
+ anchor.children('img').remove();
+ anchor.closest(".entry-title").removeClass('ov');
+ }, 3000);
+ },
+ function() {
+ $(this).children('img').remove();
+ $(this).closest(".entry-title").removeClass('ov');
+ }
+ );
// count character on keyup
function counter(event){
@@ -203,7 +223,6 @@ $(document).ready(function(){
$("#notices_primary .notices").prepend(document._importNode(li, true));
$("#notices_primary .notice:first").css({display:"none"});
$("#notices_primary .notice:first").fadeIn(2500);
- NoticeHover();
NoticeReply();
}
}
@@ -221,24 +240,23 @@ $(document).ready(function(){
NoticeReply();
});
+
function NoticeHover() {
- $("#content .notice").hover(
- function () {
- $(this).addClass('hover');
- },
- function () {
- $(this).removeClass('hover');
- }
- );
+ function mouseHandler(e) {
+ $(e.target).closest('li.hentry')[(e.type === 'mouseover') ? 'addClass' : 'removeClass']('hover');
+ };
+ $('#content .notices').mouseover(mouseHandler);
+ $('#content .notices').mouseout(mouseHandler);
}
+
function NoticeReply() {
if ($('#notice_data-text').length > 0) {
$('#content .notice').each(function() {
- var notice = $(this);
- $('.notice_reply', $(this)).click(function() {
- var nickname = ($('.author .nickname', notice).length > 0) ? $('.author .nickname', notice) : $('.author .nickname');
- NoticeReplySet(nickname.text(), $('.notice_id', notice).text());
+ var notice = $(this)[0];
+ $($('.notice_reply', notice)[0]).click(function() {
+ var nickname = ($('.author .nickname', notice).length > 0) ? $($('.author .nickname', notice)[0]) : $('.author .nickname');
+ NoticeReplySet(nickname.text(), $($('.notice_id', notice)[0]).text());
return false;
});
});
diff --git a/lib/attachmentlist.php b/lib/attachmentlist.php
index 9485fe3d65..d0478bad35 100644
--- a/lib/attachmentlist.php
+++ b/lib/attachmentlist.php
@@ -80,9 +80,9 @@ class AttachmentList extends Widget
function show()
{
-// $this->out->elementStart('div', array('id' =>'attachments_primary'));
- $this->out->elementStart('div', array('id' =>'content'));
- $this->out->element('h2', null, _('Attachments'));
+ $this->out->elementStart('dl', array('id' =>'attachment'));
+ $this->out->element('dt', null, _('Attachments'));
+ $this->out->elementStart('dd');
$this->out->elementStart('ul', array('class' => 'attachments'));
$atts = new File;
@@ -92,8 +92,9 @@ class AttachmentList extends Widget
$item->show();
}
+ $this->out->elementEnd('dd');
$this->out->elementEnd('ul');
- $this->out->elementEnd('div');
+ $this->out->elementEnd('dl');
return count($att);
}
@@ -171,7 +172,7 @@ class AttachmentListItem extends Widget
}
function linkTitle() {
- return 'Our page for ' . $this->title();
+ return $this->title();
}
/**
@@ -191,34 +192,25 @@ class AttachmentListItem extends Widget
}
function linkAttr() {
- return array('class' => 'attachment', 'href' => common_local_url('attachment', array('attachment' => $this->attachment->id)));
+ return array('class' => 'attachment', 'href' => $this->attachment->url, 'id' => 'attachment-' . $this->attachment->id);
}
function showLink() {
- $attr = $this->linkAttr();
- $text = $this->linkTitle();
- $this->out->elementStart('h4');
- $this->out->element('a', $attr, $text);
-
- if ($this->attachment->url !== $this->title())
- $this->out->element('span', null, " ({$this->attachment->url})");
-
-
- $this->out->elementEnd('h4');
+ $this->out->elementStart('a', $this->linkAttr());
+ $this->out->element('span', null, $this->linkTitle());
+ $this->showRepresentation();
+ $this->out->elementEnd('a');
}
function showNoticeAttachment()
{
$this->showLink();
- $this->showRepresentation();
}
function showRepresentation() {
$thumbnail = File_thumbnail::staticGet('file_id', $this->attachment->id);
if (!empty($thumbnail)) {
- $this->out->elementStart('a', $this->linkAttr()/*'href' => $this->linkTo()*/);
$this->out->element('img', array('alt' => 'nothing to say', 'src' => $thumbnail->url, 'width' => $thumbnail->width, 'height' => $thumbnail->height));
- $this->out->elementEnd('a');
}
}
@@ -260,7 +252,7 @@ class Attachment extends AttachmentListItem
}
function linkTitle() {
- return 'Direct link to ' . $this->title();
+ return $this->attachment->url;
}
function showRepresentation() {
diff --git a/lib/attachmentsection.php b/lib/attachmentsection.php
deleted file mode 100644
index 20e620b9b6..0000000000
--- a/lib/attachmentsection.php
+++ /dev/null
@@ -1,80 +0,0 @@
-.
- *
- * @category Widget
- * @package Laconica
- * @author Evan Prodromou
- * @copyright 2009 Control Yourself, Inc.
- * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link http://laconi.ca/
- */
-
-if (!defined('LACONICA')) {
- exit(1);
-}
-
-define('ATTACHMENTS_PER_SECTION', 6);
-
-/**
- * Base class for sections showing lists of attachments
- *
- * These are the widgets that show interesting data about a person
- * group, or site.
- *
- * @category Widget
- * @package Laconica
- * @author Evan Prodromou
- * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link http://laconi.ca/
- */
-
-class AttachmentSection extends Section
-{
- function showContent()
- {
- $attachments = $this->getAttachments();
-
- $cnt = 0;
-
- $this->out->elementStart('ul', 'attachments');
-
- while ($attachments->fetch() && ++$cnt <= ATTACHMENTS_PER_SECTION) {
- $this->showAttachment($attachments);
- }
-
- $this->out->elementEnd('ul');
-
- return ($cnt > ATTACHMENTS_PER_SECTION);
- }
-
- function getAttachments()
- {
- return null;
- }
-
- function showAttachment($attachment)
- {
- $this->out->elementStart('li');
- $this->out->element('a', array('class' => 'attachment', 'href' => common_local_url('attachment', array('attachment' => $attachment->file_id))), "Attachment tagged {$attachment->c} times");
- $this->out->elementEnd('li');
- }
-}
-
diff --git a/lib/facebookaction.php b/lib/facebookaction.php
index 043a078cd5..637a6284d9 100644
--- a/lib/facebookaction.php
+++ b/lib/facebookaction.php
@@ -97,11 +97,11 @@ class FacebookAction extends Action
{
// Add a timestamp to the file so Facebook cache wont ignore our changes
$ts = filemtime(INSTALLDIR.'/theme/base/css/display.css');
+
+ $this->element('link', array('rel' => 'stylesheet',
+ 'type' => 'text/css',
+ 'href' => theme_path('css/display.css', 'base') . '?ts=' . $ts));
- $this->element('link', array('rel' => 'stylesheet',
- 'type' => 'text/css',
- 'href' => theme_path('css/display.css', 'base') . '?ts=' . $ts));
-
$theme = common_config('site', 'theme');
$ts = filemtime(INSTALLDIR. '/theme/' . $theme .'/css/display.css');
diff --git a/lib/frequentattachmentsection.php b/lib/frequentattachmentsection.php
deleted file mode 100644
index 0ce0d18714..0000000000
--- a/lib/frequentattachmentsection.php
+++ /dev/null
@@ -1,66 +0,0 @@
-.
- *
- * @category Widget
- * @package Laconica
- * @author Evan Prodromou
- * @copyright 2009 Control Yourself, Inc.
- * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link http://laconi.ca/
- */
-
-if (!defined('LACONICA')) {
- exit(1);
-}
-
-/**
- * FIXME
- *
- * These are the widgets that show interesting data about a person
- * group, or site.
- *
- * @category Widget
- * @package Laconica
- * @author Evan Prodromou
- * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link http://laconi.ca/
- */
-
-class FrequentAttachmentSection extends AttachmentSection
-{
- function getAttachments() {
- $notice_tag = new Notice_tag;
- $query = 'select file_id, count(file_id) as c from notice_tag join file_to_post on post_id = notice_id where tag="' . $notice_tag->escape($this->out->tag) . '" group by file_id order by c desc';
- $notice_tag->query($query);
- return $notice_tag;
- }
-
- function title()
- {
- return sprintf(_('Attachments frequently tagged with %s'), $this->out->tag);
- }
-
- function divId()
- {
- return 'frequent_attachments';
- }
-}
-
diff --git a/lib/noticelist.php b/lib/noticelist.php
index a521321719..50a95cfcbb 100644
--- a/lib/noticelist.php
+++ b/lib/noticelist.php
@@ -34,6 +34,7 @@ if (!defined('LACONICA')) {
require_once INSTALLDIR.'/lib/favorform.php';
require_once INSTALLDIR.'/lib/disfavorform.php';
+require_once INSTALLDIR.'/lib/attachmentlist.php';
/**
* widget for displaying a list of notices
@@ -193,46 +194,24 @@ class NoticeListItem extends Widget
$this->out->elementEnd('div');
}
- function showNoticeAttachments()
- {
- $f2p = new File_to_post;
- $f2p->post_id = $this->notice->id;
- $file = new File;
- $file->joinAdd($f2p);
- $file->selectAdd();
- $file->selectAdd('file.id as id');
- $count = $file->find(true);
- if (!$count) return;
- if (1 === $count) {
- $href = common_local_url('attachment', array('attachment' => $file->id));
- $att_class = 'attachment';
- } else {
- $href = common_local_url('attachments', array('notice' => $this->notice->id));
- $att_class = 'attachments';
+ function showNoticeAttachments() {
+ if ($this->isUsedInList()) {
+ return;
}
+ $al = new AttachmentList($this->notice, $this->out);
+ $al->show();
+ }
- $clip = theme_path('images/icons/clip', 'base');
- if ('shownotice' === $this->out->args['action']) {
- $height = '96px';
- $width = '83%';
- $width_att = '15%';
- $clip .= '-big.png';
- $top = '70px';
- } else {
- $height = '48px';
- $width = '90%';
- $width_att = '8%';
- $clip .= '.png';
- $top = '20px';
- }
-if(0)
- $this->out->elementStart('div', 'entry-attachments');
-else
- $this->out->elementStart('p', array('class' => 'entry-attachments', 'style' => "float: right; width: $width_att; background: url($clip) no-repeat; text-align: right; height: $height;"));
- $this->out->element('a', array('class' => $att_class, 'style' => "text-decoration: none; padding-top: $top; display: block; height: $height;", 'href' => $href, 'title' => "# of attachments: $count"), $count === 1 ? '' : $count);
+ function isUsedInList() {
+ return 'shownotice' !== $this->out->args['action'];
+ }
-
- $this->out->elementEnd('p');
+ function attachmentCount($discriminant = true) {
+ $file_oembed = new File_oembed;
+ $query = "select count(*) as c from file_oembed join file_to_post on file_oembed.file_id = file_to_post.file_id where post_id=" . $this->notice->id;
+ $file_oembed->query($query);
+ $file_oembed->fetch();
+ return intval($file_oembed->c);
}
function showNoticeInfo()
diff --git a/lib/router.php b/lib/router.php
index 70ee0f3fb0..fc119821b9 100644
--- a/lib/router.php
+++ b/lib/router.php
@@ -153,24 +153,17 @@ class Router
$m->connect('attachment/:attachment/ajax',
array('action' => 'attachment_ajax'),
- array('notice' => '[0-9]+'));
+ array('attachment' => '[0-9]+'));
- $m->connect('attachment/:attachment',
- array('action' => 'attachment'),
- array('notice' => '[0-9]+'));
-
- // notice
+ $m->connect('attachment/:attachment/thumbnail',
+ array('action' => 'attachment_thumbnail'),
+ array('attachment' => '[0-9]+'));
$m->connect('notice/new', array('action' => 'newnotice'));
$m->connect('notice/new?replyto=:replyto',
array('action' => 'newnotice'),
array('replyto' => '[A-Za-z0-9_-]+'));
- $m->connect('notice/:notice/attachments/ajax',
- array('action' => 'attachments_ajax'),
- array('notice' => '[0-9]+'));
- $m->connect('notice/:notice/attachments',
- array('action' => 'attachments'),
- array('notice' => '[0-9]+'));
+
$m->connect('notice/:notice',
array('action' => 'shownotice'),
array('notice' => '[0-9]+'));
diff --git a/lib/util.php b/lib/util.php
index fbef8764a7..d56f44f7b4 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -496,6 +496,27 @@ function common_linkify($url) {
}
$attrs = array('href' => $longurl, 'rel' => 'external');
+
+// if this URL is an attachment, then we set class='attachment' and id='attahcment-ID'
+// where ID is the id of the attachment for the given URL.
+ $query = "select file_oembed.file_id as file_id from file join file_oembed on file.id = file_oembed.file_id where file.url='$longurl'";
+ $file = new File;
+ $file->query($query);
+ $file->fetch();
+
+ if (!empty($file->file_id)) {
+ $query = "select file_thumbnail.file_id as file_id from file join file_thumbnail on file.id = file_thumbnail.file_id where file.url='$longurl'";
+ $file2 = new File;
+ $file2->query($query);
+ $file2->fetch();
+
+ if (empty($file2->file_id)) {
+ $attrs['class'] = 'attachment';
+ } else {
+ $attrs['class'] = 'attachment thumbnail';
+ }
+ $attrs['id'] = "attachment-{$file->file_id}";
+ }
return XMLStringer::estring('a', $attrs, $display);
}
diff --git a/theme/base/css/display.css b/theme/base/css/display.css
index 5d2b5231c9..9bc1417b17 100644
--- a/theme/base/css/display.css
+++ b/theme/base/css/display.css
@@ -742,15 +742,10 @@ 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:3%;
-width:97%;
+margin-left:5%;
+width:95%;
float:left;
}
@@ -803,6 +798,9 @@ float:left;
width:100%;
overflow:hidden;
}
+.notice .entry-title.ov {
+overflow:visible;
+}
#shownotice .notice .entry-title {
font-size:2.2em;
}
@@ -827,7 +825,7 @@ clear:left;
float:left;
font-size:0.95em;
margin-left:59px;
-width:65%;
+width:60%;
}
#showstream .notice div.entry-content,
#shownotice .notice div.entry-content {
@@ -857,15 +855,26 @@ display:inline-block;
text-transform:lowercase;
}
+.notice .attachment {
+position:relative;
+}
+.notice .attachment img {
+position:absolute;
+top:18px;
+left:0;
+z-index:99;
+}
+#shownotice .notice .attachment img {
+position:static;
+}
+
.notice-options {
-padding-left:2%;
-float:left;
-width:50%;
position:relative;
font-size:0.95em;
-width:12.5%;
+width:90px;
float:right;
+margin-right:11px;
}
.notice-options a {
@@ -1049,8 +1058,6 @@ margin-left:18px;
}
-
-
/* TOP_POSTERS */
.section tbody td {
padding-right:18px;
diff --git a/theme/base/css/facebookapp.css b/theme/base/css/facebookapp.css
index 163b41fb4c..e6b1c9ee53 100644
--- a/theme/base/css/facebookapp.css
+++ b/theme/base/css/facebookapp.css
@@ -1,6 +1,3 @@
-@import url("display.css");
-@import url("../../identica/css/display.css");
-
* {
font-size:14px;
font-family:"Lucida Sans Unicode", "Lucida Grande", sans-serif;
diff --git a/theme/base/images/icons/clip-inline.png b/theme/base/images/icons/clip-inline.png
new file mode 100644
index 0000000000..870f8b2e8f
Binary files /dev/null and b/theme/base/images/icons/clip-inline.png differ
diff --git a/theme/default/css/display.css b/theme/default/css/display.css
index 16c9322a5d..737db7ce96 100644
--- a/theme/default/css/display.css
+++ b/theme/default/css/display.css
@@ -193,7 +193,9 @@ background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-r
}
.notices div.entry-content,
-.notices div.notice-options {
+.notices div.notice-options,
+.notices li.hover .notices div.entry-content,
+.notices li.hover .notices div.notice-options {
opacity:0.4;
}
.notices li.hover div.entry-content,
@@ -212,16 +214,16 @@ background-color:#fcfcfc;
}
.notices .notices {
-background-color:rgba(200, 200, 200, 0.025);
-}
-.notices .notices .notices {
background-color:rgba(200, 200, 200, 0.050);
}
+.notices .notices .notices {
+background-color:rgba(200, 200, 200, 0.100);
+}
.notices .notices .notices .notices {
-background-color:rgba(200, 200, 200, 0.075);
+background-color:rgba(200, 200, 200, 0.150);
}
.notices .notices .notices .notices .notices {
-background-color:rgba(200, 200, 200, 0.100);
+background-color:rgba(200, 200, 200, 0.300);
}
/*END: NOTICES */
diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css
index 2fb123a20a..f7abac4823 100644
--- a/theme/identica/css/display.css
+++ b/theme/identica/css/display.css
@@ -193,7 +193,9 @@ background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-r
}
.notices div.entry-content,
-.notices div.notice-options {
+.notices div.notice-options,
+.notices li.hover .notices div.entry-content,
+.notices li.hover .notices div.notice-options {
opacity:0.4;
}
.notices li.hover div.entry-content,
@@ -212,16 +214,16 @@ background-color:#fcfcfc;
}
.notices .notices {
-background-color:rgba(200, 200, 200, 0.025);
-}
-.notices .notices .notices {
background-color:rgba(200, 200, 200, 0.050);
}
+.notices .notices .notices {
+background-color:rgba(200, 200, 200, 0.100);
+}
.notices .notices .notices .notices {
-background-color:rgba(200, 200, 200, 0.075);
+background-color:rgba(200, 200, 200, 0.150);
}
.notices .notices .notices .notices .notices {
-background-color:rgba(200, 200, 200, 0.100);
+background-color:rgba(200, 200, 200, 0.300);
}
/*END: NOTICES */