#!/usr/bin/env python3
from lxml import etree
from utils.misc import downloadWithProgressBar, UnicodeXMLURL
from utils import mathfont
# Retrieve the unicode.xml file if necessary.
unicodeXML = downloadWithProgressBar(UnicodeXMLURL)
# Extract the mathvariants transformation.
xsltTransform = etree.XSLT(etree.XML('''\
'''))
# Put the mathvariant transforms into a Python structure.
mathvariantTransforms = {}
root = xsltTransform(etree.parse(unicodeXML)).getroot()
def parseCodePoint(aHexaString):
return int("0x%s" % aHexaString[1:], 16)
for entry in root:
mathvariant = entry.get("mathvariant")
baseChar = parseCodePoint(entry.get("baseChar"))
transformedChar = parseCodePoint(entry.get("transformedChar"))
if mathvariant not in mathvariantTransforms:
mathvariantTransforms[mathvariant] = {}
mathvariantTransforms[mathvariant][baseChar] = transformedChar
# There is no "isolated" mathvariant.
del mathvariantTransforms["isolated"]
# Automatic mathvariant uses the same transform as italic.
# It is handled specially (see below).
mathvariantTransforms["auto"] = mathvariantTransforms["italic"]
# Create a WOFF font for each mathvariant.
for mathvariant in mathvariantTransforms:
if mathvariant == "auto":
continue
font = mathfont.create("mathvariant-%s" % mathvariant,
"Copyright (c) 2016 MathML Association")
for baseChar in mathvariantTransforms[mathvariant]:
if baseChar not in font:
mathfont.createGlyphFromValue(font, baseChar)
transformedChar = mathvariantTransforms[mathvariant][baseChar]
mathfont.createGlyphFromValue(font, transformedChar)
mathfont.save(font)
# Common function to generate test for MathML mathvariant / CSS text-transform.
def generateTestFor(mathvariant, mathml):
assert mathml or mathvariant == "auto", "These tests have been removed!"
print("Generating tests for %s..." % mathvariant, end="")
if mathml:
reftest = open(
"../relations/css-styling/mathvariant-%s.html" % mathvariant, "w")
reftestReference = open(
"../relations/css-styling/mathvariant-%s-ref.html" % mathvariant, "w")
else:
reftest = open(
"../../css/css-text/text-transform/math/text-transform-math-%s-001.html" % mathvariant, "w")
reftestReference = open(
"../../css/css-text/text-transform/math/text-transform-math-%s-001-ref.html" % mathvariant, "w")
source = '\
\n\
\n\
\n\
\n\
%s\n'
if mathml:
reftest.write(source % ("mathvariant %s" % mathvariant))
reftestReference.write(
source % ("mathvariant %s (reference)" % mathvariant))
else:
reftest.write(source % ("text-transform math-%s" % mathvariant))
reftestReference.write(
source % ("text-transform math-%s (reference)" % mathvariant))
if mathvariant == "auto":
mathAssert = "Verify that a single-char is equivalent to an with the transformed italic unicode character."
mapping = "italic"
else:
mathAssert = "Verify that a single-char with a %s mathvariant is equivalent to an with the transformed unicode character." % mathvariant
mapping = mathvariant
if mathml:
source = '\
\n\
\n\
\n\
\n\
\n\
\n'
reftest.write(source % (mapping, mathvariant, mathAssert))
else:
source = '\
\n\
\n\
\n\
\n\
\n'
reftest.write(source % (mapping, mathvariant, mathvariant))
WOFFfont = "mathvariant-%s.woff" % mapping
source = '\
\n\
\n\
\n\
Test passes if all the equalities below are true.
\n' % WOFFfont
if mathml:
reftest.write(source)
reftestReference.write(source)
else:
reftest.write(source)
reftestReference.write(source)
charIndex = 0
for baseChar in mathvariantTransforms[mathvariant]:
transformedChar = mathvariantTransforms[mathvariant][baseChar]
if mathvariant == "auto":
tokenTag = '%0X;' % baseChar
tokenTagRef = '%0X;' % transformedChar
else:
tokenTag = '%0X;' % (
mathvariant, baseChar)
tokenTagRef = '%0X;' % transformedChar
if mathml:
reftest.write(' =%05X' %
(tokenTag, transformedChar))
reftestReference.write(
' =%05X' % (tokenTagRef, transformedChar))
else:
reftest.write(' %0X;=%05X' %
(mathvariant, baseChar, transformedChar))
reftestReference.write(
' %0X;=%05X' % (transformedChar, transformedChar))
charIndex += 1
if charIndex % 10 == 0:
reftest.write(' ')
reftestReference.write(' ')
reftest.write('\n')
reftestReference.write('\n')
source = '\n\n'
reftest.write(source)
reftestReference.write(source)
reftest.close()
reftestReference.close()
print(" done.")
# Generate css/css-text/text-transform/math/text-transform-math-auto-001.html
generateTestFor(mathvariant="auto", mathml=False)
generateTestFor(mathvariant="auto", mathml=True)
# Other mathvariant tests can be generated by the following command. They are
# still use internally by browsers implementing full mathvariant support.
# See https://github.com/w3c/mathml-core/issues/182
# for mathvariant in mathvariantTransforms:
# generateTestFor(mathvariant, mathml=True)