diff --git a/apps/reader/urls.py b/apps/reader/urls.py index b0429c304..0d0cfc18b 100644 --- a/apps/reader/urls.py +++ b/apps/reader/urls.py @@ -3,6 +3,7 @@ from django.conf.urls.defaults import * urlpatterns = patterns('apps.reader.views', (r'^$', 'index'), (r'^load_single_feed', 'load_single_feed'), + (r'^load_feed_page', 'load_feed_page'), (r'^load_feeds', 'load_feeds'), (r'^refresh_all_feeds', 'refresh_all_feeds'), (r'^refresh_feed', 'refresh_feed'), diff --git a/apps/reader/views.py b/apps/reader/views.py index 818353479..5282deb47 100644 --- a/apps/reader/views.py +++ b/apps/reader/views.py @@ -11,6 +11,7 @@ from django.http import HttpResponse, HttpRequest from django.core import serializers from django.utils.safestring import mark_safe from django.views.decorators.cache import cache_page +from djangologging.decorators import suppress_logging_output import logging import datetime import threading @@ -112,6 +113,7 @@ def load_feeds(request): feed['feeds'].sort(lambda x, y: cmp(x.feed_title.lower(), y.feed_title.lower())) for f in feed['feeds']: f.feed_address = mark_safe(f.feed_address) + f.page_data = None cache.set('usersub:%s' % user, feeds, SINGLE_DAY) @@ -159,6 +161,12 @@ def load_single_feed(request): data = json_encode(context) return HttpResponse(data, mimetype='text/html') +@suppress_logging_output +def load_feed_page(request): + feed = Feed.objects.get(id=request.REQUEST.get('feed_id')) + data = feed.page_data + + return HttpResponse(data, mimetype='text/html') @login_required def mark_story_as_read(request): diff --git a/apps/rss_feeds/importer.py b/apps/rss_feeds/importer.py new file mode 100644 index 000000000..04b92f4b3 --- /dev/null +++ b/apps/rss_feeds/importer.py @@ -0,0 +1,40 @@ +import urllib2 +import logging +import re +import urlparse + +class PageImporter(object): + + def __init__(self, url, feed): + self.url = url + self.feed = feed + + def fetch_page(self): + request = urllib2.Request(self.url) + + try: + response = urllib2.urlopen(request) + except HTTPError, e: + logging.error('The server couldn\'t fulfill the request. Error: %s' % e.code) + except URLError, e: + logging.error('Failed to reach server. Reason: %s' % e.reason) + else: + data = response.read() + html = data + html = self.rewrite_page(html) + self.save_page(html) + + def rewrite_page(self, response): + head = response.find('') + 6 + base_code = u'' % (self.feed.feed_link,) + try: + html = u''.join([response[:head], base_code, response[head:]]) + except: + response = response.decode('latin1').encode('utf-8') + html = u''.join([response[:head], base_code, response[head:]]) + + return html + + def save_page(self, html): + self.feed.page_data = html + self.feed.save() \ No newline at end of file diff --git a/apps/rss_feeds/models.py b/apps/rss_feeds/models.py index c8d95730f..ae42ffba7 100644 --- a/apps/rss_feeds/models.py +++ b/apps/rss_feeds/models.py @@ -12,6 +12,7 @@ from utils.story_functions import format_story_link_date__short from utils.story_functions import format_story_link_date__long from django.db.models import Q from utils.diff import HTMLDiff +from apps.rss_feeds.importer import PageImporter import settings import logging @@ -30,6 +31,7 @@ class Feed(models.Model): creation = models.DateField(auto_now_add=True) etag = models.CharField(max_length=50, blank=True) last_modified = models.DateTimeField(null=True, blank=True) + page_data = models.TextField(blank=True) def __unicode__(self): @@ -89,6 +91,10 @@ class Feed(models.Model): self.last_update = datetime.datetime.now() self.last_modified = mtime(feed.get('modified', datetime.datetime.timetuple(datetime.datetime.now()))) + + page_importer = PageImporter(self.feed_link, self) + self.page = page_importer.fetch_page() + self.save() num_entries = len(feed['entries']) diff --git a/media/css/reader.css b/media/css/reader.css index 39236d0c8..558da9077 100644 --- a/media/css/reader.css +++ b/media/css/reader.css @@ -539,3 +539,13 @@ form.opml_import_form input { background-color: #FFFFA0; cursor: pointer; } + + +/* ============== */ +/* = Feed Frame = */ +/* ============== */ + +.NB-feed-frame { + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/media/js/newsblur/assetmodel.js b/media/js/newsblur/assetmodel.js index 73f3a669f..ca0ed57cc 100644 --- a/media/js/newsblur/assetmodel.js +++ b/media/js/newsblur/assetmodel.js @@ -56,8 +56,10 @@ NEWSBLUR.AssetModel.Reader.prototype = { $('#django_log').replaceWith(log_html); var js = eval(log_js); } - } else { + } else if (o.indexOf('{') == 0) { data = eval('(' + o + ')'); + } else { + data = o; } if (callback && typeof callback == 'function'){ @@ -173,6 +175,17 @@ NEWSBLUR.AssetModel.Reader.prototype = { ); }, + load_feed_page: function(feed_id, page, callback) { + var self = this; + + this.make_request('/reader/load_feed_page', + { + feed_id: feed_id, + page: page + }, callback + ); + }, + get_feed: function(feed_id, callback) { var self = this; for (fld in this.folders) { diff --git a/media/js/newsblur/reader.js b/media/js/newsblur/reader.js index 5f5a88594..2624beaef 100644 --- a/media/js/newsblur/reader.js +++ b/media/js/newsblur/reader.js @@ -274,6 +274,8 @@ this.show_feed_title_in_stories($story_titles, feed_id); this.mark_feed_as_selected(feed_id, $feed_link); this.model.load_feed(feed_id, 0, $.rescope(this.create_story_titles, this)); + // this.model.load_feed_page(feed_id, 0, $.rescope(this.show_feed_page_contents, this)); + this.show_feed_page_contents(feed_id); }, create_story_titles: function(e, stories) { @@ -300,6 +302,13 @@ this.hover_over_story_titles($story_titles); }, + show_feed_page_contents: function(feed_id) { + var $story_pane = this.$story_pane; + var $story_iframe = $.make('iframe', { className: 'NB-feed-frame' }); + $story_pane.html($story_iframe); + $story_iframe.attr({src: '/reader/load_feed_page?feed_id='+feed_id}); + }, + load_page_of_feed_stories: function() { var feed_id = this.$story_titles.data('feed_id'); var page = this.$story_titles.data('page'); @@ -394,6 +403,22 @@ } this.mark_story_title_as_selected(story_id, $st); this.mark_story_as_read(story_id, $st); + + this.scroll_to_story_in_story_frame(story.story_title); + }, + + scroll_to_story_in_story_frame: function(story_title) { + var $iframe = $('.NB-feed-frame'); + var title = story_title.replace('^\s+|\s+$', ''); + + NEWSBLUR.log(['Title', title]); + + $iframe.contents().find(':contains('+title+')').each(function(){ + if($(this).children().length < 1) { + $iframe.scrollTo(this, 1000); + return false; + } + }); }, open_story_link: function(story_id, $st) {