114 lines
3.5 KiB
Python
114 lines
3.5 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 runpy
|
|
import sys
|
|
import string
|
|
import argparse
|
|
|
|
|
|
class PropertyWrapper(object):
|
|
__slots__ = ["index", "prop", "idlname"]
|
|
|
|
def __init__(self, index, prop):
|
|
self.index = index
|
|
self.prop = prop
|
|
if "Internal" in prop.flags:
|
|
self.idlname = None
|
|
else:
|
|
idl_name = prop.method
|
|
if not idl_name.startswith("Moz"):
|
|
idl_name = idl_name[0].lower() + idl_name[1:]
|
|
self.idlname = idl_name
|
|
|
|
def __getattr__(self, name):
|
|
return getattr(self.prop, name)
|
|
|
|
|
|
def generate(output, dataFile):
|
|
output.write(
|
|
"""/* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT */
|
|
|
|
/* processed file that defines CSS property tables that can't be generated
|
|
with the pre-processor, designed to be #included in nsCSSProps.cpp */
|
|
|
|
"""
|
|
)
|
|
|
|
raw_properties = runpy.run_path(dataFile)["data"]
|
|
properties = [
|
|
PropertyWrapper(i, p)
|
|
for i, p in enumerate(raw_properties.values())
|
|
if p.type() != "alias"
|
|
]
|
|
|
|
# Generate kIDLNameTable
|
|
output.write(
|
|
"const char* const nsCSSProps::" "kIDLNameTable[eCSSProperty_COUNT] = {\n"
|
|
)
|
|
for p in properties:
|
|
if p.idlname is None:
|
|
output.write(" nullptr, // {}\n".format(p.name))
|
|
else:
|
|
output.write(' "{}",\n'.format(p.idlname))
|
|
output.write("};\n\n")
|
|
|
|
# Generate kIDLNameSortPositionTable
|
|
ps = sorted(properties, key=lambda p: p.idlname if p.idlname else "")
|
|
ps = [(p, position) for position, p in enumerate(ps)]
|
|
ps.sort(key=lambda item: item[0].index)
|
|
output.write(
|
|
"const int32_t nsCSSProps::"
|
|
"kIDLNameSortPositionTable[eCSSProperty_COUNT] = {\n"
|
|
)
|
|
for p, position in ps:
|
|
output.write(" {},\n".format(position))
|
|
output.write("};\n\n")
|
|
|
|
# Generate preferences table
|
|
output.write(
|
|
"const nsCSSProps::PropertyPref " "nsCSSProps::kPropertyPrefTable[] = {\n"
|
|
)
|
|
for p in raw_properties.values():
|
|
if not p.pref:
|
|
continue
|
|
if p.type() != "alias":
|
|
prop_id = "eCSSProperty_" + p.id
|
|
else:
|
|
prop_id = "eCSSPropertyAlias_" + p.alias_id
|
|
output.write(' {{ {}, "{}" }},\n'.format(prop_id, p.pref))
|
|
output.write(" { eCSSProperty_UNKNOWN, nullptr },\n")
|
|
output.write("};\n\n")
|
|
|
|
# Generate shorthand subprop tables
|
|
names = []
|
|
for p in properties:
|
|
if p.type() != "shorthand":
|
|
continue
|
|
name = "g{}SubpropTable".format(p.method)
|
|
names.append(name)
|
|
output.write("static const nsCSSPropertyID {}[] = {{\n".format(name))
|
|
for subprop in p.subprops:
|
|
output.write(" eCSSProperty_{},\n".format(subprop))
|
|
output.write(" eCSSProperty_UNKNOWN\n")
|
|
output.write("};\n\n")
|
|
output.write("const nsCSSPropertyID* const\n")
|
|
output.write(
|
|
"nsCSSProps::kSubpropertyTable["
|
|
"eCSSProperty_COUNT - eCSSProperty_COUNT_no_shorthands"
|
|
"] = {\n"
|
|
)
|
|
for name in names:
|
|
output.write(" {},\n".format(name))
|
|
output.write("};\n\n")
|
|
|
|
# Generate assertions
|
|
msg = (
|
|
"GenerateCSSPropsGenerated.py did not list properties "
|
|
"in nsCSSPropertyID order"
|
|
)
|
|
for p in properties:
|
|
output.write(
|
|
'static_assert(eCSSProperty_{} == {}, "{}");\n'.format(p.id, p.index, msg)
|
|
)
|