#### Imports import logging from io import BytesIO import re import os import jinja2 as j2 from flask import ( Flask, render_template, render_template_string, request, redirect, flash, send_file, ) from markupsafe import Markup # No longer imported from Flask # Form libraries from flask_wtf import FlaskForm from wtforms import ( StringField, RadioField, SelectField, SubmitField, TextAreaField, BooleanField, SelectMultipleField, ) from wtforms.validators import ( DataRequired, InputRequired, Optional, Regexp, URL, Length, ) from wtforms.fields import HiddenField # Translations from flask_babel import Babel from flask_babel import lazy_gettext as _ from flask import redirect, request, make_response # Language swap by redirecting # Markdown to HTML - for debugging purposes from misaka import Markdown, HtmlRenderer # Managing zipfiles import zipfile from flask_cors import CORS from urllib import parse from secrets import token_urlsafe logger = logging.getLogger() #### GLOBAL VARIABLES YOLOGEN_VERSION = "0.10" GENERATOR_DICT = {"GENERATOR_VERSION": YOLOGEN_VERSION} #### Create FLASK and Jinja Environments app = Flask(__name__) app.config["SECRET_KEY"] = token_urlsafe(16) # Necessary for the form CORS cors = CORS(app) environment = j2.Environment(loader=j2.FileSystemLoader("templates/")) def is_hidden_field_filter(field): return isinstance(field, HiddenField) app.jinja_env.globals["bootstrap_is_hidden_field"] = is_hidden_field_filter # Handle translations BABEL_TRANSLATION_DIRECTORIES = "translations" babel = Babel() LANGUAGES = {"en": _("English"), "fr": _("French")} @app.context_processor def inject_conf_var(): return dict(AVAILABLE_LANGUAGES=LANGUAGES) def configure(app): babel.init_app(app, locale_selector=get_locale) app.config["LANGUAGES"] = LANGUAGES def get_locale(): print(request.accept_languages.best_match(app.config["LANGUAGES"].keys())) print(request.cookies.get("lang", "en")) # return 'en' # to test # return 'fr' if request.args.get("language"): print(request.args.get("language")) session["language"] = request.args.get("language") return request.cookies.get("lang", "en") # return request.accept_languages.best_match(app.config['LANGUAGES'].keys()) # The result is based on the Accept-Language header. For testing purposes, you can directly return a language code, for example: return ‘de’ configure(app) #### Custom functions # Define custom filter @app.template_filter("render_markdown") def render_markdown(text): renderer = HtmlRenderer() markdown = Markdown(renderer) return markdown(text) # Add custom filter j2.filters.FILTERS["render_markdown"] = render_markdown # Converting markdown to html def markdown_file_to_html_string(file): with open(file, "r") as file: markdown_content = file.read() # Convert content from Markdown to HTML html_content = render_markdown(markdown_content) # Return Markdown and HTML contents return markdown_content, html_content ### Forms # Language selector. Not used (in GeneratorForm) until it's fixed or superseeded. # Use it in the HTML with {{ form_field(main_form.generator_language) }} class Translations(FlaskForm): generator_language = SelectField( _("Select language"), choices=[("none", "")] + [language for language in LANGUAGES.items()], default=["en"], id="selectLanguage", ) class GeneralInfos(FlaskForm): app_id = StringField( Markup(_("Application identifier (id)")), description=_("Small caps and without spaces"), validators=[DataRequired(), Regexp("[a-z_1-9]+.*(?") def set_language(language=None): response = make_response(redirect(request.referrer or "/")) response.set_cookie("lang", language) return response #### Running the web server if __name__ == "__main__": app.run(debug=True)