import json from typing import Any from typing import Dict from typing import List from jinja2 import Environment from jinja2 import PackageLoader from jinja2 import select_autoescape from .settings import BOOTSTRAP_URL from .settings import SUGGESTED_JS_BY_PLATFORM from .settings import SURVEY_JS_CDN from .settings import SURVEY_JS_THEMES # Initialize Jinja environment env = Environment( loader=PackageLoader("questions", "templates"), autoescape=select_autoescape(["html", "xml"]), ) def _render_template( kind: str = "js", platform: str = "jquery", **context_data: Dict, ): filename = f"survey_{kind}.{platform}.jinja" template = env.get_template(filename) return template.render(**context_data) def get_platform_js_resources( platform: str = "jquery", resource_url: str = SURVEY_JS_CDN, ): """ Get the list of suggested JS resources for a platform. if not using the CDN, only the main SurveyJS JS file is returned. :param platform: The name of the JS platform. :param resource_url: The URL where all SurveyJS resources are located. :Returns: The list of resource URLs. """ survey_js = f"{resource_url}/survey-{platform}/survey.{platform}.min.js" platform_js = [] for js in SUGGESTED_JS_BY_PLATFORM[platform]: if resource_url == SURVEY_JS_CDN: platform_js.append(js) else: filename = js.split("/")[-1] platform_js.append(f"{resource_url}/{filename}") platform_js.append(survey_js) return platform_js def get_theme_css_resources( theme: str = "defaultV2", resource_url: str = SURVEY_JS_CDN, ): """ Get the list of suggested CSS resources for a theme. if not using the CDN, or using an unsupported theme, only the main SurveyJS CSS file is returned. :param theme: The name of the CSS theme. :param resource_url: The URL where all SurveyJS resources are located. :Returns: The list of resource URLs. """ if theme == "bootstrap" and resource_url == SURVEY_JS_CDN: return [BOOTSTRAP_URL] elif theme == "bootstrap": return [f"{resource_url}/bootstrap.min.css"] if theme not in SURVEY_JS_THEMES: theme = "survey" return [f"{resource_url}/survey-core/{theme}.min.css"] def get_survey_js( form_json: str = "", form_data: Dict[str, Any] = None, html_id: str = "questions_form", action: str = "", theme: str = "defaultV2", platform: str = "jquery", ): """ Get the SurveyJS initialization script and form definition. :param form_json: The JSON generated from the questions form. :param form_data: Any form data to set on the rendered form. :param html_id: The HTML id of the form placeholder. :param action: The URL where the submitted form data will be posted. :param theme: The name of the SurveyJS theme to use. :param platform: The name of the supported SurveyJS platform to use. :Returns: The rendered JS as string. """ if form_data is None: form_data = {} data = json.dumps(form_data) return _render_template( kind="js", platform=platform, theme=theme, json=form_json, data=data, action=action, html_id=html_id, ) def get_form_page( title: str = "", html_id: str = "questions_form", platform: str = "jquery", survey_js: str = "", js_resources: List = None, css_resources: List = None, ): """ Generate a standalone SurveyJS HTML page. :param title: The form title to display. :param html_id: The HTML id of the form placeholder. :param platform: The name of the supported SurveyJS platform to use. :param survey_js: The generated JS to put in the form. :param js_resources: The list of JS resources to add to the HTMl head. :param css_resources: The list of CSS resources to add to the HTMl head. :Returns: The rendered HTML as string. """ resources = "" if js_resources is None: js_resources = [] if css_resources is None: css_resources = [] for resource in js_resources: resources += f'\n' for resource in css_resources: resources += f'\n' return _render_template( kind="html", platform=platform, title=title, resources=resources, html_id=html_id, survey_js=survey_js, )