gluon/contrib/autolinks.py
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 1.99.7 (2012-05-02 21:56:49) dev
|
Version 1.99.7 (2012-05-03 10:03:56) dev
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
import re, cgi, sys
|
||||||
|
from simplejson import loads
|
||||||
|
import BeautifulSoup
|
||||||
|
import urllib
|
||||||
|
|
||||||
|
MAPS = [
|
||||||
|
(re.compile('http://\S*?flickr.com/\S*'),
|
||||||
|
'http://www.flickr.com/services/oembed/'),
|
||||||
|
(re.compile('http://\S*.youtu(\.be|be\.com)/watch\S*'),
|
||||||
|
'http://www.youtube.com/oembed'),
|
||||||
|
(re.compile('http://www.hulu.com/watch/\S*'),
|
||||||
|
'http://www.hulu.com/api/oembed.json'),
|
||||||
|
(re.compile('http://vimeo.com/\S*'),
|
||||||
|
'http://vimeo.com/api/oembed.json'),
|
||||||
|
(re.compile('http://www.slideshare.net/[^\/]+/\S*'),
|
||||||
|
'http://www.slideshare.net/api/oembed/2'),
|
||||||
|
(re.compile('http://qik.com/\S*'),
|
||||||
|
'http://qik.com/api/oembed.json'),
|
||||||
|
(re.compile('http://www.polleverywhere.com/\w+/\S+'),
|
||||||
|
'http://www.polleverywhere.com/services/oembed/'),
|
||||||
|
(re.compile('http://www.slideshare.net/\w+/\S+'),
|
||||||
|
'http://www.slideshare.net/api/oembed/2'),
|
||||||
|
(re.compile('http://\S+.wordpress.com/\S+'),
|
||||||
|
'http://public-api.wordpress.com/oembed/'),
|
||||||
|
(re.compile('http://*.revision3.com/\S+'),
|
||||||
|
'http://revision3.com/api/oembed/'),
|
||||||
|
(re.compile('http://www.slideshare.net/\w+/\S+'),
|
||||||
|
'http://api.smugmug.com/services/oembed/'),
|
||||||
|
(re.compile('http://\S+.viddler.com/\S+'),
|
||||||
|
'http://lab.viddler.com/services/oembed/'),
|
||||||
|
]
|
||||||
|
|
||||||
|
regex_link = re.compile('https?://\S+')
|
||||||
|
|
||||||
|
def oembed(url):
|
||||||
|
for k,v in MAPS:
|
||||||
|
if k.match(url):
|
||||||
|
oembed = v+'?format=json&url='+cgi.escape(url)
|
||||||
|
try:
|
||||||
|
return loads(urllib.urlopen(oembed).read())
|
||||||
|
except: pass
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def expand_one(url,cdict):
|
||||||
|
if cdict and url in cdict:
|
||||||
|
r = cdict[url]
|
||||||
|
elif cdict:
|
||||||
|
r = cdict[url] = oembed(url)
|
||||||
|
else:
|
||||||
|
r = oembed(url)
|
||||||
|
if 'html' in r:
|
||||||
|
return '<embed>%s</embed>' % r['html']
|
||||||
|
return '<a href="%(u)s">%(u)s</a>' % dict(u=url)
|
||||||
|
|
||||||
|
def expand_all(html,cdict=None):
|
||||||
|
soup = BeautifulSoup.BeautifulSoup(html)
|
||||||
|
for txt in soup.findAll(text=True):
|
||||||
|
if txt.parent.name != 'a':
|
||||||
|
ntxt = regex_link.sub(
|
||||||
|
lambda match: expand_one(match.group(0),cdict), txt)
|
||||||
|
txt.replaceWith(ntxt)
|
||||||
|
return str(soup)
|
||||||
|
|
||||||
|
|
||||||
|
def test():
|
||||||
|
example="""
|
||||||
|
<h3>Fringilla nisi parturient nullam</h3>
|
||||||
|
<p>http://www.youtube.com/watch?v=IWBFiI5RrA0</p>
|
||||||
|
<p>Elementum sodales est varius magna leo sociis erat. Nascetur pretium non
|
||||||
|
ultricies gravida. Condimentum at nascetur tempus. Porttitor viverra ipsum
|
||||||
|
accumsan neque aliquet. Ultrices vestibulum tempor quisque eget sem eget.
|
||||||
|
Ornare malesuada tempus dolor dolor magna consectetur. Nisl dui non curabitur
|
||||||
|
laoreet tortor.</p>
|
||||||
|
"""
|
||||||
|
return expand_all(example)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__=="__main__":
|
||||||
|
if len(sys.argv)>1:
|
||||||
|
print expand_all(open(sys.argv[1]).read())
|
||||||
|
else:
|
||||||
|
print test()
|
||||||
Reference in New Issue
Block a user