HarfBuzz text shaping engine
http://harfbuzz.github.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.8 KiB
62 lines
1.8 KiB
#!/usr/bin/env python |
|
|
|
from __future__ import print_function, division, absolute_import |
|
|
|
import sys |
|
import xml.etree.ElementTree as ET |
|
|
|
# Can we extract this from HTML element itself? I couldn't. |
|
namespaces = { |
|
'ft': 'https://github.com/OpenType/fonttest', |
|
'xlink': 'http://www.w3.org/1999/xlink', |
|
} |
|
def ns(s): |
|
ns,s = s.split(':') |
|
return '{%s}%s' % (namespaces[ns], s) |
|
|
|
def unistr(s): |
|
return ','.join('U+%04X' % ord(c) for c in s) |
|
|
|
def glyphstr(glyphs): |
|
out = [] |
|
for glyphname,x,y in glyphs: |
|
if x or y: |
|
out.append('%s@%d,%d' % (glyphname, x, y)) |
|
else: |
|
out.append(glyphname) |
|
return '['+'|'.join(out)+']' |
|
|
|
html = ET.fromstring(sys.stdin.read()) |
|
found = False |
|
|
|
for elt in html.findall(".//*[@class='expected'][@ft:id]", namespaces): |
|
found = True |
|
name = elt.get(ns('ft:id')) |
|
text = elt.get(ns('ft:render')) |
|
font = elt.get(ns('ft:font')) |
|
variations = elt.get(ns('ft:var'), '').replace(':', '=').replace(';', ',') |
|
glyphs = [] |
|
for use in elt.findall(".//use"): |
|
x = int(use.get('x')) |
|
y = int(use.get('y')) |
|
href = use.get(ns('xlink:href')) |
|
assert href[0] == '#' |
|
glyphname = '.'.join(href[1:].split('/')[1].split('.')[1:]) |
|
glyphs.append((glyphname, x, y)) |
|
opts = '--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft' |
|
if variations: |
|
opts = opts + ' --variations=%s' % variations |
|
print ("../fonts/%s:%s:%s:%s" % (font, opts, unistr(text), glyphstr(glyphs))) |
|
|
|
for elt in html.findall(".//*[@class='should-not-crash'][@ft:id]", namespaces): |
|
found = True |
|
name = elt.get(ns('ft:id')) |
|
text = elt.get(ns('ft:render')) |
|
font = elt.get(ns('ft:font')) |
|
variations = elt.get(ns('ft:var'), '').replace(':', '=').replace(';', ',') |
|
opts = '' |
|
if variations: |
|
opts = '--variations=%s' % variations |
|
print ("../fonts/%s:%s:%s:*" % (font, opts, unistr(text))) |
|
|
|
sys.exit(0 if found else 1)
|
|
|