SVGHMI: Added fonts.py with functions to convert ttf, otf and woff fonts into data_uri based CSS font-face svghmi
authorEdouard Tisserant <edouard.tisserant@gmail.com>
Mon, 29 Mar 2021 07:11:45 +0200
branchsvghmi
changeset 3203 debd5014ce21
parent 3202 5d379934d5c9
child 3207 de6b878c324d
SVGHMI: Added fonts.py with functions to convert ttf, otf and woff fonts into data_uri based CSS font-face
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"))