Merge branch '0.9.x' of gitorious.org:statusnet/mainline into 0.9.x
This commit is contained in:
		| @@ -59,7 +59,8 @@ class ApiStatusnetConfigAction extends ApiAction | ||||
|         'notice' => array('contentlimit'), | ||||
|         'throttle' => array('enabled', 'count', 'timespan'), | ||||
|         'xmpp' => array('enabled', 'server', 'port', 'user'), | ||||
|         'integration' => array('source') | ||||
|         'integration' => array('source'), | ||||
|         'attachments' => array('uploads', 'file_quota') | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
| @@ -96,7 +97,7 @@ class ApiStatusnetConfigAction extends ApiAction | ||||
|             foreach ($this->keys as $section => $settings) { | ||||
|                 $this->elementStart($section); | ||||
|                 foreach ($settings as $setting) { | ||||
|                     $value = common_config($section, $setting); | ||||
|                     $value = $this->setting($section, $setting); | ||||
|                     if (is_array($value)) { | ||||
|                         $value = implode(',', $value); | ||||
|                     } else if ($value === false || $value == '0') { | ||||
| @@ -125,7 +126,7 @@ class ApiStatusnetConfigAction extends ApiAction | ||||
|                 $result[$section] = array(); | ||||
|                 foreach ($settings as $setting) { | ||||
|                     $result[$section][$setting] | ||||
|                         = common_config($section, $setting); | ||||
|                         = $this->setting($section, $setting); | ||||
|                 } | ||||
|             } | ||||
|             $this->initDocument('json'); | ||||
| @@ -143,6 +144,20 @@ class ApiStatusnetConfigAction extends ApiAction | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function setting($section, $key) { | ||||
|         $result = common_config($section, $key); | ||||
|         if ($key == 'file_quota') { | ||||
|             // hack: adjust for the live upload limit | ||||
|             if (common_config($section, 'uploads')) { | ||||
|                 $max = ImageFile::maxFileSizeInt(); | ||||
|             } else { | ||||
|                 $max = 0; | ||||
|             } | ||||
|             return min($result, $max); | ||||
|         } | ||||
|         return $result; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Return true if read only. | ||||
|      * | ||||
|   | ||||
| @@ -118,11 +118,13 @@ class BackupaccountAction extends Action | ||||
|     { | ||||
|         $cur = common_current_user(); | ||||
|  | ||||
|         $stream = new UserActivityStream($cur); | ||||
|         $stream = new UserActivityStream($cur, true, UserActivityStream::OUTPUT_RAW); | ||||
|  | ||||
|         header('Content-Disposition: attachment; filename='.$cur->nickname.'.atom'); | ||||
|         header('Content-Type: application/atom+xml; charset=utf-8'); | ||||
|  | ||||
|         // @fixme atom feed logic is in getString... | ||||
|         // but we just want it to output to the outputter. | ||||
|         $this->raw($stream->getString()); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -202,13 +202,20 @@ class SearchNoticeListItem extends NoticeListItem { | ||||
|         $options = implode('|', array_map('preg_quote', array_map('htmlspecialchars', $terms), | ||||
|                                                             array_fill(0, sizeof($terms), '/'))); | ||||
|         $pattern = "/($options)/i"; | ||||
|         $result  = preg_replace($pattern, '<strong>\\1</strong>', $text); | ||||
|         $result = ''; | ||||
|  | ||||
|         /* Divide up into text (highlight me) and tags (don't touch) */ | ||||
|         $chunks = preg_split('/(<[^>]+>)/', $text, 0, PREG_SPLIT_DELIM_CAPTURE); | ||||
|         foreach ($chunks as $i => $chunk) { | ||||
|             if ($i % 2 == 1) { | ||||
|                 // odd: delimiter (tag) | ||||
|                 $result .= $chunk; | ||||
|             } else { | ||||
|                 // even: freetext between tags | ||||
|                 $result .= preg_replace($pattern, '<strong>\\1</strong>', $chunk); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /* Remove highlighting from inside links, loop incase multiple highlights in links */ | ||||
|         $pattern = '/(\w+="[^"]*)<strong>('.$options.')<\/strong>([^"]*")/iU'; | ||||
|         do { | ||||
|             $result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count); | ||||
|         } while ($count); | ||||
|         return $result; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -153,7 +153,7 @@ class Notice extends Memcached_DataObject | ||||
|     function saveTags() | ||||
|     { | ||||
|         /* extract all #hastags */ | ||||
|         $count = preg_match_all('/(?:^|\s)#([\pL\pN_\-\.]{1,64})/', strtolower($this->content), $match); | ||||
|         $count = preg_match_all('/(?:^|\s)#([\pL\pN_\-\.]{1,64})/u', strtolower($this->content), $match); | ||||
|         if (!$count) { | ||||
|             return true; | ||||
|         } | ||||
|   | ||||
| @@ -854,8 +854,11 @@ class Action extends HTMLOutputter // lawsuit | ||||
|     function showFooter() | ||||
|     { | ||||
|         $this->elementStart('div', array('id' => 'footer')); | ||||
|         $this->showSecondaryNav(); | ||||
|         $this->showLicenses(); | ||||
|         if (Event::handle('StartShowInsideFooter', array($this))) { | ||||
|             $this->showSecondaryNav(); | ||||
|             $this->showLicenses(); | ||||
|             Event::handle('EndShowInsideFooter', array($this)); | ||||
|         } | ||||
|         $this->elementEnd('div'); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -116,6 +116,8 @@ class Router | ||||
|     static $bare = array('requesttoken', 'accesstoken', 'userauthorization', | ||||
|                          'postnotice', 'updateprofile', 'finishremotesubscribe'); | ||||
|  | ||||
|     const REGEX_TAG = '[^\/]+'; // [\pL\pN_\-\.]{1,64} better if we can do unicode regexes | ||||
|  | ||||
|     static function get() | ||||
|     { | ||||
|         if (!Router::$inst) { | ||||
| @@ -348,14 +350,14 @@ class Router | ||||
|             $m->connect('tag', array('action' => 'publictagcloud')); | ||||
|             $m->connect('tag/:tag/rss', | ||||
|                         array('action' => 'tagrss'), | ||||
|                         array('tag' => '[\pL\pN_\-\.]{1,64}')); | ||||
|                         array('tag' => self::REGEX_TAG)); | ||||
|             $m->connect('tag/:tag', | ||||
|                         array('action' => 'tag'), | ||||
|                         array('tag' => '[\pL\pN_\-\.]{1,64}')); | ||||
|                         array('tag' => self::REGEX_TAG)); | ||||
|  | ||||
|             $m->connect('peopletag/:tag', | ||||
|                         array('action' => 'peopletag'), | ||||
|                         array('tag' => '[a-zA-Z0-9]+')); | ||||
|                         array('tag' => self::REGEX_TAG)); | ||||
|  | ||||
|             // groups | ||||
|  | ||||
| @@ -812,7 +814,7 @@ class Router | ||||
|                     $m->connect($a.'/:tag', | ||||
|                                 array('action' => $a, | ||||
|                                       'nickname' => $nickname), | ||||
|                                 array('tag' => '[a-zA-Z0-9]+')); | ||||
|                                 array('tag' => self::REGEX_TAG)); | ||||
|                 } | ||||
|  | ||||
|                 foreach (array('rss', 'groups') as $a) { | ||||
| @@ -839,12 +841,12 @@ class Router | ||||
|                 $m->connect('tag/:tag/rss', | ||||
|                             array('action' => 'userrss', | ||||
|                                   'nickname' => $nickname), | ||||
|                             array('tag' => '[\pL\pN_\-\.]{1,64}')); | ||||
|                             array('tag' => self::REGEX_TAG)); | ||||
|  | ||||
|                 $m->connect('tag/:tag', | ||||
|                             array('action' => 'showstream', | ||||
|                                   'nickname' => $nickname), | ||||
|                             array('tag' => '[\pL\pN_\-\.]{1,64}')); | ||||
|                             array('tag' => self::REGEX_TAG)); | ||||
|  | ||||
|                 $m->connect('rsd.xml', | ||||
|                             array('action' => 'rsd', | ||||
| @@ -875,7 +877,7 @@ class Router | ||||
|                 foreach (array('subscriptions', 'subscribers') as $a) { | ||||
|                     $m->connect(':nickname/'.$a.'/:tag', | ||||
|                                 array('action' => $a), | ||||
|                                 array('tag' => '[a-zA-Z0-9]+', | ||||
|                                 array('tag' => self::REGEX_TAG, | ||||
|                                       'nickname' => Nickname::DISPLAY_FMT)); | ||||
|                 } | ||||
|  | ||||
| @@ -903,12 +905,12 @@ class Router | ||||
|                 $m->connect(':nickname/tag/:tag/rss', | ||||
|                             array('action' => 'userrss'), | ||||
|                             array('nickname' => Nickname::DISPLAY_FMT), | ||||
|                             array('tag' => '[\pL\pN_\-\.]{1,64}')); | ||||
|                             array('tag' => self::REGEX_TAG)); | ||||
|  | ||||
|                 $m->connect(':nickname/tag/:tag', | ||||
|                             array('action' => 'showstream'), | ||||
|                             array('nickname' => Nickname::DISPLAY_FMT), | ||||
|                             array('tag' => '[\pL\pN_\-\.]{1,64}')); | ||||
|                             array('tag' => self::REGEX_TAG)); | ||||
|  | ||||
|                 $m->connect(':nickname/rsd.xml', | ||||
|                             array('action' => 'rsd'), | ||||
|   | ||||
| @@ -29,15 +29,48 @@ class UserActivityStream extends AtomUserNoticeFeed | ||||
| { | ||||
|     public $activities = array(); | ||||
|  | ||||
|     function __construct($user, $indent = true) | ||||
|     const OUTPUT_STRING = 1; | ||||
|     const OUTPUT_RAW = 2; | ||||
|     public $outputMode = self::OUTPUT_STRING; | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @param User $user | ||||
|      * @param boolean $indent | ||||
|      * @param boolean $outputMode: UserActivityStream::OUTPUT_STRING to return a string, | ||||
|      *                           or UserActivityStream::OUTPUT_RAW to go to raw output. | ||||
|      *                           Raw output mode will attempt to stream, keeping less | ||||
|      *                           data in memory but will leave $this->activities incomplete. | ||||
|      */ | ||||
|     function __construct($user, $indent = true, $outputMode = UserActivityStream::OUTPUT_STRING) | ||||
|     { | ||||
|         parent::__construct($user, null, $indent); | ||||
|  | ||||
|         $this->outputMode = $outputMode; | ||||
|         if ($this->outputMode == self::OUTPUT_STRING) { | ||||
|             // String buffering? Grab all the notices now. | ||||
|             $notices = $this->getNotices(); | ||||
|         } elseif ($this->outputMode == self::OUTPUT_RAW) { | ||||
|             // Raw output... need to restructure from the stringer init. | ||||
|             $this->xw = new XMLWriter(); | ||||
|             $this->xw->openURI('php://output'); | ||||
|             if(is_null($indent)) { | ||||
|                 $indent = common_config('site', 'indent'); | ||||
|             } | ||||
|             $this->xw->setIndent($indent); | ||||
|  | ||||
|             // We'll fetch notices later. | ||||
|             $notices = array(); | ||||
|         } else { | ||||
|             throw new Exception('Invalid outputMode provided to ' . __METHOD__); | ||||
|         } | ||||
|  | ||||
|         // Assume that everything but notices is feasible | ||||
|         // to pull at once and work with in memory... | ||||
|         $subscriptions = $this->getSubscriptions(); | ||||
|         $subscribers   = $this->getSubscribers(); | ||||
|         $groups        = $this->getGroups(); | ||||
|         $faves         = $this->getFaves(); | ||||
|         $notices       = $this->getNotices(); | ||||
|  | ||||
|         $objs = array_merge($subscriptions, $subscribers, $groups, $faves, $notices); | ||||
|  | ||||
| @@ -45,16 +78,44 @@ class UserActivityStream extends AtomUserNoticeFeed | ||||
|  | ||||
|         usort($objs, 'UserActivityStream::compareObject'); | ||||
|  | ||||
|         // We'll keep these around for later, and interleave them into | ||||
|         // the output stream with the user's notices. | ||||
|         foreach ($objs as $obj) { | ||||
|             $this->activities[] = $obj->asActivity(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Interleave the pre-sorted subs/groups/faves with the user's | ||||
|      * notices, all in reverse chron order. | ||||
|      */ | ||||
|     function renderEntries() | ||||
|     { | ||||
|         $end = time() + 1; | ||||
|         foreach ($this->activities as $act) { | ||||
|             $start = $act->time; | ||||
|  | ||||
|             if ($this->outputMode == self::OUTPUT_RAW && $start != $end) { | ||||
|                 // In raw mode, we haven't pre-fetched notices. | ||||
|                 // Grab the chunks of notices between other activities. | ||||
|                 $notices = $this->getNoticesBetween($start, $end); | ||||
|                 foreach ($notices as $noticeAct) { | ||||
|                     $noticeAct->asActivity()->outputTo($this, false, false); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // Only show the author sub-element if it's different from default user | ||||
|             $act->outputTo($this, false, ($act->actor->id != $this->user->uri)); | ||||
|  | ||||
|             $end = $start; | ||||
|         } | ||||
|  | ||||
|         if ($this->outputMode == self::OUTPUT_RAW) { | ||||
|             // Grab anything after the last pre-sorted activity. | ||||
|             $notices = $this->getNoticesBetween(0, $end); | ||||
|             foreach ($notices as $noticeAct) { | ||||
|                 $noticeAct->asActivity()->outputTo($this, false, false); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -121,7 +182,13 @@ class UserActivityStream extends AtomUserNoticeFeed | ||||
|         return $faves; | ||||
|     } | ||||
|  | ||||
|     function getNotices() | ||||
|     /** | ||||
|      * | ||||
|      * @param int $start unix timestamp for earliest | ||||
|      * @param int $end unix timestamp for latest | ||||
|      * @return array of Notice objects | ||||
|      */ | ||||
|     function getNoticesBetween($start=0, $end=0) | ||||
|     { | ||||
|         $notices = array(); | ||||
|  | ||||
| @@ -129,6 +196,17 @@ class UserActivityStream extends AtomUserNoticeFeed | ||||
|  | ||||
|         $notice->profile_id = $this->user->id; | ||||
|  | ||||
|         if ($start) { | ||||
|             $tsstart = common_sql_date($start); | ||||
|             $notice->whereAdd("created >= '$tsstart'"); | ||||
|         } | ||||
|         if ($end) { | ||||
|             $tsend = common_sql_date($end); | ||||
|             $notice->whereAdd("created < '$tsend'"); | ||||
|         } | ||||
|  | ||||
|         $notice->orderBy('created DESC'); | ||||
|  | ||||
|         if ($notice->find()) { | ||||
|             while ($notice->fetch()) { | ||||
|                 $notices[] = clone($notice); | ||||
| @@ -138,6 +216,11 @@ class UserActivityStream extends AtomUserNoticeFeed | ||||
|         return $notices; | ||||
|     } | ||||
|  | ||||
|     function getNotices() | ||||
|     { | ||||
|         return $this->getNoticesBetween(); | ||||
|     } | ||||
|  | ||||
|     function getGroups() | ||||
|     { | ||||
|         $groups = array(); | ||||
|   | ||||
| @@ -787,7 +787,7 @@ function common_render_text($text) | ||||
|  | ||||
|     $r = preg_replace('/[\x{0}-\x{8}\x{b}-\x{c}\x{e}-\x{19}]/', '', $r); | ||||
|     $r = common_replace_urls_callback($r, 'common_linkify'); | ||||
|     $r = preg_replace('/(^|\"\;|\'|\(|\[|\{|\s+)#([\pL\pN_\-\.]{1,64})/e', "'\\1#'.common_tag_link('\\2')", $r); | ||||
|     $r = preg_replace('/(^|\"\;|\'|\(|\[|\{|\s+)#([\pL\pN_\-\.]{1,64})/ue', "'\\1#'.common_tag_link('\\2')", $r); | ||||
|     // XXX: machine tags | ||||
|     return $r; | ||||
| } | ||||
|   | ||||
| @@ -179,28 +179,22 @@ class FacebookBridgePlugin extends Plugin | ||||
|         // Always add the admin panel route | ||||
|         $m->connect('admin/facebook', array('action' => 'facebookadminpanel')); | ||||
|  | ||||
|         // Only add these routes if an application has been setup on | ||||
|         // Facebook for the plugin to use. | ||||
|         if ($this->hasApplication()) { | ||||
|  | ||||
|             $m->connect( | ||||
|                 'main/facebooklogin', | ||||
|                 array('action' => 'facebooklogin') | ||||
|             ); | ||||
|             $m->connect( | ||||
|                 'main/facebookfinishlogin', | ||||
|                 array('action' => 'facebookfinishlogin') | ||||
|             ); | ||||
|             $m->connect( | ||||
|                 'settings/facebook', | ||||
|                 array('action' => 'facebooksettings') | ||||
|             ); | ||||
|             $m->connect( | ||||
|                 'facebook/deauthorize', | ||||
|                 array('action' => 'facebookdeauthorize') | ||||
|             ); | ||||
|  | ||||
|         } | ||||
|         $m->connect( | ||||
|             'main/facebooklogin', | ||||
|             array('action' => 'facebooklogin') | ||||
|         ); | ||||
|         $m->connect( | ||||
|             'main/facebookfinishlogin', | ||||
|             array('action' => 'facebookfinishlogin') | ||||
|         ); | ||||
|         $m->connect( | ||||
|             'settings/facebook', | ||||
|             array('action' => 'facebooksettings') | ||||
|         ); | ||||
|         $m->connect( | ||||
|             'facebook/deauthorize', | ||||
|             array('action' => 'facebookdeauthorize') | ||||
|         ); | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|   | ||||
| @@ -51,7 +51,14 @@ class Facebookclient | ||||
|     function __construct($notice) | ||||
|     { | ||||
|         $this->facebook = self::getFacebook(); | ||||
|         $this->notice   = $notice; | ||||
|  | ||||
|         if (empty($this->facebook)) { | ||||
|             throw new FacebookApiException( | ||||
|                 "Could not create Facebook client! Bad application ID or secret?" | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         $this->notice = $notice; | ||||
|  | ||||
|         $this->flink = Foreign_link::getByUserID( | ||||
|             $notice->profile_id, | ||||
| @@ -89,6 +96,22 @@ class Facebookclient | ||||
|             $secret = common_config('facebook', 'global_secret'); | ||||
|         } | ||||
|  | ||||
|         if (empty($appId)) { | ||||
|             common_log( | ||||
|                 LOG_WARNING, | ||||
|                 "Couldn't find Facebook application ID!", | ||||
|                 __FILE__ | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         if (empty($secret)) { | ||||
|             common_log( | ||||
|                 LOG_WARNING, | ||||
|                 "Couldn't find Facebook application ID!", | ||||
|                 __FILE__ | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         return new Facebook( | ||||
|             array( | ||||
|                'appId'  => $appId, | ||||
| @@ -174,6 +197,9 @@ class Facebookclient | ||||
|                 return $this->sendGraph(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // dequeue | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|   | ||||
| @@ -68,6 +68,9 @@ class MobileProfilePlugin extends WAP20Plugin | ||||
|             $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'])) { | ||||
|  | ||||
|             $this->serveMobile = true; | ||||
|         } else if (isset($_COOKIE['MobileOverride'])) { | ||||
|             // Cookie override is controlled by link at bottom. | ||||
|             $this->serveMobile = (bool)$_COOKIE['MobileOverride']; | ||||
|         } else { | ||||
|             // If they like the WAP 2.0 mimetype, serve them MP | ||||
|             // @fixme $type is undefined, making this if case useless and spewing errors. | ||||
| @@ -381,9 +384,40 @@ class MobileProfilePlugin extends WAP20Plugin | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function onStartShowScripts($action) | ||||
|     function onEndShowScripts($action) | ||||
|     { | ||||
|         $action->inlineScript(' | ||||
|             $(function() { | ||||
|                 $("#mobile-toggle-disable").click(function() { | ||||
|                     $.cookie("MobileOverride", "0", {path: "/"}); | ||||
|                     window.location.reload(); | ||||
|                     return false; | ||||
|                 }); | ||||
|                 $("#mobile-toggle-enable").click(function() { | ||||
|                     $.cookie("MobileOverride", "1", {path: "/"}); | ||||
|                     window.location.reload(); | ||||
|                     return false; | ||||
|                 }); | ||||
|             });' | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     function onEndShowInsideFooter($action) | ||||
|     { | ||||
|         if ($this->serveMobile) { | ||||
|             // TRANS: Link to switch site layout from mobile to desktop mode. Appears at very bottom of page. | ||||
|             $linkText = _m('Switch to desktop site layout.'); | ||||
|             $key = 'mobile-toggle-disable'; | ||||
|         } else { | ||||
|             // TRANS: Link to switch site layout from desktop to mobile mode. Appears at very bottom of page. | ||||
|             $linkText = _m('Switch to mobile site layout.'); | ||||
|             $key = 'mobile-toggle-enable'; | ||||
|         } | ||||
|         $action->elementStart('p'); | ||||
|         $action->element('a', array('href' => '#', 'id' => $key), $linkText); | ||||
|         $action->elementEnd('p'); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     function _common_path($relative, $ssl=false) | ||||
|   | ||||
| @@ -554,8 +554,8 @@ class TwitterImport | ||||
|         } | ||||
|  | ||||
|         // Move all the entities into order so we can | ||||
|         // replace them in reverse order and thus | ||||
|         // not mess up their indices | ||||
|         // replace them and escape surrounding plaintext | ||||
|         // in order | ||||
|  | ||||
|         $toReplace = array(); | ||||
|  | ||||
| @@ -577,56 +577,85 @@ class TwitterImport | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // sort in reverse order by key | ||||
|         // sort in forward order by key | ||||
|  | ||||
|         krsort($toReplace); | ||||
|         ksort($toReplace); | ||||
|  | ||||
|         $result = ''; | ||||
|         $cursor = 0; | ||||
|  | ||||
|         foreach ($toReplace as $part) { | ||||
|             list($type, $object) = $part; | ||||
|             $start = $object->indices[0]; | ||||
|             $end = $object->indices[1]; | ||||
|             if ($cursor < $start) { | ||||
|                 // Copy in the preceding plaintext | ||||
|                 $result .= $this->twitEscape(mb_substr($text, $cursor, $start - $cursor)); | ||||
|                 $cursor = $start; | ||||
|             } | ||||
|             $orig = $this->twitEscape(mb_substr($text, $start, $end - $start)); | ||||
|             switch($type) { | ||||
|             case self::URL: | ||||
|                 $linkText = $this->makeUrlLink($object); | ||||
|                 $linkText = $this->makeUrlLink($object, $orig); | ||||
|                 break; | ||||
|             case self::HASHTAG: | ||||
|                 $linkText = $this->makeHashtagLink($object); | ||||
|                 $linkText = $this->makeHashtagLink($object, $orig); | ||||
|                 break; | ||||
|             case self::MENTION: | ||||
|                 $linkText = $this->makeMentionLink($object); | ||||
|                 $linkText = $this->makeMentionLink($object, $orig); | ||||
|                 break; | ||||
|             default: | ||||
|                 $linkText = $orig; | ||||
|                 continue; | ||||
|             } | ||||
|             $text = mb_substr($text, 0, $object->indices[0]) . $linkText . mb_substr($text, $object->indices[1]); | ||||
|             $result .= $linkText; | ||||
|             $cursor = $end; | ||||
|         } | ||||
|         return $text; | ||||
|         $last = $this->twitEscape(mb_substr($text, $cursor)); | ||||
|         $result .= $last; | ||||
|  | ||||
|         return $result; | ||||
|     } | ||||
|  | ||||
|     function makeUrlLink($object) | ||||
|     function twitEscape($str) | ||||
|     { | ||||
|         return "<a href='{$object->url}' class='extlink'>{$object->url}</a>"; | ||||
|         // Twitter seems to preemptive turn < and > into < and > | ||||
|         // but doesn't for &, so while you may have some magic protection | ||||
|         // against XSS by not bothing to escape manually, you still get | ||||
|         // invalid XHTML. Thanks! | ||||
|         // | ||||
|         // Looks like their web interface pretty much sends anything | ||||
|         // through intact, so.... to do equivalent, decode all entities | ||||
|         // and then re-encode the special ones. | ||||
|         return htmlspecialchars(html_entity_decode($str, ENT_COMPAT, 'UTF-8')); | ||||
|     } | ||||
|  | ||||
|     function makeHashtagLink($object) | ||||
|     function makeUrlLink($object, $orig) | ||||
|     { | ||||
|         return "#" . self::tagLink($object->text); | ||||
|         return "<a href='{$object->url}' class='extlink'>{$orig}</a>"; | ||||
|     } | ||||
|  | ||||
|     function makeMentionLink($object) | ||||
|     function makeHashtagLink($object, $orig) | ||||
|     { | ||||
|         return "@".self::atLink($object->screen_name, $object->name); | ||||
|         return "#" . self::tagLink($object->text, substr($orig, 1)); | ||||
|     } | ||||
|  | ||||
|     static function tagLink($tag) | ||||
|     function makeMentionLink($object, $orig) | ||||
|     { | ||||
|         return "<a href='https://search.twitter.com/search?q=%23{$tag}' class='hashtag'>{$tag}</a>"; | ||||
|         return "@".self::atLink($object->screen_name, $object->name, substr($orig, 1)); | ||||
|     } | ||||
|  | ||||
|     static function atLink($screenName, $fullName=null) | ||||
|     static function tagLink($tag, $orig) | ||||
|     { | ||||
|         return "<a href='https://search.twitter.com/search?q=%23{$tag}' class='hashtag'>{$orig}</a>"; | ||||
|     } | ||||
|  | ||||
|     static function atLink($screenName, $fullName, $orig) | ||||
|     { | ||||
|         if (!empty($fullName)) { | ||||
|             return "<a href='http://twitter.com/#!/{$screenName}' title='{$fullName}'>{$screenName}</a>"; | ||||
|             return "<a href='http://twitter.com/#!/{$screenName}' title='{$fullName}'>{$orig}</a>"; | ||||
|         } else { | ||||
|             return "<a href='http://twitter.com/#!/{$screenName}'>{$screenName}</a>"; | ||||
|             return "<a href='http://twitter.com/#!/{$screenName}'>{$orig}</a>"; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -36,7 +36,7 @@ require_once INSTALLDIR.'/scripts/commandline.inc'; | ||||
|  | ||||
| try { | ||||
|     $user = getUser(); | ||||
|     $actstr = new UserActivityStream($user); | ||||
|     $actstr = new UserActivityStream($user, true, UserActivityStream::OUTPUT_RAW); | ||||
|     print $actstr->getString(); | ||||
| } catch (Exception $e) { | ||||
|     print $e->getMessage()."\n"; | ||||
|   | ||||
| @@ -42,6 +42,21 @@ class HashTagDetectionTests extends PHPUnit_Framework_TestCase | ||||
|                            'say {#<span class="tag"><a href="' . common_local_url('tag', array('tag' => common_canonical_tag('hello'))) . '" rel="tag">hello</a></span>} people'), | ||||
|                      array('say \'#hello\' people', | ||||
|                            'say \'#<span class="tag"><a href="' . common_local_url('tag', array('tag' => common_canonical_tag('hello'))) . '" rel="tag">hello</a></span>\' people'), | ||||
|  | ||||
|                      // Unicode legit letters | ||||
|                      array('#éclair yummy', | ||||
|                            '#<span class="tag"><a href="' . common_local_url('tag', array('tag' => common_canonical_tag('éclair'))) . '" rel="tag">éclair</a></span> yummy'), | ||||
|                      array('#维基百科 zh.wikipedia!', | ||||
|                            '#<span class="tag"><a href="' . common_local_url('tag', array('tag' => common_canonical_tag('维基百科'))) . '" rel="tag">维基百科</a></span> zh.wikipedia!'), | ||||
|                      array('#Россия russia', | ||||
|                            '#<span class="tag"><a href="' . common_local_url('tag', array('tag' => common_canonical_tag('Россия'))) . '" rel="tag">Россия</a></span> russia'), | ||||
|  | ||||
|                      // Unicode punctuators -- the ideographic "," separates the tag, just as "," does | ||||
|                      array('#维基百科,zh.wikipedia!', | ||||
|                            '#<span class="tag"><a href="' . common_local_url('tag', array('tag' => common_canonical_tag('维基百科'))) . '" rel="tag">维基百科</a></span>,zh.wikipedia!'), | ||||
|                      array('#维基百科,zh.wikipedia!', | ||||
|                            '#<span class="tag"><a href="' . common_local_url('tag', array('tag' => common_canonical_tag('维基百科'))) . '" rel="tag">维基百科</a></span>,zh.wikipedia!'), | ||||
|  | ||||
|                      ); | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										810
									
								
								theme/cleaner/css/display.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										810
									
								
								theme/cleaner/css/display.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,810 @@ | ||||
| /** theme: cleaner | ||||
|  * | ||||
|  * @package   StatusNet | ||||
|  * @author    Samantha Doherty <sammy@status.net> | ||||
|  * @copyright 2011 StatusNet, Inc. | ||||
|  * @license   http://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 Unported | ||||
|  * @link      http://status.net/ | ||||
|  */ | ||||
|  | ||||
|  | ||||
| @media screen, projection, tv { | ||||
|  | ||||
| body { | ||||
|     background-color: #e2e2e2; | ||||
|     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;  | ||||
|     font-size: 82%; | ||||
| } | ||||
|  | ||||
| a {color: #3e3e8c;} | ||||
|  | ||||
| h1 {font-size: 1.6em;} | ||||
| h2 {font-size: 1.6em;} | ||||
| h3 {font-size: 1.4em;} | ||||
| h4 {font-size: 1.4em;} | ||||
| h5 {font-size: 1.2em;} | ||||
| h6 {font-size: 1em;} | ||||
|  | ||||
| #wrap { | ||||
|     width: 940px; | ||||
|     margin: 0px auto; | ||||
|     padding: 0px 10px 10px 10px; | ||||
|     background-color: #fff; | ||||
|     box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.5); | ||||
|     -moz-box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.5); | ||||
|     -webkit-box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.5); | ||||
| } | ||||
|  | ||||
| #header { | ||||
|     width: 940px; | ||||
|     padding: 0px; | ||||
|     padding-top: 50px; | ||||
| } | ||||
|  | ||||
| address { | ||||
|     float: left; | ||||
|     margin-right: 20px; | ||||
|     margin-top: 0px; | ||||
| } | ||||
|  | ||||
| .poweredby { | ||||
|     background: url(../images/sn-tiny.png) no-repeat top left; | ||||
|     height: 40px; | ||||
|     font-size: 0.8em; | ||||
|     color: #fff; | ||||
|     line-height: 42px; | ||||
|     padding-left: 50px; | ||||
|     position: absolute; | ||||
|     top: 6px; | ||||
|     left: 0; | ||||
|     z-index: 99; | ||||
|     font-style: normal; | ||||
| } | ||||
|  | ||||
| .poweredby a { | ||||
|     color: #fff !important; | ||||
|     font-weight: bold; | ||||
| } | ||||
|  | ||||
| #site_nav_global_primary { | ||||
|     display: block; | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     left: 0; | ||||
|     z-index: 98; | ||||
|     background-color: #364A84; | ||||
|     width: 960px; | ||||
|     margin-left: -10px;  | ||||
|     margin-top: 0px; | ||||
|     height: 24px; | ||||
|     line-height: 20px; | ||||
|     text-align: right; | ||||
|     border-top: 10px solid #fff; | ||||
|     border-bottom: 1px solid #fff; | ||||
| } | ||||
|  | ||||
| #site_nav_global_primary ul { | ||||
|     margin-right: -15px; | ||||
|     float: right; | ||||
| } | ||||
|  | ||||
| #site_nav_global_primary li { | ||||
|     margin-right: 0px; | ||||
| } | ||||
|  | ||||
| #site_nav_global_primary li:last-child { | ||||
|     margin-right: 16px; | ||||
| } | ||||
|  | ||||
| #site_nav_global_primary a { | ||||
|     color: #fff !important; | ||||
|     text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5); | ||||
|     padding: 2px 12px 2px 12px; | ||||
|     height: 20px; | ||||
|     display: block; | ||||
|     float: left; | ||||
| } | ||||
|  | ||||
| #site_nav_global_primary a:hover { | ||||
|     color: #fff !important; | ||||
|     text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5); | ||||
|     background: #4c619c; | ||||
|     text-decoration: none; | ||||
| } | ||||
|  | ||||
| #site_notice { | ||||
|     color: #000; | ||||
|     float: right; | ||||
|     width: 280px; | ||||
|     padding: 10px;  | ||||
|     margin-left: 40px; | ||||
|     -webkit-border-radius: 6px; | ||||
|     -moz-border-radius: 6px; | ||||
|     border-radius: 6px; | ||||
| } | ||||
|  | ||||
| #site_notice a { | ||||
|     color: #3e3e8c; | ||||
| } | ||||
|  | ||||
| #anon_notice { | ||||
|     color: #000; | ||||
|     clear: both; | ||||
|     background: none; | ||||
|     padding: 0px; | ||||
|     margin-bottom: 10px; | ||||
| } | ||||
|  | ||||
| #anon_notice a { | ||||
|     color: #3e3e8c; | ||||
| } | ||||
|  | ||||
| .form_notice { | ||||
|     float: right; | ||||
|     margin-top: 0px; | ||||
|     width: 460px; | ||||
|     -webkit-border-radius: 6px; | ||||
|     -moz-border-radius: 6px; | ||||
|     border-radius: 6px; | ||||
|     background: #cdd1dd; | ||||
| } | ||||
|  | ||||
| .form_notice fieldset { | ||||
|     width: 100%; | ||||
| } | ||||
|  | ||||
| .form_notice textarea { | ||||
|     width: 328px; | ||||
|     height: 54px; | ||||
|     -webkit-border-radius: 6px; | ||||
|     -moz-border-radius: 6px; | ||||
|     border-radius: 6px; | ||||
| } | ||||
|  | ||||
| .form_notice label[for=notice_data-attach], | ||||
| .form_notice #notice_data-attach { | ||||
|     top: 27px; | ||||
|     right: 86px; | ||||
| } | ||||
|  | ||||
| .form_notice #notice_data-geo_wrap label, | ||||
| .form_notice #notice_data-geo_wrap input { | ||||
|     top: 52px; | ||||
|     right: 86px; | ||||
| } | ||||
|  | ||||
| .form_notice #notice_action-submit { | ||||
|     font-size: 0.9em; | ||||
|     top: 80px; | ||||
| 	right: -2px; | ||||
|     height: 2.4em; | ||||
|     width: 106px; | ||||
| } | ||||
|  | ||||
| .form_notice .error, | ||||
| .form_notice .success { | ||||
|     width: 341px; | ||||
| } | ||||
|  | ||||
| .form_notice .error { | ||||
|     margin-left: 0px; | ||||
| } | ||||
|  | ||||
| #core { | ||||
|     clear: both; | ||||
|     margin: 0px; | ||||
|     width: 940px; | ||||
|     margin-left: 0px; | ||||
|     margin-top: 4px; | ||||
| } | ||||
|  | ||||
| #content { | ||||
|     padding-top: 10px; | ||||
|     width: 610px; | ||||
|     margin-right: 0px; | ||||
|     padding-left: 10px; | ||||
|     padding-right: 20px; | ||||
| } | ||||
|  | ||||
| #site_nav_local_views { | ||||
|     background-color: #7080aa; | ||||
|     -webkit-border-top-left-radius: 6px; | ||||
|     -webkit-border-top-right-radius: 6px; | ||||
|     -moz-border-radius-topleft: 6px; | ||||
|     -moz-border-radius-topright: 6px; | ||||
|     border-top-left-radius: 6px; | ||||
|     border-top-right-radius: 6px; | ||||
|     height: 24px; | ||||
|     line-height: 20px; | ||||
|     margin-bottom: 0px; | ||||
|     padding-left: 0px; | ||||
| } | ||||
|  | ||||
| #site_nav_local_views a { | ||||
|     color: #fff !important; | ||||
|     padding: 2px 12px 2px 12px; | ||||
|     display: block; | ||||
|     float: left; | ||||
|     height: 20px; | ||||
|     width: auto; | ||||
|     text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5); | ||||
| } | ||||
|  | ||||
| #site_nav_local_views li:first-child a { | ||||
|     -webkit-border-top-left-radius: 6px; | ||||
|     -moz-border-radius-topleft: 6px; | ||||
|     border-top-left-radius: 6px; | ||||
| } | ||||
|  | ||||
| #site_nav_local_views a:hover { | ||||
|     background: #8e98b4 !important; | ||||
|     color: #fff !important; | ||||
|     text-decoration: none; | ||||
| } | ||||
|  | ||||
| #site_nav_local_views .current a { | ||||
|     text-decoration: none; | ||||
|     background: #8e98b4 !important; | ||||
|     color: #fff !important; | ||||
| } | ||||
|  | ||||
| #aside_primary { | ||||
|     width: 290px; | ||||
|     padding-left: 10px; | ||||
|     padding-top: 14px; | ||||
| } | ||||
|  | ||||
| #aside_primary .section { | ||||
|     width: 280px; | ||||
|     margin-left: 0px; | ||||
|     margin-right: 10px; | ||||
|  | ||||
| } | ||||
|  | ||||
| #aside_primary h2 { | ||||
|     font-size: 1.4em; | ||||
|     margin-bottom: 8px; | ||||
|     border-bottom: 2px solid #fff; | ||||
| } | ||||
|  | ||||
| .section ul.entities { | ||||
|     width: 290px; | ||||
| } | ||||
|  | ||||
| .section .entities li { | ||||
|     margin-right: 17px; | ||||
|     margin-bottom: 10px; | ||||
|     width: 24px; | ||||
| } | ||||
|  | ||||
| #popular_notices .avatar { | ||||
|     position: relative; | ||||
|     top: 2px; | ||||
|     margin-bottom: 4px; | ||||
| } | ||||
|  | ||||
| #aside_primary td { | ||||
|     padding-right: 20px; | ||||
|     padding-bottom: 14px; | ||||
| } | ||||
|  | ||||
| #aside_primary td .nickname { | ||||
|     line-height: 1.6em; | ||||
| } | ||||
|  | ||||
| .section .avatar { | ||||
|     box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); | ||||
|     -moz-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); | ||||
|     -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); | ||||
| } | ||||
|  | ||||
| #content h1 { | ||||
|     margin-bottom: 8px; | ||||
|     border-bottom: 2px solid #f2f2f2; | ||||
| } | ||||
|  | ||||
| #notices_primary { | ||||
|     margin-top: -5px; | ||||
| } | ||||
|  | ||||
| #content .notice { | ||||
|     padding-bottom: 14px; | ||||
|     border-bottom: 2px dotted #eee; | ||||
| } | ||||
|  | ||||
| .notice { | ||||
|     line-height: 1.35em; | ||||
|     margin-bottom: 10px; | ||||
| } | ||||
|  | ||||
| #content .notice .author .photo { | ||||
|     left: 0px; | ||||
|     top: 6px; | ||||
| } | ||||
|  | ||||
| #content .notice .entry-title { | ||||
|     min-height: 34px; | ||||
| } | ||||
|  | ||||
| #showstream .notice .entry-title { | ||||
|     min-height: 1px; | ||||
| } | ||||
|  | ||||
| #shownotice .notice .entry-title { | ||||
|     min-height:123px; | ||||
| } | ||||
|  | ||||
| .notice div.entry-content { | ||||
|     font-size: 0.9em; | ||||
|     line-height: 1.2em; | ||||
|     margin-top: 6px; | ||||
|     opacity: 0.6; | ||||
| } | ||||
|  | ||||
| .notice:hover div.entry-content { | ||||
|     opacity: 1; | ||||
| } | ||||
|  | ||||
| .user_in .notice div.entry-content { | ||||
|     max-width: 440px; | ||||
| } | ||||
|  | ||||
| div.entry-content a.response:before { | ||||
| 	content: "("; | ||||
| } | ||||
|  | ||||
| div.entry-content a.response:after { | ||||
| 	content: ")"; | ||||
| } | ||||
|  | ||||
| .notice-options { | ||||
|     margin-top: 4px; | ||||
| } | ||||
|  | ||||
| .pagination { | ||||
|     height: 1.2em; | ||||
| } | ||||
|  | ||||
| #jOverlayContent button { | ||||
|     top: 20px; | ||||
|     right: 36px; | ||||
| } | ||||
|  | ||||
| .entity_profile { | ||||
|     float: left; | ||||
|     width: 435px; | ||||
|     margin-top: 4px; | ||||
| } | ||||
|  | ||||
| .entity_profile .entity_depiction { | ||||
|     margin-top: 4px; | ||||
| } | ||||
|  | ||||
| .entity_actions { | ||||
|     width: 140px; | ||||
|     margin-top: 8px; | ||||
|     margin-bottom: 10px; | ||||
| } | ||||
|  | ||||
| .entity_actions a, .entity_actions p, .entity_actions .entity_subscribe input, .entity_actions .entity_block input, .entity_actions .entity_moderation input, .entity_actions .entity_role input, .entity_actions .entity_nudge input, .entity_actions .entity_delete input { | ||||
|    	text-shadow:0 1px 0 rgba(255,255,255,0.4); | ||||
|     border-radius: 4px; | ||||
|     -moz-border-radius: 4px; | ||||
|     -webkit-border-radius: 4px; | ||||
|     background-color: #CDD1DD !important; | ||||
| } | ||||
|  | ||||
| .entity_moderation:hover ul, | ||||
| .entity_role:hover ul { | ||||
|     border-radius: 4px; | ||||
|     -moz-border-radius: 4px; | ||||
|     -webkit-border-radius: 4px; | ||||
| } | ||||
|  | ||||
| .entity_send-a-message .form_notice legend { | ||||
|    	text-shadow:0 1px 0 rgba(255,255,255,0.4); | ||||
| } | ||||
|  | ||||
| .entity_send-a-message .form_notice { | ||||
|     border: 1px solid #7B4E82; | ||||
| } | ||||
|  | ||||
| .entity_send-a-message .form_notice #notice_action-submit { | ||||
|     color: #fff !important; | ||||
|     top: 46px; | ||||
| } | ||||
|  | ||||
| #aside_primary #entity_remote_subscribe a:hover { | ||||
|     background-color: #fff !important; | ||||
| } | ||||
|  | ||||
| #entity_remote_subscribe .dialogbox { | ||||
|     border: 1px solid #7B4E82; | ||||
|     border-radius: 8px; | ||||
| 	-moz-border-radius: 8px; | ||||
| 	-webkit-border-radius: 8px; | ||||
| } | ||||
|  | ||||
| #entity_remote_subscribe input { | ||||
|     padding-left: 4px; | ||||
| } | ||||
|  | ||||
| #entity_remote_subscribe .submit_dialogbox { | ||||
|     margin-top: 10px; | ||||
|     float: right; | ||||
| } | ||||
|  | ||||
| #filter_tags_item .submit { | ||||
|   left: 6px; | ||||
|   top: -3px; | ||||
| } | ||||
|  | ||||
| .pagination { | ||||
|     height: 1.2em; | ||||
|     padding-bottom: 12px; | ||||
|     -webkit-border-radius: 6px; | ||||
|     -moz-border-radius: 6px; | ||||
|     border-radius: 6px; | ||||
| } | ||||
|  | ||||
| #footer { | ||||
|     color: #000; | ||||
|     margin-left: 0px; | ||||
|     margin-right: 0px; | ||||
|     -webkit-border-top-left-radius: 6px; | ||||
|     -webkit-border-top-right-radius: 6px; | ||||
|     -moz-border-radius-topleft: 6px; | ||||
|     -moz-border-radius-topright: 6px; | ||||
|     border-top-left-radius: 6px; | ||||
|     border-top-right-radius: 6px; | ||||
| } | ||||
|  | ||||
| #footer a { | ||||
|     color: #3e3e8c; | ||||
| } | ||||
|  | ||||
| .error, .success { | ||||
|     background-color: #F7E8E8; | ||||
|     padding: 4px; | ||||
|     -webkit-border-radius: 6px; | ||||
|     -moz-border-radius: 6px; | ||||
|     border-radius: 6px; | ||||
| } | ||||
| .success { | ||||
|     background-color: #f2f2f2; | ||||
| } | ||||
|  | ||||
| .form_notice input.submit, .form_settings input.submit, .form_settings input.cancel { | ||||
|     border-radius: 3px; | ||||
|     -moz-border-radius: 3px; | ||||
|     -webkit-border-radius: 3px; | ||||
|     text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5); | ||||
|     color:#fff; | ||||
|     font-weight: normal; | ||||
|     font-size: 1em; | ||||
|     height: 2.2em; | ||||
|     padding-left: 1em; | ||||
|     padding-right: 1em; | ||||
|     background: #7080aa; | ||||
|     background: -moz-linear-gradient(top, #7b8dbb , #7080aa); | ||||
|     background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7b8dbb), color-stop(100%,#7080aa));  | ||||
|     filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7b8dbb', endColorstr='#7080aa',GradientType=0 ); | ||||
|     border-width: 1px; | ||||
| } | ||||
|  | ||||
| .form_notice input.submit:hover, .form_settings input.submit:hover, .form_settings input.cancel:hover { | ||||
|     text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.8); | ||||
|     background: #7b8dbb; | ||||
|     background: -moz-linear-gradient(top, #7080aa , #7b8dbb); | ||||
|     background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7080aa), color-stop(100%,#7b8dbb)); | ||||
|     filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7080aa', endColorstr='#7b8dbb',GradientType=0 ); | ||||
| } | ||||
|  | ||||
| .form_settings input#settings_design_reset, .form_settings input.cancel { | ||||
|     background: #e2e2e2; | ||||
|     color: #8e181b; | ||||
|     text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.5); | ||||
| } | ||||
|  | ||||
| .form_settings input#settings_design_reset:hover, .form_settings input.cancel:hover { | ||||
|     background: #f2f2f2; | ||||
|     color: #8e181b; | ||||
|     text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.5); | ||||
| } | ||||
|  | ||||
| .form_settings input.checkbox, .form_settings input.radio { | ||||
|     margin-left: 24%; | ||||
|     margin-top: 2px; | ||||
|     position: relative; | ||||
|     left: -14px; | ||||
| } | ||||
|  | ||||
| .form_settings label.checkbox, .form_settings label.radio { | ||||
|     width: auto; | ||||
|     max-width: 60%; | ||||
|     position: relative; | ||||
|     left: -30px; | ||||
| } | ||||
|  | ||||
| .form_settings li input.radio { | ||||
|     clear: left; | ||||
| } | ||||
|  | ||||
| .form_settings label.radio { | ||||
|     margin-left: 10px; | ||||
|     margin-right: 10px; | ||||
|     text-align: left; | ||||
| } | ||||
|  | ||||
| #form_login p.form_guide, #form_register #settings_rememberme p.form_guide, #form_openid_login #settings_rememberme p.form_guide, #settings_twitter_remove p.form_guide, #design_background-image_onoff p.form_guide { | ||||
|     margin-left: 26%; | ||||
| } | ||||
|  | ||||
| #form_search ul.form_data #q { | ||||
|     margin-left: 10px; | ||||
| } | ||||
|  | ||||
| .form_settings fieldset fieldset { | ||||
|     margin-bottom: 30px; | ||||
|     padding-top: 25px; | ||||
| } | ||||
|  | ||||
|  | ||||
| #content thead th { | ||||
| text-align:left; | ||||
| } | ||||
| #content tbody th { | ||||
| vertical-align:top; | ||||
| text-align:left; | ||||
| font-weight:normal; | ||||
| padding-top:11px; | ||||
| padding-right:18px; | ||||
| } | ||||
| #content tbody tr { | ||||
|     border-top: 1px dotted #bbb; | ||||
| } | ||||
| #content td { | ||||
| padding:11px 18px 11px 0; | ||||
| vertical-align:top; | ||||
| } | ||||
| #content td:last-child { | ||||
| padding-right:0; | ||||
| } | ||||
|  | ||||
|  | ||||
| #realtime_actions { | ||||
|     position: relative !important; | ||||
|     float: right; | ||||
|     padding-top: 15px; | ||||
|     margin-bottom: -8px !important; | ||||
| } | ||||
|  | ||||
| .realtime-popup #content { | ||||
|     padding-left: 4px !important; | ||||
|     padding-right: 4px !important; | ||||
|     margin-right: 0px; | ||||
| } | ||||
|  | ||||
| .realtime-popup .form_notice textarea { | ||||
|     width: 325px !important; | ||||
| } | ||||
|  | ||||
| .realtime-popup .form_notice #notice_action-submit { | ||||
|     top: 59px !important; | ||||
|     right: 6px !important; | ||||
| } | ||||
|  | ||||
| .realtime-popup .form_notice label[for=notice_data-attach], .realtime-popup .form_notice #notice_data-attach { | ||||
|     right: 74px; | ||||
|     top: 3px !important; | ||||
| } | ||||
|  | ||||
| .realtime-popup .form_notice #notice_data-geo_wrap label, .realtime-popup .form_notice #notice_data-geo_wrap input { | ||||
|     right: 8px; | ||||
|     top: 3px !important; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* Bookmark specific styles */ | ||||
|  | ||||
| #content .bookmark .entry-title { | ||||
|     margin-left: 0px; | ||||
| } | ||||
|  | ||||
| .bookmark h3 { | ||||
|     margin: 0px 0px 8px 0px; | ||||
|     float: left; | ||||
|     line-height: 1.2em; | ||||
|     max-width: 92%; | ||||
| } | ||||
|  | ||||
| .bookmark-notice-count { | ||||
|     border-radius: 4px; | ||||
| 	-moz-border-radius: 4px; | ||||
| 	-webkit-border-radius: 4px; | ||||
|     padding: 1px 6px; | ||||
|     font-size: 1.2em; | ||||
|     line-height: 1.2em; | ||||
|     background: #fff; | ||||
|     border: 1px solid #7b8dbb; | ||||
|     color: #3e3e8c !important; | ||||
|     position: relative; | ||||
|     right: 4px; | ||||
|     margin-left: 10px; | ||||
| } | ||||
|  | ||||
| .bookmark-notice-count:hover { | ||||
|     text-decoration: none; | ||||
|     background: #f2f2f2; | ||||
|     border: 1px solid #7b8dbb; | ||||
|     text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.5); | ||||
| } | ||||
|  | ||||
| .notice .bookmark-description { | ||||
|     clear: both; | ||||
|     margin-left: 0px; | ||||
|     margin-bottom: 0px; | ||||
| } | ||||
|  | ||||
| .notice .bookmark-author { | ||||
|     margin-left: 0px; | ||||
|     float: left; | ||||
| } | ||||
|  | ||||
| .bookmark-tags { | ||||
|     clear: both; | ||||
|     margin-bottom: 8px; | ||||
|     line-height: 1.6em; | ||||
| } | ||||
|  | ||||
| ul.bookmark-tags a { | ||||
|     border-radius: 4px; | ||||
| 	-moz-border-radius: 4px; | ||||
| 	-webkit-border-radius: 4px; | ||||
|     padding: 1px 6px; | ||||
|     background: #f2f2f2; | ||||
|     color: #3e3e8c !important; | ||||
|     text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.5); | ||||
|     font-size: 0.9em; | ||||
| } | ||||
|  | ||||
| ul.bookmark-tags a:hover { | ||||
|     background-color: #cdd1dd; | ||||
|     text-decoration: none; | ||||
| } | ||||
|  | ||||
| .bookmark-avatar { | ||||
|     float: none !important; | ||||
|     position: relative; | ||||
|     top: 2px; | ||||
| } | ||||
|  | ||||
| .bookmark div.entry-content { | ||||
|     font-size: 0.9em; | ||||
|     line-height: 1.2em; | ||||
|     margin-top: 6px; | ||||
|     opacity: 0.6; | ||||
|     margin-bottom: 0px; | ||||
| } | ||||
|  | ||||
| .bookmark:hover div.entry-content { | ||||
|     opacity: 1; | ||||
| } | ||||
|  | ||||
| .bookmark .notice-options { | ||||
|     margin-top: 16px; | ||||
| } | ||||
|  | ||||
| #bookmarkpopup { | ||||
|     min-width: 600px; | ||||
|     margin-top: 0px; | ||||
|     height: 100%; | ||||
|     border: 10px solid #364A84; | ||||
|     background: #364A84; | ||||
| } | ||||
|  | ||||
| #bookmarkpopup #wrap { | ||||
|     width: auto; | ||||
|     min-width: 560px; | ||||
|     padding: 40px 0px 25px 0px; | ||||
|     margin-right: 2px; | ||||
|     background: #fff url(../mobilelogo.png) no-repeat 6px 6px; | ||||
| } | ||||
|  | ||||
| #bookmarkpopup #header { | ||||
|     width: auto; | ||||
|     padding: 0px 10px; | ||||
| } | ||||
|  | ||||
| #bookmarkpopup .form_settings label { | ||||
|     margin-top: 2px; | ||||
|     text-align: right; | ||||
|     width: 24%; | ||||
|     font-size: 1.2em; | ||||
| } | ||||
|  | ||||
| #bookmarkpopup .form_settings .form_data input { | ||||
|     width: 60%; | ||||
| } | ||||
|  | ||||
| #bookmarkpopup .form_guide { | ||||
|     color: #777; | ||||
| } | ||||
|  | ||||
| #bookmarkpopup #submit { | ||||
|     float: right; | ||||
|     margin-right: 0px; | ||||
| } | ||||
|  | ||||
| #bookmarkpopup fieldset fieldset { | ||||
|     margin-bottom: 10px; | ||||
| } | ||||
|  | ||||
| /* Onboard specific styles */ | ||||
|  | ||||
| .onboard-flash { | ||||
|     border-radius: 6px; | ||||
|  	-moz-border-radius: 6px; | ||||
|    	-webkit-border-radius: 6px; | ||||
|     font-size: 1.1em; | ||||
|     box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.5); | ||||
|     -moz-box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.5); | ||||
|     -webkit-box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.5); | ||||
| } | ||||
|  | ||||
| .onboard-flash p { | ||||
|     margin-bottom: 10px; | ||||
| } | ||||
|  | ||||
| .onboard-flash .next:before { | ||||
|     content: '\00BB'; | ||||
|     padding-right: 6px; | ||||
| } | ||||
|  | ||||
| .onboard-breadcrumbs { | ||||
|     margin-bottom: 16px !important; | ||||
| } | ||||
|  | ||||
| .onboard-breadcrumbs li { | ||||
|     background: none !important; | ||||
|     border-top: none !important; | ||||
|     padding: 6px 12px 2px 0px !important; | ||||
| } | ||||
|  | ||||
| .onboard-breadcrumbs li:last-child { | ||||
|     padding-right: 0px !important; | ||||
| } | ||||
|  | ||||
| .onboard-breadcrumbs a { | ||||
|     text-decoration: none; | ||||
| } | ||||
|  | ||||
| .onboard-breadcrumbs a:hover { | ||||
|     color: #3e3e8c !important; | ||||
| } | ||||
|  | ||||
| /* Billing specific styles */ | ||||
|  | ||||
| #content table.billing_info { | ||||
|     margin-top: 10px; | ||||
|     background:rgba(240, 240, 240, 0.4); | ||||
| } | ||||
|  | ||||
| #content table.billing_info th { | ||||
|     text-align: right; | ||||
|     width: 50%; | ||||
| } | ||||
|  | ||||
| .invalid { | ||||
|     border: solid 2px red !important; | ||||
| } | ||||
|  | ||||
| #payment_history table { | ||||
|     width: 100%; | ||||
| } | ||||
|  | ||||
| #billingadminpanel .form_settings input { | ||||
|     margin-right: 0px; | ||||
| } | ||||
|  | ||||
| }/*end of @media screen, projection, tv*/ | ||||
							
								
								
									
										81
									
								
								theme/cleaner/css/ie.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								theme/cleaner/css/ie.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| /* Temporary copy of base styles for overriding */ | ||||
|  | ||||
| input.checkbox, | ||||
| input.radio { | ||||
| top:0; | ||||
| } | ||||
| .form_notice textarea { | ||||
|     width: 328px; | ||||
| } | ||||
| .form_notice .form_note + label { | ||||
| position:absolute; | ||||
| top:25px; | ||||
| left:83%; | ||||
| text-indent:-9999px; | ||||
| height:16px; | ||||
| width:16px; | ||||
| display:block; | ||||
|     left: 390px; | ||||
|     top: 27px; | ||||
| } | ||||
| .form_notice #notice_action-submit { | ||||
|     width: 106px; | ||||
|     max-width: 106px; | ||||
| } | ||||
| .form_notice #notice_data-attach_selected, | ||||
| .form_notice #notice_data-geo_selected { | ||||
| width:78.75%; | ||||
| } | ||||
| .form_notice #notice_data-attach_selected button, | ||||
| .form_notice #notice_data-geo_selected button { | ||||
| padding:0 4px; | ||||
| } | ||||
| .notice-options input.submit { | ||||
| font-size:0; | ||||
| text-align:right; | ||||
| text-indent:0; | ||||
| } | ||||
| .notice div.entry-content .timestamp a { | ||||
| margin-right:4px; | ||||
| } | ||||
| .entity_profile { | ||||
| width:64%; | ||||
| } | ||||
| .notice { | ||||
| z-index:1; | ||||
| } | ||||
| .notice:hover { | ||||
| z-index:9999; | ||||
| } | ||||
| .notice .thumbnail img { | ||||
| z-index:9999; | ||||
| } | ||||
|  | ||||
| .form_settings fieldset fieldset legend { | ||||
| line-height:auto; | ||||
| } | ||||
|  | ||||
| /* IE specific styles */ | ||||
|  | ||||
| #site_nav_global_primary ul { | ||||
|     margin-right: 0px; | ||||
| } | ||||
|  | ||||
| .notice-options input.submit { | ||||
|     color:#FFFFFF; | ||||
| } | ||||
|  | ||||
| .form_notice #notice_data-attach { | ||||
|     filter: alpha(opacity=0); | ||||
| } | ||||
|  | ||||
| .form_notice .form_note + label { | ||||
|     background:transparent url(../../rebase/images/icons/icons-01.gif) no-repeat 0 -328px; | ||||
| } | ||||
|  | ||||
| .form_notice #notice_data-geo_wrap label { | ||||
|    background:transparent url(../../rebase/images/icons/icons-01.gif) no-repeat 0 -1780px; | ||||
| } | ||||
| .form_notice #notice_data-geo_wrap label.checked { | ||||
|    background:transparent url(../../rebase/images/icons/icons-01.gif) no-repeat 0 -1846px; | ||||
| } | ||||
							
								
								
									
										204
									
								
								theme/cleaner/css/mp-screen.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								theme/cleaner/css/mp-screen.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,204 @@ | ||||
| /* mobile style */ | ||||
|  | ||||
| body { | ||||
|     background-image: none; | ||||
|     min-width: 0; | ||||
| } | ||||
|  | ||||
| #wrap { | ||||
|     margin: 0; | ||||
|     padding: 0; | ||||
|     min-width:0; | ||||
|     max-width:100%; | ||||
| } | ||||
|  | ||||
| #header { | ||||
|     width: 96%; | ||||
|     padding: 0 2%; | ||||
|     padding-top: 20px; | ||||
| } | ||||
|  | ||||
| .user_in #header { | ||||
|     padding-top: 40px; | ||||
| } | ||||
|  | ||||
| address { | ||||
| margin:1em 0 0 0; | ||||
| float:left; | ||||
| width:100%; | ||||
| } | ||||
|  | ||||
| address img + .fn { | ||||
| display:block; | ||||
| margin-top:1em; | ||||
|     margin-right: 10px; | ||||
| clear: left; | ||||
| float:left; | ||||
| } | ||||
|  | ||||
| #site_nav_global_primary { | ||||
|     margin:0; | ||||
|     width: 100%; | ||||
|     padding: 4px 0; | ||||
|     height: auto; | ||||
|     position:absolute; | ||||
|     top:0; | ||||
|     left:0; | ||||
|     font-size: 1em; | ||||
| 	letter-spacing: 0em; | ||||
|     border-top: none; | ||||
| } | ||||
|  | ||||
| #site_nav_global_primary li { | ||||
|     margin-left:0; | ||||
|     margin-right:0px; | ||||
|     float:left; | ||||
|     font-size:0.9em; | ||||
|     padding: 2px 4px; | ||||
|     line-height: 1em; | ||||
|     height: auto; | ||||
| } | ||||
|  | ||||
| #site_nav_global_primary li a { | ||||
|     height: auto; | ||||
| } | ||||
|  | ||||
| .form_notice { | ||||
|     float: left; | ||||
|     margin-left: 0px; | ||||
|     width: 300px; | ||||
|     padding: 4px; | ||||
| } | ||||
|  | ||||
| #form_notice-direct.form_notice { | ||||
|     padding-top: 10px; | ||||
| } | ||||
|  | ||||
| .form_notice textarea { | ||||
|     width: 210px; | ||||
|     height: 50px; | ||||
|     padding: 4px; | ||||
| } | ||||
|  | ||||
| #notice_text-count { | ||||
| position:absolute; | ||||
| bottom:2px; | ||||
|     left: 175px; | ||||
|     font-size: 0.8em; | ||||
| z-index:9; | ||||
| } | ||||
|  | ||||
| #form_notice-direct.form_notice #notice_text-count { | ||||
|     left: 0px; | ||||
| } | ||||
|  | ||||
| /*input type=file no good in | ||||
| iPhone/iPod Touch, Android, Opera Mini Simulator | ||||
| */ | ||||
| .form_notice #notice_text-count + label, | ||||
| .form_notice label[for="notice_data-attach"] { | ||||
| display:none; | ||||
| } | ||||
| .form_notice #notice_data-attach { | ||||
| position:static; | ||||
| clear:both; | ||||
| width:65%; | ||||
| height:auto; | ||||
| display:block; | ||||
| z-index:9; | ||||
| padding:0; | ||||
| margin:0; | ||||
| background:none; | ||||
| opacity:1; | ||||
| } | ||||
|  | ||||
| .form_notice #notice_action-submit { | ||||
|     text-align: center; | ||||
|     left: 230px; | ||||
|     top: 32px; | ||||
|     width: 70px; | ||||
|     font-size: 0.8em; | ||||
| } | ||||
|  | ||||
| #form_notice-direct.form_notice #notice_action-submit { | ||||
|     top: 62px; | ||||
| } | ||||
|  | ||||
| #site_nav_local_views { | ||||
|     height: auto; | ||||
|     font-size: 0.9em; | ||||
|     line-height: 2em; | ||||
|     margin-bottom: 0px; | ||||
|     padding-left: 4px; | ||||
|     background: none; | ||||
| } | ||||
|  | ||||
| #site_nav_local_views li { | ||||
|     margin-right: 6px; | ||||
| } | ||||
|  | ||||
| #site_nav_local_views a { | ||||
|     background-color: #7080aa; | ||||
|     -webkit-border-radius: 6px; | ||||
|     -moz-border-radius: 6px; | ||||
|     border-radius: 6px; | ||||
|     margin-right: 2px; | ||||
|     margin-bottom: 2px; | ||||
| } | ||||
|  | ||||
| #core { | ||||
|     width: 100%; | ||||
|     margin: 0; | ||||
| } | ||||
|  | ||||
| #content { | ||||
|     width: 96%; | ||||
|     padding: 10px 2%; | ||||
|     margin: 0; | ||||
|     min-height: auto; | ||||
| } | ||||
|  | ||||
| #footer { | ||||
|     margin: 0; | ||||
|     padding: 10px 4px 4px 4px; | ||||
| } | ||||
|  | ||||
|  | ||||
| .form_settings fieldset { | ||||
| margin-bottom:7px; | ||||
| } | ||||
|  | ||||
| .form_settings label { | ||||
| width:auto; | ||||
| display:block; | ||||
| float:none; | ||||
|     text-align: left; | ||||
| } | ||||
|  | ||||
| .form_settings .form_data li { | ||||
| margin-bottom:7px; | ||||
| } | ||||
|  | ||||
| .form_settings .form_data textarea, | ||||
| .form_settings .form_data select,  | ||||
| .form_settings .form_data input { | ||||
| margin-left:0; | ||||
| display:block; | ||||
| } | ||||
| .form_settings .form_data textarea { | ||||
| width:96.41%; | ||||
| } | ||||
|  | ||||
| .form_settings .form_data label { | ||||
| float:none; | ||||
| } | ||||
|  | ||||
| .form_settings .form_data p.form_guide { | ||||
| width:auto; | ||||
| margin-left:0; | ||||
| } | ||||
|  | ||||
| #settings_design_color .form_data { | ||||
|  width: auto; | ||||
|  margin-right: 0; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								theme/cleaner/default-avatar-mini.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								theme/cleaner/default-avatar-mini.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 857 B | 
							
								
								
									
										
											BIN
										
									
								
								theme/cleaner/default-avatar-profile.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								theme/cleaner/default-avatar-profile.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 3.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								theme/cleaner/default-avatar-stream.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								theme/cleaner/default-avatar-stream.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								theme/cleaner/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								theme/cleaner/logo.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 34 KiB | 
							
								
								
									
										
											BIN
										
									
								
								theme/cleaner/mobilelogo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								theme/cleaner/mobilelogo.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 9.1 KiB | 
							
								
								
									
										1
									
								
								theme/cleaner/theme.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								theme/cleaner/theme.ini
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| include=rebase | ||||
		Reference in New Issue
	
	Block a user