added support for foaf:OnlineAccount information, checkout examples/foaf-based.ini
This commit is contained in:
parent
4dd8c2bca2
commit
03fef82091
43
examples/foaf-based.ini
Normal file
43
examples/foaf-based.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# Planet configuration file
|
||||||
|
|
||||||
|
# Every planet needs a [Planet] section
|
||||||
|
[Planet]
|
||||||
|
# name: Your planet's name
|
||||||
|
# link: Link to the main page
|
||||||
|
# owner_name: Your name
|
||||||
|
# owner_email: Your e-mail address
|
||||||
|
name = Elias' Planet
|
||||||
|
link = http://torrez.us/planet/
|
||||||
|
owner_name = Elias Torres
|
||||||
|
owner_email = elias@torrez.us
|
||||||
|
|
||||||
|
# cache_directory: Where cached feeds are stored
|
||||||
|
# log_level: One of DEBUG, INFO, WARNING, ERROR or CRITICAL
|
||||||
|
cache_directory = /tmp/venus/
|
||||||
|
log_level = DEBUG
|
||||||
|
|
||||||
|
# The following provide defaults for each template:
|
||||||
|
# output_theme: "theme" of the output
|
||||||
|
# output_dir: Directory to place output files
|
||||||
|
# items_per_page: How many items to put on each page
|
||||||
|
output_theme = mobile
|
||||||
|
output_dir = /var/www/planet
|
||||||
|
items_per_page = 60
|
||||||
|
|
||||||
|
# If non-zero, all feeds which have not been updated in the indicated
|
||||||
|
# number of days will be marked as inactive
|
||||||
|
activity_threshold = 90
|
||||||
|
|
||||||
|
# filters to be run
|
||||||
|
filters = excerpt.py
|
||||||
|
|
||||||
|
# filter parameters
|
||||||
|
[excerpt.py]
|
||||||
|
omit = img p br
|
||||||
|
width = 500
|
||||||
|
|
||||||
|
# subscription list
|
||||||
|
[http://torrez.us/who#elias]
|
||||||
|
content_type = foaf
|
||||||
|
online_accounts = http://del.icio.us/|http://del.icio.us/rss/{foaf:accountName}
|
||||||
|
http://flickr.com/|http://api.flickr.com/services/feeds/photos_public.gne?id={foaf:accountName}
|
@ -177,6 +177,11 @@ def load(config_file):
|
|||||||
|
|
||||||
# retrieve list options (e.g., etag, last-modified) from cache
|
# retrieve list options (e.g., etag, last-modified) from cache
|
||||||
options = {}
|
options = {}
|
||||||
|
|
||||||
|
# add original options
|
||||||
|
for key, value in parser.items(list):
|
||||||
|
options[key] = value
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cached_config = ConfigParser()
|
cached_config = ConfigParser()
|
||||||
cached_config.read(cache_filename)
|
cached_config.read(cache_filename)
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
from ConfigParser import ConfigParser
|
from ConfigParser import ConfigParser
|
||||||
|
|
||||||
# input = foaf, output = ConfigParser
|
# input = foaf, output = ConfigParser
|
||||||
def foaf2config(rdf, baseuri, config=None):
|
def foaf2config(rdf, config=None):
|
||||||
|
|
||||||
if not config:
|
if not config or not config.sections():
|
||||||
config = ConfigParser()
|
config = ConfigParser()
|
||||||
|
|
||||||
|
section = config.sections().pop()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from RDF import Model, NS, Parser, Statement
|
from RDF import Model, NS, Parser, Statement
|
||||||
except:
|
except:
|
||||||
@ -14,20 +16,37 @@ def foaf2config(rdf, baseuri, config=None):
|
|||||||
if hasattr(rdf, 'read'):
|
if hasattr(rdf, 'read'):
|
||||||
rdf = rdf.read()
|
rdf = rdf.read()
|
||||||
|
|
||||||
|
# account mappings, none by default
|
||||||
|
# form: accounts = {url to service homepage (as found in FOAF)}|{URI template}\n*
|
||||||
|
# example: http://del.icio.us/|http://del.icio.us/rss/{foaf:accountName}
|
||||||
|
accounts = {}
|
||||||
|
if(config.has_option(section, 'online_accounts')):
|
||||||
|
values = config.get(section, 'online_accounts')
|
||||||
|
for account_map in values.split('\n'):
|
||||||
|
try:
|
||||||
|
homepage, map = account_map.split('|')
|
||||||
|
accounts[homepage] = map
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
model = Model()
|
model = Model()
|
||||||
def handler(code, level, facility, message, line, column, byte, file, uri):
|
def handler(code, level, facility, message, line, column, byte, file, uri):
|
||||||
pass
|
pass
|
||||||
Parser().parse_string_into_model(model,rdf,baseuri,handler)
|
Parser().parse_string_into_model(model,rdf,section,handler)
|
||||||
|
|
||||||
dc = NS('http://purl.org/dc/elements/1.1/')
|
dc = NS('http://purl.org/dc/elements/1.1/')
|
||||||
foaf = NS('http://xmlns.com/foaf/0.1/')
|
foaf = NS('http://xmlns.com/foaf/0.1/')
|
||||||
rdfs = NS('http://www.w3.org/2000/01/rdf-schema#')
|
rdfs = NS('http://www.w3.org/2000/01/rdf-schema#')
|
||||||
|
|
||||||
for statement in model.find_statements(Statement(None,foaf.weblog,None)):
|
for statement in model.find_statements(Statement(None,foaf.weblog,None)):
|
||||||
|
|
||||||
|
# feed owner
|
||||||
|
person = statement.subject
|
||||||
|
|
||||||
feed = model.get_target(statement.object,rdfs.seeAlso)
|
feed = model.get_target(statement.object,rdfs.seeAlso)
|
||||||
if not feed: continue
|
if not feed: continue
|
||||||
|
|
||||||
title = model.get_target(statement.subject,foaf.name)
|
title = model.get_target(person,foaf.name)
|
||||||
if not title: title = model.get_target(statement.object,dc.title)
|
if not title: title = model.get_target(statement.object,dc.title)
|
||||||
if not title: continue
|
if not title: continue
|
||||||
|
|
||||||
@ -36,6 +55,35 @@ def foaf2config(rdf, baseuri, config=None):
|
|||||||
config.add_section(feed)
|
config.add_section(feed)
|
||||||
config.set(feed, 'name', str(title))
|
config.set(feed, 'name', str(title))
|
||||||
|
|
||||||
|
# if we don't have mappings, we're done
|
||||||
|
if not accounts.keys():
|
||||||
|
continue
|
||||||
|
|
||||||
|
# now look for OnlineAccounts for the same person
|
||||||
|
for statement in model.find_statements(Statement(person,foaf.holdsAccount,None)):
|
||||||
|
rdfaccthome = model.get_target(statement.object,foaf.accountServiceHomepage)
|
||||||
|
rdfacctname = model.get_target(statement.object,foaf.accountName)
|
||||||
|
|
||||||
|
if not rdfaccthome or not rdfacctname: continue
|
||||||
|
|
||||||
|
if not rdfaccthome.is_resource() or not accounts.has_key(str(rdfaccthome.uri)): continue
|
||||||
|
|
||||||
|
if not rdfacctname.is_literal(): continue
|
||||||
|
|
||||||
|
rdfacctname = rdfacctname.literal_value['string']
|
||||||
|
rdfaccthome = str(rdfaccthome.uri)
|
||||||
|
|
||||||
|
# shorten feed title a bit
|
||||||
|
try:
|
||||||
|
servicetitle = rdfaccthome.replace('http://','').split('/')[0]
|
||||||
|
except:
|
||||||
|
servicetitle = rdfaccthome
|
||||||
|
|
||||||
|
feed = accounts[rdfaccthome].replace("{foaf:accountName}", rdfacctname)
|
||||||
|
if not config.has_section(feed):
|
||||||
|
config.add_section(feed)
|
||||||
|
config.set(feed, 'name', "%s (%s)" % (title, servicetitle))
|
||||||
|
|
||||||
return config
|
return config
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
@ -43,14 +91,7 @@ if __name__ == "__main__":
|
|||||||
config = ConfigParser()
|
config = ConfigParser()
|
||||||
|
|
||||||
for uri in sys.argv[1:]:
|
for uri in sys.argv[1:]:
|
||||||
foaf2config(urllib.urlopen(uri), uri, config)
|
config.add_section(uri)
|
||||||
|
foaf2config(urllib.urlopen(uri), config)
|
||||||
|
|
||||||
config.write(sys.stdout)
|
config.write(sys.stdout)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
# small main program which converts FOAF into config.ini format
|
|
||||||
import sys, urllib
|
|
||||||
config = ConfigParser()
|
|
||||||
for foaf in sys.argv[1:]:
|
|
||||||
foaf2config(urllib.urlopen(foaf), config)
|
|
||||||
config.write(sys.stdout)
|
|
||||||
|
@ -43,34 +43,35 @@ class FoafTest(unittest.TestCase):
|
|||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.config = ConfigParser()
|
self.config = ConfigParser()
|
||||||
|
self.config.add_section(blogroll)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Tests
|
# Tests
|
||||||
#
|
#
|
||||||
|
|
||||||
def test_foaf_document(self):
|
def test_foaf_document(self):
|
||||||
foaf2config(test_foaf_document, blogroll, self.config)
|
foaf2config(test_foaf_document, self.config)
|
||||||
self.assertEqual('Danny Ayers', self.config.get(testfeed, 'name'))
|
self.assertEqual('Danny Ayers', self.config.get(testfeed, 'name'))
|
||||||
|
|
||||||
def test_no_foaf_name(self):
|
def test_no_foaf_name(self):
|
||||||
test = test_foaf_document.replace('foaf:name','foaf:title')
|
test = test_foaf_document.replace('foaf:name','foaf:title')
|
||||||
foaf2config(test, blogroll, self.config)
|
foaf2config(test, self.config)
|
||||||
self.assertEqual('Raw Blog by Danny Ayers',
|
self.assertEqual('Raw Blog by Danny Ayers',
|
||||||
self.config.get(testfeed, 'name'))
|
self.config.get(testfeed, 'name'))
|
||||||
|
|
||||||
def test_no_weblog(self):
|
def test_no_weblog(self):
|
||||||
test = test_foaf_document.replace('rdfs:seeAlso','rdfs:seealso')
|
test = test_foaf_document.replace('rdfs:seeAlso','rdfs:seealso')
|
||||||
foaf2config(test, blogroll, self.config)
|
foaf2config(test, self.config)
|
||||||
self.assertFalse(self.config.has_section(testfeed))
|
self.assertFalse(self.config.has_section(testfeed))
|
||||||
|
|
||||||
def test_invalid_xml_before(self):
|
def test_invalid_xml_before(self):
|
||||||
test = '\n<?xml version="1.0" encoding="UTF-8"?>' + test_foaf_document
|
test = '\n<?xml version="1.0" encoding="UTF-8"?>' + test_foaf_document
|
||||||
foaf2config(test, blogroll, self.config)
|
foaf2config(test, self.config)
|
||||||
self.assertFalse(self.config.has_section(testfeed))
|
self.assertFalse(self.config.has_section(testfeed))
|
||||||
|
|
||||||
def test_invalid_xml_after(self):
|
def test_invalid_xml_after(self):
|
||||||
test = test_foaf_document.strip()[:-1]
|
test = test_foaf_document.strip()[:-1]
|
||||||
foaf2config(test, blogroll, self.config)
|
foaf2config(test, self.config)
|
||||||
self.assertEqual('Danny Ayers', self.config.get(testfeed, 'name'))
|
self.assertEqual('Danny Ayers', self.config.get(testfeed, 'name'))
|
||||||
|
|
||||||
# these tests only make sense if libRDF is installed
|
# these tests only make sense if libRDF is installed
|
||||||
|
Loading…
x
Reference in New Issue
Block a user