#!/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 = '&#x%0X;' % baseChar tokenTagRef = '&#x%0X;' % transformedChar else: tokenTag = '&#x%0X;' % ( mathvariant, baseChar) tokenTagRef = '&#x%0X;' % transformedChar if mathml: reftest.write(' %s=%05X' % (tokenTag, transformedChar)) reftestReference.write( ' %s=%05X' % (tokenTagRef, transformedChar)) else: reftest.write(' &#x%0X;=%05X' % (mathvariant, baseChar, transformedChar)) reftestReference.write( ' &#x%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) # Generate italic_mapping.js file used by selection tests. print("Generating italic_mapping.js...", end="") italic_mapping = open("../../css/css-text/text-transform/math/italic-mapping.js", "w") italic_mapping.write("// Generated by mathml/tools/mathvariant.py; DO NOT EDIT.\n"); italic_mapping.write("let italic_mapping = {\n"); for baseChar in mathvariantTransforms["italic"]: transformedChar = mathvariantTransforms[mathvariant][baseChar] italic_mapping.write(" 0x%0X: 0x%0X,\n" % (baseChar, transformedChar)); italic_mapping.write("}\n"); italic_mapping.close() print(" done.") # 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)