59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
import logging
|
|
import re
|
|
|
|
from staticfiles.storage import staticfiles_storage
|
|
from staticfiles import finders
|
|
from django.conf import settings
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
def try_staticfiles_lookup(path):
|
|
"""
|
|
Try to lookup a path in staticfiles_storage. If it fails, return
|
|
a dead link instead of raising an exception.
|
|
"""
|
|
try:
|
|
url = staticfiles_storage.url(path)
|
|
except Exception as err:
|
|
log.warning("staticfiles_storage couldn't find path {0}: {1}".format(
|
|
path, str(err)))
|
|
# Just return the original path; don't kill everything.
|
|
url = path
|
|
return url
|
|
|
|
|
|
def replace(static_url, prefix=None):
|
|
if prefix is None:
|
|
prefix = ''
|
|
else:
|
|
prefix = prefix + '/'
|
|
|
|
quote = static_url.group('quote')
|
|
|
|
servable = (
|
|
# If in debug mode, we'll serve up anything that the finders can find
|
|
(settings.DEBUG and finders.find(static_url.group('rest'), True)) or
|
|
# Otherwise, we'll only serve up stuff that the storages can find
|
|
staticfiles_storage.exists(static_url.group('rest'))
|
|
)
|
|
|
|
if servable:
|
|
return static_url.group(0)
|
|
else:
|
|
# don't error if file can't be found
|
|
url = try_staticfiles_lookup(prefix + static_url.group('rest'))
|
|
return "".join([quote, url, quote])
|
|
|
|
|
|
def replace_urls(text, staticfiles_prefix=None, replace_prefix='/static/'):
|
|
def replace_url(static_url):
|
|
return replace(static_url, staticfiles_prefix)
|
|
|
|
return re.sub(r"""
|
|
(?x) # flags=re.VERBOSE
|
|
(?P<quote>\\?['"]) # the opening quotes
|
|
(?P<prefix>{prefix}) # the prefix
|
|
(?P<rest>.*?) # everything else in the url
|
|
(?P=quote) # the first matching closing quote
|
|
""".format(prefix=replace_prefix), replace_url, text)
|