diff options
-rw-r--r-- | README.rst | 1 | ||||
-rw-r--r-- | src/web/export.py | 198 | ||||
-rw-r--r-- | src/web/templates/management.html | 4 | ||||
-rw-r--r-- | src/web/views/article.py | 21 |
4 files changed, 18 insertions, 206 deletions
@@ -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, |