Source code for sagenb.notebook.template

# -*- coding: utf-8 -*-
"""
HTML Templating for the Notebook

AUTHORS:

- Bobby Moretti (2007-07-18): initial version

- Timothy Clemans and Mike Hansen (2008-10-27): major update
"""
from __future__ import absolute_import
#############################################################################
#       Copyright (C) 2007 William Stein <wstein@gmail.com>
#  Distributed under the terms of the GNU General Public License (GPL)
#  The full text of the GPL is available at:
#                  http://www.gnu.org/licenses/
#############################################################################

import jinja2

import os, re, sys

from sagenb.misc.misc import SAGE_VERSION, DATA
from flask_babel import gettext, ngettext, lazy_gettext
from flask import current_app as app

if 'SAGENB_TEMPLATE_PATH' in os.environ:
    if not os.path.isdir(os.environ['SAGENB_TEMPLATE_PATH']):
        raise ValueError("Enviromental variable SAGENB_TEMPLATE_PATH points to\
                         a non-existant directory")
    TEMPLATE_PATH = os.environ['SAGENB_TEMPLATE_PATH']
else:
    TEMPLATE_PATH = os.path.join(DATA, 'sage')

css_illegal_re = re.compile(r'[^-A-Za-z_0-9]')

[docs]def css_escape(string): r""" Returns a string with all characters not legal in a css name replaced with hyphens (-). INPUT: - ``string`` -- the string to be escaped. EXAMPLES:: sage: from sagenb.notebook.template import css_escape sage: css_escape('abcd') 'abcd' sage: css_escape('12abcd') '12abcd' sage: css_escape(r'\'"abcd\'"') '---abcd---' sage: css_escape('my-invalid/identifier') 'my-invalid-identifier' sage: css_escape(r'quotes"mustbe!escaped') 'quotes-mustbe-escaped' """ return css_illegal_re.sub('-', string)
[docs]def prettify_time_ago(t): """ Converts seconds to a meaningful string. INPUT - t -- time in seconds """ if t < 60: s = int(t) return ngettext('%(num)d second', '%(num)d seconds', s) if t < 3600: m = int(t/60) return ngettext('%(num)d minute', '%(num)d minutes', m) if t < 3600*24: h = int(t/3600) return ngettext('%(num)d hour', '%(num)d hours', h) d = int(t/(3600*24)) return ngettext('%(num)d day', '%(num)d days', d)
[docs]def clean_name(name): """ Converts a string to a safe/clean name by converting non-alphanumeric characters to underscores. INPUT: - name -- a string EXAMPLES:: sage: from sagenb.notebook.template import clean_name sage: print(clean_name('this!is@bad+string')) this_is_bad_string """ return ''.join([x if x.isalnum() else '_' for x in name])
[docs]def template(filename, **user_context): """ Returns HTML, CSS, etc., for a template file rendered in the given context. INPUT: - ``filename`` - a string; the filename of the template relative to ``sagenb/data/templates`` - ``user_context`` - a dictionary; the context in which to evaluate the file's template variables OUTPUT: - a string - the rendered HTML, CSS, etc. EXAMPLES:: sage: from sagenb.flask_version import base # random output -- depends on warnings issued by other sage packages sage: app = base.create_app(tmp_dir(ext='.sagenb')) sage: ctx = app.app_context() sage: ctx.push() sage: from sagenb.notebook.template import template sage: s = template(os.path.join('html', 'yes_no.html')); type(s) <type 'unicode'> sage: 'Yes' in s True sage: u = unicode('Are Gröbner bases awesome?','utf-8') sage: s = template(os.path.join('html', 'yes_no.html'), message=u) sage: 'Gr\xc3\xb6bner' in s.encode('utf-8') True """ from sagenb.notebook.notebook import MATHJAX, JEDITABLE_TINYMCE from .misc import notebook #A dictionary containing the default context default_context = {'sitename': gettext('Sage Notebook'), 'sage_version': SAGE_VERSION, 'MATHJAX': MATHJAX, 'gettext': gettext, 'JEDITABLE_TINYMCE': JEDITABLE_TINYMCE, 'conf': notebook.conf() if notebook else None} try: tmpl = app.jinja_env.get_template(filename) except jinja2.exceptions.TemplateNotFound: return "Notebook Bug -- missing template %s"%filename context = dict(default_context) context.update(user_context) r = tmpl.render(**context) return r