mirror of
https://github.com/janeczku/calibre-web
synced 2024-08-30 13:02:41 +00:00
![OzzieIsaacs](/assets/img/avatar_default.png)
Bugfix for feeds - removed categories related and up - load new books now working - category random now working login page is free of non accessible elements boolean custom column is vivible in UI books with only with certain languages can be shown book shelfs can be deleted from UI Anonymous user view is more resticted Added browse of series in sidebar Dependencys in vendor folder are updated to newer versions (licencs files are now present) Bugfix editing Authors names Made upload on windows working
112 lines
3.0 KiB
Python
112 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
jinja2._compat
|
|
~~~~~~~~~~~~~~
|
|
|
|
Some py2/py3 compatibility support based on a stripped down
|
|
version of six so we don't have to depend on a specific version
|
|
of it.
|
|
|
|
:copyright: Copyright 2013 by the Jinja team, see AUTHORS.
|
|
:license: BSD, see LICENSE for details.
|
|
"""
|
|
import sys
|
|
|
|
PY2 = sys.version_info[0] == 2
|
|
PYPY = hasattr(sys, 'pypy_translation_info')
|
|
_identity = lambda x: x
|
|
|
|
|
|
if not PY2:
|
|
unichr = chr
|
|
range_type = range
|
|
text_type = str
|
|
string_types = (str,)
|
|
integer_types = (int,)
|
|
|
|
iterkeys = lambda d: iter(d.keys())
|
|
itervalues = lambda d: iter(d.values())
|
|
iteritems = lambda d: iter(d.items())
|
|
|
|
import pickle
|
|
from io import BytesIO, StringIO
|
|
NativeStringIO = StringIO
|
|
|
|
def reraise(tp, value, tb=None):
|
|
if value.__traceback__ is not tb:
|
|
raise value.with_traceback(tb)
|
|
raise value
|
|
|
|
ifilter = filter
|
|
imap = map
|
|
izip = zip
|
|
intern = sys.intern
|
|
|
|
implements_iterator = _identity
|
|
implements_to_string = _identity
|
|
encode_filename = _identity
|
|
get_next = lambda x: x.__next__
|
|
|
|
else:
|
|
unichr = unichr
|
|
text_type = unicode
|
|
range_type = xrange
|
|
string_types = (str, unicode)
|
|
integer_types = (int, long)
|
|
|
|
iterkeys = lambda d: d.iterkeys()
|
|
itervalues = lambda d: d.itervalues()
|
|
iteritems = lambda d: d.iteritems()
|
|
|
|
import cPickle as pickle
|
|
from cStringIO import StringIO as BytesIO, StringIO
|
|
NativeStringIO = BytesIO
|
|
|
|
exec('def reraise(tp, value, tb=None):\n raise tp, value, tb')
|
|
|
|
from itertools import imap, izip, ifilter
|
|
intern = intern
|
|
|
|
def implements_iterator(cls):
|
|
cls.next = cls.__next__
|
|
del cls.__next__
|
|
return cls
|
|
|
|
def implements_to_string(cls):
|
|
cls.__unicode__ = cls.__str__
|
|
cls.__str__ = lambda x: x.__unicode__().encode('utf-8')
|
|
return cls
|
|
|
|
get_next = lambda x: x.next
|
|
|
|
def encode_filename(filename):
|
|
if isinstance(filename, unicode):
|
|
return filename.encode('utf-8')
|
|
return filename
|
|
|
|
|
|
def with_metaclass(meta, *bases):
|
|
# This requires a bit of explanation: the basic idea is to make a
|
|
# dummy metaclass for one level of class instanciation that replaces
|
|
# itself with the actual metaclass. Because of internal type checks
|
|
# we also need to make sure that we downgrade the custom metaclass
|
|
# for one level to something closer to type (that's why __call__ and
|
|
# __init__ comes back from type etc.).
|
|
#
|
|
# This has the advantage over six.with_metaclass in that it does not
|
|
# introduce dummy classes into the final MRO.
|
|
class metaclass(meta):
|
|
__call__ = type.__call__
|
|
__init__ = type.__init__
|
|
def __new__(cls, name, this_bases, d):
|
|
if this_bases is None:
|
|
return type.__new__(cls, name, (), d)
|
|
return meta(name, bases, d)
|
|
return metaclass('temporary_class', None, {})
|
|
|
|
|
|
try:
|
|
from urllib.parse import quote_from_bytes as url_quote
|
|
except ImportError:
|
|
from urllib import quote as url_quote
|