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) {