# HG changeset patch # User Edouard Tisserant # Date 1616994705 -7200 # Node ID debd5014ce2183879e14fbaffd5b4b5427f536e2 # Parent 5d379934d5c976779f15439223e84f354759d022 SVGHMI: Added fonts.py with functions to convert ttf, otf and woff fonts into data_uri based CSS font-face diff -r 5d379934d5c9 -r debd5014ce21 svghmi/fonts.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/svghmi/fonts.py Mon Mar 29 07:11:45 2021 +0200 @@ -0,0 +1,69 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of Beremiz +# Copyright (C) 2021: Edouard TISSERANT +# +# See COPYING file for copyrights details. + +from __future__ import print_function +from base64 import b64encode + +from fontTools import ttLib + +def GetFontTypeAndFamilyName(filename): + """ + Getting font family, format and MIME type + """ + + familyname = None + formatname = None + mimetype = None + + font = ttLib.TTFont(filename) + # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html + for name in font["name"].names: + if name.nameID==1 and name.platformID in [0,3]: + familyname = name.toUnicode() + + if font.flavor : + # woff and woff2 + formatname = font.flavor + mimetype = "font/" + formatname + # conditions on sfntVersion was deduced from fontTools.ttLib.sfnt + elif font.sfntVersion in ("\x00\x01\x00\x00", "true"): + formatname = "truetype" + mimetype = "font/ttf" + elif font.sfntVersion == "OTTO": + formatname = "opentype" + mimetype = "font/otf" + + return familyname,formatname,mimetype + +def DataURIFromFile(filename, mimetype): + with open(filename, "rb") as fp: + data = fp.read() + return "".join([ + "data:", + mimetype, + ";base64,", + b64encode(data).strip()]) + +def GetCSSFontFaceFromFontFile(filename): + familyname, formatname, mimetype = GetFontTypeAndFamilyName(filename) + data_uri = DataURIFromFile(filename, mimetype) + css_font_face = \ + """ + @font-face {{ + font-family: "{}"; + src: url("{}") format("{}") + }} + """.format(familyname, data_uri, formatname) + return css_font_face + + +# tests +if __name__ == '__main__': + print(GetCSSFontFaceFromFontFile("/usr/share/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf")) + print(GetCSSFontFaceFromFontFile("/usr/share/fonts/opentype/urw-base35/NimbusSans-Regular.otf")) + print(GetCSSFontFaceFromFontFile("/usr/share/yelp/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Regular.woff"))