import fontforge
import os
import md5
import subprocess
import tempfile
import json
import copy
SCRIPT_PATH = os.path.dirname(os.path.abspath(__file__))
BLANK_PATH = os.path.join(SCRIPT_PATH, 'blank.svg')
INPUT_SVG_DIR = os.path.join(SCRIPT_PATH, '..', '..', 'src/icons/svg')
OUTPUT_FONT_DIR = os.path.join(SCRIPT_PATH, '..', '..', 'src/icons/font')
AUTO_WIDTH = True
KERNING = 15
m = md5.new()
f = fontforge.font()
f.encoding = 'UnicodeFull'
f.design_size = 24
f.em = 24
f.ascent = 448
f.descent = 64
# Add lookup table
f.addLookup("ligatable","gsub_ligature",(),(("liga",(("latn",("dflt")),)),))
f.addLookupSubtable("ligatable","ligatable1")
# Import base characters
for char in "0123456789abcdefghijklmnopqrstuvwzxyz_- ":
glyph = f.createChar(ord(char))
glyph.importOutlines(BLANK_PATH)
glyph.width = 0
font_name = 'swiper-icons';
m.update(font_name + ';')
for dirname, dirnames, filenames in os.walk(INPUT_SVG_DIR):
for filename in filenames:
name, ext = os.path.splitext(filename)
filePath = os.path.join(dirname, filename)
size = os.path.getsize(filePath)
if ext in ['.svg', '.eps']:
if ext in ['.svg']:
# hack removal of tags
svgfile = open(filePath, 'r+')
tmpsvgfile = tempfile.NamedTemporaryFile(suffix=ext, delete=False)
svgtext = svgfile.read()
svgfile.seek(0)
# replace the tags with 'nothing'
svgtext = svgtext.replace('', '')
svgtext = svgtext.replace('', '')
tmpsvgfile.file.write(svgtext)
svgfile.close()
tmpsvgfile.file.close()
filePath = tmpsvgfile.name
# end hack
m.update(name + str(size) + ';')
glyph = f.createChar(-1, name)
glyph.importOutlines(filePath)
# Add ligatures
ligature = [];
for c in name:
if (c == '_'):
c = "underscore"
if (c == '-'):
c = "hyphen"
if (c == ' '):
c = "space"
ligature.append(c)
glyph.addPosSub('ligatable1', ligature)
# if we created a temporary file, let's clean it up
if tmpsvgfile:
os.unlink(tmpsvgfile.name)
# set glyph size explicitly or automatically depending on autowidth
if AUTO_WIDTH:
glyph.left_side_bearing = glyph.right_side_bearing = 0
glyph.round()
# resize glyphs if autowidth is enabled
if AUTO_WIDTH:
f.autoWidth(0, 0, 512)
fontfile = '%s/swiper-icons' % (OUTPUT_FONT_DIR)
print fontfile;
build_hash = m.hexdigest()
f.fontname = font_name
f.familyname = font_name
f.fullname = font_name
f.generate(fontfile + '.ttf')
scriptPath = os.path.dirname(os.path.realpath(__file__))
try:
subprocess.Popen([scriptPath + '/sfnt2woff', fontfile + '.ttf'], stdout=subprocess.PIPE)
except OSError:
# If the local version of sfnt2woff fails (i.e., on Linux), try to use the
# global version. This allows us to avoid forcing OS X users to compile
# sfnt2woff from source, simplifying install.
subprocess.call(['sfnt2woff', fontfile + '.ttf'])
# Hint the TTF file
subprocess.call('ttfautohint -s -f -n ' + fontfile + '.ttf ' + fontfile + '-hinted.ttf > /dev/null 2>&1 && mv ' + fontfile + '-hinted.ttf ' + fontfile + '.ttf', shell=True)
# WOFF2 Font
subprocess.call('woff2_compress ' + fontfile + '.ttf', shell=True)