Some content in Makefile.in is removed because after this change, the scripts no longer invoke the preprocessor and thus don't have unknown dependencies anymore outside what is provided in their inputs array. The order of exports.PREFERENCES in properties-db changes because the data file has shorthands placed after longhands. The only usage of it is in test_css-properties-db.js which doesn't care about the order. MozReview-Commit-ID: AMjzTRf2HYN
100 lines
3.4 KiB
Python
100 lines
3.4 KiB
Python
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
import sys
|
|
import string
|
|
import argparse
|
|
|
|
def get_properties(dataFile):
|
|
with open(dataFile, "r") as f:
|
|
properties = eval(f.read())
|
|
properties = [{"name":p[0], "prop":p[1], "id":p[2],
|
|
"flags":p[3], "pref":p[4], "proptype":p[5]}
|
|
for (i, p) in enumerate(properties)]
|
|
|
|
# Sort the list so that longhand properties are intermingled first,
|
|
# shorthand properties follow, then aliases appear last.
|
|
# This matches the order of the nsCSSPropertyID enum.
|
|
|
|
def property_compare(x, y):
|
|
property_order = {"longhand": 0, "shorthand": 1, "alias": 2}
|
|
return property_order[x["proptype"]] - property_order[y["proptype"]]
|
|
|
|
properties = sorted(properties, cmp=property_compare)
|
|
|
|
for i, p in enumerate(properties):
|
|
p["index"] = i
|
|
|
|
# Record each property's IDL name.
|
|
for p in properties:
|
|
if "CSS_PROPERTY_INTERNAL" in p["flags"]:
|
|
p["idlname"] = None
|
|
else:
|
|
idl_name = p["prop"]
|
|
if not idl_name.startswith("Moz"):
|
|
idl_name = idl_name[0].lower() + idl_name[1:]
|
|
p["idlname"] = idl_name
|
|
|
|
return properties
|
|
|
|
def generate_idl_names(properties):
|
|
names = []
|
|
for p in properties:
|
|
if p["proptype"] is "alias":
|
|
continue
|
|
if p["idlname"] is None:
|
|
names.append(" nullptr, // %s" % p["name"])
|
|
else:
|
|
names.append(' "%s",' % p["idlname"])
|
|
return "\n".join(names)
|
|
|
|
def generate_assertions(properties):
|
|
def enum(p):
|
|
if p["proptype"] is "alias":
|
|
return "eCSSPropertyAlias_%s" % p["id"][0]
|
|
else:
|
|
return "eCSSProperty_%s" % p["id"]
|
|
msg = ('static_assert(%s == %d, "GenerateCSSPropsGenerated.py did not list '
|
|
'properties in nsCSSPropertyID order");')
|
|
return "\n".join(map(lambda p: msg % (enum(p), p["index"]), properties))
|
|
|
|
def generate_idl_name_positions(properties):
|
|
# Skip aliases.
|
|
ps = filter(lambda p: p["proptype"] is not "alias", properties)
|
|
|
|
# Sort alphabetically by IDL name.
|
|
ps = sorted(ps, key=lambda p: p["idlname"])
|
|
|
|
# Annotate entries with the sorted position.
|
|
ps = [(p, position) for position, p in enumerate(ps)]
|
|
|
|
# Sort back to nsCSSPropertyID order.
|
|
ps = sorted(ps, key=lambda (p, position): p["index"])
|
|
|
|
return ",\n".join(map(lambda (p, position): " %d" % position, ps))
|
|
|
|
def generate(output, cppTemplate, dataFile):
|
|
cppFile = open(cppTemplate, "r")
|
|
cppTemplate = cppFile.read()
|
|
cppFile.close()
|
|
|
|
properties = get_properties(dataFile)
|
|
substitutions = {
|
|
"idl_names": generate_idl_names(properties),
|
|
"assertions": generate_assertions(properties),
|
|
"idl_name_positions": generate_idl_name_positions(properties),
|
|
}
|
|
output.write("/* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT */\n\n" +
|
|
string.Template(cppTemplate).substitute(substitutions) + "\n")
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('cppTemplate', help='CSS property file template')
|
|
parser.add_argument('preprocessorHeader', help='Header file to pass through the preprocessor')
|
|
args = parser.parse_args()
|
|
generate(sys.stdout, args.cppTemplate, args.preprocessorHeader)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|