working pond

This commit is contained in:
Jeena 2014-02-04 21:44:02 +01:00
parent 08639f9999
commit 35f4825596
5 changed files with 195 additions and 3 deletions

View file

@ -94,6 +94,8 @@ App.prototype.after_login = function(backend) {
if(backend == "OwnCloud") {
this.backend = new OwnCloud(this, localStorage.server_url, localStorage.session_id);
} else if (backend == "Pond") {
this.backend = new Pond(this, localStorage.server_url, localStorage.session_id)
} else {
this.backend = new TinyTinyRSS(this, localStorage.server_url, localStorage.session_id);
}
@ -283,6 +285,9 @@ App.prototype.showFull = function(article, slide_back) {
$(page_id + " .author").innerHTML = "– " + article.author;
$(page_id + " .article").innerHTML = article.content;
$$(page_id + " .article a").forEach(function(o, i) {
o.target = "_blank";
});
if(article.unread) {
$("#setunread").innerHTML = "❌";

View file

@ -83,7 +83,7 @@ Login.prototype.authenticate = function(e) {
Pond.login(server_url, user, password, function(data) {
if(data.session_token) {
localStorage.server_url = server_url;
localStorage.session_token = data.session_token;
localStorage.session_id = data.session_token;
localStorage.backend = "Pond";
_this.app.after_login(localStorage.backend);

View file

@ -46,7 +46,7 @@ OwnCloud.prototype.doOperation = function(method, operation, new_options, callba
url += "?" + a.join("&");
}
var xhr = new XMLHttpRequest();
var xhr = new XMLHttpRequest({mozSystem: true});
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
if(xhr.status == 200) {
@ -213,6 +213,7 @@ OwnCloud.prototype.normalize_article = function(article) {
OwnCloud.prototype.logOut = function() {
this.doOperation("logout");
localStorage.feeds = null;
};
OwnCloud.prototype.getFeedFor = function(o) {
@ -234,7 +235,7 @@ OwnCloud.login = function(server_url, user, password, callback) {
var url = server_url + "/index.php/apps/news/api/v1-2/version";
var xhr = new XMLHttpRequest();
var xhr = new XMLHttpRequest({mozSystem: true});
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
if(xhr.status == 200) {

View file

@ -2,6 +2,9 @@ function Pond(app, server_url, session_token) {
this.app = app;
this.server_url = server_url;
this.session_token = session_token;
this.feeds = {};
var feeds = localStorage.feeds;
if(feeds) this.feeds = JSON.parse(feeds);
window.addEventListener("offline", this.onoffline.bind(this));
window.addEventListener("online", this.ononline.bind(this));
@ -19,6 +22,183 @@ Pond.prototype.toString = function() {
return "Pond"
};
Pond.prototype.doOperation = function(method, operation, new_options, callback) {
if(!navigator.onLine) {
callback(null);
return;
}
var url = this.server_url + "/api/" + operation;
var options = {};
for (var key in new_options) {
options[key] = new_options[key];
}
var a = [];
for(var key in options) {
a.push(key + "=" + options[key]);
}
var body = "";
if(method == "GET" || method == "HEAD" || method == "PUT") { // FIXME: in future remove put from here
url += "?" + a.join("&");
} else {
body = a.join("&");
}
var xhr = new XMLHttpRequest({mozSystem: true});
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
if(xhr.status == 200) {
if(callback)
callback(JSON.parse(xhr.responseText));
} else {
if(xhr.status != 0) alert("error: " + xhr.status + " " + xhr.statusText);
if(callback) callback(null);
}
}
}
xhr.open(method, url, true);
xhr.withCredentials = true;
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader("Content-Length", body.length);
xhr.setRequestHeader("Connection", "close");
xhr.setRequestHeader('X-Session-Token', this.session_token);
xhr.send(body);
};
Pond.prototype.reload = function(callback) {
var _this = this;
this.getFeeds(function() { _this.getUnreadFeeds(callback); });
};
Pond.prototype.getUnreadFeeds = function(callback, skip) {
var options = {
status: "unread",
limit: 100
};
if(skip && skip.length > 0) {
options.before_id = skip[skip.length - 1].id
}
var _this = this;
this.doOperation("GET", "subscriptions/articles", options, function(items) {
if(!items) items = []; // So it can run the last callback
function isFeedAvailable(o) {
return !!_this.feeds[o.feedId];
}
if(items.every(isFeedAvailable)) {
callback(items.map(_this.normalizeArticle, _this));
} else {
_this.getFeeds(function() {
callback(items.map(_this.normalizeArticle, _this));
});
}
});
}
Pond.prototype.getFeeds = function(callback) {
var _this = this;
this.doOperation("GET", "subscriptions", {}, function(feeds) {
_this.feeds = {};
for (var i = 0; i < feeds.length; i++) {
var feed = feeds[i];
_this.feeds[feed.id] = feed;
}
localStorage.feeds = JSON.stringify(_this.feeds);
callback();
});
};
Pond.prototype.normalizeArticle = function(article) {
var feed = this.feeds[article.subscription_id];
var feed_title = "";
if(feed) {
feed_title = feed.name;
}
var content;
if(article.body.type == "text") content = article.body.content.replace(/\n/, "<br>");
else content = article.body.content.htmlDecode();
var excerpt = article.summary.content.htmlDecode();
if(!excerpt || excerpt.length < 1) excerpt = content;
return {
id: article.id,
guid_hash: article.url + article.id,
title: article.title,
content: content,
feed_title: feed_title,
feed_id: article.subscription_id,
excerpt: excerpt.stripHTML().substring(0, 100),
updated: article.published_at,
link: article.url,
marked: false, // not implemented in Pond server yet
unread: !article.read
}
};
Pond.prototype.setArticleStatus = function(article, callback, status) {
var options = {
status: status
};
var url = "subscriptions/" + article.feed_id + "/articles/" + article.id
if (navigator.onLine) this.doOperation("PUT", url, options, callback);
else {
this.append("unread_articles", articles);
}
}
Pond.prototype.setArticleRead = function(article, callback) {
this.setArticleStatus(article, callback, "read");
}
Pond.prototype.setArticleUnread = function(article, callback) {
this.setArticleStatus(article, callback, "unread");
}
Pond.prototype.setArticlesRead = function(articles, callback) {
articles.forEach(function(article) {
this.setArticleStatus(article, callback, "read");
})
}
Pond.prototype.setArticlesUnread = function(articles, callback) {
articles.forEach(function(article) {
this.setArticleStatus(article, callback, "unread");
})
}
Pond.prototype.setArticleStarred = function(article, callback) {
// not implemented yet in Pond
}
Pond.prototype.setArticleUnstarred = function(articles, callback) {
// not implemented yet in Pond
}
Pond.prototype.logOut = function() {
this.doOperation("auth/sessions/" + this.session_token );
localStorage.feeds = null;
}
Pond.prototype.getFeedFor = function(o) {
return this.feeds[o.subscription_id];
};
Pond.login = function(server_url, user, password, callback) {
var url = server_url + "/api/auth/sessions";

View file

@ -49,6 +49,12 @@ String.prototype.escapeHTML = function() {
});
}
String.prototype.htmlDecode = function() {
var e = document.createElement('div');
e.innerHTML = this;
return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}
String.prototype.stripHTML = function() {
return this.replace(/(<([^>]+)>)/ig, "");
}