Support custom fonts

This commit is contained in:
Raphael Michel
2017-08-23 13:35:47 +02:00
parent 56338be13e
commit 50ca6ee63d
5 changed files with 96 additions and 38 deletions

View File

@@ -8,6 +8,7 @@ import sass
from django.conf import settings
from django.core.files.base import ContentFile
from django.core.files.storage import default_storage
from django.dispatch import Signal
from django.templatetags.static import static as _static
from pretix.base.models import Event
@@ -23,11 +24,6 @@ def regenerate_css(event_id: int):
event = Event.objects.select_related('organizer').get(pk=event_id)
sassdir = os.path.join(settings.STATIC_ROOT, 'pretixpresale/scss')
sassrules = []
if event.settings.get('primary_color'):
sassrules.append('$brand-primary: {};'.format(event.settings.get('primary_color')))
sassrules.append('@import "main.scss";')
def static(path):
sp = _static(path)
if not settings.MEDIA_URL.startswith("/") and sp.startswith("/"):
@@ -41,6 +37,19 @@ def regenerate_css(event_id: int):
sp = urljoin(settings.SITE_URL, sp)
return '"{}"'.format(sp)
sassrules = []
if event.settings.get('primary_color'):
sassrules.append('$brand-primary: {};'.format(event.settings.get('primary_color')))
font = event.settings.get('primary_font')
if font != 'Open Sans':
sassrules.append(get_font_stylesheet(font))
sassrules.append('$font-family-sans-serif: "{}", "Open Sans", "OpenSans", "Helvetica Neue", Helvetica, Arial, sans-serif !default'.format(
font
))
sassrules.append('@import "main.scss";')
cf = dict(django_libsass.CUSTOM_FUNCTIONS)
cf['static'] = static
css = sass.compile(
@@ -57,3 +66,62 @@ def regenerate_css(event_id: int):
newname = default_storage.save(fname, ContentFile(css.encode('utf-8')))
event.settings.set('presale_css_file', newname)
event.settings.set('presale_css_checksum', checksum)
register_fonts = Signal()
"""
Return a dictionaries of the following structure. Paths should be relative to static root.
{
"font name": {
"regular": {
"truetype": "….ttf",
"woff": "",
"woff2": ""
},
"bold": {
...
},
"italic": {
...
},
"bolditalic": {
...
}
}
}
"""
def get_fonts():
f = {}
for recv, value in register_fonts.send(0):
f.update(value)
return f
def get_font_stylesheet(font_name):
stylesheet = []
font = get_fonts()[font_name]
for sty, formats in font.items():
stylesheet.append('@font-face { ')
stylesheet.append('font-family: "{}";'.format(font_name))
if sty in ("italic", "bolditalic"):
stylesheet.append("font-style: italic;")
else:
stylesheet.append("font-style: normal;")
if sty in ("bold", "bolditalic"):
stylesheet.append("font-weight: bold;")
else:
stylesheet.append("font-weight: normal;")
srcs = []
if "woff2" in formats:
srcs.append("url(static('{}')) format('woff2')".format(formats['woff2']))
if "woff" in formats:
srcs.append("url(static('{}')) format('woff')".format(formats['woff']))
if "truetype" in formats:
srcs.append("url(static('{}')) format('truetype')".format(formats['truetype']))
stylesheet.append("src: {};".format(", ".join(srcs)))
stylesheet.append("}")
return "\n".join(stylesheet)