From da1b47a029e678aee8b99ee11eec972dfb9a1a2b Mon Sep 17 00:00:00 2001 From: Domovoy Date: Mon, 23 Jul 2012 12:56:47 +0200 Subject: [PATCH 001/156] Progress on #1. Comments are now threaded, at least in the database, for normal view. --- include/conversation.php | 7 +++++-- mod/item.php | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/include/conversation.php b/include/conversation.php index 4a9142bb20..67445c2904 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -582,7 +582,9 @@ function conversation(&$a, $items, $mode, $update, $preview = false) { } $override_comment_box = ((($page_writeable) && ($item_writeable)) ? true : false); - $show_comment_box = ((($page_writeable) && ($item_writeable) && ($comments_seen == $comments[$item['parent']])) ? true : false); + // The comment box should now appear under each writable item, not only at the end of the thread, don't bother with $comments_seen + //$show_comment_box = ((($page_writeable) && ($item_writeable) && ($comments_seen == $comments[$item['parent']])) ? true : false); + $show_comment_box = ((($page_writeable) && ($item_writeable)) ? true : false); if(($comments[$item['parent']] > 2) && ($comments_seen <= ($comments[$item['parent']] - 2)) && ($item['gravity'] == 6)) { @@ -681,12 +683,13 @@ function conversation(&$a, $items, $mode, $update, $preview = false) { } if(($show_comment_box) || (($show_comment_box == false) && ($override_comment_box == false) && ($item['last-child']))) { + // The parent is now the item itself, not his parent $comment = replace_macros($cmnt_tpl,array( '$return_path' => '', '$jsreload' => (($mode === 'display') ? $_SESSION['return_url'] : ''), '$type' => (($mode === 'profile') ? 'wall-comment' : 'net-comment'), '$id' => $item['item_id'], - '$parent' => $item['parent'], + '$parent' => $item['item_id'], '$qcomment' => $qcomment, '$profile_uid' => $profile_owner, '$mylink' => $a->contact['url'], diff --git a/mod/item.php b/mod/item.php index fddc3fd124..cc1e628c80 100644 --- a/mod/item.php +++ b/mod/item.php @@ -77,14 +77,15 @@ function item_post(&$a) { ); } // if this isn't the real parent of the conversation, find it - if($r !== false && count($r)) { + // We are now threading the comments, the parent may have a parent + /*if($r !== false && count($r)) { $parid = $r[0]['parent']; if($r[0]['id'] != $r[0]['parent']) { $r = q("SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1", intval($parid) ); } - } + }*/ if(($r === false) || (! count($r))) { notice( t('Unable to locate original post.') . EOL); From 2a1657e3617faff8964e979a7a8482dfc0ec08d9 Mon Sep 17 00:00:00 2001 From: Domovoy Date: Mon, 23 Jul 2012 13:58:47 +0200 Subject: [PATCH 002/156] Revert "Progress on #1. Comments are now threaded, at least in the database, for normal view." This reverts commit da1b47a029e678aee8b99ee11eec972dfb9a1a2b. Useless, comments are already threaded in the database using parent-uri --- include/conversation.php | 7 ++----- mod/item.php | 5 ++--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/include/conversation.php b/include/conversation.php index 67445c2904..4a9142bb20 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -582,9 +582,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) { } $override_comment_box = ((($page_writeable) && ($item_writeable)) ? true : false); - // The comment box should now appear under each writable item, not only at the end of the thread, don't bother with $comments_seen - //$show_comment_box = ((($page_writeable) && ($item_writeable) && ($comments_seen == $comments[$item['parent']])) ? true : false); - $show_comment_box = ((($page_writeable) && ($item_writeable)) ? true : false); + $show_comment_box = ((($page_writeable) && ($item_writeable) && ($comments_seen == $comments[$item['parent']])) ? true : false); if(($comments[$item['parent']] > 2) && ($comments_seen <= ($comments[$item['parent']] - 2)) && ($item['gravity'] == 6)) { @@ -683,13 +681,12 @@ function conversation(&$a, $items, $mode, $update, $preview = false) { } if(($show_comment_box) || (($show_comment_box == false) && ($override_comment_box == false) && ($item['last-child']))) { - // The parent is now the item itself, not his parent $comment = replace_macros($cmnt_tpl,array( '$return_path' => '', '$jsreload' => (($mode === 'display') ? $_SESSION['return_url'] : ''), '$type' => (($mode === 'profile') ? 'wall-comment' : 'net-comment'), '$id' => $item['item_id'], - '$parent' => $item['item_id'], + '$parent' => $item['parent'], '$qcomment' => $qcomment, '$profile_uid' => $profile_owner, '$mylink' => $a->contact['url'], diff --git a/mod/item.php b/mod/item.php index cc1e628c80..fddc3fd124 100644 --- a/mod/item.php +++ b/mod/item.php @@ -77,15 +77,14 @@ function item_post(&$a) { ); } // if this isn't the real parent of the conversation, find it - // We are now threading the comments, the parent may have a parent - /*if($r !== false && count($r)) { + if($r !== false && count($r)) { $parid = $r[0]['parent']; if($r[0]['id'] != $r[0]['parent']) { $r = q("SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1", intval($parid) ); } - }*/ + } if(($r === false) || (! count($r))) { notice( t('Unable to locate original post.') . EOL); From 69b883829af30d314898623804dfda2b5c46eb35 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Wed, 25 Jul 2012 21:28:06 +0200 Subject: [PATCH 003/156] Speed improvements in the database --- database.sql | 2 ++ update.php | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/database.sql b/database.sql index 1d0a321760..13722d3c0c 100644 --- a/database.sql +++ b/database.sql @@ -569,6 +569,8 @@ CREATE TABLE IF NOT EXISTS `item` ( KEY `moderated` (`moderated`), KEY `spam` (`spam`), KEY `author-name` (`author-name`), + KEY `uid_commented` (`uid`, `commented`), + KEY `uid_created` (`uid`, `created`), FULLTEXT KEY `title` (`title`), FULLTEXT KEY `body` (`body`), FULLTEXT KEY `allow_cid` (`allow_cid`), diff --git a/update.php b/update.php index d752eaa6df..879d7017d4 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ Date: Wed, 25 Jul 2012 22:50:06 +0200 Subject: [PATCH 004/156] Further performance improvements --- database.sql | 1 + update.php | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/database.sql b/database.sql index 13722d3c0c..684491685e 100644 --- a/database.sql +++ b/database.sql @@ -571,6 +571,7 @@ CREATE TABLE IF NOT EXISTS `item` ( KEY `author-name` (`author-name`), KEY `uid_commented` (`uid`, `commented`), KEY `uid_created` (`uid`, `created`), + KEY `uid_unseen` (`uid`, `unseen`), FULLTEXT KEY `title` (`title`), FULLTEXT KEY `body` (`body`), FULLTEXT KEY `allow_cid` (`allow_cid`), diff --git a/update.php b/update.php index 879d7017d4..2d80ee369d 100644 --- a/update.php +++ b/update.php @@ -1338,7 +1338,13 @@ function update_1152() { } function update_1153() { - $r = q("CREATE INDEX `uid_commented` ON `item` (`uid`, `commented`); CREATE INDEX `uid_created` ON `item` (`uid`, `created`)"); + $r = q("CREATE INDEX `uid_commented` ON `item` (`uid`, `commented`)"); + if(! $r) + return UPDATE_FAILED; + $r = q("CREATE INDEX `uid_created` ON `item` (`uid`, `created`)"); + if(! $r) + return UPDATE_FAILED; + $r = q("CREATE INDEX `uid_unseen` ON `item` (`uid`, `unseen`)"); if(! $r) return UPDATE_FAILED; return UPDATE_SUCCESS; From 6456c2484ece64dc3fa02a8984b04854aee66b38 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Wed, 25 Jul 2012 23:40:23 +0200 Subject: [PATCH 005/156] scale_external_images: Fix: Hadn't looked for pictures in the format [img=XxY] --- include/network.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/network.php b/include/network.php index a95dde535c..fd9999b539 100644 --- a/include/network.php +++ b/include/network.php @@ -802,7 +802,7 @@ function scale_external_images($s, $include_link = true, $scale_replace = false) $s = htmlspecialchars_decode($s); $matches = null; - $c = preg_match_all('/\[img\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER); + $c = preg_match_all('/\[img.*?\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER); if($c) { require_once('include/Photo.php'); foreach($matches as $mtch) { From fc27edb6d76765cd9b85d29a3c41f23f17c6ca41 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Thu, 26 Jul 2012 00:23:25 +0200 Subject: [PATCH 006/156] network: Caching of images --- include/network.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/network.php b/include/network.php index fd9999b539..0fff5c7cc9 100644 --- a/include/network.php +++ b/include/network.php @@ -823,6 +823,12 @@ function scale_external_images($s, $include_link = true, $scale_replace = false) $scaled = $mtch[1]; $i = fetch_url($scaled); + $cache = get_config('system','itemcache'); + if (($cache != '') and is_dir($cache)) { + $cachefile = $cache."/".hash("md5", $scaled); + file_put_contents($cachefile, $i); + } + // guess mimetype from headers or filename $type = guess_image_type($mtch[1],true); From b9f13400d91254410fc1be22bc8f7f26f3caf645 Mon Sep 17 00:00:00 2001 From: friendica Date: Wed, 25 Jul 2012 15:52:26 -0700 Subject: [PATCH 007/156] rev update --- boot.php | 2 +- util/messages.po | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/boot.php b/boot.php index 6a894445ba..0de2b0afcf 100644 --- a/boot.php +++ b/boot.php @@ -11,7 +11,7 @@ require_once('include/cache.php'); require_once('library/Mobile_Detect/Mobile_Detect.php'); define ( 'FRIENDICA_PLATFORM', 'Friendica'); -define ( 'FRIENDICA_VERSION', '3.0.1414' ); +define ( 'FRIENDICA_VERSION', '3.0.1415' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DB_UPDATE_VERSION', 1154 ); diff --git a/util/messages.po b/util/messages.po index daf6a0918e..87fc198c29 100644 --- a/util/messages.po +++ b/util/messages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 3.0.1414\n" +"Project-Id-Version: 3.0.1415\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-07-24 10:00-0700\n" +"POT-Creation-Date: 2012-07-25 10:00-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -7064,7 +7064,7 @@ msgstr "" msgid "Sharing notification from Diaspora network" msgstr "" -#: ../../include/diaspora.php:2174 +#: ../../include/diaspora.php:2177 msgid "Attachments:" msgstr "" From 1573c1063197ed28e99cd328ad24232010dbfabc Mon Sep 17 00:00:00 2001 From: Rainulf Pineda Date: Wed, 25 Jul 2012 21:38:28 -0400 Subject: [PATCH 008/156] Fixed syntax error in usage of anonymous function. --- include/diaspora.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index cea66db0c0..a23c11bd21 100755 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -2156,9 +2156,9 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) { /** * Transform #tags, strip off the [url] and replace spaces with underscore */ - $body = preg_replace_callback('/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', function($match) { - return '#'. str_replace(' ', '_', $match[2]); - }, $body); + $body = preg_replace_callback('/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', create_function('$match', + 'return \'#\'. str_replace(\' \', \'_\', $match[2]);' + ), $body); //if(strlen($title)) // $body = "[b]".html_entity_decode($title)."[/b]\n\n".$body; From 794ae669cefa8234da08718e81a5872832b79259 Mon Sep 17 00:00:00 2001 From: Simon L'nu Date: Wed, 25 Jul 2012 22:28:09 -0400 Subject: [PATCH 009/156] fixes to cursor Signed-off-by: Simon L'nu --- view/theme/dispy/head.tpl | 20 ++++++++++++++------ view/theme/dispy/icons/sparkle.cur | Bin 19942 -> 4286 bytes view/theme/dispy/jot-header.tpl | 2 +- view/theme/dispy/jot.tpl | 9 ++++++--- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/view/theme/dispy/head.tpl b/view/theme/dispy/head.tpl index d42b19aef7..5f6b26a78a 100644 --- a/view/theme/dispy/head.tpl +++ b/view/theme/dispy/head.tpl @@ -2,29 +2,33 @@ - - + + + - - + - + + {{ endif }} From dc416e58871ff817aca6b51dde176c7eae80ddaa Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Thu, 26 Jul 2012 07:38:51 +0200 Subject: [PATCH 010/156] Moving the index creation commands into a readme file due to the fact that creating of these indexes is really slow. --- mods/readme.txt | 5 +++++ update.php | 15 +-------------- 2 files changed, 6 insertions(+), 14 deletions(-) create mode 100644 mods/readme.txt diff --git a/mods/readme.txt b/mods/readme.txt new file mode 100644 index 0000000000..9e79f843fe --- /dev/null +++ b/mods/readme.txt @@ -0,0 +1,5 @@ +Site speed can be improved when the following indexes are set. They cannot be set through the update script because on large sites they will block the site for several minutes. + +CREATE INDEX `uid_commented` ON `item` (`uid`, `commented`); +CREATE INDEX `uid_created` ON `item` (`uid`, `created`); +CREATE INDEX `uid_unseen` ON `item` (`uid`, `unseen`); diff --git a/update.php b/update.php index 2d80ee369d..f98fb3ae71 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ Date: Fri, 27 Jul 2012 22:08:57 +0200 Subject: [PATCH 011/156] Threaded comments are starting to work. For now, only on normal view, and not during update --- include/conversation.php | 997 ++++++++++++++++++++---------- mod/item.php | 3 +- mod/network.php | 2 +- view/theme/duepuntozero/style.css | 6 +- view/threaded_conversation.tpl | 13 + view/wall_thread.tpl | 91 +++ 6 files changed, 781 insertions(+), 331 deletions(-) create mode 100644 view/threaded_conversation.tpl create mode 100644 view/wall_thread.tpl diff --git a/include/conversation.php b/include/conversation.php index 4a9142bb20..2794d8ab3b 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -299,6 +299,292 @@ function localize_item(&$item){ } +/** + * Recursively prepare a thread for HTML + */ + +function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $profile_owner) { + $result = array(); + + $wall_template = 'wall_thread.tpl'; + $wallwall_template = 'wallwall_thread.tpl'; + $items_seen = 0; + $nb_items = count($items); + $lastcollapsed = false; + $firstcollapsed = false; + + foreach($items as $item) { + // prevent private email reply to public conversation from leaking. + if($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) { + // Don't count it as a visible item + $nb_items--; + continue; + } + + $items_seen++; + + $alike = array(); + $dlike = array(); + $comment = ''; + $template = $wall_template; + $commentww = ''; + $sparkle = ''; + $owner_url = $owner_photo = $owner_name = ''; + $buttons = ''; + $dropping = false; + $star = false; + $isstarred = "unstarred"; + $photo = $item['photo']; + $thumb = $item['thumb']; + $indent = ''; + $osparkle = ''; + + $toplevelpost = (($item['id'] == $item['parent']) ? true : false); + $item_writeable = (($item['writable'] || $item['self']) ? true : false); + $show_comment_box = ((($page_writeable) && ($item_writeable)) ? true : false); + $lock = ((($item['private'] == 1) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid']) + || strlen($item['deny_cid']) || strlen($item['deny_gid'])))) + ? t('Private Message') + : false); + $redirect_url = $a->get_baseurl($ssl_state) . '/redir/' . $item['cid'] ; + $shareable = ((($profile_owner == local_user()) && ($item['private'] != 1)) ? true : false); + if(local_user() && link_compare($a->contact['url'],$item['author-link'])) + $edpost = array($a->get_baseurl($ssl_state)."/editpost/".$item['id'], t("Edit")); + else + $edpost = false; + if((intval($item['contact-id']) && $item['contact-id'] == remote_user()) || ($item['uid'] == local_user())) + $dropping = true; + + $drop = array( + 'dropping' => $dropping, + 'select' => t('Select'), + 'delete' => t('Delete'), + ); + + $filer = (($profile_owner == local_user()) ? t("save to folder") : false); + + $diff_author = ((link_compare($item['url'],$item['author-link'])) ? false : true); + $profile_name = (((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']); + if($item['author-link'] && (! $item['author-name'])) + $profile_name = $item['author-link']; + + $sp = false; + $profile_link = best_link_url($item,$sp); + if($profile_link === 'mailbox') + $profile_link = ''; + if($sp) + $sparkle = ' sparkle'; + else + $profile_link = zrl($profile_link); + + $normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']); + if(($normalised != 'mailbox') && (x($a->contacts,$normalised))) + $profile_avatar = $a->contacts[$normalised]['thumb']; + else + $profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $a->get_cached_avatar_image($thumb)); + + $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => ''); + call_hooks('render_location',$locate); + $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate)); + + $tags=array(); + foreach(explode(',',$item['tag']) as $tag){ + $tag = trim($tag); + if ($tag!="") $tags[] = bbcode($tag); + } + + like_puller($a,$item,$alike,'like'); + like_puller($a,$item,$dlike,'dislike'); + + $like = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : ''); + $dislike = ((x($dlike,$item['uri'])) ? format_like($dlike[$item['uri']],$dlike[$item['uri'] . '-l'],'dislike',$item['uri']) : ''); + + if($toplevelpost) { + if((! $item['self']) && ($mode !== 'profile')) { + if($item['wall']) { + + // On the network page, I am the owner. On the display page it will be the profile owner. + // This will have been stored in $a->page_contact by our calling page. + // Put this person as the wall owner of the wall-to-wall notice. + + $owner_url = zrl($a->page_contact['url']); + $owner_photo = $a->page_contact['thumb']; + $owner_name = $a->page_contact['name']; + $template = $wallwall_template; + $commentww = 'ww'; + } + } + else if($item['owner-link']) { + + $owner_linkmatch = (($item['owner-link']) && link_compare($item['owner-link'],$item['author-link'])); + $alias_linkmatch = (($item['alias']) && link_compare($item['alias'],$item['author-link'])); + $owner_namematch = (($item['owner-name']) && $item['owner-name'] == $item['author-name']); + if((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) { + + // The author url doesn't match the owner (typically the contact) + // and also doesn't match the contact alias. + // The name match is a hack to catch several weird cases where URLs are + // all over the park. It can be tricked, but this prevents you from + // seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn + // well that it's the same Bob Smith. + + // But it could be somebody else with the same name. It just isn't highly likely. + + + $owner_url = $item['owner-link']; + $owner_photo = $item['owner-avatar']; + $owner_name = $item['owner-name']; + $template = $wallwall_template; + $commentww = 'ww'; + // If it is our contact, use a friendly redirect link + if((link_compare($item['owner-link'],$item['url'])) + && ($item['network'] === NETWORK_DFRN)) { + $owner_url = $redirect_url; + $osparkle = ' sparkle'; + } + else + $owner_url = zrl($owner_url); + } + } + if($profile_owner == local_user()) { + $isstarred = (($item['starred']) ? "starred" : "unstarred"); + + $star = array( + 'do' => t("add star"), + 'undo' => t("remove star"), + 'toggle' => t("toggle star status"), + 'classdo' => (($item['starred']) ? "hidden" : ""), + 'classundo' => (($item['starred']) ? "" : "hidden"), + 'starred' => t('starred'), + 'tagger' => t("add tag"), + 'classtagger' => "", + ); + } + } else { + $indent = 'comment'; + // Collapse comments + if($nb_items > 2) { + if(!$firstcollapsed && ($items_seen <= ($nb_items - 2))) { + $firstcollapsed = true; + } + else if($items_seen == ($nb_items - 1)) { + $lastcollapsed = true; + } + } + } + + logger('item, page_writeable:'. ($page_writeable ? 'yes' : 'no') .', show comment box: '. ($show_comment_box ? 'yes' : 'no'), LOGGER_DEBUG); + if($page_writeable) { + $buttons = array( + 'like' => array( t("I like this \x28toggle\x29"), t("like")), + 'dislike' => array( t("I don't like this \x28toggle\x29"), t("dislike")), + ); + if ($shareable) $buttons['share'] = array( t('Share this'), t('share')); + + + if($show_comment_box) { + $qc = $qcomment = null; + + if(in_array('qcomment',$a->plugins)) { + $qc = ((local_user()) ? get_pconfig(local_user(),'qcomment','words') : null); + $qcomment = (($qc) ? explode("\n",$qc) : null); + } + + $comment = replace_macros($cmnt_tpl,array( + '$return_path' => '', + '$jsreload' => (($mode === 'display') ? $_SESSION['return_url'] : ''), + '$type' => (($mode === 'profile') ? 'wall-comment' : 'net-comment'), + '$id' => $item['item_id'], + '$parent' => $item['item_id'], + '$qcomment' => $qcomment, + '$profile_uid' => $profile_owner, + '$mylink' => $a->contact['url'], + '$mytitle' => t('This is you'), + '$myphoto' => $a->contact['thumb'], + '$comment' => t('Comment'), + '$submit' => t('Submit'), + '$edbold' => t('Bold'), + '$editalic' => t('Italic'), + '$eduline' => t('Underline'), + '$edquote' => t('Quote'), + '$edcode' => t('Code'), + '$edimg' => t('Image'), + '$edurl' => t('Link'), + '$edvideo' => t('Video'), + '$preview' => t('Preview'), + '$ww' => (($mode === 'network') ? $commentww : '') + )); + } + } + + if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0) + $indent .= ' shiny'; + + localize_item($item); + + $body = prepare_body($item,true); + + $tmp_item = array( + // collapse comments in template. I don't like this much... + 'comment_firstcollapsed' => $comment_firstcollapsed, + 'comment_lastcollapsed' => $comment_lastcollapsed, + // template to use to render item (wall, walltowall, search) + 'template' => $template, + + 'type' => implode("",array_slice(explode("/",$item['verb']),-1)), + 'tags' => $tags, + 'body' => template_escape($body), + 'text' => strip_tags(template_escape($body)), + 'id' => $item['item_id'], + 'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])), + 'olinktitle' => sprintf( t('View %s\'s profile @ %s'), $owner_name, ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])), + 'to' => t('to'), + 'wall' => t('Wall-to-Wall'), + 'vwall' => t('via Wall-To-Wall:'), + 'profile_url' => $profile_link, + 'item_photo_menu' => item_photo_menu($item), + 'name' => template_escape($profile_name), + 'thumb' => $profile_avatar, + 'osparkle' => $osparkle, + 'sparkle' => $sparkle, + 'title' => template_escape($item['title']), + 'ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])), + 'lock' => $lock, + 'location' => template_escape($location), + 'indent' => $indent, + 'owner_url' => $owner_url, + 'owner_photo' => $owner_photo, + 'owner_name' => template_escape($owner_name), + 'plink' => get_plink($item), + 'edpost' => $edpost, + 'isstarred' => $isstarred, + 'star' => $star, + 'filer' => $filer, + 'drop' => $drop, + 'vote' => $buttons, + 'like' => $like, + 'dislike' => $dislike, + 'comment' => $comment, + 'previewing' => $previewing, + 'wait' => t('Please wait'), + ); + + $arr = array('item' => $item, 'output' => $tmp_item); + call_hooks('display_item', $arr); + + $item_result = $arr['output']; + + $item_result['children'] = array(); + if(count($item['children'])) { + $item_result['children'] = prepare_threads_body($a, $item['children'], $cmnt_tpl, $page_writeable, $mode, $profile_owner); + } + $item_result['private'] = $item['private']; + $result[] = $item_result; + } + + return $result; +} + /** * "Render" a conversation or list of items for HTML display. * There are two major forms of display: @@ -311,7 +597,7 @@ function localize_item(&$item){ */ if(!function_exists('conversation')) { -function conversation(&$a, $items, $mode, $update, $preview = false) { +function conversation(&$a, $items, $mode, $update, $preview = false, $thr_c = false) { require_once('bbcode.php'); @@ -500,364 +786,386 @@ function conversation(&$a, $items, $mode, $update, $preview = false) { { // Normal View + // Threaded comments, $thr_c is used for now since we don't know what other parts of friendica uses this function + // Better not rely on the new code for stuff we haven't examined yet + if($thr_c) { + // get all the topmost parents + // this shouldn't be needed, as we should have only them in ou array + // But for now, this array respects the old style, just in case - // Figure out how many comments each parent has - // (Comments all have gravity of 6) - // Store the result in the $comments array - - $comments = array(); - foreach($items as $item) { - if((intval($item['gravity']) == 6) && ($item['id'] != $item['parent'])) { - if(! x($comments,$item['parent'])) - $comments[$item['parent']] = 1; - else - $comments[$item['parent']] += 1; - } elseif(! x($comments,$item['parent'])) - $comments[$item['parent']] = 0; // avoid notices later on - } - - // map all the like/dislike activities for each parent item - // Store these in the $alike and $dlike arrays - - foreach($items as $item) { - like_puller($a,$item,$alike,'like'); - like_puller($a,$item,$dlike,'dislike'); - } - - $comments_collapsed = false; - $comments_seen = 0; - $comment_lastcollapsed = false; - $comment_firstcollapsed = false; - $blowhard = 0; - $blowhard_count = 0; - - - foreach($items as $item) { - - $comment = ''; - $template = $tpl; - $commentww = ''; - $sparkle = ''; - $owner_url = $owner_photo = $owner_name = ''; - - // We've already parsed out like/dislike for special treatment. We can ignore them now - - if(((activity_match($item['verb'],ACTIVITY_LIKE)) - || (activity_match($item['verb'],ACTIVITY_DISLIKE))) - && ($item['id'] != $item['parent'])) - continue; - - $toplevelpost = (($item['id'] == $item['parent']) ? true : false); - - - // Take care of author collapsing and comment collapsing - // (author collapsing is currently disabled) - // If a single author has more than 3 consecutive top-level posts, squash the remaining ones. - // If there are more than two comments, squash all but the last 2. - - if($toplevelpost) { - - $item_writeable = (($item['writable'] || $item['self']) ? true : false); - - $comments_seen = 0; - $comments_collapsed = false; - $comment_lastcollapsed = false; - $comment_firstcollapsed = false; - - $threadsid++; - $threads[$threadsid]['id'] = $item['item_id']; - $threads[$threadsid]['private'] = $item['private']; - $threads[$threadsid]['items'] = array(); - - } - else { - - // prevent private email reply to public conversation from leaking. - if($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) - continue; - - $comments_seen ++; - $comment_lastcollapsed = false; - $comment_firstcollapsed = false; - } - - $override_comment_box = ((($page_writeable) && ($item_writeable)) ? true : false); - $show_comment_box = ((($page_writeable) && ($item_writeable) && ($comments_seen == $comments[$item['parent']])) ? true : false); - - - if(($comments[$item['parent']] > 2) && ($comments_seen <= ($comments[$item['parent']] - 2)) && ($item['gravity'] == 6)) { - - if (!$comments_collapsed){ - $threads[$threadsid]['num_comments'] = sprintf( tt('%d comment','%d comments',$comments[$item['parent']]),$comments[$item['parent']] ); - $threads[$threadsid]['hide_text'] = t('show more'); - $comments_collapsed = true; - $comment_firstcollapsed = true; + $threads = array(); + foreach($items as $item) { + if($item['id'] == $item['parent']) { + $threads[] = $item; } } - if(($comments[$item['parent']] > 2) && ($comments_seen == ($comments[$item['parent']] - 1))) { - $comment_lastcollapsed = true; + $threads = prepare_threads_body($a, $threads, $cmnt_tpl, $page_writeable, $mode, $profile_owner, $previewing); + } else { + + + // Figure out how many comments each parent has + // (Comments all have gravity of 6) + // Store the result in the $comments array + + $comments = array(); + foreach($items as $item) { + if((intval($item['gravity']) == 6) && ($item['id'] != $item['parent'])) { + if(! x($comments,$item['parent'])) + $comments[$item['parent']] = 1; + else + $comments[$item['parent']] += 1; + } elseif(! x($comments,$item['parent'])) + $comments[$item['parent']] = 0; // avoid notices later on } - $redirect_url = $a->get_baseurl($ssl_state) . '/redir/' . $item['cid'] ; + // map all the like/dislike activities for each parent item + // Store these in the $alike and $dlike arrays - $lock = ((($item['private'] == 1) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid']) - || strlen($item['deny_cid']) || strlen($item['deny_gid'])))) - ? t('Private Message') - : false); + foreach($items as $item) { + like_puller($a,$item,$alike,'like'); + like_puller($a,$item,$dlike,'dislike'); + } + + $comments_collapsed = false; + $comments_seen = 0; + $comment_lastcollapsed = false; + $comment_firstcollapsed = false; + $blowhard = 0; + $blowhard_count = 0; - // Top-level wall post not written by the wall owner (wall-to-wall) - // First figure out who owns it. + foreach($items as $item) { - $osparkle = ''; + $comment = ''; + $template = $tpl; + $commentww = ''; + $sparkle = ''; + $owner_url = $owner_photo = $owner_name = ''; - if(($toplevelpost) && (! $item['self']) && ($mode !== 'profile')) { + // We've already parsed out like/dislike for special treatment. We can ignore them now - if($item['wall']) { + if(((activity_match($item['verb'],ACTIVITY_LIKE)) + || (activity_match($item['verb'],ACTIVITY_DISLIKE))) + && ($item['id'] != $item['parent'])) + continue; - // On the network page, I am the owner. On the display page it will be the profile owner. - // This will have been stored in $a->page_contact by our calling page. - // Put this person as the wall owner of the wall-to-wall notice. + $toplevelpost = (($item['id'] == $item['parent']) ? true : false); + + + // Take care of author collapsing and comment collapsing + // (author collapsing is currently disabled) + // If a single author has more than 3 consecutive top-level posts, squash the remaining ones. + // If there are more than two comments, squash all but the last 2. + + if($toplevelpost) { + + $item_writeable = (($item['writable'] || $item['self']) ? true : false); + + $comments_seen = 0; + $comments_collapsed = false; + $comment_lastcollapsed = false; + $comment_firstcollapsed = false; + + $threadsid++; + $threads[$threadsid]['id'] = $item['item_id']; + $threads[$threadsid]['private'] = $item['private']; + $threads[$threadsid]['items'] = array(); - $owner_url = zrl($a->page_contact['url']); - $owner_photo = $a->page_contact['thumb']; - $owner_name = $a->page_contact['name']; - $template = $wallwall; - $commentww = 'ww'; } + else { - if((! $item['wall']) && $item['owner-link']) { + // prevent private email reply to public conversation from leaking. + if($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) + continue; - $owner_linkmatch = (($item['owner-link']) && link_compare($item['owner-link'],$item['author-link'])); - $alias_linkmatch = (($item['alias']) && link_compare($item['alias'],$item['author-link'])); - $owner_namematch = (($item['owner-name']) && $item['owner-name'] == $item['author-name']); - if((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) { + $comments_seen ++; + $comment_lastcollapsed = false; + $comment_firstcollapsed = false; + } - // The author url doesn't match the owner (typically the contact) - // and also doesn't match the contact alias. - // The name match is a hack to catch several weird cases where URLs are - // all over the park. It can be tricked, but this prevents you from - // seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn - // well that it's the same Bob Smith. + $override_comment_box = ((($page_writeable) && ($item_writeable)) ? true : false); + // Show comment box on every writable item + $show_comment_box = ((($page_writeable) && ($item_writeable)) ? true : false); - // But it could be somebody else with the same name. It just isn't highly likely. - - $owner_url = $item['owner-link']; - $owner_photo = $item['owner-avatar']; - $owner_name = $item['owner-name']; - $template = $wallwall; - $commentww = 'ww'; - // If it is our contact, use a friendly redirect link - if((link_compare($item['owner-link'],$item['url'])) - && ($item['network'] === NETWORK_DFRN)) { - $owner_url = $redirect_url; - $osparkle = ' sparkle'; - } - else - $owner_url = zrl($owner_url); + if(($comments[$item['parent']] > 2) && ($comments_seen <= ($comments[$item['parent']] - 2)) && ($item['gravity'] == 6)) { + + if (!$comments_collapsed){ + $threads[$threadsid]['num_comments'] = sprintf( tt('%d comment','%d comments',$comments[$item['parent']]),$comments[$item['parent']] ); + $threads[$threadsid]['hide_text'] = t('show more'); + $comments_collapsed = true; + $comment_firstcollapsed = true; } } - } + if(($comments[$item['parent']] > 2) && ($comments_seen == ($comments[$item['parent']] - 1))) { - $likebuttons = ''; - $shareable = ((($profile_owner == local_user()) && ($item['private'] != 1)) ? true : false); - - if($page_writeable) { -/* if($toplevelpost) { */ - $likebuttons = array( - 'like' => array( t("I like this \x28toggle\x29"), t("like")), - 'dislike' => array( t("I don't like this \x28toggle\x29"), t("dislike")), - ); - if ($shareable) $likebuttons['share'] = array( t('Share this'), t('share')); -/* } */ - - $qc = $qcomment = null; - - if(in_array('qcomment',$a->plugins)) { - $qc = ((local_user()) ? get_pconfig(local_user(),'qcomment','words') : null); - $qcomment = (($qc) ? explode("\n",$qc) : null); + $comment_lastcollapsed = true; } - if(($show_comment_box) || (($show_comment_box == false) && ($override_comment_box == false) && ($item['last-child']))) { - $comment = replace_macros($cmnt_tpl,array( - '$return_path' => '', - '$jsreload' => (($mode === 'display') ? $_SESSION['return_url'] : ''), - '$type' => (($mode === 'profile') ? 'wall-comment' : 'net-comment'), - '$id' => $item['item_id'], - '$parent' => $item['parent'], - '$qcomment' => $qcomment, - '$profile_uid' => $profile_owner, - '$mylink' => $a->contact['url'], - '$mytitle' => t('This is you'), - '$myphoto' => $a->contact['thumb'], - '$comment' => t('Comment'), - '$submit' => t('Submit'), - '$edbold' => t('Bold'), - '$editalic' => t('Italic'), - '$eduline' => t('Underline'), - '$edquote' => t('Quote'), - '$edcode' => t('Code'), - '$edimg' => t('Image'), - '$edurl' => t('Link'), - '$edvideo' => t('Video'), - '$preview' => t('Preview'), - '$ww' => (($mode === 'network') ? $commentww : '') - )); + $redirect_url = $a->get_baseurl($ssl_state) . '/redir/' . $item['cid'] ; + + $lock = ((($item['private'] == 1) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid']) + || strlen($item['deny_cid']) || strlen($item['deny_gid'])))) + ? t('Private Message') + : false); + + + // Top-level wall post not written by the wall owner (wall-to-wall) + // First figure out who owns it. + + $osparkle = ''; + + if(($toplevelpost) && (! $item['self']) && ($mode !== 'profile')) { + + if($item['wall']) { + + // On the network page, I am the owner. On the display page it will be the profile owner. + // This will have been stored in $a->page_contact by our calling page. + // Put this person as the wall owner of the wall-to-wall notice. + + $owner_url = zrl($a->page_contact['url']); + $owner_photo = $a->page_contact['thumb']; + $owner_name = $a->page_contact['name']; + $template = $wallwall; + $commentww = 'ww'; + } + + if((! $item['wall']) && $item['owner-link']) { + + $owner_linkmatch = (($item['owner-link']) && link_compare($item['owner-link'],$item['author-link'])); + $alias_linkmatch = (($item['alias']) && link_compare($item['alias'],$item['author-link'])); + $owner_namematch = (($item['owner-name']) && $item['owner-name'] == $item['author-name']); + if((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) { + + // The author url doesn't match the owner (typically the contact) + // and also doesn't match the contact alias. + // The name match is a hack to catch several weird cases where URLs are + // all over the park. It can be tricked, but this prevents you from + // seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn + // well that it's the same Bob Smith. + + // But it could be somebody else with the same name. It just isn't highly likely. + + + $owner_url = $item['owner-link']; + $owner_photo = $item['owner-avatar']; + $owner_name = $item['owner-name']; + $template = $wallwall; + $commentww = 'ww'; + // If it is our contact, use a friendly redirect link + if((link_compare($item['owner-link'],$item['url'])) + && ($item['network'] === NETWORK_DFRN)) { + $owner_url = $redirect_url; + $osparkle = ' sparkle'; + } + else + $owner_url = zrl($owner_url); + } + } } - } - if(local_user() && link_compare($a->contact['url'],$item['author-link'])) - $edpost = array($a->get_baseurl($ssl_state)."/editpost/".$item['id'], t("Edit")); - else - $edpost = false; + $likebuttons = ''; + $shareable = ((($profile_owner == local_user()) && ($item['private'] != 1)) ? true : false); - $drop = ''; - $dropping = false; + if($page_writeable) { + /* if($toplevelpost) { */ + $likebuttons = array( + 'like' => array( t("I like this \x28toggle\x29"), t("like")), + 'dislike' => array( t("I don't like this \x28toggle\x29"), t("dislike")), + ); + if ($shareable) $likebuttons['share'] = array( t('Share this'), t('share')); + /* } */ - if((intval($item['contact-id']) && $item['contact-id'] == remote_user()) || ($item['uid'] == local_user())) - $dropping = true; + $qc = $qcomment = null; - $drop = array( - 'dropping' => $dropping, - 'select' => t('Select'), - 'delete' => t('Delete'), - ); + if(in_array('qcomment',$a->plugins)) { + $qc = ((local_user()) ? get_pconfig(local_user(),'qcomment','words') : null); + $qcomment = (($qc) ? explode("\n",$qc) : null); + } - $star = false; - $filer = false; - - $isstarred = "unstarred"; - if ($profile_owner == local_user()) { - if($toplevelpost) { - $isstarred = (($item['starred']) ? "starred" : "unstarred"); - - $star = array( - 'do' => t("add star"), - 'undo' => t("remove star"), - 'toggle' => t("toggle star status"), - 'classdo' => (($item['starred']) ? "hidden" : ""), - 'classundo' => (($item['starred']) ? "" : "hidden"), - 'starred' => t('starred'), - 'tagger' => t("add tag"), - 'classtagger' => "", - ); + if(($show_comment_box) || (($show_comment_box == false) && ($override_comment_box == false) && ($item['last-child']))) { + $comment = replace_macros($cmnt_tpl,array( + '$return_path' => '', + '$jsreload' => (($mode === 'display') ? $_SESSION['return_url'] : ''), + '$type' => (($mode === 'profile') ? 'wall-comment' : 'net-comment'), + '$id' => $item['item_id'], + '$parent' => $item['item_id'], + '$qcomment' => $qcomment, + '$profile_uid' => $profile_owner, + '$mylink' => $a->contact['url'], + '$mytitle' => t('This is you'), + '$myphoto' => $a->contact['thumb'], + '$comment' => t('Comment'), + '$submit' => t('Submit'), + '$edbold' => t('Bold'), + '$editalic' => t('Italic'), + '$eduline' => t('Underline'), + '$edquote' => t('Quote'), + '$edcode' => t('Code'), + '$edimg' => t('Image'), + '$edurl' => t('Link'), + '$edvideo' => t('Video'), + '$preview' => t('Preview'), + '$ww' => (($mode === 'network') ? $commentww : '') + )); + } } - $filer = t("save to folder"); + + if(local_user() && link_compare($a->contact['url'],$item['author-link'])) + $edpost = array($a->get_baseurl($ssl_state)."/editpost/".$item['id'], t("Edit")); + else + $edpost = false; + + $drop = ''; + $dropping = false; + + if((intval($item['contact-id']) && $item['contact-id'] == remote_user()) || ($item['uid'] == local_user())) + $dropping = true; + + $drop = array( + 'dropping' => $dropping, + 'select' => t('Select'), + 'delete' => t('Delete'), + ); + + $star = false; + $filer = false; + + $isstarred = "unstarred"; + if ($profile_owner == local_user()) { + if($toplevelpost) { + $isstarred = (($item['starred']) ? "starred" : "unstarred"); + + $star = array( + 'do' => t("add star"), + 'undo' => t("remove star"), + 'toggle' => t("toggle star status"), + 'classdo' => (($item['starred']) ? "hidden" : ""), + 'classundo' => (($item['starred']) ? "" : "hidden"), + 'starred' => t('starred'), + 'tagger' => t("add tag"), + 'classtagger' => "", + ); + } + $filer = t("save to folder"); + } + + + $photo = $item['photo']; + $thumb = $item['thumb']; + + // Post was remotely authored. + + $diff_author = ((link_compare($item['url'],$item['author-link'])) ? false : true); + + $profile_name = (((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']); + + if($item['author-link'] && (! $item['author-name'])) + $profile_name = $item['author-link']; + + $sp = false; + $profile_link = best_link_url($item,$sp); + if($profile_link === 'mailbox') + $profile_link = ''; + if($sp) + $sparkle = ' sparkle'; + else + $profile_link = zrl($profile_link); + + $normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']); + if(($normalised != 'mailbox') && (x($a->contacts,$normalised))) + $profile_avatar = $a->contacts[$normalised]['thumb']; + else + $profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $a->get_cached_avatar_image($thumb)); + + $like = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : ''); + $dislike = ((x($dlike,$item['uri'])) ? format_like($dlike[$item['uri']],$dlike[$item['uri'] . '-l'],'dislike',$item['uri']) : ''); + + $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => ''); + call_hooks('render_location',$locate); + + $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate)); + + $indent = (($toplevelpost) ? '' : ' comment'); + + if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0) + $indent .= ' shiny'; + + // + localize_item($item); + + + $tags=array(); + foreach(explode(',',$item['tag']) as $tag){ + $tag = trim($tag); + if ($tag!="") $tags[] = bbcode($tag); + } + + // Build the HTML + + $body = prepare_body($item,true); + //$tmp_item = replace_macros($template, + $tmp_item = array( + // collapse comments in template. I don't like this much... + 'comment_firstcollapsed' => $firstcollapsed, + 'comment_lastcollapsed' => $lastcollapsed, + // template to use to render item (wall, walltowall, search) + 'template' => $template, + + 'type' => implode("",array_slice(explode("/",$item['verb']),-1)), + 'tags' => $tags, + 'body' => template_escape($body), + 'text' => strip_tags(template_escape($body)), + 'id' => $item['item_id'], + 'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])), + 'olinktitle' => sprintf( t('View %s\'s profile @ %s'), $owner-name, ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])), + 'to' => t('to'), + 'wall' => t('Wall-to-Wall'), + 'vwall' => t('via Wall-To-Wall:'), + 'profile_url' => $profile_link, + 'item_photo_menu' => item_photo_menu($item), + 'name' => template_escape($profile_name), + 'thumb' => $profile_avatar, + 'osparkle' => $osparkle, + 'sparkle' => $sparkle, + 'title' => template_escape($item['title']), + 'ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])), + 'lock' => $lock, + 'location' => template_escape($location), + 'indent' => $indent, + 'owner_url' => $owner_url, + 'owner_photo' => $owner_photo, + 'owner_name' => template_escape($owner_name), + 'plink' => get_plink($item), + 'edpost' => $edpost, + 'isstarred' => $isstarred, + 'star' => $star, + 'filer' => $filer, + 'drop' => $drop, + 'vote' => $likebuttons, + 'like' => $like, + 'dislike' => $dislike, + 'comment' => $comment, + 'previewing' => $previewing, + 'wait' => t('Please wait'), + + ); + + + $arr = array('item' => $item, 'output' => $tmp_item); + call_hooks('display_item', $arr); + + $threads[$threadsid]['items'][] = $arr['output']; } - - - $photo = $item['photo']; - $thumb = $item['thumb']; - - // Post was remotely authored. - - $diff_author = ((link_compare($item['url'],$item['author-link'])) ? false : true); - - $profile_name = (((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']); - - if($item['author-link'] && (! $item['author-name'])) - $profile_name = $item['author-link']; - - $sp = false; - $profile_link = best_link_url($item,$sp); - if($profile_link === 'mailbox') - $profile_link = ''; - if($sp) - $sparkle = ' sparkle'; - else - $profile_link = zrl($profile_link); - - $normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']); - if(($normalised != 'mailbox') && (x($a->contacts,$normalised))) - $profile_avatar = $a->contacts[$normalised]['thumb']; - else - $profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $a->get_cached_avatar_image($thumb)); - - $like = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : ''); - $dislike = ((x($dlike,$item['uri'])) ? format_like($dlike[$item['uri']],$dlike[$item['uri'] . '-l'],'dislike',$item['uri']) : ''); - - $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => ''); - call_hooks('render_location',$locate); - - $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate)); - - $indent = (($toplevelpost) ? '' : ' comment'); - - if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0) - $indent .= ' shiny'; - - // - localize_item($item); - - - $tags=array(); - foreach(explode(',',$item['tag']) as $tag){ - $tag = trim($tag); - if ($tag!="") $tags[] = bbcode($tag); - } - - // Build the HTML - - $body = prepare_body($item,true); - //$tmp_item = replace_macros($template, - $tmp_item = array( - // collapse comments in template. I don't like this much... - 'comment_firstcollapsed' => $comment_firstcollapsed, - 'comment_lastcollapsed' => $comment_lastcollapsed, - // template to use to render item (wall, walltowall, search) - 'template' => $template, - - 'type' => implode("",array_slice(explode("/",$item['verb']),-1)), - 'tags' => $tags, - 'body' => template_escape($body), - 'text' => strip_tags(template_escape($body)), - 'id' => $item['item_id'], - 'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])), - 'olinktitle' => sprintf( t('View %s\'s profile @ %s'), $owner-name, ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])), - 'to' => t('to'), - 'wall' => t('Wall-to-Wall'), - 'vwall' => t('via Wall-To-Wall:'), - 'profile_url' => $profile_link, - 'item_photo_menu' => item_photo_menu($item), - 'name' => template_escape($profile_name), - 'thumb' => $profile_avatar, - 'osparkle' => $osparkle, - 'sparkle' => $sparkle, - 'title' => template_escape($item['title']), - 'ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])), - 'lock' => $lock, - 'location' => template_escape($location), - 'indent' => $indent, - 'owner_url' => $owner_url, - 'owner_photo' => $owner_photo, - 'owner_name' => template_escape($owner_name), - 'plink' => get_plink($item), - 'edpost' => $edpost, - 'isstarred' => $isstarred, - 'star' => $star, - 'filer' => $filer, - 'drop' => $drop, - 'vote' => $likebuttons, - 'like' => $like, - 'dislike' => $dislike, - 'comment' => $comment, - 'previewing' => $previewing, - 'wait' => t('Please wait'), - - ); - - - $arr = array('item' => $item, 'output' => $tmp_item); - call_hooks('display_item', $arr); - - $threads[$threadsid]['items'][] = $arr['output']; } } } + $page_template = get_markup_template("conversation.tpl"); + if($thr_c) + $page_template = get_markup_template("threaded_conversation.tpl"); $o = replace_macros($page_template, array( '$baseurl' => $a->get_baseurl($ssl_state), '$mode' => $mode, @@ -1159,12 +1467,43 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) { } +function get_item_children($arr, $parent) { + $children = array(); + foreach($arr as $item) { + if(($item['id'] != $item['parent']) && ($item['thr-parent'] == $parent['uri'])) { + $item['children'] = get_item_children($arr, $item); + $children[] = $item; + } + } + return $children; +} + +function sort_item_children($items) { + $result = $items; + usort($result,'sort_thr_created_rev'); + foreach($result as $k => $i) { + if(count($result[$k]['children'])) { + $result[$k]['children'] = sort_item_children($result[$k]['children']); + } + } + return $result; +} + +function add_children_to_list($children, &$arr) { + foreach($children as $y) { + $arr[] = $y; + if(count($y['children'])) + add_children_to_list($y['children'], $arr); + } +} + function conv_sort($arr,$order) { if((!(is_array($arr) && count($arr)))) return array(); $parents = array(); + $children = array(); foreach($arr as $x) if($x['id'] == $x['parent']) @@ -1177,21 +1516,22 @@ function conv_sort($arr,$order) { if(count($parents)) foreach($parents as $i=>$_x) - $parents[$i]['children'] = array(); + $parents[$i]['children'] = get_item_children($arr, $_x); - foreach($arr as $x) { + /*foreach($arr as $x) { if($x['id'] != $x['parent']) { $p = find_thread_parent_index($parents,$x); if($p !== false) $parents[$p]['children'][] = $x; } - } + }*/ if(count($parents)) { foreach($parents as $k => $v) { if(count($parents[$k]['children'])) { - $y = $parents[$k]['children']; + $parents[$k]['children'] = sort_item_children($parents[$k]['children']); + /*$y = $parents[$k]['children']; usort($y,'sort_thr_created_rev'); - $parents[$k]['children'] = $y; + $parents[$k]['children'] = $y;*/ } } } @@ -1201,8 +1541,9 @@ function conv_sort($arr,$order) { foreach($parents as $x) { $ret[] = $x; if(count($x['children'])) - foreach($x['children'] as $y) - $ret[] = $y; + add_children_to_list($x['children'], $ret); + /*foreach($x['children'] as $y) + $ret[] = $y;*/ } } diff --git a/mod/item.php b/mod/item.php index fddc3fd124..012f2989b0 100644 --- a/mod/item.php +++ b/mod/item.php @@ -79,6 +79,7 @@ function item_post(&$a) { // if this isn't the real parent of the conversation, find it if($r !== false && count($r)) { $parid = $r[0]['parent']; + $parent_uri = $r[0]['uri']; if($r[0]['id'] != $r[0]['parent']) { $r = q("SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1", intval($parid) @@ -96,7 +97,7 @@ function item_post(&$a) { $parent = $r[0]['id']; // multi-level threading - preserve the info but re-parent to our single level threading - if(($parid) && ($parid != $parent)) + //if(($parid) && ($parid != $parent)) $thr_parent = $parent_uri; if($parent_item['contact-id'] && $uid) { diff --git a/mod/network.php b/mod/network.php index 17368ab92d..2ca3c5b06f 100644 --- a/mod/network.php +++ b/mod/network.php @@ -687,7 +687,7 @@ function network_content(&$a, $update = 0) { $mode = (($nouveau) ? 'network-new' : 'network'); - $o .= conversation($a,$items,$mode,$update); + $o .= conversation($a,$items,$mode,$update, false, true); if(! $update) { if(! get_pconfig(local_user(),'system','alt_pager')) { diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css index 1be81d738e..e17f8319bc 100644 --- a/view/theme/duepuntozero/style.css +++ b/view/theme/duepuntozero/style.css @@ -935,8 +935,12 @@ input#dfrn-url { } -.wall-item-content-wrapper.comment { +.tread-wrapper .tread-wrapper { margin-left: 50px; +} + +.wall-item-content-wrapper.comment { +# margin-left: 50px; background: #EEEEEE; } diff --git a/view/threaded_conversation.tpl b/view/threaded_conversation.tpl new file mode 100644 index 0000000000..f60839e495 --- /dev/null +++ b/view/threaded_conversation.tpl @@ -0,0 +1,13 @@ +{{ for $threads as $item }} +{{ inc $item.template }}{{ endinc }} +{{ endfor }} + +
+ +{{ if $dropping }} + +
+{{ endif }} diff --git a/view/wall_thread.tpl b/view/wall_thread.tpl new file mode 100644 index 0000000000..56e21bb828 --- /dev/null +++ b/view/wall_thread.tpl @@ -0,0 +1,91 @@ +
+ {{if $item.comment_firstcollapsed}} +
+ $item.num_comments $item.hide_text +
+ {{endif}} + + +
+
+
+
+ + $item.name + + menu +
+
    + $item.item_photo_menu +
+
+
+
+
+ {{ if $item.lock }}
$item.lock
+ {{ else }}
{{ endif }} +
$item.location
+
+
+
+ $item.name +
$item.ago
+ +
+
+
$item.title
+
+
$item.body +
+ {{ for $item.tags as $tag }} + $tag + {{ endfor }} +
+
+
+
+ {{ if $item.vote }} + + {{ endif }} + {{ if $item.plink }} + + {{ endif }} + {{ if $item.edpost }} + + {{ endif }} + + {{ if $item.star }} + + + {{ endif }} + {{ if $item.filer }} + + {{ endif }} +
+ {{ if $item.drop.dropping }}{{ endif }} +
+ {{ if $item.drop.dropping }}{{ endif }} +
+
+
+
+ +
$item.dislike
+
+ $item.comment +
+
+
+{{ for $item.children as $item }} + {{ inc $item.template }}{{ endinc }} +{{ endfor }} +
From d558d255405f6a8d35ce7fb16c175cf28de430f3 Mon Sep 17 00:00:00 2001 From: Domovoy Date: Fri, 27 Jul 2012 22:47:18 +0200 Subject: [PATCH 012/156] CommentBox is now hidden by default, this can be toggled with a fake link --- include/conversation.php | 2 -- view/comment_item.tpl | 3 ++- view/head.tpl | 9 +++++++++ view/theme/duepuntozero/comment_item.tpl | 3 ++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/include/conversation.php b/include/conversation.php index 2794d8ab3b..2a085666d7 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -473,7 +473,6 @@ function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $pr } } - logger('item, page_writeable:'. ($page_writeable ? 'yes' : 'no') .', show comment box: '. ($show_comment_box ? 'yes' : 'no'), LOGGER_DEBUG); if($page_writeable) { $buttons = array( 'like' => array( t("I like this \x28toggle\x29"), t("like")), @@ -489,7 +488,6 @@ function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $pr $qc = ((local_user()) ? get_pconfig(local_user(),'qcomment','words') : null); $qcomment = (($qc) ? explode("\n",$qc) : null); } - $comment = replace_macros($cmnt_tpl,array( '$return_path' => '', '$jsreload' => (($mode === 'display') ? $_SESSION['return_url'] : ''), diff --git a/view/comment_item.tpl b/view/comment_item.tpl index a1d4e1043a..b2be6f94e3 100644 --- a/view/comment_item.tpl +++ b/view/comment_item.tpl @@ -1,5 +1,6 @@
-
+ $comment + diff --git a/view/head.tpl b/view/head.tpl index 8a75a4b8e0..e5495b329f 100644 --- a/view/head.tpl +++ b/view/head.tpl @@ -96,6 +96,15 @@ } } + function showHideCommentBox(id) { + if( $('#comment-edit-form-' + id).is(':visible')) { + $('#comment-edit-form-' + id).hide(); + } + else { + $('#comment-edit-form-' + id).show(); + } + } + diff --git a/view/theme/duepuntozero/comment_item.tpl b/view/theme/duepuntozero/comment_item.tpl index ea24d95cc3..63c05f335c 100755 --- a/view/theme/duepuntozero/comment_item.tpl +++ b/view/theme/duepuntozero/comment_item.tpl @@ -1,5 +1,6 @@
- + $comment + From eaf0d04bfb4aaa37c12181ee0ca0f9661905d4b4 Mon Sep 17 00:00:00 2001 From: Domovoy Date: Fri, 27 Jul 2012 22:58:51 +0200 Subject: [PATCH 013/156] Comment box is now inside the item. Makes it easier to know what we are commenting on. --- view/theme/darkzero/style.css | 2 +- view/wall_thread.tpl | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/view/theme/darkzero/style.css b/view/theme/darkzero/style.css index 55644e462d..5cd7eed659 100644 --- a/view/theme/darkzero/style.css +++ b/view/theme/darkzero/style.css @@ -28,7 +28,7 @@ background: #444; } .wall-item-tools { background-color: #444444; background-image: none;} -.comment-wwedit-wrapper{ background-color: #333333; } +.comment-wwedit-wrapper{ background-color: #444444; } .comment-edit-preview{ color: #000000; } .wall-item-content-wrapper.comment { background-color: #444444; border: 0px;} .photo-top-album-name{ background-color: #333333; } diff --git a/view/wall_thread.tpl b/view/wall_thread.tpl index 56e21bb828..aac5dbe2b2 100644 --- a/view/wall_thread.tpl +++ b/view/wall_thread.tpl @@ -76,13 +76,13 @@ {{ if $item.drop.dropping }}{{ endif }}
+
+ $item.comment +
$item.dislike
-
- $item.comment -
{{ for $item.children as $item }} From 3f39e29e6e74ddbd74a3e415d83b6fce0fa0428e Mon Sep 17 00:00:00 2001 From: Thomas Willingham Date: Sat, 28 Jul 2012 01:16:09 +0100 Subject: [PATCH 014/156] Friendicaland got bigger. --- js/country.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/country.js b/js/country.js index cc7697a1f5..bbe9c7a183 100644 --- a/js/country.js +++ b/js/country.js @@ -275,7 +275,7 @@ aStates[249]="|'Adan|'Ataq|Abyan|Al Bayda'|Al Hudaydah|Al Jawf|Al Mahrah|Al Mahw aStates[250]="|Kosovo|Montenegro|Serbia|Vojvodina"; aStates[251]="|Central|Copperbelt|Eastern|Luapula|Lusaka|North-Western|Northern|Southern|Western"; aStates[252]="|Bulawayo|Harare|ManicalandMashonaland Central|Mashonaland East|Mashonaland West|Masvingo|Matabeleland North|Matabeleland South|Midlands"; -aStates[253]="|Self Hosted|Private Server|Architects Of Sleep|DFRN|Distributed Friend Network|Free-Beer.ch|Foojbook|Free-Haven|Friendica.eu|Friendika.me.4.it|Friendika - I Ask Questions|Frndc.com|Hikado|Hipatia|Hungerfreunde|Kaluguran Community|Kak Ste?|Karl.Markx.pm|Loozah Social Club|MyFriendica.net|MyFriendNetwork|Oi!|OpenMindSpace|Recolutionari.es|SPRACI|Sysfu Social Club|theshi.re|Tumpambae|Uzmiac|Other"; +aStates[253]="|Self Hosted|Private Server|Architects Of Sleep|DFRN|Distributed Friend Network|Free-Beer.ch|Foojbook|Free-Haven|Friendica.eu|Friendika.me.4.it|Friendika - I Ask Questions|Frndc.com|Hikado|Hipatia|Hungerfreunde|Kaluguran Community|Kak Ste|Karl.Markx.pm|Loozah Social Club|MyFriendica.net|MyFriendNetwork|Oi!|OpenMindSpace|Optimistisch|Recolutionari.es|Sparkling Network|SPRACI|Styliztique|Sysfu Social Club|Trevena|theshi.re|Tumpambae|Uzmiac|Other"; /* * gArCountryInfo * (0) Country name From 50e20a14945778c4816b0a3e7a44e22deb074b37 Mon Sep 17 00:00:00 2001 From: friendica Date: Fri, 27 Jul 2012 17:52:43 -0700 Subject: [PATCH 015/156] rev update --- boot.php | 2 +- util/messages.po | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/boot.php b/boot.php index 0de2b0afcf..39c5a0992b 100644 --- a/boot.php +++ b/boot.php @@ -11,7 +11,7 @@ require_once('include/cache.php'); require_once('library/Mobile_Detect/Mobile_Detect.php'); define ( 'FRIENDICA_PLATFORM', 'Friendica'); -define ( 'FRIENDICA_VERSION', '3.0.1415' ); +define ( 'FRIENDICA_VERSION', '3.0.1417' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DB_UPDATE_VERSION', 1154 ); diff --git a/util/messages.po b/util/messages.po index 87fc198c29..5d8dd2bc9f 100644 --- a/util/messages.po +++ b/util/messages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 3.0.1415\n" +"Project-Id-Version: 3.0.1417\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-07-25 10:00-0700\n" +"POT-Creation-Date: 2012-07-27 10:00-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" From 1f09e7ad23f1f3982f44e9b2c9a1e6d08da7f825 Mon Sep 17 00:00:00 2001 From: Zach Prezkuta Date: Sat, 28 Jul 2012 09:57:16 -0600 Subject: [PATCH 016/156] Modify Javascript to improve page loading times 1. Add template category 'end' that places content right before final tag 2. Move most Javascript from tpl files into one cacheable file, theme.js 3. Load scripts at end of the HTML document instead of in the header 4. Minify several Javascript files Note that the second and third things were only done for Frost and Frost Mobile. Doing it for every theme means going through every .tpl for every theme and rearranging the Javascript, which is tedious. --- boot.php | 7 + include/conversation.php | 18 +- index.php | 6 + js/acl.min.js | 1 + js/ajaxupload.min.js | 6 + js/country.min.js | 11 + js/fk.autocomplete.min.js | 5 + js/jquery.htmlstream.min.js | 6 + js/main.min.js | 1 + js/webtoolkit.base64.min.js | 6 + library/jquery_ac/friendica.complete.min.js | 10 + mod/contacts.php | 30 +- mod/editpost.php | 10 +- mod/events.php | 3 + mod/message.php | 43 +- mod/photos.php | 46 +- mod/profile_photo.php | 1 + mod/profiles.php | 7 +- mod/settings.php | 33 +- mod/wallmessage.php | 59 +- view/admin_aside.tpl | 2 +- view/contact_end.tpl | 0 view/contacts-end.tpl | 0 view/contacts-head.tpl | 17 + view/cropend.tpl | 0 view/end.tpl | 0 view/event_end.tpl | 0 view/jot-end.tpl | 0 view/message-end.tpl | 0 view/message-head.tpl | 17 + view/msg-end.tpl | 0 view/photo_edit_head.tpl | 11 + view/photos_head.tpl | 26 + view/photos_upload.tpl | 4 +- view/profed_end.tpl | 0 view/profed_head.tpl | 2 + view/settings-end.tpl | 0 view/settings-head.tpl | 25 + view/settings_display_end.tpl | 0 view/theme/frost-mobile/TODO | 6 + view/theme/frost-mobile/acl_selector.tpl | 22 + view/theme/frost-mobile/admin_aside.tpl | 11 - view/theme/frost-mobile/admin_site.tpl | 37 +- view/theme/frost-mobile/comment_item.tpl | 4 +- view/theme/frost-mobile/contact_edit.tpl | 88 ++ view/theme/frost-mobile/contact_head.tpl | 30 - view/theme/frost-mobile/contacts-end.tpl | 4 + view/theme/frost-mobile/contacts-head.tpl | 5 + view/theme/frost-mobile/cropbody.tpl | 27 + view/theme/frost-mobile/cropend.tpl | 4 + view/theme/frost-mobile/crophead.tpl | 1 + view/theme/frost-mobile/default.php | 1 + view/theme/frost-mobile/end.tpl | 19 + view/theme/frost-mobile/event_end.tpl | 4 + view/theme/frost-mobile/event_head.tpl | 135 +-- view/theme/frost-mobile/field_checkbox.tpl | 6 + view/theme/frost-mobile/field_themeselect.tpl | 9 + view/theme/frost-mobile/head.tpl | 86 +- view/theme/frost-mobile/jot-end.tpl | 5 + view/theme/frost-mobile/jot-header.tpl | 219 +--- view/theme/frost-mobile/jot.tpl | 2 +- view/theme/frost-mobile/js/acl.js | 78 +- view/theme/frost-mobile/js/acl.min.js | 1 + .../frost-mobile/js/fk.autocomplete.min.js | 5 + view/theme/frost-mobile/js/main.js | 332 +++--- view/theme/frost-mobile/js/main.min.js | 1 + view/theme/frost-mobile/js/theme.js | 657 ++++++++++- view/theme/frost-mobile/js/theme.js.old | 121 -- view/theme/frost-mobile/js/theme.min.js | 1 + view/theme/frost-mobile/login.tpl | 2 +- view/theme/frost-mobile/message-end.tpl | 4 + view/theme/frost-mobile/message-head.tpl | 0 view/theme/frost-mobile/msg-header.tpl | 98 +- view/theme/frost-mobile/oembed_video.tpl | 4 + view/theme/frost-mobile/photo_edit_head.tpl | 7 + view/theme/frost-mobile/photos_head.tpl | 5 + view/theme/frost-mobile/photos_upload.tpl | 13 +- view/theme/frost-mobile/profed_end.tpl | 8 + view/theme/frost-mobile/profed_head.tpl | 37 +- view/theme/frost-mobile/profile_edit.tpl | 2 +- view/theme/frost-mobile/settings-head.tpl | 5 + .../frost-mobile/settings_display_end.tpl | 2 + view/theme/frost-mobile/style.css | 39 +- view/theme/frost-mobile/theme.php | 2 + view/theme/frost-mobile/wallmsg-end.tpl | 5 + view/theme/frost-mobile/wallmsg-header.tpl | 82 +- view/theme/frost/acl_selector.tpl | 22 + view/theme/frost/admin_aside.tpl | 11 - view/theme/frost/admin_site.tpl | 56 + view/theme/frost/comment_item.tpl | 4 +- view/theme/frost/contact_end.tpl | 6 + view/theme/frost/contact_head.tpl | 0 view/theme/frost/contacts-end.tpl | 4 + view/theme/frost/contacts-head.tpl | 5 + view/theme/frost/conversation.tpl | 4 +- view/theme/frost/cropbody.tpl | 27 + view/theme/frost/cropend.tpl | 4 + view/theme/frost/crophead.tpl | 1 + view/theme/frost/default.php | 1 + view/theme/frost/end.tpl | 19 + view/theme/frost/event_end.tpl | 7 + view/theme/frost/event_head.tpl | 6 + view/theme/frost/field_themeselect.tpl | 9 + view/theme/frost/head.tpl | 90 +- view/theme/frost/jot-end.tpl | 5 + view/theme/frost/jot-header.tpl | 324 +----- view/theme/frost/jot.tpl | 85 ++ view/theme/frost/js/acl.js | 258 +++++ view/theme/frost/js/acl.min.js | 1 + view/theme/frost/js/fk.autocomplete.js | 194 ++++ view/theme/frost/js/fk.autocomplete.min.js | 5 + view/theme/frost/js/main.js | 322 +++--- view/theme/frost/js/main.min.js | 1 + view/theme/frost/js/theme.js | 1014 +++++++++++++++-- view/theme/frost/js/theme.min.js | 1 + view/theme/frost/login.tpl | 2 +- view/theme/frost/message-end.tpl | 4 + view/theme/frost/message-head.tpl | 0 view/theme/frost/msg-end.tpl | 9 + view/theme/frost/msg-header.tpl | 9 + view/theme/frost/photo_edit_head.tpl | 7 + view/theme/frost/photos_head.tpl | 5 + view/theme/frost/photos_upload.tpl | 9 +- view/theme/frost/profed_end.tpl | 9 + view/theme/frost/profed_head.tpl | 5 + view/theme/frost/profile_edit.tpl | 2 +- view/theme/frost/settings-head.tpl | 5 + view/theme/frost/settings_display_end.tpl | 2 + view/theme/frost/theme.php | 3 +- view/theme/frost/wallmsg-end.tpl | 5 + view/theme/frost/wallmsg-header.tpl | 6 + view/wallmsg-end.tpl | 0 132 files changed, 3300 insertions(+), 1917 deletions(-) create mode 100644 js/acl.min.js create mode 100644 js/ajaxupload.min.js create mode 100644 js/country.min.js create mode 100644 js/fk.autocomplete.min.js create mode 100644 js/jquery.htmlstream.min.js create mode 100644 js/main.min.js create mode 100644 js/webtoolkit.base64.min.js create mode 100644 library/jquery_ac/friendica.complete.min.js create mode 100644 view/contact_end.tpl create mode 100644 view/contacts-end.tpl create mode 100644 view/contacts-head.tpl create mode 100644 view/cropend.tpl create mode 100644 view/end.tpl create mode 100644 view/event_end.tpl create mode 100644 view/jot-end.tpl create mode 100644 view/message-end.tpl create mode 100644 view/message-head.tpl create mode 100644 view/msg-end.tpl create mode 100644 view/photo_edit_head.tpl create mode 100644 view/photos_head.tpl create mode 100644 view/profed_end.tpl create mode 100644 view/settings-end.tpl create mode 100644 view/settings-head.tpl create mode 100644 view/settings_display_end.tpl create mode 100644 view/theme/frost-mobile/acl_selector.tpl create mode 100644 view/theme/frost-mobile/contact_edit.tpl create mode 100644 view/theme/frost-mobile/contacts-end.tpl create mode 100644 view/theme/frost-mobile/contacts-head.tpl create mode 100644 view/theme/frost-mobile/cropbody.tpl create mode 100644 view/theme/frost-mobile/cropend.tpl create mode 100644 view/theme/frost-mobile/crophead.tpl create mode 100644 view/theme/frost-mobile/end.tpl create mode 100644 view/theme/frost-mobile/event_end.tpl create mode 100644 view/theme/frost-mobile/field_checkbox.tpl create mode 100644 view/theme/frost-mobile/field_themeselect.tpl create mode 100644 view/theme/frost-mobile/jot-end.tpl create mode 100644 view/theme/frost-mobile/js/acl.min.js create mode 100644 view/theme/frost-mobile/js/fk.autocomplete.min.js create mode 100644 view/theme/frost-mobile/js/main.min.js delete mode 100644 view/theme/frost-mobile/js/theme.js.old create mode 100644 view/theme/frost-mobile/js/theme.min.js create mode 100644 view/theme/frost-mobile/message-end.tpl create mode 100644 view/theme/frost-mobile/message-head.tpl create mode 100755 view/theme/frost-mobile/oembed_video.tpl create mode 100644 view/theme/frost-mobile/photo_edit_head.tpl create mode 100644 view/theme/frost-mobile/photos_head.tpl create mode 100644 view/theme/frost-mobile/profed_end.tpl create mode 100644 view/theme/frost-mobile/settings-head.tpl create mode 100644 view/theme/frost-mobile/settings_display_end.tpl create mode 100644 view/theme/frost-mobile/wallmsg-end.tpl create mode 100644 view/theme/frost/acl_selector.tpl create mode 100644 view/theme/frost/admin_site.tpl create mode 100644 view/theme/frost/contact_end.tpl create mode 100644 view/theme/frost/contact_head.tpl create mode 100644 view/theme/frost/contacts-end.tpl create mode 100644 view/theme/frost/contacts-head.tpl create mode 100644 view/theme/frost/cropbody.tpl create mode 100644 view/theme/frost/cropend.tpl create mode 100644 view/theme/frost/crophead.tpl create mode 100644 view/theme/frost/end.tpl create mode 100644 view/theme/frost/event_end.tpl create mode 100644 view/theme/frost/event_head.tpl create mode 100644 view/theme/frost/field_themeselect.tpl create mode 100644 view/theme/frost/jot-end.tpl create mode 100644 view/theme/frost/jot.tpl create mode 100644 view/theme/frost/js/acl.js create mode 100644 view/theme/frost/js/acl.min.js create mode 100644 view/theme/frost/js/fk.autocomplete.js create mode 100644 view/theme/frost/js/fk.autocomplete.min.js create mode 100644 view/theme/frost/js/main.min.js create mode 100644 view/theme/frost/js/theme.min.js create mode 100644 view/theme/frost/message-end.tpl create mode 100644 view/theme/frost/message-head.tpl create mode 100644 view/theme/frost/msg-end.tpl create mode 100644 view/theme/frost/msg-header.tpl create mode 100644 view/theme/frost/photo_edit_head.tpl create mode 100644 view/theme/frost/photos_head.tpl create mode 100644 view/theme/frost/profed_end.tpl create mode 100644 view/theme/frost/profed_head.tpl create mode 100644 view/theme/frost/settings-head.tpl create mode 100644 view/theme/frost/settings_display_end.tpl create mode 100644 view/theme/frost/wallmsg-end.tpl create mode 100644 view/theme/frost/wallmsg-header.tpl create mode 100644 view/wallmsg-end.tpl diff --git a/boot.php b/boot.php index 0de2b0afcf..34cc4093a8 100644 --- a/boot.php +++ b/boot.php @@ -573,6 +573,13 @@ if(! class_exists('App')) { )); } + function init_page_end() { + $tpl = get_markup_template('end.tpl'); + $this->page['end'] = replace_macros($tpl,array( + '$baseurl' => $this->get_baseurl() // FIXME for z_path!!!! + )); + } + function set_curl_code($code) { $this->curl_code = $code; } diff --git a/include/conversation.php b/include/conversation.php index 4a9142bb20..6a2b2ae633 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -1055,7 +1055,6 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) { $plaintext = true; $tpl = get_markup_template('jot-header.tpl'); - $a->page['htmlhead'] .= replace_macros($tpl, array( '$newpost' => 'true', '$baseurl' => $a->get_baseurl(true), @@ -1072,6 +1071,23 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) { )); + $tpl = get_markup_template('jot-end.tpl'); + $a->page['end'] .= replace_macros($tpl, array( + '$newpost' => 'true', + '$baseurl' => $a->get_baseurl(true), + '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'), + '$geotag' => $geotag, + '$nickname' => $x['nickname'], + '$ispublic' => t('Visible to everybody'), + '$linkurl' => t('Please enter a link URL:'), + '$vidurl' => t("Please enter a video link/URL:"), + '$audurl' => t("Please enter an audio link/URL:"), + '$term' => t('Tag term:'), + '$fileas' => t('Save to Folder:'), + '$whereareu' => t('Where are you right now?') + )); + + $tpl = get_markup_template("jot.tpl"); $jotplugins = ''; diff --git a/index.php b/index.php index 61f3562b58..c9b7f34d72 100644 --- a/index.php +++ b/index.php @@ -118,6 +118,12 @@ if(! x($_SESSION,'authenticated')) $a->init_pagehead(); +/** + * Build the page ending -- this is stuff that goes right before + * the closing tag + */ + +$a->init_page_end(); if(! x($_SESSION,'sysmsg')) diff --git a/js/acl.min.js b/js/acl.min.js new file mode 100644 index 0000000000..74904a02c0 --- /dev/null +++ b/js/acl.min.js @@ -0,0 +1 @@ +function ACL(e,t){that=this,that.url=e,that.kp_timer=null,t==undefined&&(t=[]),that.allow_cid=t[0]||[],that.allow_gid=t[1]||[],that.deny_cid=t[2]||[],that.deny_gid=t[3]||[],that.group_uids=[],that.nw=4,that.list_content=$("#acl-list-content"),that.item_tpl=unescape($(".acl-list-item[rel=acl-template]").html()),that.showall=$("#acl-showall"),t.length==0&&that.showall.addClass("selected"),that.showall.click(that.on_showall),$(".acl-button-show").live("click",that.on_button_show),$(".acl-button-hide").live("click",that.on_button_hide),$("#acl-search").keypress(that.on_search),$("#acl-wrapper").parents("form").submit(that.on_submit),that.get(0,100)}ACL.prototype.on_submit=function(){aclfileds=$("#acl-fields").html(""),$(that.allow_gid).each(function(e,t){aclfileds.append("")}),$(that.allow_cid).each(function(e,t){aclfileds.append("")}),$(that.deny_gid).each(function(e,t){aclfileds.append("")}),$(that.deny_cid).each(function(e,t){aclfileds.append("")})},ACL.prototype.search=function(){var e=$("#acl-search").val();that.list_content.html(""),that.get(0,100,e)},ACL.prototype.on_search=function(e){that.kp_timer&&clearTimeout(that.kp_timer),that.kp_timer=setTimeout(that.search,1e3)},ACL.prototype.on_showall=function(e){return e.preventDefault(),e.stopPropagation(),that.showall.hasClass("selected")?!1:(that.showall.addClass("selected"),that.allow_cid=[],that.allow_gid=[],that.deny_cid=[],that.deny_gid=[],that.update_view(),!1)},ACL.prototype.on_button_show=function(e){return e.preventDefault(),e.stopImmediatePropagation(),e.stopPropagation(),that.set_allow($(this).parent().attr("id")),!1},ACL.prototype.on_button_hide=function(e){return e.preventDefault(),e.stopImmediatePropagation(),e.stopPropagation(),that.set_deny($(this).parent().attr("id")),!1},ACL.prototype.set_allow=function(e){type=e[0],id=parseInt(e.substr(1));switch(type){case"g":that.allow_gid.indexOf(id)<0?that.allow_gid.push(id):that.allow_gid.remove(id),that.deny_gid.indexOf(id)>=0&&that.deny_gid.remove(id);break;case"c":that.allow_cid.indexOf(id)<0?that.allow_cid.push(id):that.allow_cid.remove(id),that.deny_cid.indexOf(id)>=0&&that.deny_cid.remove(id)}that.update_view()},ACL.prototype.set_deny=function(e){type=e[0],id=parseInt(e.substr(1));switch(type){case"g":that.deny_gid.indexOf(id)<0?that.deny_gid.push(id):that.deny_gid.remove(id),that.allow_gid.indexOf(id)>=0&&that.allow_gid.remove(id);break;case"c":that.deny_cid.indexOf(id)<0?that.deny_cid.push(id):that.deny_cid.remove(id),that.allow_cid.indexOf(id)>=0&&that.allow_cid.remove(id)}that.update_view()},ACL.prototype.update_view=function(){that.allow_gid.length==0&&that.allow_cid.length==0&&that.deny_gid.length==0&&that.deny_cid.length==0?(that.showall.addClass("selected"),$("#jot-perms-icon").removeClass("lock").addClass("unlock"),$("#jot-public").show(),$(".profile-jot-net input").attr("disabled",!1),typeof editor!="undefined"&&editor!=0&&$("#profile-jot-desc").html(ispublic)):(that.showall.removeClass("selected"),$("#jot-perms-icon").removeClass("unlock").addClass("lock"),$("#jot-public").hide(),$(".profile-jot-net input").attr("disabled","disabled"),$("#profile-jot-desc").html(" ")),$("#acl-list-content .acl-list-item").each(function(){$(this).removeClass("groupshow grouphide")}),$("#acl-list-content .acl-list-item").each(function(){itemid=$(this).attr("id"),type=itemid[0],id=parseInt(itemid.substr(1)),btshow=$(this).children(".acl-button-show").removeClass("selected"),bthide=$(this).children(".acl-button-hide").removeClass("selected");switch(type){case"g":var e="";that.allow_gid.indexOf(id)>=0&&(btshow.addClass("selected"),bthide.removeClass("selected"),e="groupshow"),that.deny_gid.indexOf(id)>=0&&(btshow.removeClass("selected"),bthide.addClass("selected"),e="grouphide"),$(that.group_uids[id]).each(function(t,n){e=="grouphide"&&$("#c"+n).removeClass("groupshow");if(e!=""){var r=$("#c"+n).attr("class");if(r==undefined)return!0;var i=r.indexOf("grouphide");i==-1&&$("#c"+n).addClass(e)}});break;case"c":that.allow_cid.indexOf(id)>=0&&(btshow.addClass("selected"),bthide.removeClass("selected")),that.deny_cid.indexOf(id)>=0&&(btshow.removeClass("selected"),bthide.addClass("selected"))}})},ACL.prototype.get=function(e,t,n){var r={start:e,count:t,search:n};$.ajax({type:"POST",url:that.url,data:r,dataType:"json",success:that.populate})},ACL.prototype.populate=function(e){var t=Math.ceil(e.tot/that.nw)*42;that.list_content.height(t),$(e.items).each(function(){html="
"+that.item_tpl+"
",html=html.format(this.photo,this.name,this.type,this.id,"",this.network,this.link),this.uids!=undefined&&(that.group_uids[this.id]=this.uids),that.list_content.append(html)}),that.update_view()}; \ No newline at end of file diff --git a/js/ajaxupload.min.js b/js/ajaxupload.min.js new file mode 100644 index 0000000000..246f2bdb2c --- /dev/null +++ b/js/ajaxupload.min.js @@ -0,0 +1,6 @@ +/** + * AJAX Upload ( http://valums.com/ajax-upload/ ) + * Copyright (c) Andris Valums + * Licensed under the MIT license ( http://valums.com/mit-license/ ) + * Thanks to Gary Haran, David Mark, Corey Burns and others for contributions. + */(function(){function log(){typeof console!="undefined"&&typeof console.log=="function"&&(Array.prototype.unshift.call(arguments,"[Ajax Upload]"),console.log(Array.prototype.join.call(arguments," ")))}function addEvent(e,t,n){if(e.addEventListener)e.addEventListener(t,n,!1);else{if(!e.attachEvent)throw new Error("not supported or DOM not loaded");e.attachEvent("on"+t,function(){n.call(e)})}}function addResizeEvent(e){var t;addEvent(window,"resize",function(){t&&clearTimeout(t),t=setTimeout(e,100)})}function getBox(e){var t,n,r,i,s=getOffset(e);return t=s.left,r=s.top,n=t+e.offsetWidth,i=r+e.offsetHeight,{left:t,right:n,top:r,bottom:i}}function addStyles(e,t){for(var n in t)t.hasOwnProperty(n)&&(e.style[n]=t[n])}function copyLayout(e,t){var n=getBox(e);addStyles(t,{position:"absolute",left:n.left+"px",top:n.top+"px",width:e.offsetWidth+"px",height:e.offsetHeight+"px"}),t.title=e.title}function fileFromPath(e){return e.replace(/.*(\/|\\)/,"")}function getExt(e){return-1!==e.indexOf(".")?e.replace(/.*[.]/,""):""}function hasClass(e,t){var n=new RegExp("\\b"+t+"\\b");return n.test(e.className)}function addClass(e,t){hasClass(e,t)||(e.className+=" "+t)}function removeClass(e,t){var n=new RegExp("\\b"+t+"\\b");e.className=e.className.replace(n,"")}function removeNode(e){e.parentNode.removeChild(e)}if(document.documentElement.getBoundingClientRect)var getOffset=function(e){var t=e.getBoundingClientRect(),n=e.ownerDocument,r=n.body,i=n.documentElement,s=i.clientTop||r.clientTop||0,o=i.clientLeft||r.clientLeft||0,u=1;if(r.getBoundingClientRect){var a=r.getBoundingClientRect();u=(a.right-a.left)/r.clientWidth}u>1&&(s=0,o=0);var f=t.top/u+(window.pageYOffset||i&&i.scrollTop/u||r.scrollTop/u)-s,l=t.left/u+(window.pageXOffset||i&&i.scrollLeft/u||r.scrollLeft/u)-o;return{top:f,left:l}};else var getOffset=function(e){var t=0,n=0;do t+=e.offsetTop||0,n+=e.offsetLeft||0,e=e.offsetParent;while(e);return{left:n,top:t}};var toElement=function(){var e=document.createElement("div");return function(t){e.innerHTML=t;var n=e.firstChild;return e.removeChild(n)}}(),getUID=function(){var e=0;return function(){return"ValumsAjaxUpload"+e++}}();window.AjaxUpload=function(e,t){this._settings={action:"upload.php",name:"userfile",data:{},autoSubmit:!0,responseType:!1,hoverClass:"hover",focusClass:"focus",disabledClass:"disabled",onChange:function(e,t){},onSubmit:function(e,t){},onComplete:function(e,t){}};for(var n in t)t.hasOwnProperty(n)&&(this._settings[n]=t[n]);e.jquery?e=e[0]:typeof e=="string"&&(/^#.*/.test(e)&&(e=e.slice(1)),e=document.getElementById(e));if(!e||e.nodeType!==1)throw new Error("Please make sure that you're passing a valid element");e.nodeName.toUpperCase()=="A"&&addEvent(e,"click",function(e){e&&e.preventDefault?e.preventDefault():window.event&&(window.event.returnValue=!1)}),this._button=e,this._input=null,this._disabled=!1,this.enable(),this._rerouteClicks()},AjaxUpload.prototype={setData:function(e){this._settings.data=e},disable:function(){addClass(this._button,this._settings.disabledClass),this._disabled=!0;var e=this._button.nodeName.toUpperCase();(e=="INPUT"||e=="BUTTON")&&this._button.setAttribute("disabled","disabled"),this._input&&(this._input.parentNode.style.visibility="hidden")},enable:function(){removeClass(this._button,this._settings.disabledClass),this._button.removeAttribute("disabled"),this._disabled=!1},_createInput:function(){var e=this,t=document.createElement("input");t.setAttribute("type","file"),t.setAttribute("name",this._settings.name),addStyles(t,{position:"absolute",right:0,margin:0,padding:0,fontSize:"480px",fontFamily:"sans-serif",cursor:"pointer"});var n=document.createElement("div");addStyles(n,{display:"block",position:"absolute",overflow:"hidden",margin:0,padding:0,opacity:0,direction:"ltr",zIndex:2147483583,cursor:"pointer"});if(n.style.opacity!=="0"){if(typeof n.filters=="undefined")throw new Error("Opacity not supported by the browser");n.style.filter="alpha(opacity=0)"}addEvent(t,"change",function(){if(!t||t.value==="")return;var n=fileFromPath(t.value);if(!1===e._settings.onChange.call(e,n,getExt(n))){e._clearInput();return}e._settings.autoSubmit&&e.submit()}),addEvent(t,"mouseover",function(){addClass(e._button,e._settings.hoverClass)}),addEvent(t,"mouseout",function(){removeClass(e._button,e._settings.hoverClass),removeClass(e._button,e._settings.focusClass),t.parentNode.style.visibility="hidden"}),addEvent(t,"focus",function(){addClass(e._button,e._settings.focusClass)}),addEvent(t,"blur",function(){removeClass(e._button,e._settings.focusClass)}),n.appendChild(t),document.body.appendChild(n),this._input=t},_clearInput:function(){if(!this._input)return;removeNode(this._input.parentNode),this._input=null,this._createInput(),removeClass(this._button,this._settings.hoverClass),removeClass(this._button,this._settings.focusClass)},_rerouteClicks:function(){var e=this;addEvent(e._button,"mouseover",function(){if(e._disabled)return;e._input||e._createInput();var t=e._input.parentNode;copyLayout(e._button,t),t.style.visibility="visible"})},_createIframe:function(){var e=getUID(),t=toElement('', $Text); + $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '', $Text); else $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '$1', $Text); @@ -355,7 +355,7 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) { $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text); if ($tryoembed) - $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '', $Text); + $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '', $Text); else $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", "http://www.youtube.com/watch?v=$1", $Text); @@ -369,7 +369,7 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) { $Text = preg_replace("/\[vimeo\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text); if ($tryoembed) - $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '', $Text); + $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '', $Text); else $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", "http://vimeo.com/$1", $Text); diff --git a/include/oembed.php b/include/oembed.php index a4452586ee..6fc4c53717 100755 --- a/include/oembed.php +++ b/include/oembed.php @@ -12,7 +12,9 @@ function oembed_replacecb($matches){ function oembed_fetch_url($embedurl){ - $txt = Cache::get($embedurl); + $a = get_app(); + + $txt = Cache::get($a->videowidth . $embedurl); // These media files should now be caught in bbcode.php // left here as a fallback in case this is called from another source @@ -38,7 +40,7 @@ function oembed_fetch_url($embedurl){ $entries = $xpath->query("//link[@type='application/json+oembed']"); foreach($entries as $e){ $href = $e->getAttributeNode("href")->nodeValue; - $txt = fetch_url($href . '&maxwidth=425'); + $txt = fetch_url($href . '&maxwidth=' . $a->videowidth); break; } } @@ -47,7 +49,7 @@ function oembed_fetch_url($embedurl){ if ($txt==false || $txt==""){ // try oohembed service - $ourl = "http://oohembed.com/oohembed/?url=".urlencode($embedurl).'&maxwidth=425'; + $ourl = "http://oohembed.com/oohembed/?url=".urlencode($embedurl).'&maxwidth=' . $a->videowidth; $txt = fetch_url($ourl); } @@ -55,7 +57,7 @@ function oembed_fetch_url($embedurl){ if ($txt[0]!="{") $txt='{"type":"error"}'; //save in cache - Cache::set($embedurl,$txt); + Cache::set($a->videowidth . $embedurl,$txt); } diff --git a/view/theme/frost-mobile/profile_photo.tpl b/view/theme/frost-mobile/profile_photo.tpl new file mode 100644 index 0000000000..42fc139f8f --- /dev/null +++ b/view/theme/frost-mobile/profile_photo.tpl @@ -0,0 +1,19 @@ +

$title

+ + + + +
+ + +
+ +
+ +
+ + + + diff --git a/view/theme/frost-mobile/theme.php b/view/theme/frost-mobile/theme.php index 314361b9c9..96d40958ef 100644 --- a/view/theme/frost-mobile/theme.php +++ b/view/theme/frost-mobile/theme.php @@ -4,7 +4,7 @@ * Name: Frost--mobile version * Description: Like frosted glass * Credits: Navigation icons taken from http://iconza.com. Other icons taken from http://thenounproject.com, including: Like, Dislike, Black Lock, Unlock, Pencil, Tag, Camera, Paperclip (Marie Coons), Folder (Sergio Calcara), Chain-link (Andrew Fortnum), Speaker (Harold Kim), Quotes (Henry Ryder), Video Camera (Anas Ramadan), and Left Arrow, Right Arrow, and Delete X (all three P.J. Onori). All under Attribution (CC BY 3.0). Others from The Noun Project are public domain or No Rights Reserved (CC0). - * Version: Version 0.2.3 + * Version: Version 0.2.4 * Author: Zach P * Maintainer: Zach P */ @@ -24,5 +24,7 @@ function frost_mobile_init(&$a) { $a->sourcename = 'Friendica mobile web'; + $a->videowidth = 250; + $a->videoheight = 200; } diff --git a/view/theme/frost-mobile/wallwall_item.tpl b/view/theme/frost-mobile/wallwall_item.tpl index 113987246c..e4d6b60bb4 100644 --- a/view/theme/frost-mobile/wallwall_item.tpl +++ b/view/theme/frost-mobile/wallwall_item.tpl @@ -18,12 +18,12 @@
    $item.item_photo_menu
- + -->
- {{ if $item.lock }}
$item.lock
+ {{ if $item.lock }}$item.lock {{ else }}
{{ endif }}
$item.location
From 7ceb21385935b777f2aa74e0aab42f0eb981736d Mon Sep 17 00:00:00 2001 From: Simon L'nu Date: Mon, 6 Aug 2012 17:05:25 -0400 Subject: [PATCH 075/156] add a 'manage' icon to clarify things Signed-off-by: Simon L'nu --- view/theme/dispy/dark/icons.png | Bin 28696 -> 20161 bytes view/theme/dispy/dark/icons.svg | 130 +++++++++++++++++++++++++++--- view/theme/dispy/dark/style.css | 2 +- view/theme/dispy/dark/style.less | 4 +- view/theme/dispy/light/icons.png | Bin 19715 -> 19765 bytes view/theme/dispy/light/icons.svg | 126 ++++++++++++++++++++++++++--- view/theme/dispy/light/style.css | 2 +- view/theme/dispy/light/style.less | 4 +- 8 files changed, 242 insertions(+), 26 deletions(-) diff --git a/view/theme/dispy/dark/icons.png b/view/theme/dispy/dark/icons.png index 67c8f3f0b4fb8bb919b0aef064f3d1b9102ad6f5..aaf97473b41b8c6f8a0a02d620bc42cb509dbd42 100644 GIT binary patch literal 20161 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%0ATv!>ZmV)9=3!Re(45~`pvhsE) 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 YG*>JiJBk$p?dC)rY@H9+TKlK|8(2`jZ2$lO literal 28696 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

a?KPRT)M0( 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�P-4z^)L#>=KVe!I;>y{LV- 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 F{{sj%0Hgo_ diff --git a/view/theme/dispy/dark/icons.svg b/view/theme/dispy/dark/icons.svg index 7cbbd3574e..90b83bf811 100644 --- a/view/theme/dispy/dark/icons.svg +++ b/view/theme/dispy/dark/icons.svg @@ -43,6 +43,58 @@ is_visible="true" teeth="10" phi="10" /> + + + + + + + + + + + + + + + fit-margin-bottom="0" + inkscape:showpageshadow="false" + showborder="true"> image/svg+xml - + @@ -117,7 +171,7 @@ id="layer1" transform="translate(0,-852.36218)"> + + + + + + + + + + diff --git a/view/theme/dispy/dark/style.css b/view/theme/dispy/dark/style.css index 95e2bb9983..ff30337a35 100644 --- a/view/theme/dispy/dark/style.css +++ b/view/theme/dispy/dark/style.css @@ -90,7 +90,7 @@ nav .nav-link{display:inline-block;width:22px;height:22px;overflow:hidden;margin #nav-home-link{background-position:-44px -132px;}#nav-home-link:hover{background-position:-66px -132px;} #nav-intro-link{background-position:0px -88px;}#nav-intro-link:hover{background-position:-22px -88px;} #nav-login-link,#nav-logout-link{background-position:0 -88px;}#nav-login-link:hover,#nav-logout-link:hover{background-position:-22px -88px;} -#nav-manage-link{background-position:0px -22px;}#nav-manage-link:hover{background-position:-22px -22px;} +#nav-manage-link{background-position:-88px -88px;}#nav-manage-link:hover{background-position:-110px -88px;} #nav-messages-link{background-position:-44px -88px;}#nav-messages-link:hover{background-position:-66px -88px;} #nav-notify-link,#nav-notifications-linkmenu{background-position:-44px -110px;} #nav-notify-link:hover{background-position:-66px -110px;} diff --git a/view/theme/dispy/dark/style.less b/view/theme/dispy/dark/style.less index f701c12253..d7becbedb8 100644 --- a/view/theme/dispy/dark/style.less +++ b/view/theme/dispy/dark/style.less @@ -542,9 +542,9 @@ nav .nav-link { } } #nav-manage-link { - background-position: 0px -22px; + background-position: -88px -88px; &:hover { - background-position: -22px -22px; + background-position: -110px -88px; } } #nav-messages-link { diff --git a/view/theme/dispy/light/icons.png b/view/theme/dispy/light/icons.png index 5c2eab36e4aa18d896cdd2cc7d8b4d5268f55806..1494c1b8b496400f3a7b766b2b88c9e6c8060c1a 100644 GIT binary patch literal 19765 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 literal 19715 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 + + + + + + + + + + + + + + image/svg+xml - + @@ -1482,7 +1534,7 @@ id="path4166" /> + + + + + + + + diff --git a/view/theme/dispy/light/style.css b/view/theme/dispy/light/style.css index 9a991b796e..03942c6cde 100644 --- a/view/theme/dispy/light/style.css +++ b/view/theme/dispy/light/style.css @@ -90,7 +90,7 @@ nav .nav-link{display:inline-block;width:22px;height:22px;overflow:hidden;margin #nav-home-link{background-position:-44px -132px;}#nav-home-link:hover{background-position:-66px -132px;} #nav-intro-link{background-position:0px -88px;}#nav-intro-link:hover{background-position:-22px -88px;} #nav-login-link,#nav-logout-link{background-position:0 -88px;}#nav-login-link:hover,#nav-logout-link:hover{background-position:-22px -88px;} -#nav-manage-link{background-position:0px -22px;}#nav-manage-link:hover{background-position:-22px -22px;} +#nav-manage-link{background-position:-88px -88px;}#nav-manage-link:hover{background-position:-110px -88px;} #nav-messages-link{background-position:-44px -88px;}#nav-messages-link:hover{background-position:-66px -88px;} #nav-notify-link,#nav-notifications-linkmenu{background-position:-44px -110px;} #nav-notify-link:hover{background-position:-66px -110px;} diff --git a/view/theme/dispy/light/style.less b/view/theme/dispy/light/style.less index 87b405470c..3db91a8507 100644 --- a/view/theme/dispy/light/style.less +++ b/view/theme/dispy/light/style.less @@ -543,9 +543,9 @@ nav .nav-link { } } #nav-manage-link { - background-position: 0px -22px; + background-position: -88px -88px; &:hover { - background-position: -22px -22px; + background-position: -110px -88px; } } #nav-messages-link { From 558fbcc69e65eeda548e5f6379a15ea0121c911f Mon Sep 17 00:00:00 2001 From: friendica Date: Mon, 6 Aug 2012 19:50:57 -0700 Subject: [PATCH 076/156] rev update + don't tag anything in [] brackets --- boot.php | 2 +- include/text.php | 4 ++ util/messages.po | 108 +++++++++++++++++++++++------------------------ 3 files changed, 59 insertions(+), 55 deletions(-) diff --git a/boot.php b/boot.php index 6a350c5f4d..ea9ef91443 100644 --- a/boot.php +++ b/boot.php @@ -11,7 +11,7 @@ require_once('include/cache.php'); require_once('library/Mobile_Detect/Mobile_Detect.php'); define ( 'FRIENDICA_PLATFORM', 'Friendica'); -define ( 'FRIENDICA_VERSION', '3.0.1426' ); +define ( 'FRIENDICA_VERSION', '3.0.1427' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DB_UPDATE_VERSION', 1154 ); diff --git a/include/text.php b/include/text.php index 1c50086aac..356c2fab4c 100644 --- a/include/text.php +++ b/include/text.php @@ -504,6 +504,10 @@ function get_tags($s) { $s = preg_replace('/\[code\](.*?)\[\/code\]/sm','',$s); + // ignore anything in a bbtag + + $s = preg_replace('/\[(.*?)\]/sm','',$s); + // Match full names against @tags including the space between first and last // We will look these up afterward to see if they are full names or not recognisable. diff --git a/util/messages.po b/util/messages.po index 5f6dfcbd9e..ec0b11cf50 100644 --- a/util/messages.po +++ b/util/messages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 3.0.1426\n" +"Project-Id-Version: 3.0.1427\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-05 10:00-0700\n" +"POT-Creation-Date: 2012-08-06 10:00-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -227,7 +227,7 @@ msgstr "" msgid "Edit event" msgstr "" -#: ../../mod/events.php:307 ../../include/text.php:1110 +#: ../../mod/events.php:307 ../../include/text.php:1114 msgid "link to source" msgstr "" @@ -423,7 +423,7 @@ msgstr "" #: ../../mod/photos.php:572 ../../mod/like.php:145 ../../mod/tagger.php:70 #: ../../addon/communityhome/communityhome.php:163 -#: ../../view/theme/diabook/theme.php:570 ../../include/text.php:1362 +#: ../../view/theme/diabook/theme.php:570 ../../include/text.php:1366 #: ../../include/diaspora.php:1793 ../../include/conversation.php:114 #: ../../include/conversation.php:230 msgid "photo" @@ -2600,7 +2600,7 @@ msgstr "" #: ../../addon/facebook/facebook.php:770 #: ../../addon/privacy_image_cache/privacy_image_cache.php:263 #: ../../addon/dav/layout.fnk.php:441 ../../addon/dav/layout.fnk.php:488 -#: ../../include/text.php:677 +#: ../../include/text.php:681 msgid "Save" msgstr "" @@ -2861,7 +2861,7 @@ msgstr "" msgid "No contacts." msgstr "" -#: ../../mod/viewcontacts.php:76 ../../include/text.php:614 +#: ../../mod/viewcontacts.php:76 ../../include/text.php:618 msgid "View Contacts" msgstr "" @@ -3906,8 +3906,8 @@ msgstr "" msgid "No installed applications." msgstr "" -#: ../../mod/search.php:83 ../../include/text.php:674 -#: ../../include/text.php:675 ../../include/nav.php:91 +#: ../../mod/search.php:83 ../../include/text.php:678 +#: ../../include/text.php:679 ../../include/nav.php:91 msgid "Search" msgstr "" @@ -5139,7 +5139,7 @@ msgid "Latest likes" msgstr "" #: ../../addon/communityhome/communityhome.php:155 -#: ../../view/theme/diabook/theme.php:562 ../../include/text.php:1360 +#: ../../view/theme/diabook/theme.php:562 ../../include/text.php:1364 #: ../../include/conversation.php:106 ../../include/conversation.php:222 msgid "event" msgstr "" @@ -5260,38 +5260,38 @@ msgstr "" #: ../../addon/dav/common/wdcal_edit.inc.php:254 #: ../../addon/dav/common/wdcal_edit.inc.php:270 #: ../../addon/dav/common/wdcal_edit.inc.php:293 -#: ../../addon/dav/common/wdcal_edit.inc.php:305 ../../include/text.php:880 +#: ../../addon/dav/common/wdcal_edit.inc.php:305 ../../include/text.php:884 msgid "Sunday" msgstr "" #: ../../addon/dav/common/wdcal_edit.inc.php:235 #: ../../addon/dav/common/wdcal_edit.inc.php:274 -#: ../../addon/dav/common/wdcal_edit.inc.php:308 ../../include/text.php:880 +#: ../../addon/dav/common/wdcal_edit.inc.php:308 ../../include/text.php:884 msgid "Monday" msgstr "" #: ../../addon/dav/common/wdcal_edit.inc.php:238 -#: ../../addon/dav/common/wdcal_edit.inc.php:277 ../../include/text.php:880 +#: ../../addon/dav/common/wdcal_edit.inc.php:277 ../../include/text.php:884 msgid "Tuesday" msgstr "" #: ../../addon/dav/common/wdcal_edit.inc.php:241 -#: ../../addon/dav/common/wdcal_edit.inc.php:280 ../../include/text.php:880 +#: ../../addon/dav/common/wdcal_edit.inc.php:280 ../../include/text.php:884 msgid "Wednesday" msgstr "" #: ../../addon/dav/common/wdcal_edit.inc.php:244 -#: ../../addon/dav/common/wdcal_edit.inc.php:283 ../../include/text.php:880 +#: ../../addon/dav/common/wdcal_edit.inc.php:283 ../../include/text.php:884 msgid "Thursday" msgstr "" #: ../../addon/dav/common/wdcal_edit.inc.php:247 -#: ../../addon/dav/common/wdcal_edit.inc.php:286 ../../include/text.php:880 +#: ../../addon/dav/common/wdcal_edit.inc.php:286 ../../include/text.php:884 msgid "Friday" msgstr "" #: ../../addon/dav/common/wdcal_edit.inc.php:250 -#: ../../addon/dav/common/wdcal_edit.inc.php:289 ../../include/text.php:880 +#: ../../addon/dav/common/wdcal_edit.inc.php:289 ../../include/text.php:884 msgid "Saturday" msgstr "" @@ -7337,158 +7337,158 @@ msgstr "" msgid "older" msgstr "" -#: ../../include/text.php:593 +#: ../../include/text.php:597 msgid "No contacts" msgstr "" -#: ../../include/text.php:602 +#: ../../include/text.php:606 #, php-format msgid "%d Contact" msgid_plural "%d Contacts" msgstr[0] "" msgstr[1] "" -#: ../../include/text.php:715 +#: ../../include/text.php:719 msgid "poke" msgstr "" -#: ../../include/text.php:715 ../../include/conversation.php:201 +#: ../../include/text.php:719 ../../include/conversation.php:201 msgid "poked" msgstr "" -#: ../../include/text.php:716 +#: ../../include/text.php:720 msgid "ping" msgstr "" -#: ../../include/text.php:716 +#: ../../include/text.php:720 msgid "pinged" msgstr "" -#: ../../include/text.php:717 +#: ../../include/text.php:721 msgid "prod" msgstr "" -#: ../../include/text.php:717 +#: ../../include/text.php:721 msgid "prodded" msgstr "" -#: ../../include/text.php:718 +#: ../../include/text.php:722 msgid "slap" msgstr "" -#: ../../include/text.php:718 +#: ../../include/text.php:722 msgid "slapped" msgstr "" -#: ../../include/text.php:719 +#: ../../include/text.php:723 msgid "finger" msgstr "" -#: ../../include/text.php:719 +#: ../../include/text.php:723 msgid "fingered" msgstr "" -#: ../../include/text.php:720 +#: ../../include/text.php:724 msgid "rebuff" msgstr "" -#: ../../include/text.php:720 +#: ../../include/text.php:724 msgid "rebuffed" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "January" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "February" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "March" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "April" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "May" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "June" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "July" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "August" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "September" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "October" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "November" msgstr "" -#: ../../include/text.php:884 +#: ../../include/text.php:888 msgid "December" msgstr "" -#: ../../include/text.php:970 +#: ../../include/text.php:974 msgid "bytes" msgstr "" -#: ../../include/text.php:990 ../../include/text.php:1005 +#: ../../include/text.php:994 ../../include/text.php:1009 msgid "remove" msgstr "" -#: ../../include/text.php:990 ../../include/text.php:1005 +#: ../../include/text.php:994 ../../include/text.php:1009 msgid "[remove]" msgstr "" -#: ../../include/text.php:993 +#: ../../include/text.php:997 msgid "Categories:" msgstr "" -#: ../../include/text.php:1008 +#: ../../include/text.php:1012 msgid "Filed under:" msgstr "" -#: ../../include/text.php:1024 ../../include/text.php:1036 +#: ../../include/text.php:1028 ../../include/text.php:1040 msgid "Click to open/close" msgstr "" -#: ../../include/text.php:1142 ../../include/user.php:236 +#: ../../include/text.php:1146 ../../include/user.php:236 msgid "default" msgstr "" -#: ../../include/text.php:1154 +#: ../../include/text.php:1158 msgid "Select an alternate language" msgstr "" -#: ../../include/text.php:1364 +#: ../../include/text.php:1368 msgid "activity" msgstr "" -#: ../../include/text.php:1366 +#: ../../include/text.php:1370 msgid "comment" msgstr "" -#: ../../include/text.php:1367 +#: ../../include/text.php:1371 msgid "post" msgstr "" -#: ../../include/text.php:1522 +#: ../../include/text.php:1526 msgid "Item filed" msgstr "" From 4cc6bf660c04c4b361eee8db59e5beb83e6b1081 Mon Sep 17 00:00:00 2001 From: Domovoy Date: Tue, 7 Aug 2012 09:53:53 +0200 Subject: [PATCH 077/156] The number of comments shown when collapsed is the total of all the descendant items. --- include/conversation.php | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/include/conversation.php b/include/conversation.php index 706bcdde67..73c3337d52 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -299,6 +299,21 @@ function localize_item(&$item){ } +/** + * Count the total of comments on this item and its desendants + */ +function count_descendants($item) { + $total = count($item['children']); + + if($total > 0) { + foreach($item['children'] as $child) { + $total += count_descendants($child); + } + } + + return $total; +} + /** * Recursively prepare a thread for HTML */ @@ -311,6 +326,8 @@ function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $pr $items_seen = 0; $nb_items = count($items); + $total_children = $nb_items; + foreach($items as $item) { // prevent private email reply to public conversation from leaking. if($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) { @@ -338,6 +355,7 @@ function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $pr $osparkle = ''; $lastcollapsed = false; $firstcollapsed = false; + $total_children += count_descendants($item); $toplevelpost = (($item['id'] == $item['parent']) ? true : false); $item_writeable = (($item['writable'] || $item['self']) ? true : false); @@ -577,7 +595,7 @@ function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $pr $item_result = $arr['output']; if($firstcollapsed) { - $item_result['num_comments'] = sprintf( tt('%d comment','%d comments',$nb_items),$nb_items ); + $item_result['num_comments'] = sprintf( tt('%d comment','%d comments',$total_children),$total_children ); $item_result['hide_text'] = t('show more'); } From 4b514ea9893d9814cf8a000ef165d24a96fdaf7d Mon Sep 17 00:00:00 2001 From: Domovoy Date: Tue, 7 Aug 2012 10:04:47 +0200 Subject: [PATCH 078/156] Fallback so that we alway have a thr-parent --- mod/item.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mod/item.php b/mod/item.php index fe7513de00..c7b755eaed 100644 --- a/mod/item.php +++ b/mod/item.php @@ -545,6 +545,10 @@ function item_post(&$a) { $uri = item_new_uri($a->get_hostname(),$profile_uid); + // Fallback so that we alway have a thr-parent + if(!$thr_parent) + $thr_parent = $uri; + $datarray = array(); $datarray['uid'] = $profile_uid; $datarray['type'] = $post_type; From c0024daff7675361fa6d5afa34a78bee1373254a Mon Sep 17 00:00:00 2001 From: Domovoy Date: Tue, 7 Aug 2012 12:02:06 +0200 Subject: [PATCH 079/156] Added view/wallwall_thread.tpl --- view/wallwall_thread.tpl | 86 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 view/wallwall_thread.tpl diff --git a/view/wallwall_thread.tpl b/view/wallwall_thread.tpl new file mode 100644 index 0000000000..b7cca3fab9 --- /dev/null +++ b/view/wallwall_thread.tpl @@ -0,0 +1,86 @@ + +

+
+
+
+ + $item.owner_name +
+
$item.wall
+
+ + $item.name + menu +
+
    + $item.item_photo_menu +
+
+ +
+
+
+ {{ if $item.lock }}
$item.lock
+ {{ else }}
{{ endif }} +
$item.location
+
+
+
+ $item.name $item.to $item.owner_name $item.vwall
+
$item.ago
+
+
+
$item.title
+
+
$item.body +
+ {{ for $item.tags as $tag }} + $tag + {{ endfor }} +
+
+
+
+ {{ if $item.vote }} + + {{ endif }} + {{ if $item.plink }} + + {{ endif }} + {{ if $item.edpost }} + + {{ endif }} + + {{ if $item.star }} + + + {{ endif }} + {{ if $item.filer }} + + {{ endif }} + +
+ {{ if $item.drop.dropping }}{{ endif }} +
+ {{ if $item.drop.dropping }}{{ endif }} +
+
+
+
+ +
$item.dislike
+
+
+ $item.comment +
+ +
+
+ From 5ca71d04b2de63b969c6c367f2f05067b2c9dd46 Mon Sep 17 00:00:00 2001 From: Domovoy Date: Tue, 7 Aug 2012 12:08:36 +0200 Subject: [PATCH 080/156] Wall to wall items should now be threaded too. --- view/wallwall_thread.tpl | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/view/wallwall_thread.tpl b/view/wallwall_thread.tpl index b7cca3fab9..3986b065c1 100644 --- a/view/wallwall_thread.tpl +++ b/view/wallwall_thread.tpl @@ -1,3 +1,10 @@ +{{if $item.comment_firstcollapsed}} +
+ $item.num_comments $item.hide_text +
+ +{{ for $item.children as $item }} + {{ inc $item.template }}{{ endinc }} +{{ endfor }} +{{ if $item.flatten }} +
+ $item.comment +
+{{ endif }} + +{{if $item.comment_lastcollapsed}}{{endif}} From afaa5f20384cce82f58de47ae73245d36a87dd97 Mon Sep 17 00:00:00 2001 From: Domovoy Date: Tue, 7 Aug 2012 12:13:42 +0200 Subject: [PATCH 081/156] Removed useless comment box (from old non-threaded template, to comment box where displayed) --- view/wallwall_thread.tpl | 5 ----- 1 file changed, 5 deletions(-) diff --git a/view/wallwall_thread.tpl b/view/wallwall_thread.tpl index 3986b065c1..89f121f210 100644 --- a/view/wallwall_thread.tpl +++ b/view/wallwall_thread.tpl @@ -90,11 +90,6 @@
$item.dislike
-
-
- $item.comment -
-
{{ for $item.children as $item }} From 101df5145e4d95751e317e4d613d7108721ec687 Mon Sep 17 00:00:00 2001 From: friendica Date: Wed, 8 Aug 2012 17:06:54 -0700 Subject: [PATCH 082/156] rev update --- boot.php | 2 +- util/messages.po | 106 +++++++++++++++++++++++------------------------ 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/boot.php b/boot.php index 1f4a2a06b5..3df59f4c01 100644 --- a/boot.php +++ b/boot.php @@ -11,7 +11,7 @@ require_once('include/cache.php'); require_once('library/Mobile_Detect/Mobile_Detect.php'); define ( 'FRIENDICA_PLATFORM', 'Friendica'); -define ( 'FRIENDICA_VERSION', '3.0.1427' ); +define ( 'FRIENDICA_VERSION', '3.0.1429' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DB_UPDATE_VERSION', 1154 ); diff --git a/util/messages.po b/util/messages.po index ec0b11cf50..bfbe2ec39a 100644 --- a/util/messages.po +++ b/util/messages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 3.0.1427\n" +"Project-Id-Version: 3.0.1429\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-06 10:00-0700\n" +"POT-Creation-Date: 2012-08-08 10:00-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -232,7 +232,7 @@ msgid "link to source" msgstr "" #: ../../mod/events.php:331 ../../view/theme/diabook/theme.php:131 -#: ../../include/nav.php:52 ../../boot.php:1635 +#: ../../include/nav.php:52 ../../boot.php:1645 msgid "Events" msgstr "" @@ -288,7 +288,7 @@ msgstr "" #: ../../mod/events.php:432 ../../mod/directory.php:132 #: ../../include/event.php:40 ../../include/bb2diaspora.php:447 -#: ../../boot.php:1187 +#: ../../boot.php:1197 msgid "Location:" msgstr "" @@ -370,7 +370,7 @@ msgstr "" msgid "No" msgstr "" -#: ../../mod/photos.php:46 ../../boot.php:1628 +#: ../../mod/photos.php:46 ../../boot.php:1638 msgid "Photo Albums" msgstr "" @@ -594,7 +594,7 @@ msgstr "" #: ../../mod/photos.php:1324 ../../mod/photos.php:1365 #: ../../mod/photos.php:1397 ../../mod/content.php:690 -#: ../../include/conversation.php:695 ../../boot.php:570 +#: ../../include/conversation.php:695 ../../boot.php:580 msgid "Comment" msgstr "" @@ -1251,7 +1251,7 @@ msgid "is interested in:" msgstr "" #: ../../mod/match.php:58 ../../mod/suggest.php:59 -#: ../../include/contact_widgets.php:9 ../../boot.php:1131 +#: ../../include/contact_widgets.php:9 ../../boot.php:1141 msgid "Connect" msgstr "" @@ -1311,7 +1311,7 @@ msgstr[1] "" #: ../../mod/content.php:587 ../../addon/page/page.php:76 #: ../../addon/page/page.php:110 ../../addon/showmore/showmore.php:119 #: ../../include/contact_widgets.php:188 ../../include/conversation.php:592 -#: ../../boot.php:571 +#: ../../boot.php:581 msgid "show more" msgstr "" @@ -1914,7 +1914,7 @@ msgstr "" #: ../../addon/facebook/facebook.php:1200 #: ../../addon/public_server/public_server.php:62 #: ../../addon/testdrive/testdrive.php:67 ../../include/items.php:3214 -#: ../../boot.php:780 +#: ../../boot.php:790 msgid "Administrator" msgstr "" @@ -1924,7 +1924,7 @@ msgid "" "Password reset failed." msgstr "" -#: ../../mod/lostpass.php:83 ../../boot.php:913 +#: ../../mod/lostpass.php:83 ../../boot.php:923 msgid "Password Reset" msgstr "" @@ -2592,7 +2592,7 @@ msgstr "" msgid "Invalid contact." msgstr "" -#: ../../mod/notes.php:44 ../../boot.php:1642 +#: ../../mod/notes.php:44 ../../boot.php:1652 msgid "Personal Notes" msgstr "" @@ -2845,7 +2845,7 @@ msgstr "" #: ../../mod/profperm.php:103 ../../view/theme/diabook/theme.php:128 #: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:84 -#: ../../include/nav.php:50 ../../boot.php:1618 +#: ../../include/nav.php:50 ../../boot.php:1628 msgid "Profile" msgstr "" @@ -2949,7 +2949,7 @@ msgstr "" msgid "Choose a nickname: " msgstr "" -#: ../../mod/register.php:269 ../../include/nav.php:81 ../../boot.php:879 +#: ../../mod/register.php:269 ../../include/nav.php:81 ../../boot.php:889 msgid "Register" msgstr "" @@ -2992,7 +2992,7 @@ msgid "Access denied." msgstr "" #: ../../mod/fbrowser.php:25 ../../view/theme/diabook/theme.php:130 -#: ../../include/nav.php:51 ../../boot.php:1625 +#: ../../include/nav.php:51 ../../boot.php:1635 msgid "Photos" msgstr "" @@ -3803,7 +3803,7 @@ msgstr "" msgid "FTP Password" msgstr "" -#: ../../mod/profile.php:21 ../../boot.php:1044 +#: ../../mod/profile.php:21 ../../boot.php:1054 msgid "Requested profile is not available." msgstr "" @@ -4198,23 +4198,23 @@ msgstr "" msgid "Edit/Manage Profiles" msgstr "" -#: ../../mod/profiles.php:673 ../../boot.php:1153 +#: ../../mod/profiles.php:673 ../../boot.php:1163 msgid "Change profile photo" msgstr "" -#: ../../mod/profiles.php:674 ../../boot.php:1154 +#: ../../mod/profiles.php:674 ../../boot.php:1164 msgid "Create New Profile" msgstr "" -#: ../../mod/profiles.php:685 ../../boot.php:1164 +#: ../../mod/profiles.php:685 ../../boot.php:1174 msgid "Profile Image" msgstr "" -#: ../../mod/profiles.php:687 ../../boot.php:1167 +#: ../../mod/profiles.php:687 ../../boot.php:1177 msgid "visible to everybody" msgstr "" -#: ../../mod/profiles.php:688 ../../boot.php:1168 +#: ../../mod/profiles.php:688 ../../boot.php:1178 msgid "Edit visibility" msgstr "" @@ -4343,17 +4343,17 @@ msgid "Gender: " msgstr "" #: ../../mod/directory.php:134 ../../include/profile_advanced.php:17 -#: ../../boot.php:1189 +#: ../../boot.php:1199 msgid "Gender:" msgstr "" #: ../../mod/directory.php:136 ../../include/profile_advanced.php:37 -#: ../../boot.php:1192 +#: ../../boot.php:1202 msgid "Status:" msgstr "" #: ../../mod/directory.php:138 ../../include/profile_advanced.php:48 -#: ../../boot.php:1194 +#: ../../boot.php:1204 msgid "Homepage:" msgstr "" @@ -5111,7 +5111,7 @@ msgstr "" #: ../../addon/communityhome/communityhome.php:34 #: ../../addon/communityhome/twillingham/communityhome.php:28 #: ../../addon/communityhome/twillingham/communityhome.php:34 -#: ../../include/nav.php:64 ../../boot.php:900 +#: ../../include/nav.php:64 ../../boot.php:910 msgid "Login" msgstr "" @@ -7504,11 +7504,11 @@ msgstr "" msgid "view full size" msgstr "" -#: ../../include/oembed.php:135 +#: ../../include/oembed.php:137 msgid "Embedded content" msgstr "" -#: ../../include/oembed.php:144 +#: ../../include/oembed.php:146 msgid "Embedding disabled" msgstr "" @@ -7547,7 +7547,7 @@ msgstr "" msgid "Contacts not in any group" msgstr "" -#: ../../include/nav.php:46 ../../boot.php:899 +#: ../../include/nav.php:46 ../../boot.php:909 msgid "Logout" msgstr "" @@ -7555,7 +7555,7 @@ msgstr "" msgid "End this session" msgstr "" -#: ../../include/nav.php:49 ../../boot.php:1611 +#: ../../include/nav.php:49 ../../boot.php:1621 msgid "Status" msgstr "" @@ -7635,11 +7635,11 @@ msgstr "" msgid "Manage other pages" msgstr "" -#: ../../include/nav.php:138 ../../boot.php:1147 +#: ../../include/nav.php:138 ../../boot.php:1157 msgid "Profiles" msgstr "" -#: ../../include/nav.php:138 ../../boot.php:1147 +#: ../../include/nav.php:138 ../../boot.php:1157 msgid "Manage/edit profiles" msgstr "" @@ -8322,96 +8322,96 @@ msgstr "" msgid "This action is not available under your subscription plan." msgstr "" -#: ../../boot.php:569 +#: ../../boot.php:579 msgid "Delete this item?" msgstr "" -#: ../../boot.php:572 +#: ../../boot.php:582 msgid "show fewer" msgstr "" -#: ../../boot.php:775 +#: ../../boot.php:785 #, php-format msgid "Update %s failed. See error logs." msgstr "" -#: ../../boot.php:777 +#: ../../boot.php:787 #, php-format msgid "Update Error at %s" msgstr "" -#: ../../boot.php:878 +#: ../../boot.php:888 msgid "Create a New Account" msgstr "" -#: ../../boot.php:902 +#: ../../boot.php:912 msgid "Nickname or Email address: " msgstr "" -#: ../../boot.php:903 +#: ../../boot.php:913 msgid "Password: " msgstr "" -#: ../../boot.php:906 +#: ../../boot.php:916 msgid "Or login using OpenID: " msgstr "" -#: ../../boot.php:912 +#: ../../boot.php:922 msgid "Forgot your password?" msgstr "" -#: ../../boot.php:1079 +#: ../../boot.php:1089 msgid "Edit profile" msgstr "" -#: ../../boot.php:1139 +#: ../../boot.php:1149 msgid "Message" msgstr "" -#: ../../boot.php:1261 ../../boot.php:1347 +#: ../../boot.php:1271 ../../boot.php:1357 msgid "g A l F d" msgstr "" -#: ../../boot.php:1262 ../../boot.php:1348 +#: ../../boot.php:1272 ../../boot.php:1358 msgid "F d" msgstr "" -#: ../../boot.php:1307 ../../boot.php:1388 +#: ../../boot.php:1317 ../../boot.php:1398 msgid "[today]" msgstr "" -#: ../../boot.php:1319 +#: ../../boot.php:1329 msgid "Birthday Reminders" msgstr "" -#: ../../boot.php:1320 +#: ../../boot.php:1330 msgid "Birthdays this week:" msgstr "" -#: ../../boot.php:1381 +#: ../../boot.php:1391 msgid "[No description]" msgstr "" -#: ../../boot.php:1399 +#: ../../boot.php:1409 msgid "Event Reminders" msgstr "" -#: ../../boot.php:1400 +#: ../../boot.php:1410 msgid "Events this week:" msgstr "" -#: ../../boot.php:1614 +#: ../../boot.php:1624 msgid "Status Messages and Posts" msgstr "" -#: ../../boot.php:1621 +#: ../../boot.php:1631 msgid "Profile Details" msgstr "" -#: ../../boot.php:1638 +#: ../../boot.php:1648 msgid "Events and Calendar" msgstr "" -#: ../../boot.php:1645 +#: ../../boot.php:1655 msgid "Only You Can See This" msgstr "" From ba9c50c0dd458e748c22e541c270c28905295616 Mon Sep 17 00:00:00 2001 From: friendica Date: Thu, 9 Aug 2012 15:32:07 -0700 Subject: [PATCH 083/156] rev update --- boot.php | 2 +- util/messages.po | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/boot.php b/boot.php index 3df59f4c01..c50dbb582f 100644 --- a/boot.php +++ b/boot.php @@ -11,7 +11,7 @@ require_once('include/cache.php'); require_once('library/Mobile_Detect/Mobile_Detect.php'); define ( 'FRIENDICA_PLATFORM', 'Friendica'); -define ( 'FRIENDICA_VERSION', '3.0.1429' ); +define ( 'FRIENDICA_VERSION', '3.0.1430' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DB_UPDATE_VERSION', 1154 ); diff --git a/util/messages.po b/util/messages.po index bfbe2ec39a..c245fa152b 100644 --- a/util/messages.po +++ b/util/messages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 3.0.1429\n" +"Project-Id-Version: 3.0.1430\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-08 10:00-0700\n" +"POT-Creation-Date: 2012-08-09 10:00-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" From 4894619d7b18a5c92649c74a2eae3dbd93eb40c0 Mon Sep 17 00:00:00 2001 From: friendica Date: Thu, 9 Aug 2012 23:01:37 -0700 Subject: [PATCH 084/156] bring back "delete selected items" - but need to pass pagedropping to each item --- include/conversation.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/conversation.php b/include/conversation.php index 73c3337d52..3c4ff29082 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -676,6 +676,9 @@ function conversation(&$a, $items, $mode, $update, $preview = false) { $page_writeable = false; } + $page_dropping = ((local_user() && local_user() == $profile_owner) ? true : false); + + if($update) $return_url = $_SESSION['return_url']; else @@ -851,7 +854,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) { '$mode' => $mode, '$user' => $a->user, '$threads' => $threads, - '$dropping' => ($dropping?t('Delete Selected Items'):False), + '$dropping' => ($page_dropping?t('Delete Selected Items'):False), )); return $o; From 2b7d08508d63ad5fd7fa7d4f70e3ce67ba932404 Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Fri, 10 Aug 2012 04:25:08 -0400 Subject: [PATCH 085/156] head.tpl: commentOpen() and commentClose() return true/false usefull to concatenate other actions: "commentClose(this, $id) && cmtBbClose($id)" --- view/head.tpl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/view/head.tpl b/view/head.tpl index e5495b329f..42bd92f4ce 100644 --- a/view/head.tpl +++ b/view/head.tpl @@ -39,7 +39,9 @@ $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty"); $("#mod-cmnt-wrap-" + id).show(); openMenu("comment-edit-submit-wrapper-" + id); + return true; } + return false; } function commentClose(obj,id) { if(obj.value == '') { @@ -48,7 +50,9 @@ $("#comment-edit-text-" + id).addClass("comment-edit-text-empty"); $("#mod-cmnt-wrap-" + id).hide(); closeMenu("comment-edit-submit-wrapper-" + id); + return true; } + return false; } From 64a6e8693c5158c37994d8c1c211265fc158b27d Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Fri, 10 Aug 2012 04:27:50 -0400 Subject: [PATCH 086/156] quattro: remove unused parameter 'comment' from function cmtBbClose --- view/theme/quattro/theme.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/view/theme/quattro/theme.php b/view/theme/quattro/theme.php index 5cb373eefe..51d9d05d5e 100644 --- a/view/theme/quattro/theme.php +++ b/view/theme/quattro/theme.php @@ -43,10 +43,10 @@ function insertFormatting(comment,BBcode,id) { } function cmtBbOpen(id) { - $(".comment-edit-bb-" + id).show(); + $("#comment-edit-bb-" + id).show(); } -function cmtBbClose(comment, id) { - $(".comment-edit-bb-" + id).hide(); +function cmtBbClose(id) { + $("#comment-edit-bb-" + id).hide(); } $(document).ready(function() { From c4bff3d3934f93b059da64b02886e3ffa8a5a0d7 Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Fri, 10 Aug 2012 04:29:22 -0400 Subject: [PATCH 087/156] quattro: add comment tools icons, fix hide/show comment tools --- view/theme/quattro/comment_item.tpl | 13 +++++++------ view/theme/quattro/dark/style.css | 12 +++++------- view/theme/quattro/green/style.css | 12 +++++------- view/theme/quattro/icons/bbedit.png | Bin 0 -> 2145 bytes view/theme/quattro/quattro.less | 14 +++++++------- view/theme/quattro/wall_thread.tpl | 6 +++++- 6 files changed, 29 insertions(+), 28 deletions(-) create mode 100644 view/theme/quattro/icons/bbedit.png diff --git a/view/theme/quattro/comment_item.tpl b/view/theme/quattro/comment_item.tpl index ea24d95cc3..7d1d7550b2 100644 --- a/view/theme/quattro/comment_item.tpl +++ b/view/theme/quattro/comment_item.tpl @@ -10,8 +10,8 @@
$mytitle
-
-
    +
    • @@ -37,8 +37,11 @@ style="cursor: pointer;" title="$edvideo" onclick="insertFormatting('$comment','video', $id);">
    -
    - + {{ if $qcomment }} {{ endif }} -
    -
    diff --git a/view/theme/quattro/dark/style.css b/view/theme/quattro/dark/style.css index 5ff0591602..17e51cf170 100644 --- a/view/theme/quattro/dark/style.css +++ b/view/theme/quattro/dark/style.css @@ -2009,25 +2009,23 @@ footer { opacity: 0.3; filter: alpha(opacity=30); } -[class^="comment-edit-bb"] { +.comment-edit-bb { list-style: none; display: none; - margin: 0px 0 0px 60px; + margin: 0px; + padding: 0px; width: 75%; } -[class^="comment-edit-bb"] > li { +.comment-edit-bb > li { display: inline-block; margin: 10px 10px 0 0; visibility: none; } -[class^="comment-edit-bb-end"] { - clear: both; -} .editicon { display: inline-block; width: 16px; height: 16px; - background-image: url(bbedit.png); + background-image: url(icons/bbedit.png); text-decoration: none; } .editicon :hover { diff --git a/view/theme/quattro/green/style.css b/view/theme/quattro/green/style.css index 3cc4e8cf61..da9cdd7942 100644 --- a/view/theme/quattro/green/style.css +++ b/view/theme/quattro/green/style.css @@ -2009,25 +2009,23 @@ footer { opacity: 0.3; filter: alpha(opacity=30); } -[class^="comment-edit-bb"] { +.comment-edit-bb { list-style: none; display: none; - margin: 0px 0 0px 60px; + margin: 0px; + padding: 0px; width: 75%; } -[class^="comment-edit-bb"] > li { +.comment-edit-bb > li { display: inline-block; margin: 10px 10px 0 0; visibility: none; } -[class^="comment-edit-bb-end"] { - clear: both; -} .editicon { display: inline-block; width: 16px; height: 16px; - background-image: url(bbedit.png); + background-image: url(icons/bbedit.png); text-decoration: none; } .editicon :hover { diff --git a/view/theme/quattro/icons/bbedit.png b/view/theme/quattro/icons/bbedit.png new file mode 100644 index 0000000000000000000000000000000000000000..b89f2f7a830b573d37ea591e715d5e9507574642 GIT binary patch literal 2145 zcmV-n2%h(eP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iyc3 z0t*R39JQ+e00-eoL_t(|+U=TqP*m3)$3HjhF6#pBf;@t(B1tOXiyC!?WLkAPW8!O~ zX{V!Rn09TZm_7&tlP2wCrrO%aXd)JvNx-q=^ksZ>s!p0ntVw)}MywDV6f6t4LfBPy zSpgSz_4bdwyIIHryOB7!Ip2TIIrpCPyZ4^^J-_oi=X@mu#vI2^oRDL6IH68}*UdTf!OpD&;J^fIw=dH`bd1`GxR)=n#$Xbk`ko0ZP?HkL15 z%#Iy9#-#5hNs?t*7XL8_q2&?k*@2IMSAdolK`v7pe2XNS|^f>MG_T0uWDTxBp57@9_ z!+jHR`LoOA!$%HdGMTt|;UZ7Ye{$Hmxw(s2xO5fS>G9InfzSZ)KvzKC2_yn0U<*(W z%ntJzzXbjWlmjn^P(KFfQSw@#U&((PI057W=SG`}m9{QmLXdJe*a@5j{xVXi(eUs0 zY0*RxrBabP*~p~SG{1Lt*sOGS*>HP2s8uS`GiL(u^Sm`YziQQekxP;!dD%0|c(3X` zYHJ(F$;lqJZf$J?rKNB1)7Q4JAS+plMDMN&;)#85D5(`FQwTlf%Qz7wJrrX7-hh06 zK>n1Ho)5u>9Y_V*hbad`Jg^&B1RMv}DSfaQ*sRn^16~Jy66g$KlO9E$JqN9&mD}A8 ztTro2aWO>Qb93!-19v@cwAu-1wOXR0q8R8Oz;5ec_ny4~?A^OJ=2Z*6%ENs{D9^w6phJa~#SP4@%EVcJgso>n~l ziTiw4IfT&2hcm$UfYZa2gW>nUQeZ8x2ly@U2Ji^bs?@QJ^iWrC4>55Q$(}P8dK|b0 z+{DC9WZ+I8n&@aAQK@-)_Dt$pEVz1m_}}&Gl$Djqot>Q&6ch}yRbF0BSy`D3Fw*_P z!a^!4b}?gG0w$A*AHDcP09LHayl|1a`nszXq@;x6Vy~~r$jBfiC54of zl);OUef#L_?8Iy~1NhstS#EN*;VKmsyQr={?yrBv5k+%z^B@}*cLx9`PyIJy7lo=( zytAZ)87079m1%ox81`2x>AMg3yN)X9@nOor;A7D3fbwGC z_NFViUEal@R-TFOO=c|vhVqG3-lhY#7LrWug=D>SNN-S*+ z`0=3(78@`TNCs|&@m?+<8ZZFe%C%JBnzCpN1t)-oBb0}tU3rFHdFBmZK#8fZ57$4H zm6h`5ZQF>6jq@_z<3XR0gj%EVlN!L%)`HvPA=Q|UTC1a@rHRBx)3{}BqOq}&>C>lw z?ny1dBO9a9=+FDwG&ME(|I_;Q>*bP?QhNHllc8~P0+#kJjFS_*1FyH91#xo*|Lh1~ z6b^?0-})yE+uu?Mc{)ro`#kA0N?iLZKnJ`D90PSTJ9YxFr|K+gmpU}>v{VrCl%kwV`^=cO@f3ajx9kn5eDd`y;IeVEUxicb`&_j0*oId9O zG%B95Bm|opW$Vpndn53j5IkfcZUHYn;J)Zqb~(Zd(Nc}+0Q>`(k~EK+#els7XLG&( z5XE=YU0GQvce`BZS1cKNs3L{?++fJfUBpyl;)r!jCX;u;YDi>3R&vB0u#DFak{_0L zuB@z-x9mPh{0o~|y>uSeZE*5;CO$j!K99}Fq2}1p2ll=Vt#?78jIw>B# z@d-g_f#BF$S}N~7@Gka@1;o0X+-tc+_Ox{Nzq9*+_isb1UGBLv`VMI%l35UX3~}Jl zA^D?|-gBE--*|jXbQ%JJ(BlF^4=o5C5fFN4LFkBq&_j li { +.comment-edit-bb > li { display: inline-block; margin: 10px 10px 0 0; visibility: none; } -[class^="comment-edit-bb-end"] { - clear: both; -} + .editicon { display: inline-block; width: 16px; height: 16px; - background-image: url(bbedit.png); + background-image: url(icons/bbedit.png); text-decoration: none; :hover {background-color: #ccc;} } diff --git a/view/theme/quattro/wall_thread.tpl b/view/theme/quattro/wall_thread.tpl index 4d454f00db..fe136b2b2f 100644 --- a/view/theme/quattro/wall_thread.tpl +++ b/view/theme/quattro/wall_thread.tpl @@ -2,7 +2,11 @@ {{ else }} {{if $item.comment_firstcollapsed}}
    - $item.num_comments $item.hide_text + $item.num_comments + $item.hide_text
    - {{ if $item.threaded }}{{ if $item.comment }} + {{ if $item.threaded }}{{ if $item.comment }}{{ if $item.indent==comment }}
    - $item.comment + $item.comment
    - {{ endif }}{{ endif }} + {{ endif }}{{ endif }}{{ endif }} @@ -124,8 +124,10 @@ {{if $item.comment_lastcollapsed}}{{endif}} {{ endif }} -{{ if $item.flatten }} -
    - $item.comment -
    +{{ if $item.indent!=comment}} +
    $item.comment
    +{{ endif }} + +{{ if $item.flatten }} +
    $item.comment
    {{ endif }} diff --git a/view/theme/quattro/wallwall_thread.tpl b/view/theme/quattro/wallwall_thread.tpl index cc2f8e3627..ceb74517e3 100644 --- a/view/theme/quattro/wallwall_thread.tpl +++ b/view/theme/quattro/wallwall_thread.tpl @@ -101,14 +101,14 @@
    $item.dislike
    - {{ if $item.threaded }}{{ if $item.comment }} + {{ if $item.threaded }}{{ if $item.comment }}{{ if $item.indent==comment }}
    $item.comment
    - {{ endif }}{{ endif }} + {{ endif }}{{ endif }}{{ endif }} @@ -127,8 +127,10 @@ {{if $item.comment_lastcollapsed}}{{endif}} {{ endif }} -{{ if $item.flatten }} -
    - $item.comment -
    +{{ if $item.indent!=comment}} +
    $item.comment
    +{{ endif }} + +{{ if $item.flatten }} +
    $item.comment
    {{ endif }} From dbbf5b86a2ebfe862d4d833be41997d8b596f260 Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Fri, 10 Aug 2012 04:55:51 -0400 Subject: [PATCH 089/156] template processor: trim strings in {{ if str!=str }}, add 'debug' tag: {{ debug $var [$var1 [$var2 [...]]] }}{{ enddebug }} is replaced by
    var_export($var1)\nvar_export($var2)\n....
    --- include/template_processor.php | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/include/template_processor.php b/include/template_processor.php index 46252c355f..4088ddab60 100644 --- a/include/template_processor.php +++ b/include/template_processor.php @@ -63,7 +63,7 @@ if ($b[0]=="$") $b = $this->_get_var($b); $val = ($a == $b); } else if (strpos($args[2],"!=")>0){ - list($a,$b) = explode("!=",$args[2]); + list($a,$b) = array_map("trim", explode("!=",$args[2])); $a = $this->_get_var($a); if ($b[0]=="$") $b = $this->_get_var($b); $val = ($a != $b); @@ -133,6 +133,26 @@ return $ret; } + + /** + * DEBUG node + * + * {{ debug $var [$var [$var [...]]] }}{{ enddebug }} + * + * replace node with
    var_dump($var, $var, ...);
    + */ + private function _replcb_debug($args){ + $vars = array_map('trim', explode(" ",$args[2])); + $vars[] = $args[1]; + + $ret = "
    ";
    +			foreach ($vars as $var){
    +				$ret .= htmlspecialchars(var_export( $this->_get_var($var), true ));
    +				$ret .= "\n";
    +			}
    +			$ret .= "
    "; + return $ret; + } private function _replcb_node($m) { $node = $this->nodes[$m[1]]; From fc07f50fd8d2972009bebb3c974cbcbee321c642 Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Fri, 10 Aug 2012 05:42:36 -0400 Subject: [PATCH 090/156] conversation: add 'thread_level' to $item array --- include/conversation.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/conversation.php b/include/conversation.php index 3c4ff29082..68aa1fa33c 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -588,6 +588,7 @@ function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $pr 'comment' => $comment, 'previewing' => $previewing, 'wait' => t('Please wait'), + 'thread_level' => $thread_level, ); $arr = array('item' => $item, 'output' => $tmp_item); @@ -818,6 +819,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) { 'conv' => (($preview) ? '' : array('href'=> $a->get_baseurl($ssl_state) . '/display/' . $nickname . '/' . $item['id'], 'title'=> t('View in context'))), 'previewing' => $previewing, 'wait' => t('Please wait'), + 'thread_level' => 1, ); $arr = array('item' => $item, 'output' => $tmp_item); From ec3d8a80cda6124bd8c68e6721f3fb5d280d4e0c Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Fri, 10 Aug 2012 06:27:01 -0400 Subject: [PATCH 091/156] quattro: fix collapsed thread, fix comment box, style previev comment, add 'expand / collapse" thread --- view/theme/quattro/dark/style.css | 54 +++++++++++++++++++++----- view/theme/quattro/green/style.css | 54 +++++++++++++++++++++----- view/theme/quattro/quattro.less | 39 +++++++++++++++---- view/theme/quattro/theme.php | 10 +++++ view/theme/quattro/wall_item_tag.tpl | 4 ++ view/theme/quattro/wall_thread.tpl | 33 ++++++++++------ view/theme/quattro/wallwall_thread.tpl | 37 ++++++++++++------ 7 files changed, 181 insertions(+), 50 deletions(-) diff --git a/view/theme/quattro/dark/style.css b/view/theme/quattro/dark/style.css index 17e51cf170..9561fe728a 100644 --- a/view/theme/quattro/dark/style.css +++ b/view/theme/quattro/dark/style.css @@ -1075,6 +1075,7 @@ section { width: 710px; border: 1px solid #2d2d2d; margin-top: 10px; + background-color: #fce94f; } .comment-edit-preview .contact-photo { width: 32px; @@ -1091,12 +1092,17 @@ section { padding-left: 12px; } .comment-edit-preview .wall-item-container { - width: 700px; + width: 90%; } .comment-edit-preview .tread-wrapper { - width: 700px; + width: 90%; padding: 0; margin: 10px 0; + background-color: #fce94f; + border-bottom: 0px; +} +.comment-edit-preview .wall-item-conv { + display: none; } .shiny { border-right: 10px solid #fce94f; @@ -1143,36 +1149,64 @@ section { height: 25px; } /* threaded comments */ +.children { + margin-top: 1em; +} +.children .hide-comments-outer { + margin-left: 60px; +} +.children .comment-edit-preview { + width: 660px; +} +.children .comment-edit-preview .wall-item-container { + width: 610px; +} .children .children { margin-left: 40px; } .children .children .wall-item-container { width: 710px; } -.children .children .children { - margin-left: 40px; +.children .children .comment-edit-preview { + width: 620px; +} +.children .children .comment-edit-preview .wall-item-container { + width: 620px; } .children .children .children .wall-item-container { width: 670px; } -.children .children .children .children { - margin-left: 40px; +.children .children .children .comment-edit-preview { + width: 580px; +} +.children .children .children .comment-edit-preview .wall-item-container { + width: 580px; } .children .children .children .children .wall-item-container { width: 630px; } -.children .children .children .children .children { - margin-left: 40px; +.children .children .children .children .comment-edit-preview { + width: 540px; +} +.children .children .children .children .comment-edit-preview .wall-item-container { + width: 540px; } .children .children .children .children .children .wall-item-container { width: 590px; } +.children .children .children .children .children .comment-edit-preview { + width: 500px; +} +.children .children .children .children .children .comment-edit-preview .wall-item-container { + width: 500px; +} .children .children .children .children .children .children { margin-left: 0px; } -.threaded .hide-comments-outer { - margin-left: 20px; +.children .children .children .children .children .children .hide-comments-outer { + margin-left: 0px; } +/*.threaded .hide-comments-outer { margin-left: 20px; }*/ span[id^="showmore-teaser"] { background: url("showmore-bg.jpg") no-repeat center bottom; } diff --git a/view/theme/quattro/green/style.css b/view/theme/quattro/green/style.css index da9cdd7942..29d5512712 100644 --- a/view/theme/quattro/green/style.css +++ b/view/theme/quattro/green/style.css @@ -1075,6 +1075,7 @@ section { width: 710px; border: 1px solid #2d2d2d; margin-top: 10px; + background-color: #ddffdd; } .comment-edit-preview .contact-photo { width: 32px; @@ -1091,12 +1092,17 @@ section { padding-left: 12px; } .comment-edit-preview .wall-item-container { - width: 700px; + width: 90%; } .comment-edit-preview .tread-wrapper { - width: 700px; + width: 90%; padding: 0; margin: 10px 0; + background-color: #ddffdd; + border-bottom: 0px; +} +.comment-edit-preview .wall-item-conv { + display: none; } .shiny { border-right: 10px solid #ddffdd; @@ -1143,36 +1149,64 @@ section { height: 25px; } /* threaded comments */ +.children { + margin-top: 1em; +} +.children .hide-comments-outer { + margin-left: 60px; +} +.children .comment-edit-preview { + width: 660px; +} +.children .comment-edit-preview .wall-item-container { + width: 610px; +} .children .children { margin-left: 40px; } .children .children .wall-item-container { width: 710px; } -.children .children .children { - margin-left: 40px; +.children .children .comment-edit-preview { + width: 620px; +} +.children .children .comment-edit-preview .wall-item-container { + width: 620px; } .children .children .children .wall-item-container { width: 670px; } -.children .children .children .children { - margin-left: 40px; +.children .children .children .comment-edit-preview { + width: 580px; +} +.children .children .children .comment-edit-preview .wall-item-container { + width: 580px; } .children .children .children .children .wall-item-container { width: 630px; } -.children .children .children .children .children { - margin-left: 40px; +.children .children .children .children .comment-edit-preview { + width: 540px; +} +.children .children .children .children .comment-edit-preview .wall-item-container { + width: 540px; } .children .children .children .children .children .wall-item-container { width: 590px; } +.children .children .children .children .children .comment-edit-preview { + width: 500px; +} +.children .children .children .children .children .comment-edit-preview .wall-item-container { + width: 500px; +} .children .children .children .children .children .children { margin-left: 0px; } -.threaded .hide-comments-outer { - margin-left: 20px; +.children .children .children .children .children .children .hide-comments-outer { + margin-left: 0px; } +/*.threaded .hide-comments-outer { margin-left: 20px; }*/ span[id^="showmore-teaser"] { background: url("showmore-bg.jpg") no-repeat center bottom; } diff --git a/view/theme/quattro/quattro.less b/view/theme/quattro/quattro.less index 2a4b1b0d06..d7b82c8bc1 100644 --- a/view/theme/quattro/quattro.less +++ b/view/theme/quattro/quattro.less @@ -545,6 +545,7 @@ section { width: 710px; border: 1px solid @Grey5; margin-top: 10px; + background-color: @JotPreviewBackgroundColor; .contact-photo { width: 32px; height: 32px; margin-left: 16px; /*background: url(../../../images/icons/22/user.png) no-repeat center center;*/ @@ -555,8 +556,13 @@ section { } .wall-item-links { padding-left: 12px; } - .wall-item-container { width: 700px; } - .tread-wrapper { width: 700px; padding: 0; margin: 10px 0;} + .wall-item-container { width: 90%; } + .tread-wrapper { + width: 90%; padding: 0; margin: 10px 0; + background-color: @JotPreviewBackgroundColor; + border-bottom: 0px; + } + .wall-item-conv { display: none; } } .shiny { border-right:10px solid @ShinyBorderColor; } @@ -599,32 +605,49 @@ section { /* threaded comments */ .children { - + margin-top: 1em; + .hide-comments-outer { margin-left:60px; } + + .comment-edit-preview { width: 660px; + .wall-item-container { width: 610px; } + } + & .children { + margin-left: 40px; .wall-item-container { width: 710px; } + .comment-edit-preview { width: 620px; + .wall-item-container { width: 620px; } + } & .children { - margin-left: 40px; .wall-item-container { width: 670px; } + .comment-edit-preview { width: 580px; + .wall-item-container { width: 580px; } + } & .children { - margin-left: 40px; .wall-item-container { width: 630px; } + .comment-edit-preview { width: 540px; + .wall-item-container { width: 540px; } + } & .children { - margin-left: 40px; .wall-item-container { width: 590px; } + .comment-edit-preview { width: 500px; + .wall-item-container { width: 500px; } + } .children { margin-left: 0px; - } + .hide-comments-outer { margin-left: 0px; } + } } } } } } -.threaded .hide-comments-outer { margin-left: 20px; } +/*.threaded .hide-comments-outer { margin-left: 20px; }*/ span[id^="showmore-teaser"]{ background: url("showmore-bg.jpg") no-repeat center bottom; diff --git a/view/theme/quattro/theme.php b/view/theme/quattro/theme.php index 51d9d05d5e..1c986e4c8f 100644 --- a/view/theme/quattro/theme.php +++ b/view/theme/quattro/theme.php @@ -42,6 +42,16 @@ function insertFormatting(comment,BBcode,id) { return true; } +function showThread(id) { + $("#collapsed-comments-" + id).show() + $("#collapsed-comments-" + id + " .collapsed-comments").show() +} +function hideThread(id) { + $("#collapsed-comments-" + id).hide() + $("#collapsed-comments-" + id + " .collapsed-comments").hide() +} + + function cmtBbOpen(id) { $("#comment-edit-bb-" + id).show(); } diff --git a/view/theme/quattro/wall_item_tag.tpl b/view/theme/quattro/wall_item_tag.tpl index d655306e59..e1ef932135 100644 --- a/view/theme/quattro/wall_item_tag.tpl +++ b/view/theme/quattro/wall_item_tag.tpl @@ -1,3 +1,5 @@ +{{ if $item.thread_level!=1 }}
    {{ endif }} +
    @@ -18,6 +20,8 @@
    +{{ if $item.thread_level!=1 }}
    {{ endif }} + {{ if $item.flatten }}
    $item.comment
    {{ endif }} diff --git a/view/theme/quattro/wall_thread.tpl b/view/theme/quattro/wall_thread.tpl index bd165eed78..01738b666b 100644 --- a/view/theme/quattro/wall_thread.tpl +++ b/view/theme/quattro/wall_thread.tpl @@ -7,11 +7,19 @@ $item.hide_text + {{ if $item.thread_level==3 }} - + expand / + collapse thread{{ endif }}