aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.rst1
-rw-r--r--src/web/export.py198
-rw-r--r--src/web/templates/management.html4
-rw-r--r--src/web/views/article.py21
4 files changed, 18 insertions, 206 deletions
diff --git a/README.rst b/README.rst
index 014a1d57..f6ec7857 100644
--- a/README.rst
+++ b/README.rst
@@ -16,7 +16,6 @@ Main features
* a RESTful API to manage your articles (or connect your own crawler);
* data liberation: export and import all your account with a JSON file;
* export and import feeds with OPML files;
-* export articles to HTML;
* favorite articles;
* detection of inactive feeds;
* share articles with Google +, Pinboard and reddit.
diff --git a/src/web/export.py b/src/web/export.py
index 9d9448df..048dc064 100644
--- a/src/web/export.py
+++ b/src/web/export.py
@@ -20,190 +20,21 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
__author__ = "Cedric Bonhomme"
-__version__ = "$Revision: 0.6 $"
+__version__ = "$Revision: 0.7 $"
__date__ = "$Date: 2011/10/24 $"
-__revision__ = "$Date: 2014/04/12 $"
+__revision__ = "$Date: 2016/10/06 $"
__copyright__ = "Copyright (c) Cedric Bonhomme"
__license__ = "AGPLv3"
#
-# This file contains the export functions of jarr. Indeed
-# it is possible to export the database of articles in different formats:
-# - simple HTML webzine;
-# - text file.
+# This file contains the export functions of jarr.
#
-import os
-import shutil
-import time
-import tarfile
-from datetime import datetime
-
from flask import jsonify
-import conf
-from web import models
-
-
-def HTML_HEADER(title="jarr", css="./style.css"):
- return """<!DOCTYPE html>
-<html lang="en-US">
-<head>
-<title>%s</title>
-<meta charset="utf-8"/>
-<link rel="stylesheet" href="%s" />
-</head>
-<body>""" % (title, css)
-
-HTML_FOOTER = """<hr />
-<p>This archive has been generated with
-<a href="https://github.com/JARR/JARR">jarr</a>.
-A software under AGPLv3 license.
-You are welcome to copy, modify or redistribute the source code according to the
-<a href="https://www.gnu.org/licenses/agpl-3.0.txt">AGPLv3</a> license.</p>
-</body>
-</html>
-"""
-
-CSS = """body {
- font:normal medium 'Gill Sans','Gill Sans MT',Verdana,sans-serif;
- margin:1.20em auto;
- width:80%;
- line-height:1.75;
-}
-blockquote {
- font-size:small;
- line-height:2.153846;
- margin:2.153846em 0;
- padding:0;font-style:oblique;
- border-left:1px dotted;
- margin-left:2.153846em;
- padding-left:2.153846em;
-}
-blockquote p{
- margin:2.153846em 0;
-}
-p+br {
- display:none;
-}
-h1 {
-font-size:large;
-}
-h2,h3 {
- font-size:medium;
-}
-hr {
- border-style:dotted;
- height:1px;
- border-width: 1px 0 0 0;
- margin:1.45em 0 1.4em;
- padding:0;
-}
-a {
- text-decoration:none;
- color:#00008B;
-}
-#footer {
- clear:both;
- text-align:center;
- font-size:small;
-}
-img {
- border:0;
-}
-.horizontal,.simple li {
- margin:0;
- padding:0;
- list-style:none;
- display:inline
-}
-.simple li:before {
- content:"+ ";
-}
-.simple > li:first-child:before {
- content:"";
-}
-.author {
- text-decoration:none;
- display:block;
- float:right;
- margin-left:2em;
- font-size:small;
-}
-.content {
- margin:1.00em 1.00em;
-}"""
-
-
-def export_html(user):
- """
- Export all articles of 'user' in Web pages.
- """
- webzine_root = conf.WEBZINE_ROOT + "/webzine/"
- nb_articles = format(len(models.Article.query.filter(models.Article.user_id == user.id).all()), ",d")
- index = HTML_HEADER("News archive")
- index += "<h1>List of feeds</h1>\n"
- index += """<p>%s articles.</p>\n<ul>\n""" % (nb_articles,)
- for feed in user.feeds.order_by(models.Feed.title):
- # creates a folder for each stream
- feed_folder = webzine_root + str(feed.id)
- try:
- os.makedirs(feed_folder)
- except OSError:
- # directories already exists (not a problem)
- pass
-
- index += """ <li><a href="%s">%s</a></li>\n""" % (feed.id, feed.title)
-
- posts = HTML_HEADER(feed.title, "../style.css")
- posts += """<h1>Articles of the feed <a href="%s">%s</a></h1>\n""" % (feed.site_link, feed.title)
- posts += """<p>%s articles.</p>\n""" % (format(len(feed.articles.all()), ",d"),)
-
- for article in feed.articles:
-
- post_file_name = os.path.normpath(feed_folder + "/" + str(article.id) + ".html")
- feed_index = os.path.normpath(feed_folder + "/index.html")
-
- posts += article.date.ctime() + " - " + """<a href="./%s.html">%s</a>""" % \
- (article.id, article.title[:150]) + "<br />\n"
-
- a_post = HTML_HEADER(article.title, "../style.css")
- a_post += '<div style="width:60%; overflow:hidden; text-align:justify; margin:0 auto">\n'
- a_post += """<h1><a href="%s">%s</a></h1>\n<br />""" % \
- (article.link, article.title)
- a_post += article.content
- a_post += "</div>\n<hr />\n"
- a_post += """<br />\n<a href="%s">Complete story</a>\n<br />\n""" % (article.link,)
- a_post += HTML_FOOTER
-
- with open(post_file_name, "w") as f:
- f.write(a_post)
-
- posts += HTML_FOOTER
- if len(feed.articles.all()) != 0:
- with open(feed_index, "w") as f:
- f.write(posts)
-
- index += "</ul>\n"
- index += "<p>" + time.strftime("Generated on %d %b %Y at %H:%M.") + "</p>\n"
- index += HTML_FOOTER
- with open(webzine_root + "index.html", "w") as f:
- f.write(index)
- with open(webzine_root + "style.css", "w") as f:
- f.write(CSS)
-
- archive_file_name = datetime.now().strftime('%Y-%m-%d') + '.tar.gz'
- with tarfile.open(conf.WEBZINE_ROOT + archive_file_name, "w:gz") as tar:
- tar.add(webzine_root, arcname=os.path.basename(webzine_root))
-
- shutil.rmtree(webzine_root)
-
- with open(conf.WEBZINE_ROOT + archive_file_name, 'rb') as export_file:
- return export_file.read(), archive_file_name
-
def export_json(user):
"""
- Export all articles of 'user' in JSON.
+ Export all articles of user in JSON.
"""
result = []
for feed in user.feeds:
@@ -215,16 +46,13 @@ def export_json(user):
"enabled": feed.enabled,
"created_date": feed.created_date.strftime('%s'),
"articles": [ {
- "title": article.title,
- "link": article.link,
- "content": article.content,
- "readed": article.readed,
- "like": article.like,
- "date": article.date.strftime('%s'),
- "retrieved_date": article.retrieved_date.strftime('%s')
- }
- for article in feed.articles
- ]
- })
-
+ "title": article.title,
+ "link": article.link,
+ "content": article.content,
+ "readed": article.readed,
+ "like": article.like,
+ "date": article.date.strftime('%s'),
+ "retrieved_date": article.retrieved_date.strftime('%s')
+ } for article in feed.articles ]
+ })
return jsonify(result=result)
diff --git a/src/web/templates/management.html b/src/web/templates/management.html
index eaf1de31..2f5eda6f 100644
--- a/src/web/templates/management.html
+++ b/src/web/templates/management.html
@@ -24,9 +24,5 @@
<br />
<a href="{{ url_for('articles.export', format='JSON') }}" class="btn btn-default">{{ _('Export account to JSON') }}</a>
</div>
- <div class="well">
- <h1>{{ _('Export articles') }}</h1>
- <a href="{{ url_for('articles.export', format='HTML') }}" class="btn btn-default">HTML</a>
- </div>
</div><!-- /.container -->
{% endblock %}
diff --git a/src/web/views/article.py b/src/web/views/article.py
index eed9a9d3..572c019e 100644
--- a/src/web/views/article.py
+++ b/src/web/views/article.py
@@ -7,7 +7,7 @@ from flask_login import login_required, current_user
from bootstrap import db
-from web.export import export_json, export_html
+from web.export import export_json
from web.lib.utils import clear_string, redirect_url
from web.controllers import (ArticleController, UserController,
CategoryController)
@@ -125,23 +125,11 @@ def expire():
@login_required
def export():
"""
- Export all articles to HTML or JSON.
+ Export to OPML or JSON.
"""
user = UserController(current_user.id).get(id=current_user.id)
- if request.args.get('format') == "HTML":
- # Export to HTML
- try:
- archive_file, archive_file_name = export_html(user)
- except Exception as e:
- print(e)
- flash(gettext("Error when exporting articles."), 'danger')
- return redirect(redirect_url())
- response = make_response(archive_file)
- response.headers['Content-Type'] = 'application/x-compressed'
- response.headers['Content-Disposition'] = 'attachment; filename=%s' \
- % archive_file_name
- elif request.args.get('format') == "JSON":
- # Export to JSON
+ if request.args.get('format') == "JSON":
+ # Export to JSON for the export of account.
try:
json_result = export_json(user)
except Exception as e:
@@ -152,6 +140,7 @@ def export():
response.headers["Content-Disposition"] \
= 'attachment; filename=account.json'
elif request.args.get('format') == "OPML":
+ # Export to the OPML format.
categories = {cat.id: cat.dump()
for cat in CategoryController(user.id).read()}
response = make_response(render_template('opml.xml', user=user,
bgstack15