/jarn/xmpp/core/browser/transforms.py

https://github.com/giacomos/jarn.xmpp.core · Python · 94 lines · 70 code · 21 blank · 3 comment · 15 complexity · 9c566927eed2c385a43ead0ead68d942 MD5 · raw file

  1. import json
  2. import re
  3. import urllib2
  4. from urlparse import urlparse
  5. from BeautifulSoup import BeautifulSoup
  6. from plone.memoize import ram
  7. from Products.CMFCore.utils import getToolByName
  8. from Products.Five.browser import BrowserView
  9. @ram.cache(lambda method, url: url)
  10. def getFavIcon(url):
  11. try:
  12. return urllib2.urlopen(url, timeout=5).read()
  13. except urllib2.URLError:
  14. return None
  15. @ram.cache(lambda method, url: url)
  16. def getURLData(url):
  17. try:
  18. doc = urllib2.urlopen(url, timeout=5).read()
  19. except urllib2.URLError:
  20. return None
  21. try:
  22. doc = BeautifulSoup(urllib2.urlopen(url).read())
  23. except UnicodeEncodeError: # This is for links to files/images.
  24. doc = BeautifulSoup('')
  25. title = url
  26. description = u''
  27. # title
  28. if doc.title:
  29. title = doc.title.string
  30. if not title:
  31. title = doc.first('meta', attrs={'name': 'title'})
  32. if title:
  33. title = title.get('content')
  34. # description
  35. description = doc.first('meta', attrs={'name': 'description'})
  36. if description:
  37. description = description.get('content')
  38. # Find favicon
  39. host_url = urlparse(url)
  40. favicon_url = doc.first('link', rel='shortcut icon')
  41. if favicon_url:
  42. favicon_url = favicon_url.get('href')
  43. if not favicon_url.startswith('http'):
  44. favicon_url = host_url[0] + u'://' + host_url[1] + favicon_url
  45. else:
  46. favicon_url = host_url[0] + u'://' + host_url[1] + u'/favicon.ico'
  47. return json.dumps({
  48. 'title': title,
  49. 'description': description,
  50. 'favicon_url': favicon_url})
  51. class MagicLinksView(BrowserView):
  52. def __call__(self, url):
  53. return getURLData(url)
  54. class FavIconsView(BrowserView):
  55. def __call__(self, url):
  56. self.request.response.setHeader("Content-type", "image/x-icon")
  57. return getFavIcon(url)
  58. class ContentTransform(BrowserView):
  59. def __call__(self, text):
  60. tr = getToolByName(self.context, 'portal_transforms')
  61. text = tr.convert('web_intelligent_plain_text_to_html', text).getData()
  62. user_pattern = re.compile(r'@[\w\.\-@]+')
  63. user_refs = user_pattern.findall(text)
  64. mt = getToolByName(self.context, 'portal_membership')
  65. portal_url = getToolByName(self.context, 'portal_url')()
  66. for user_ref in user_refs:
  67. user_id = user_ref[1:]
  68. if mt.getMemberById(user_id) is not None:
  69. link = '<a href="%s/pubsub-feed?node=%s">%s</a>' % \
  70. (portal_url, user_id, user_ref)
  71. text = user_pattern.sub(link, text)
  72. result = {'text': text}
  73. return json.dumps(result)