]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Update Mapstraction to properly scrape data from notice-list pages
authorEvan Prodromou <evan@status.net>
Fri, 4 Dec 2009 19:31:19 +0000 (14:31 -0500)
committerEvan Prodromou <evan@status.net>
Fri, 4 Dec 2009 19:31:19 +0000 (14:31 -0500)
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.

plugins/Mapstraction/MapstractionPlugin.php
plugins/Mapstraction/map.php
plugins/Mapstraction/usermap.js

index c4f9cd77de152a9fee1676807cf767421af5c218..ba7827151b32c5dde0c5544617f74aea892e5f27 100644 (file)
@@ -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;
     }
index 89723f43ce78a6a4eb0584f038b67bf3c015f535..734e480884a3b4db5ebe94f04f951bfbdc71ae96 100644 (file)
@@ -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;
     }
index e667dd5790e5aab33fb3501129862666bfc42bff..4b7a6c26b4adf08a2e9eadefb406bbe7d6d3b893 100644 (file)
@@ -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);
-
-        $.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'>&#215;</button>";
-        html+=$("<div/>").append($(this).clone()).html();
-        $().jOverlay({ "html": html });
-        $('#jOverlayContent').show();
-        $('#jOverlayContent button').click($.closeOverlay);
-        
-        showMapstraction($("#map_canvas_popup"), notice);
-
-        return false;
-     });
-});
+     return notices;
+}
+
+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 {
+        '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];