diff --git a/src/sessions/twitter/templates.py b/src/sessions/twitter/templates.py new file mode 100644 index 00000000..bfccddb8 --- /dev/null +++ b/src/sessions/twitter/templates.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +import re +import arrow +import languageHandler +from string import Template +from . import utils + +def process_date(field, relative_times=True, offset_seconds=0): + original_date = arrow.get(field, locale="en") + if relative_times == True: + ts = original_date.humanize(locale=languageHandler.curLang[:2]) + else: + ts = original_date.shift(seconds=offset_seconds).format(_("dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.curLang[:2]) + return ts + +def process_text(tweet): + if hasattr(tweet, "text"): + text = tweet.text + elif hasattr(tweet, "full_text"): + text = tweet.full_text + # Cleanup mentions, so we'll remove more than 2 mentions to make the tweet easier to read. + text = utils.clean_mentions(text) + # Replace URLS for extended version of those. + if hasattr(tweet, "entities"): + text = utils.expand_urls(text, tweet.entities) + text = re.sub(r"https://twitter.com/\w+/status/\d+", "", text) + return text + +def process_image_descriptions(entities): + """ Attempt to extract information for image descriptions. """ + image_descriptions = [] + for media in entities["media"]: + if media.get("ext_alt_text") != None: + image_descriptions.append(media.get("ext_alt_text")) + idescriptions = "" + for image in image_descriptions: + idescriptions += "Image description: {}.".format(image) + return idescriptions + +def render_tweet(tweet, template, relative_times=False, offset_seconds=0): + """ Renders any given Tweet according to the passed template. + Available data for tweets will be stored in the following variables: + $date: Creation date. + $display_name: User profile name. + $screen_name: User screen name, this is the same name used to reference the user in Twitter. + $ source: Source client from where the current tweet was sent. + $lang: Two letter code for the automatically detected language for the tweet. This detection is performed by Twitter. + $text: Tweet text. + $image_descriptions: Information regarding image descriptions added by twitter users. + """ + available_data = dict() + created_at = process_date(tweet.created_at, relative_times, offset_seconds) + available_data.update(date=created_at) + # user. + available_data.update(display_name=tweet.user.name, screen_name=tweet.user.screen_name) + # Source client from where tweet was originated. + available_data.update(source=tweet.source) + if hasattr(tweet, "retweeted_status"): + if hasattr(tweet.retweeted_status, "quoted_status"): + text = "RT @{}: {} Quote from @{}: {}".format(tweet.retweeted_status.user.screen_name, process_text(tweet.retweeted_status), tweet.retweeted_status.quoted_status.user.screen_name, process_text(tweet.retweeted_status.quoted_status)) + else: + text = "RT @{}: {}".format(tweet.retweeted_status.user.screen_name, process_text(tweet.retweeted_status)) + elif hasattr(tweet, "quoted_status"): + text = "{} Quote from @{}: {}".format(process_text(tweet), tweet.quoted_status.user.screen_name, process_text(tweet.quoted_status)) + else: + text = process_text(tweet) + available_data.update(lang=tweet.lang, text=text) + # process image descriptions + image_descriptions = "" + if hasattr(tweet, "quoted_status") and hasattr(tweet.quoted_status, "extended_entities"): + image_descriptions = process_image_descriptions(tweet.quoted_status.extended_entities) + elif hasattr(tweet.retweeted_status, "quoted_status") and hasattr(tweet.retweeted_status.quoted_status, "extended_entities"): + image_descriptions = process_image_descriptions(tweet.retweeted_status.quoted_status.extended_entities) + if image_descriptions != "": + available_data.update(image_descriptions=image_descriptions) + result = Template(template).safe_substitute(**available_data) + result = re.sub(r"\$\w+", "", result) + return result \ No newline at end of file