#!/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='expected-no-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)
