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