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');
|
||||
|
||||
if (!in_array($actionName,
|
||||
array('showstream', 'all', 'usermap', 'allmap'))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
switch ($this->provider)
|
||||
{
|
||||
case 'cloudmade':
|
||||
@ -143,9 +148,20 @@ class MapstractionPlugin extends Plugin
|
||||
|
||||
$action->script(common_path('plugins/Mapstraction/usermap.js'));
|
||||
|
||||
$action->elementStart('script', array('type' => 'text/javascript'));
|
||||
$action->raw(sprintf('var _provider = "%s";', $this->provider));
|
||||
$action->elementEnd('script');
|
||||
$action->inlineScript(sprintf('var _provider = "%s";', $this->provider));
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
@ -128,12 +128,9 @@ class MapAction extends OwnerDesignAction
|
||||
}
|
||||
}
|
||||
|
||||
$this->elementStart('script', array('type' => 'text/javascript'));
|
||||
$this->raw('/*<![CDATA[*/'); // XHTML compat for Safari
|
||||
$this->raw('var _notices = ' . json_encode($jsonArray).'; ');
|
||||
$this->raw('showMapstraction($("#map_canvas"),_notices);');
|
||||
$this->raw('/*]]>*/'); // XHTML compat for Safari
|
||||
$this->elementEnd('script');
|
||||
$this->inlineScript('$(document).ready(function() { '.
|
||||
' var _notices = ' . json_encode($jsonArray).'; ' .
|
||||
'showMapstraction($("#map_canvas"), _notices); });');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1,40 +1,32 @@
|
||||
$(document).ready(function() {
|
||||
function scrapeNotices(user)
|
||||
{
|
||||
var notices = [];
|
||||
$(".notice").each(function(){
|
||||
var notice = getNoticeFromElement($(this));
|
||||
if(notice['geo'])
|
||||
notices.push(notice);
|
||||
var notice = getNoticeFromElement($(this));
|
||||
if (user) {
|
||||
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(){
|
||||
var noticeElement = $(this).closest(".notice");
|
||||
notice = getNoticeFromElement(noticeElement);
|
||||
return notices;
|
||||
}
|
||||
|
||||
$.fn.jOverlay.options = {
|
||||
color : '#000',
|
||||
opacity : '0.6',
|
||||
zIndex : 99,
|
||||
center : false,
|
||||
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);
|
||||
function scrapeUser()
|
||||
{
|
||||
var avatarURL = $(".entity_profile .entity_depiction img.avatar").attr('src');
|
||||
var profileURL = $(".entity_profile .entity_nickname .url").attr('href');
|
||||
var nickname = $(".entity_profile .entity_nickname .nickname").text();
|
||||
|
||||
return false;
|
||||
});
|
||||
});
|
||||
return {
|
||||
'profile_image_url': avatarURL,
|
||||
'profile_url': profileURL,
|
||||
'screen_name': nickname
|
||||
};
|
||||
}
|
||||
|
||||
function getMicroformatValue(element)
|
||||
{
|
||||
@ -48,23 +40,34 @@ function getMicroformatValue(element)
|
||||
function getNoticeFromElement(noticeElement)
|
||||
{
|
||||
var notice = {};
|
||||
if(noticeElement.find(".geo").length){
|
||||
|
||||
if(noticeElement.find(".geo").length) {
|
||||
var latlon = noticeElement.find(".geo").attr('title').split(";");
|
||||
notice['geo']={'coordinates': [
|
||||
parseFloat(latlon[0]),
|
||||
parseFloat(latlon[1])] };
|
||||
}
|
||||
notice['user']={
|
||||
'profile_image_url': noticeElement.find("img.avatar").attr('src'),
|
||||
'profile_url': noticeElement.find(".author a.url").attr('href'),
|
||||
'screen_name': noticeElement.find(".author .nickname").text()
|
||||
};
|
||||
notice['html']=noticeElement.find(".entry-content").html();
|
||||
notice['url']=noticeElement.find("a.timestamp").attr('href');
|
||||
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;
|
||||
}
|
||||
|
||||
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) {
|
||||
if(element instanceof jQuery) element = element[0];
|
||||
if(! $.isArray(notices)) notices = [notices];
|
||||
|
Loading…
Reference in New Issue
Block a user