OpenSlides/client/src/app/core/ui-services/load-font.service.ts
Sean Engelhardt 0053bb56a2 Add custom fonts (WIP)
Pretty much angular magic
2019-02-26 11:38:30 +01:00

83 lines
2.4 KiB
TypeScript

import { Injectable } from '@angular/core';
import { ConfigService } from './config.service';
/**
* Enables the usage of the FontFace constructor
*/
declare let FontFace: any;
/**
* The linter refuses to allow Document['fonts'].
* Since Document.fonts is working draft since 2016, typescript
* dies not yet support it natively (even though it exists in normal browsers)
*/
interface FontDocument extends Document {
fonts: any;
}
/**
* Service to dynamically load and sets custom loaded fonts
* using FontFace.
* Browser support might not be perfect yet.
*/
@Injectable({
providedIn: 'root'
})
export class LoadFontService {
/**
* The prefix to load custom fonts from
*/
private urlPrefix = window.location.origin;
/**
* Constructor
*
* @param configService To observe the config variables
*/
public constructor(private configService: ConfigService) {
this.loadCustomFont();
}
/**
* Observes and loads custom fonts for the projector.
* Currently, normal and regular fonts can be considered, since
* italic fonts can easily be calculated by the browser.
* Falls back to the normal OSFont when no custom font was set.
*/
private loadCustomFont(): void {
this.configService.get<any>('font_regular').subscribe(regular => {
if (regular) {
this.setCustomProjectorFont(regular, 400);
}
});
this.configService.get<any>('font_bold').subscribe(bold => {
if (bold) {
this.setCustomProjectorFont(bold, 500);
}
});
}
/**
* Sets a new font for the custom projector. Weight is required to
* differentiate between bold and normal fonts
*
* @param font the font object from the config service
* @param weight the desired weight of the font
*/
private setCustomProjectorFont(font: any, weight: number): void {
const path = font.path ? font.path : font.default;
const url = font.path ? `${this.urlPrefix}${path}` : path;
const fontFace = new FontFace('customProjectorFont', `url(${url})`, { weight: weight });
fontFace
.load()
.then(res => {
(document as FontDocument).fonts.add(res);
})
.catch(error => {
console.error(error);
});
}
}