summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Andrews <candrews@integralblue.com>2009-11-19 12:00:25 -0500
committerCraig Andrews <candrews@integralblue.com>2009-11-19 12:00:25 -0500
commit4463768baed036b487d473a60b30f0c314ee1673 (patch)
tree5c617bf209239e36929117beda261778815756f9
parentad0b9a7115dd0681b003f350bebcd6b6e39ea8b2 (diff)
tobyink's location RDF patch
-rw-r--r--actions/foaf.php26
-rw-r--r--lib/location.php24
-rw-r--r--lib/rssaction.php12
-rw-r--r--plugins/GeonamesPlugin.php24
4 files changed, 82 insertions, 4 deletions
diff --git a/actions/foaf.php b/actions/foaf.php
index 356393304..e9f67b7f2 100644
--- a/actions/foaf.php
+++ b/actions/foaf.php
@@ -108,11 +108,29 @@ class FoafAction extends Action
if ($this->profile->bio) {
$this->element('bio:olb', null, $this->profile->bio);
}
- // XXX: more structured location data
- if ($this->profile->location) {
+
+ $location = $this->profile->getLocation();
+ if ($location) {
+ $attr = array();
+ if ($location->getRdfURL()) {
+ $attr['rdf:about'] = $location->getRdfURL();
+ }
+ $location_name = $location->getName();
+
$this->elementStart('based_near');
- $this->elementStart('geo:SpatialThing');
- $this->element('name', null, $this->profile->location);
+ $this->elementStart('geo:SpatialThing', $attr);
+ if ($location_name) {
+ $this->element('name', null, $location_name);
+ }
+ if ($location->lat) {
+ $this->element('geo:lat', null, $location->lat);
+ }
+ if ($location->lon) {
+ $this->element('geo:long', null, $location->lat);
+ }
+ if ($location->getURL()) {
+ $this->element('page', array('rdf:resource'=>$location->getURL()));
+ }
$this->elementEnd('geo:SpatialThing');
$this->elementEnd('based_near');
}
diff --git a/lib/location.php b/lib/location.php
index bbfc15a36..191550d6d 100644
--- a/lib/location.php
+++ b/lib/location.php
@@ -52,6 +52,7 @@ class Location
public $location_id;
public $location_ns;
private $_url;
+ private $_rdfurl;
var $names = array();
@@ -185,4 +186,27 @@ class Location
return $url;
}
+
+ /**
+ * Get an URL for this location, suitable for embedding in RDF
+ *
+ * @return string URL for this location or NULL
+ */
+
+ function getRdfURL()
+ {
+ // Keep one cached
+
+ if (is_string($this->_rdfurl)) {
+ return $this->_rdfurl;
+ }
+
+ $url = null;
+
+ Event::handle('LocationRdfUrl', array($this, &$url));
+
+ $this->_rdfurl = $url;
+
+ return $url;
+ }
}
diff --git a/lib/rssaction.php b/lib/rssaction.php
index faf6bec7d..cd4c8b51c 100644
--- a/lib/rssaction.php
+++ b/lib/rssaction.php
@@ -244,6 +244,16 @@ class Rss10Action extends Action
$this->element('dc:creator', null, ($profile->fullname) ? $profile->fullname : $profile->nickname);
$this->element('foaf:maker', array('rdf:resource' => $creator_uri));
$this->element('sioc:has_creator', array('rdf:resource' => $creator_uri.'#acct'));
+ $location = $notice->getLocation();
+ if ($location && isset($location->lat) && isset($location->lon)) {
+ $location_uri = $location->getRdfURL();
+ $attrs = array('geo:lat' => $location->lat,
+ 'geo:long' => $location->lon);
+ if (strlen($location_uri)) {
+ $attrs['rdf:resource'] = $location_uri;
+ }
+ $this->element('statusnet:origin', $attrs);
+ }
$this->element('statusnet:postIcon', array('rdf:resource' => $profile->avatarUrl()));
$this->element('cc:licence', array('rdf:resource' => common_config('license', 'url')));
if ($notice->reply_to) {
@@ -354,6 +364,8 @@ class Rss10Action extends Action
'http://rdfs.org/sioc/types#',
'xmlns:rdfs' =>
'http://www.w3.org/2000/01/rdf-schema#',
+ 'xmlns:geo' =>
+ 'http://www.w3.org/2003/01/geo/wgs84_pos#',
'xmlns:statusnet' =>
'http://status.net/ont/',
'xmlns' => 'http://purl.org/rss/1.0/'));
diff --git a/plugins/GeonamesPlugin.php b/plugins/GeonamesPlugin.php
index 1d7381a80..59232c1c5 100644
--- a/plugins/GeonamesPlugin.php
+++ b/plugins/GeonamesPlugin.php
@@ -302,4 +302,28 @@ class GeonamesPlugin extends Plugin
// it's been filled, so don't process further.
return false;
}
+
+ /**
+ * Machine-readable name for a location
+ *
+ * Given a location, we try to retrieve a geonames.org URL.
+ *
+ * @param Location $location Location to get the url for
+ * @param string &$url Place to put the url
+ *
+ * @return boolean whether to continue
+ */
+
+ function onLocationRdfUrl($location, &$url)
+ {
+ if ($location->location_ns != self::LOCATION_NS) {
+ // It's not one of our IDs... keep processing
+ return true;
+ }
+
+ $url = 'http://sw.geonames.org/' . $location->location_id . '/';
+
+ // it's been filled, so don't process further.
+ return false;
+ }
}