#!/usr/bin/env/ python # Copyright (C) 2021, Anais Berck # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details: . from flask import Flask, render_template, request, Response, session # from weasyprint import HTML from pagedjs import make_pdf from settings import DEBUG, BASEURL, DEFAULT_LANGUAGE, SECRET_KEY import os from fcntl import lockf, LOCK_EX, LOCK_UN # Spacy tries to import CUDA, do not break when it fails try: from paseo import crear_camino except ModuleNotFoundError: pass import os.path basepath = os.path.dirname(__file__) app = Flask(__name__) app.secret_key = SECRET_KEY # Book HTML is loaded through filesystem, in a tmp dir, make path absolute. PAGEDJS_STATIC_DIR = os.path.join(basepath, 'static') COUNTER_PATH_ES = 'edition_counter.txt' COUNTER_PATH_EN = 'edition_counter_en.txt' def get_edition_count_es(): fd = os.open(COUNTER_PATH_ES, os.O_RDWR|os.O_CREAT) lockf(fd, LOCK_EX) fo = os.fdopen(fd, 'r+', encoding='utf-8') content = fo.read() if not content: edition_count = 0 else: edition_count = int(content.strip()) edition_count += 1 fo.seek(0) fo.truncate() fo.write(str(edition_count)) fo.flush() lockf(fd, LOCK_UN) os.close(fd) return edition_count def get_edition_count_en(): fd = os.open(COUNTER_PATH_EN, os.O_RDWR|os.O_CREAT) lockf(fd, LOCK_EX) fo = os.fdopen(fd, 'r+', encoding='utf-8') content = fo.read() if not content: edition_count = 0 else: edition_count = int(content.strip()) edition_count += 1 fo.seek(0) fo.truncate() fo.write(str(edition_count)) fo.flush() lockf(fd, LOCK_UN) os.close(fd) return edition_count def get_language(): if 'LANGUAGE' in session: return session['LANGUAGE'] else: return DEFAULT_LANGUAGE def set_language(language): session['LANGUAGE'] = language session.modified = True def index_es(): return render_template('index.html') def index_en(): return render_template('index_en.html') @app.route('{}/en'.format(BASEURL)) def en(): set_language('en') return index() @app.route('{}/es'.format(BASEURL)) def es(): set_language('es') return index() @app.route('{}/'.format(BASEURL)) def index(): if get_language() == 'es': return index_es() else: return index_en() def book_es (): edition_count = get_edition_count_es() fragment = max(0, min(1, int(request.form['fragment']))) first_word = 'un' if fragment == 0: novel = os.path.join(basepath, '../data/emilia_prueba.txt') author = 'Emilia Pardo Bazán' # Non breaking spaces title = 'La Madre Naturaleza' # Non breaking spaces else: novel = os.path.join(basepath, '../data/prueba.txt') author = 'Benito Pérez Gáldos' # Non breaking spaces title = 'Miau' path = crear_camino(novel, first_word, 'es') context = { 'title': title, 'author': author, 'path': path, 'STATIC_DIR': '/static' if DEBUG else PAGEDJS_STATIC_DIR, 'DEBUG': DEBUG, 'edition_count': edition_count, } html = render_template('book.html', **context) if (DEBUG): return html else: pdf = make_pdf(html) r = Response(pdf, mimetype='application/pdf') r.headers.extend({ 'Content-Disposition': 'attachment; filename="Paseo por arboles de Madrid.pdf"' }) return r def book_en (): edition_count = get_edition_count_en() fragment = max(0, min(1, int(request.form['fragment']))) first_word = 'a' if fragment == 0: novel = os.path.join(basepath, '../data/emilia_english.txt') author = 'Emilia Pardo Bazán' # Non breaking spaces title = 'The Swan of Vila Morta' # Non breaking spaces else: novel = os.path.join(basepath, '../data/benito_english.txt') author = 'Benito Pérez Gáldos' # Non breaking spaces title = 'Marianela' path = crear_camino(novel, first_word, 'en') context = { 'title': title, 'author': author, 'path': path, 'STATIC_DIR': '/static' if DEBUG else PAGEDJS_STATIC_DIR, 'DEBUG': DEBUG, 'edition_count': edition_count, } html = render_template('book_en.html', **context) if (DEBUG): return html else: pdf = make_pdf(html) r = Response(pdf, mimetype='application/pdf') r.headers.extend({ 'Content-Disposition': 'attachment; filename="Walk along the trees of Madrid.pdf"' }) return r @app.route('{}/book'.format(BASEURL), methods=['POST']) def book(): if get_language() == 'es': return book_es() else: return book_en()