def test_markup_tag_cleaner(): assert clean_html('<b>Hello</b>') == 'Hello' assert clean_html('<p><b>Hello</b></p>') == 'Hello' assert clean_html('<p>Hello <b>world</b></p>') == 'Hello world' assert (clean_html('<p>"<Entity> test"</p>') == '"<Entity> test"') assert clean_html('<p>"charref test"</p>') == '"charref test"'
def feed_entry(category_id, feed_id, entry_id): feed, feed_permalink, entry, entry_permalink = \ find_feed_and_entry(category_id, feed_id, entry_id) content = entry.content or entry.summary if content is not None: content = content.sanitized_html entry_data = { 'title': clean_html(str(entry.title)), 'content': content, 'updated': entry.updated_at.__str__(), 'permalink': entry_permalink or None, } feed_data = { 'title': clean_html(str(feed.title)), 'permalink': feed_permalink or None } add_urls( entry_data, ['read_url', 'unread_url', 'star_url', 'unstar_url'], category_id, feed_id, entry_id ) add_urls( feed_data, ['entries_url'], category_id, feed_id ) entry_data['feed'] = feed_data return jsonify(entry_data)
def feed_entries(category_id, feed_id): stage = get_stage() Cursor(category_id) try: with stage: feed = stage.feeds[feed_id] except KeyError: r = jsonify( error='feed-not-found', message='Given feed does not exist' ) r.status_code = 404 return r url_token, entry_after, read, starred = get_optional_args() generator = None if url_token: try: generator = get_entry_generator(url_token) except IteratorNotFound: pass else: url_token = str(now()) if not generator: it = iter(feed.entries) feed_title = clean_html(str(feed.title)) feed_permalink = get_permalink(feed) generator = FeedEntryGenerator(category_id, feed_id, feed_title, feed_permalink, it, now(), read, starred) try: generator.set_iterator(entry_after) except StopIteration: return jsonify( title=generator.feed_title, entries=[], next_url=None ) save_entry_generators(url_token, generator) tidy_generators_up() entries = generator.get_entries() if len(entries) < app.config['PAGE_SIZE']: next_url = None if not entries: remove_entry_generator(url_token) else: next_url = make_next_url( category_id, url_token, entries[-1]['entry_id'], read, starred, feed_id ) return jsonify( title=clean_html(str(feed.title)), entries=entries, next_url=next_url )
def category_entries(category_id): cursor = Cursor(category_id) generator = None url_token, entry_after, read, starred = get_optional_args() if url_token: try: generator = get_entry_generator(url_token) except IteratorNotFound: pass else: url_token = str(now()) if not generator: subscriptions = cursor.recursive_subscriptions generator = CategoryEntryGenerator() if entry_after: id_after, time_after = decode_entry_after(entry_after) else: time_after = None id_after = None for subscription in subscriptions: try: with get_stage() as stage: feed = stage.feeds[subscription.feed_id] except KeyError: continue feed_id = get_hash(feed.id) feed_title = clean_html(str(feed.title)) it = iter(feed.entries) feed_permalink = get_permalink(feed) child = FeedEntryGenerator(category_id, feed_id, feed_title, feed_permalink, it, now(), read, starred) generator.add(child) generator.set_generators(id_after, time_after) save_entry_generators(url_token, generator) tidy_generators_up() entries = generator.get_entries() if not entries or len(entries) < app.config['PAGE_SIZE']: next_url = None if not entries: remove_entry_generator(url_token) else: next_url = make_next_url( category_id, url_token, encode_entry_after(entries[-1]['entry_id'], entries[-1]['updated']), read, starred ) return jsonify( title=category_id.split('/')[-1][1:] or app.config['ALLFEED'], entries=entries, next_url=next_url )
def get_entry_data(self): if not self.entry: raise StopIteration entry_permalink = get_permalink(self.entry) entry_data = { 'title': clean_html(str(self.entry.title)), 'entry_id': get_hash(self.entry.id), 'permalink': entry_permalink or None, 'updated': Rfc3339().encode(self.entry.updated_at.astimezone(utc)), 'read': bool(self.entry.read), 'starred': bool(self.entry.starred) } feed_data = { 'title': self.feed_title, 'permalink': self.feed_permalink or None } add_urls(entry_data, ['entry_url'], self.category_id, self.feed_id, get_hash(self.entry.id)) add_urls(feed_data, ['entries_url'], self.category_id, self.feed_id) entry_data['feed'] = feed_data return entry_data