Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def _prepare_activity(a, reader=True):
"""Preprocesses an activity to prepare it to be rendered as Atom.
Modifies a in place.
Args:
a: ActivityStreams 1 activity dict
reader: boolean, whether the output will be rendered in a feed reader.
Currently just includes location if True, not otherwise.
"""
act_type = source.object_type(a)
obj = util.get_first(a, 'object', default={})
primary = obj if (not act_type or act_type == 'post') else a
# Render content as HTML; escape &s
obj['rendered_content'] = _encode_ampersands(microformats2.render_content(
primary, include_location=reader, render_attachments=True,
# Readers often obey CSS white-space: pre strictly and don't even line wrap,
# so don't use it.
# https://forum.newsblur.com/t/android-cant-read-line-pre-formatted-lines/6116
white_space_pre=False))
# Make sure every activity has the title field, since Atom requires
# the title element.
if not a.get('title'):
a['title'] = util.ellipsize(_encode_ampersands(
a.get('displayName') or a.get('content') or obj.get('title') or
obj.get('displayName') or obj.get('content') or 'Untitled'))
# strip HTML tags. the Atom spec says title is plain text:
# http://atomenabled.org/developers/syndication/#requiredEntryElements
a['title'] = xml.sax.saxutils.escape(util.parse_html(a['title']).get_text(''))
def render(source, activity, base):
obj = activity.get('object') or activity
content = microformats2.render_content(obj)
embed = source.embed_post(base)
type = as_source.object_type(activity)
content = activity.get('content', '')
if type == 'share' and not content:
content = 'retweeted this.'
rendered = embed + content if type == 'comment' else content + embed
mf2_class = {'like': 'u-like-of',
'share': 'u-repost-of',
}.get(type, 'in-reply-to')
url = (obj.get('inReplyTo') or [{}])[0].get('url') or base.get('url')
rendered += """
<a href="%s" class="%s"></a>
<a href="%s" class="u-syndication"></a>
item = fg.add_entry()
url = obj.get('url')
id = obj.get('id') or url
item.id(id)
item.link(href=url)
item.guid(url, permalink=True)
# title (required)
title = (obj.get('title') or obj.get('displayName') or
util.ellipsize(obj.get('content', '-')))
# strip HTML tags
title = util.parse_html(title).get_text('').strip()
item.title(title)
content = microformats2.render_content(
obj, include_location=True, render_attachments=True, render_image=True)
if not content:
content = obj.get('summary')
if content:
item.content(content, type='CDATA')
categories = [
{'term': t['displayName']} for t in obj.get('tags', [])
if t.get('displayName') and
t.get('verb') not in ('like', 'react', 'share') and
t.get('objectType') not in ('article', 'person', 'mention')]
item.category(categories)
author = obj.get('author', {})
author = {
'name': author.get('displayName') or author.get('username'),
_prepare_actor(elem.get('actor'))
# normalize attachments, render attached notes/articles
attachments = a.get('attachments') or obj.get('attachments') or []
for att in attachments:
att['stream'] = util.get_first(att, 'stream')
type = att.get('objectType')
if type == 'image':
att['image'] = util.get_first(att, 'image')
image_atts.append(att['image'])
continue
image_urls_seen |= set(util.get_urls(att, 'image'))
if type in ('note', 'article'):
html = microformats2.render_content(
att, include_location=reader, render_attachments=True,
white_space_pre=False)
author = att.get('author')
if author:
name = microformats2.maybe_linked_name(
microformats2.object_to_json(author).get('properties') or {})
html = '%s: %s' % (name.strip(), html)
children.append(html)
# render image(s) that we haven't already seen
for image in image_atts + util.get_list(obj, 'image'):
if not image:
continue
url = image.get('url')
parsed = urllib.parse.urlparse(url)
rest = urllib.parse.urlunparse(('', '') + parsed[2:])
def image_url(obj):
return util.get_first(obj, 'image', {}).get('url')
def actor_name(obj):
return obj.get('displayName') or obj.get('username')
if not actor:
actor = {}
items = []
for activity in activities:
obj = activity.get('object') or activity
if obj.get('objectType') == 'person':
continue
author = obj.get('author', {})
content = microformats2.render_content(
obj, include_location=True, render_attachments=True)
obj_title = obj.get('title') or obj.get('displayName')
item = {
'id': obj.get('id') or obj.get('url'),
'url': obj.get('url'),
'image': image_url(obj),
'title': obj_title if mf2util.is_name_a_title(obj_title, content) else None,
'summary': obj.get('summary'),
'content_html': content,
'date_published': obj.get('published'),
'date_modified': obj.get('updated'),
'author': {
'name': actor_name(author),
'url': author.get('url'),
'avatar': image_url(author),
},