forked from GNUsocial/gnu-social
Update Mapstraction to properly scrape data from notice-list pages
Refactored the JavaScript for Mapstraction use so it scrapes data from the HTML of the page it's on, if possible, and otherwise generates a JSON array.
This commit is contained in:
parent
2c07d4a530
commit
a92228c713
@ -112,6 +112,11 @@ class MapstractionPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
$actionName = $action->trimmed('action');
|
$actionName = $action->trimmed('action');
|
||||||
|
|
||||||
|
if (!in_array($actionName,
|
||||||
|
array('showstream', 'all', 'usermap', 'allmap'))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
switch ($this->provider)
|
switch ($this->provider)
|
||||||
{
|
{
|
||||||
case 'cloudmade':
|
case 'cloudmade':
|
||||||
@ -143,9 +148,20 @@ class MapstractionPlugin extends Plugin
|
|||||||
|
|
||||||
$action->script(common_path('plugins/Mapstraction/usermap.js'));
|
$action->script(common_path('plugins/Mapstraction/usermap.js'));
|
||||||
|
|
||||||
$action->elementStart('script', array('type' => 'text/javascript'));
|
$action->inlineScript(sprintf('var _provider = "%s";', $this->provider));
|
||||||
$action->raw(sprintf('var _provider = "%s";', $this->provider));
|
|
||||||
$action->elementEnd('script');
|
// usermap and allmap handle this themselves
|
||||||
|
|
||||||
|
if (in_array($actionName,
|
||||||
|
array('showstream', 'all'))) {
|
||||||
|
$action->inlineScript('$(document).ready(function() { '.
|
||||||
|
' var user = null; '.
|
||||||
|
(($actionName == 'showstream') ? ' user = scrapeUser(); ' : '') .
|
||||||
|
' var notices = scrapeNotices(user); ' .
|
||||||
|
' console.log(notices); ' .
|
||||||
|
' showMapstraction($("#map_canvas"), notices); '.
|
||||||
|
'});');
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -128,12 +128,9 @@ class MapAction extends OwnerDesignAction
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->elementStart('script', array('type' => 'text/javascript'));
|
$this->inlineScript('$(document).ready(function() { '.
|
||||||
$this->raw('/*<![CDATA[*/'); // XHTML compat for Safari
|
' var _notices = ' . json_encode($jsonArray).'; ' .
|
||||||
$this->raw('var _notices = ' . json_encode($jsonArray).'; ');
|
'showMapstraction($("#map_canvas"), _notices); });');
|
||||||
$this->raw('showMapstraction($("#map_canvas"),_notices);');
|
|
||||||
$this->raw('/*]]>*/'); // XHTML compat for Safari
|
|
||||||
$this->elementEnd('script');
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,40 +1,32 @@
|
|||||||
$(document).ready(function() {
|
function scrapeNotices(user)
|
||||||
|
{
|
||||||
var notices = [];
|
var notices = [];
|
||||||
$(".notice").each(function(){
|
$(".notice").each(function(){
|
||||||
var notice = getNoticeFromElement($(this));
|
var notice = getNoticeFromElement($(this));
|
||||||
if(notice['geo'])
|
if (user) {
|
||||||
notices.push(notice);
|
notice['user'] = user;
|
||||||
|
} else {
|
||||||
|
notice['user'] = getUserFromElement($(this));
|
||||||
|
}
|
||||||
|
if(notice['geo'])
|
||||||
|
notices.push(notice);
|
||||||
});
|
});
|
||||||
if($("#map_canvas").length && notices.length>0)
|
|
||||||
{
|
|
||||||
showMapstraction($("#map_canvas"), notices);
|
|
||||||
}
|
|
||||||
|
|
||||||
$('.geo').click(function(){
|
return notices;
|
||||||
var noticeElement = $(this).closest(".notice");
|
}
|
||||||
notice = getNoticeFromElement(noticeElement);
|
|
||||||
|
|
||||||
$.fn.jOverlay.options = {
|
function scrapeUser()
|
||||||
color : '#000',
|
{
|
||||||
opacity : '0.6',
|
var avatarURL = $(".entity_profile .entity_depiction img.avatar").attr('src');
|
||||||
zIndex : 99,
|
var profileURL = $(".entity_profile .entity_nickname .url").attr('href');
|
||||||
center : false,
|
var nickname = $(".entity_profile .entity_nickname .nickname").text();
|
||||||
bgClickToClose : true,
|
|
||||||
autoHide : true,
|
|
||||||
css : {'max-width':'542px', 'top':'5%', 'left':'32.5%'}
|
|
||||||
};
|
|
||||||
var html="<div id='map_canvas_popup' class='gray smallmap' style='width: 542px; height: 500px' />";
|
|
||||||
html+="<button class='close'>×</button>";
|
|
||||||
html+=$("<div/>").append($(this).clone()).html();
|
|
||||||
$().jOverlay({ "html": html });
|
|
||||||
$('#jOverlayContent').show();
|
|
||||||
$('#jOverlayContent button').click($.closeOverlay);
|
|
||||||
|
|
||||||
showMapstraction($("#map_canvas_popup"), notice);
|
|
||||||
|
|
||||||
return false;
|
return {
|
||||||
});
|
'profile_image_url': avatarURL,
|
||||||
});
|
'profile_url': profileURL,
|
||||||
|
'screen_name': nickname
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function getMicroformatValue(element)
|
function getMicroformatValue(element)
|
||||||
{
|
{
|
||||||
@ -48,23 +40,34 @@ function getMicroformatValue(element)
|
|||||||
function getNoticeFromElement(noticeElement)
|
function getNoticeFromElement(noticeElement)
|
||||||
{
|
{
|
||||||
var notice = {};
|
var notice = {};
|
||||||
if(noticeElement.find(".geo").length){
|
|
||||||
|
if(noticeElement.find(".geo").length) {
|
||||||
var latlon = noticeElement.find(".geo").attr('title').split(";");
|
var latlon = noticeElement.find(".geo").attr('title').split(";");
|
||||||
notice['geo']={'coordinates': [
|
notice['geo']={'coordinates': [
|
||||||
parseFloat(latlon[0]),
|
parseFloat(latlon[0]),
|
||||||
parseFloat(latlon[1])] };
|
parseFloat(latlon[1])] };
|
||||||
}
|
}
|
||||||
notice['user']={
|
|
||||||
'profile_image_url': noticeElement.find("img.avatar").attr('src'),
|
notice['html'] = noticeElement.find(".entry-content").html();
|
||||||
'profile_url': noticeElement.find(".author a.url").attr('href'),
|
notice['url'] = noticeElement.find("a.timestamp").attr('href');
|
||||||
'screen_name': noticeElement.find(".author .nickname").text()
|
notice['created_at'] = noticeElement.find("abbr.published").text();
|
||||||
};
|
|
||||||
notice['html']=noticeElement.find(".entry-content").html();
|
|
||||||
notice['url']=noticeElement.find("a.timestamp").attr('href');
|
|
||||||
notice['created_at']=noticeElement.find("abbr.published").text();
|
|
||||||
return notice;
|
return notice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getUserFromElement(noticeElement)
|
||||||
|
{
|
||||||
|
var avatarURL = noticeElement.find("img.avatar").attr('src');
|
||||||
|
var profileURL = noticeElement.find(".author a.url").attr('href');
|
||||||
|
var nickname = noticeElement.find(".author .nickname").text();
|
||||||
|
|
||||||
|
return {
|
||||||
|
'profile_image_url': avatarURL,
|
||||||
|
'profile_url': profileURL,
|
||||||
|
'screen_name': nickname
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function showMapstraction(element, notices) {
|
function showMapstraction(element, notices) {
|
||||||
if(element instanceof jQuery) element = element[0];
|
if(element instanceof jQuery) element = element[0];
|
||||||
if(! $.isArray(notices)) notices = [notices];
|
if(! $.isArray(notices)) notices = [notices];
|
||||||
|
Loading…
Reference in New Issue
Block a user