Merge branch '0.9.x' into activityatompub

This commit is contained in:
Evan Prodromou 2010-12-09 11:27:55 -05:00
commit 2f2c47eca9
74 changed files with 837 additions and 98 deletions

View File

@ -130,14 +130,24 @@ class XRD
foreach ($this->links as $link) {
$titles = array();
$properties = array();
if (isset($link['title'])) {
$titles = $link['title'];
unset($link['title']);
}
if (isset($link['property'])) {
$properties = $link['property'];
unset($link['property']);
}
$xs->elementStart('Link', $link);
foreach ($titles as $title) {
$xs->element('Title', null, $title);
}
foreach ($properties as $property) {
$xs->element('Property',
array('type' => $property['type']),
$property['value']);
}
$xs->elementEnd('Link');
}

View File

@ -97,11 +97,24 @@ class XrdAction extends Action
'href' => common_local_url('foaf',
array('nickname' => $nick)));
$xrd->links[] = array('rel' => 'http://apinamespace.org/atom',
'type' => 'application/atomsvc+xml',
'href' => common_local_url('ApiAtomService', array('id' => $nick)));
if (common_config('site', 'fancy')) {
$apiRoot = common_path('api/', true);
} else {
$apiRoot = common_path('index.php/api/', true);
}
$xrd->links[] = array('rel' => 'http://apinamespace.org/twitter',
'href' => $apiRoot,
'property' => array(array('type' => 'http://apinamespace.org/twitter/username',
'value' => $nick)));
Event::handle('EndXrdActionLinks', array(&$xrd, $this->user));
}
header('Content-type: application/xrd+xml');
print $xrd->toXML();
}

View File

@ -0,0 +1,197 @@
<?php
/**
* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2010, StatusNet, Inc.
*
* Extra level of caching, in memory
*
* PHP version 5
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category Cache
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @copyright 2010 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
/**
* Extra level of caching
*
* This plugin adds an extra level of in-process caching to any regular
* cache system like APC, XCache, or Memcache.
*
* Note that since most caching plugins return false for StartCache*
* methods, you should add this plugin before them, i.e.
*
* addPlugin('InProcessCache');
* addPlugin('XCache');
*
* @category Cache
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @copyright 2010 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
class InProcessCachePlugin extends Plugin
{
private $_items = array();
private $_hits = array();
/**
* Get an item from the cache
*
* Called before other cache systems are called (iif this
* plugin was loaded correctly, see class comment). If we
* have the data, return it, and don't hit the other cache
* systems.
*
* @param string &$key Key to fetch
* @param mixed &$value Resulting value or false for miss
*
* @return boolean false if found, else true
*/
function onStartCacheGet(&$key, &$value)
{
if (array_key_exists($key, $this->_items)) {
$value = $this->_items[$key];
if (array_key_exists($key, $this->_hits)) {
$this->_hits[$key]++;
} else {
$this->_hits[$key] = 1;
}
Event::handle('EndCacheGet', array($key, &$value));
return false;
}
return true;
}
/**
* Called at the end of a cache get
*
* If we don't already have the data, we cache it. This
* keeps us from having to call the external cache if the
* key is requested again.
*
* @param string $key Key to fetch
* @param mixed &$value Resulting value or false for miss
*
* @return boolean hook value, true
*/
function onEndCacheGet($key, &$value)
{
if (!array_key_exists($key, $this->_items) ||
$this->_items[$key] != $value) {
$this->_items[$key] = $value;
}
return true;
}
/**
* Called at the end of setting a cache element
*
* Always set the cache element; may overwrite existing
* data.
*
* @param string $key Key to fetch
* @param mixed $value Resulting value or false for miss
* @param integer $flag ignored
* @param integer $expiry ignored
*
* @return boolean true
*/
function onEndCacheSet($key, $value, $flag, $expiry)
{
$this->_items[$key] = $value;
return true;
}
/**
* Called at the end of deleting a cache element
*
* If stuff's deleted from the other cache, we
* delete it too.
*
* @param string &$key Key to delete
* @param boolean &$success Success flag; ignored
*
* @return boolean true
*/
function onStartCacheDelete(&$key, &$success)
{
if (array_key_exists($key, $this->_items)) {
unset($this->_items[$key]);
}
return true;
}
/**
* Version info
*
* @param array &$versions Array of version blocks
*
* @return boolean true
*/
function onPluginVersion(&$versions)
{
$url = 'http://status.net/wiki/Plugin:InProcessCache';
$versions[] = array('name' => 'InProcessCache',
'version' => STATUSNET_VERSION,
'author' => 'Evan Prodromou',
'homepage' => $url,
'description' =>
_m('Additional in-process cache for plugins.'));
return true;
}
/**
* Cleanup function; called at end of process
*
* If the inprocess/stats config value is true, we dump
* stats to the log file
*
* @return boolean true
*/
function cleanup()
{
if (common_config('inprocess', 'stats')) {
$this->log(LOG_INFO, "cache size: " .
count($this->_items));
$sum = 0;
foreach ($this->_hits as $hitcount) {
$sum += $hitcount;
}
$this->log(LOG_INFO, $sum . " hits on " .
count($this->_hits) . " keys");
}
return true;
}
}

View File

@ -0,0 +1,14 @@
.fake: clean all
TARGETS=usermap-mxn-openlayers.min.js
CORE=js/mxn.js js/mxn.core.js
USERMAP=usermap.js
all: $(TARGETS)
clean:
rm -f $(TARGETS)
usermap-mxn-openlayers.min.js: $(CORE) js/mxn.openlayers.core.js $(USERMAP)
cat $+ | yui-compressor -o $@ --type=js

View File

@ -128,8 +128,8 @@ class MapstractionPlugin extends Plugin
$action->script('http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6');
break;
case 'openlayers':
// XXX: is this not nice...?
$action->script('http://openlayers.org/api/OpenLayers.js');
// Use our included stripped & minified OpenLayers.
$action->script(common_path('plugins/Mapstraction/OpenLayers/OpenLayers.js'));
break;
case 'yahoo':
$action->script(sprintf('http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=%s',
@ -140,11 +140,19 @@ class MapstractionPlugin extends Plugin
return true;
}
if ($this->provider == 'openlayers') {
// We have an optimized path for our default case.
//
// Note that OpenLayers.js needs to be separate, or it won't
// be able to find its UI images and styles.
$action->script(common_path('plugins/Mapstraction/usermap-mxn-openlayers.min.js'));
} else {
$action->script(sprintf('%s?(%s)',
common_path('plugins/Mapstraction/js/mxn.js'),
$this->provider));
$action->script(common_path('plugins/Mapstraction/usermap.js'));
}
$action->inlineScript(sprintf('var _provider = "%s";', $this->provider));

View File

@ -0,0 +1,15 @@
.fake: clean all
TARGET=OpenLayers.js
SOURCEDIR=OpenLayers-2.10/
HERE=`pwd`
all: $(TARGET)
clean:
rm -f $(TARGET)
$(TARGET): statusnet.cfg
cp -f statusnet.cfg $(SOURCEDIR)/build/statusnet.cfg
(cd $(SOURCEDIR)/build && ./build.py statusnet.cfg)
yui-compressor $(SOURCEDIR)/build/OpenLayers.js -o $(TARGET)

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,14 @@
The default OpenLayers.js file, minified, weighs in at a whopping 943kb uncompressed.
With gzip compression it's still over 200kb, so we're building a stripped-down copy
with just what we need.
Docs on how the stripping process works:
http://docs.openlayers.org/library/deploying.html
To recreate this OpenLayers.js file:
# get yui-compressor (install from apt, or set up a shell script or alias to the jar)
# download and decompress OpenLayers-2.10 zip or tgz
make clean && make
If necessary, change the relative path to the OpenLayers source directory in the Makefile.

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 992 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

View File

@ -0,0 +1,43 @@
# Modified lite.cfg for building an OpenLayers subset for StatusNet's Mapstraction plugin.
# This file includes a small subset of OpenLayers code, designed to be
# integrated into another application. It includes only the Layer types
# neccesary to create tiled or untiled WMS, and does not include any Controls.
# This is the result of what was at the time called "Webmap.js" at the FOSS4G
# Web Mapping BOF.
[first]
OpenLayers/SingleFile.js
OpenLayers.js
OpenLayers/BaseTypes.js
OpenLayers/BaseTypes/Class.js
OpenLayers/Util.js
[last]
[include]
OpenLayers/Map.js
OpenLayers/Layer/WMS.js
# Needed for Mapstraction on StatusNet
OpenLayers/Feature.js
OpenLayers/Feature/Vector.js
OpenLayers/Geometry.js
OpenLayers/Geometry/Point.js
OpenLayers/Geometry/LinearRing.js
OpenLayers/Geometry/LineString.js
OpenLayers/Icon.js
OpenLayers/Layer/Markers.js
OpenLayers/Layer/TMS.js
OpenLayers/Marker.js
OpenLayers/Popup.js
# Default controls, needed to keep the map dynamic
OpenLayers/Control/ArgParser.js
OpenLayers/Control/Attribution.js
OpenLayers/Control/Navigation.js
OpenLayers/Control/PanZoom.js
[exclude]

View File

@ -0,0 +1,10 @@
.olLayerGoogleCopyright {
right: 3px;
bottom: 2px;
left: auto;
}
.olLayerGooglePoweredBy {
left: 2px;
bottom: 2px;
}

View File

@ -0,0 +1,7 @@
.olControlZoomPanel div {
background-image: url(img/zoom-panel-NOALPHA.png);
}
.olControlPanPanel div {
background-image: url(img/pan-panel-NOALPHA.png);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,397 @@
div.olMap {
z-index: 0;
padding: 0px!important;
margin: 0px!important;
cursor: default;
}
div.olMapViewport {
text-align: left;
}
div.olLayerDiv {
-moz-user-select: none;
}
.olLayerGoogleCopyright {
left: 2px;
bottom: 2px;
}
.olLayerGooglePoweredBy {
left: 2px;
bottom: 15px;
}
.olControlAttribution {
font-size: smaller;
right: 3px;
bottom: 4.5em;
position: absolute;
display: block;
}
.olControlScale {
right: 3px;
bottom: 3em;
display: block;
position: absolute;
font-size: smaller;
}
.olControlScaleLine {
display: block;
position: absolute;
left: 10px;
bottom: 15px;
font-size: xx-small;
}
.olControlScaleLineBottom {
border: solid 2px black;
border-bottom: none;
margin-top:-2px;
text-align: center;
}
.olControlScaleLineTop {
border: solid 2px black;
border-top: none;
text-align: center;
}
.olControlPermalink {
right: 3px;
bottom: 1.5em;
display: block;
position: absolute;
font-size: smaller;
}
div.olControlMousePosition {
bottom: 0em;
right: 3px;
display: block;
position: absolute;
font-family: Arial;
font-size: smaller;
}
.olControlOverviewMapContainer {
position: absolute;
bottom: 0px;
right: 0px;
}
.olControlOverviewMapElement {
padding: 10px 18px 10px 10px;
background-color: #00008B;
-moz-border-radius: 1em 0 0 0;
}
.olControlOverviewMapMinimizeButton {
right: 0px;
bottom: 80px;
}
.olControlOverviewMapMaximizeButton {
right: 0px;
bottom: 80px;
}
.olControlOverviewMapExtentRectangle {
overflow: hidden;
background-image: url("img/blank.gif");
cursor: move;
border: 2px dotted red;
}
.olControlOverviewMapRectReplacement {
overflow: hidden;
cursor: move;
background-image: url("img/overview_replacement.gif");
background-repeat: no-repeat;
background-position: center;
}
.olLayerGeoRSSDescription {
float:left;
width:100%;
overflow:auto;
font-size:1.0em;
}
.olLayerGeoRSSClose {
float:right;
color:gray;
font-size:1.2em;
margin-right:6px;
font-family:sans-serif;
}
.olLayerGeoRSSTitle {
float:left;font-size:1.2em;
}
.olPopupContent {
padding:5px;
overflow: auto;
}
.olControlNavToolbar {
width:0px;
height:0px;
}
.olControlNavToolbar div {
display:block;
width: 28px;
height: 28px;
top: 300px;
left: 6px;
position: relative;
}
.olControlNavigationHistory {
background-image: url("img/navigation_history.png");
background-repeat: no-repeat;
width: 24px;
height: 24px;
}
.olControlNavigationHistoryPreviousItemActive {
background-position: 0px 0px;
}
.olControlNavigationHistoryPreviousItemInactive {
background-position: 0px -24px;
}
.olControlNavigationHistoryNextItemActive {
background-position: -24px 0px;
}
.olControlNavigationHistoryNextItemInactive {
background-position: -24px -24px;
}
.olControlNavToolbar .olControlNavigationItemActive {
background-image: url("img/panning-hand-on.png");
background-repeat: no-repeat;
}
.olControlNavToolbar .olControlNavigationItemInactive {
background-image: url("img/panning-hand-off.png");
background-repeat: no-repeat;
}
.olControlNavToolbar .olControlZoomBoxItemActive {
background-image: url("img/drag-rectangle-on.png");
background-color: orange;
background-repeat: no-repeat;
}
.olControlNavToolbar .olControlZoomBoxItemInactive {
background-image: url("img/drag-rectangle-off.png");
background-repeat: no-repeat;
}
.olControlEditingToolbar {
float:right;
right: 0px;
height: 30px;
width: 200px;
}
.olControlEditingToolbar div {
background-image: url("img/editing_tool_bar.png");
background-repeat: no-repeat;
float:right;
width: 24px;
height: 24px;
margin: 5px;
}
.olControlEditingToolbar .olControlNavigationItemActive {
background-position: -103px -23px;
}
.olControlEditingToolbar .olControlNavigationItemInactive {
background-position: -103px -0px;
}
.olControlEditingToolbar .olControlDrawFeaturePointItemActive {
background-position: -77px -23px;
}
.olControlEditingToolbar .olControlDrawFeaturePointItemInactive {
background-position: -77px -0px;
}
.olControlEditingToolbar .olControlDrawFeaturePathItemInactive {
background-position: -51px 0px;
}
.olControlEditingToolbar .olControlDrawFeaturePathItemActive {
background-position: -51px -23px;
}
.olControlEditingToolbar .olControlDrawFeaturePolygonItemInactive {
background-position: -26px 0px;
}
.olControlEditingToolbar .olControlDrawFeaturePolygonItemActive {
background-position: -26px -23px ;
}
div.olControlSaveFeaturesItemActive {
background-image: url(img/save_features_on.png);
background-repeat: no-repeat;
background-position: 0px 1px;
}
div.olControlSaveFeaturesItemInactive {
background-image: url(img/save_features_off.png);
background-repeat: no-repeat;
background-position: 0px 1px;
}
.olHandlerBoxZoomBox {
border: 2px solid red;
position: absolute;
background-color: white;
opacity: 0.50;
font-size: 1px;
filter: alpha(opacity=50);
}
.olHandlerBoxSelectFeature {
border: 2px solid blue;
position: absolute;
background-color: white;
opacity: 0.50;
font-size: 1px;
filter: alpha(opacity=50);
}
.olControlPanPanel {
top: 10px;
left: 5px;
}
.olControlPanPanel div {
background-image: url(img/pan-panel.png);
height: 18px;
width: 18px;
cursor: pointer;
position: absolute;
}
.olControlPanPanel .olControlPanNorthItemInactive {
top: 0px;
left: 9px;
background-position: 0px 0px;
}
.olControlPanPanel .olControlPanSouthItemInactive {
top: 36px;
left: 9px;
background-position: 18px 0px;
}
.olControlPanPanel .olControlPanWestItemInactive {
position: absolute;
top: 18px;
left: 0px;
background-position: 0px 18px;
}
.olControlPanPanel .olControlPanEastItemInactive {
top: 18px;
left: 18px;
background-position: 18px 18px;
}
.olControlZoomPanel {
top: 71px;
left: 14px;
}
.olControlZoomPanel div {
background-image: url(img/zoom-panel.png);
position: absolute;
height: 18px;
width: 18px;
cursor: pointer;
}
.olControlZoomPanel .olControlZoomInItemInactive {
top: 0px;
left: 0px;
background-position: 0px 0px;
}
.olControlZoomPanel .olControlZoomToMaxExtentItemInactive {
top: 18px;
left: 0px;
background-position: 0px -18px;
}
.olControlZoomPanel .olControlZoomOutItemInactive {
top: 36px;
left: 0px;
background-position: 0px 18px;
}
.olPopupCloseBox {
background: url("img/close.gif") no-repeat;
cursor: pointer;
}
.olFramedCloudPopupContent {
padding: 5px;
overflow: auto;
}
.olControlNoSelect {
-moz-user-select: none;
}
.olImageLoadError {
background-color: pink;
opacity: 0.5;
filter: alpha(opacity=50); /* IE */
}
/**
* Cursor styles
*/
.olCursorWait {
cursor: wait;
}
.olDragDown {
cursor: move;
}
.olDrawBox {
cursor: crosshair;
}
.olControlDragFeatureOver {
cursor: move;
}
.olControlDragFeatureActive.olControlDragFeatureOver.olDragDown {
cursor: -moz-grabbing;
}
/**
* Layer switcher
*/
.olControlLayerSwitcher {
position: absolute;
top: 25px;
right: 0px;
width: 20em;
font-family: sans-serif;
font-weight: bold;
margin-top: 3px;
margin-left: 3px;
margin-bottom: 3px;
font-size: smaller;
color: white;
background-color: transparent;
}
.olControlLayerSwitcher .layersDiv {
padding-top: 5px;
padding-left: 10px;
padding-bottom: 5px;
padding-right: 75px;
background-color: darkblue;
width: 100%;
height: 100%;
}
.olControlLayerSwitcher .layersDiv .baseLbl,
.olControlLayerSwitcher .layersDiv .dataLbl {
margin-top: 3px;
margin-left: 3px;
margin-bottom: 3px;
}
.olControlLayerSwitcher .layersDiv .baseLayersDiv,
.olControlLayerSwitcher .layersDiv .dataLayersDiv {
padding-left: 10px;
}
.olControlLayerSwitcher .maximizeDiv,
.olControlLayerSwitcher .minimizeDiv {
top: 5px;
right: 0px;
}

File diff suppressed because one or more lines are too long

View File

@ -78,20 +78,28 @@ class PiwikAnalyticsPlugin extends Plugin
*/
function onEndShowScripts($action)
{
$piwikCode1 = <<<ENDOFPIWIK
var pkBaseURL = (("https:" == document.location.protocol) ? "https://{$this->piwikroot}" : "http://{$this->piwikroot}");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
ENDOFPIWIK;
$piwikCode2 = <<<ENDOFPIWIK
// Slight modification to the default code.
// Loading the piwik.js file from a <script> created in a document.write
// meant that the browser had no way to preload it, ensuring that its
// loading will be synchronous, blocking further page rendering.
//
// User-agents understand protocol-relative links, so instead of the
// URL produced in JS we can just give a universal one. Since it's
// sitting there in the DOM ready to go, the browser can preload the
// file for us and we're less likely to have to wait for it.
$piwikUrl = '//' . $this->piwikroot . 'piwik.js';
$piwikCode = <<<ENDOFPIWIK
try {
var pkBaseURL = (("https:" == document.location.protocol) ? "https://{$this->piwikroot}" : "http://{$this->piwikroot}");
var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", {$this->piwikId});
piwikTracker.trackPageView();
piwikTracker.enableLinkTracking();
} catch( err ) {}
ENDOFPIWIK;
$action->inlineScript($piwikCode1);
$action->inlineScript($piwikCode2);
// Don't use $action->script() here; it'll try to preface the URL.
$action->element('script', array('type' => 'text/javascript', 'src' => $piwikUrl), ' ');
$action->inlineScript($piwikCode);
return true;
}

View File

@ -30,6 +30,7 @@ class TwitterQueueHandler extends QueueHandler
function handle($notice)
{
return broadcast_twitter($notice);
$ok = broadcast_twitter($notice);
return $ok || common_config('twitter', 'ignore_errors');
}
}