Summary: Rounding has been successfully adopted by multiple products and frameworks. Time to move it out of experimental mode. Rounding can still be turned of by setting the point scale factor to 0 on the config. Reviewed By: gkassabli Differential Revision: D4953838 fbshipit-source-id: 3ee5f27d92f95b3ed4a01c98bc35e9157f2e91c5
252 lines
7.4 KiB
Python
252 lines
7.4 KiB
Python
# Copyright (c) 2014-present, Facebook, Inc.
|
|
# All rights reserved.
|
|
#
|
|
# This source code is licensed under the BSD-style license found in the
|
|
# LICENSE file in the root directory of this source tree. An additional grant
|
|
# of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
from __future__ import unicode_literals
|
|
import os
|
|
|
|
ENUMS = {
|
|
'Direction': [
|
|
'Inherit',
|
|
'LTR',
|
|
'RTL',
|
|
],
|
|
'Unit': [
|
|
'Undefined',
|
|
'Point',
|
|
'Percent',
|
|
'Auto',
|
|
],
|
|
'FlexDirection': [
|
|
'Column',
|
|
'ColumnReverse',
|
|
'Row',
|
|
'RowReverse',
|
|
],
|
|
'Justify': [
|
|
'FlexStart',
|
|
'Center',
|
|
'FlexEnd',
|
|
'SpaceBetween',
|
|
'SpaceAround',
|
|
],
|
|
'Overflow': [
|
|
'Visible',
|
|
'Hidden',
|
|
'Scroll',
|
|
],
|
|
'Align': [
|
|
'Auto',
|
|
'FlexStart',
|
|
'Center',
|
|
'FlexEnd',
|
|
'Stretch',
|
|
'Baseline',
|
|
'SpaceBetween',
|
|
'SpaceAround',
|
|
],
|
|
'PositionType': [
|
|
'Relative',
|
|
'Absolute',
|
|
],
|
|
'Display': [
|
|
'Flex',
|
|
'None',
|
|
],
|
|
'Wrap': [
|
|
'NoWrap',
|
|
'Wrap',
|
|
'WrapReverse',
|
|
],
|
|
'MeasureMode': [
|
|
'Undefined',
|
|
'Exactly',
|
|
'AtMost',
|
|
],
|
|
'Dimension': [
|
|
'Width',
|
|
'Height',
|
|
],
|
|
'Edge': [
|
|
'Left',
|
|
'Top',
|
|
'Right',
|
|
'Bottom',
|
|
'Start',
|
|
'End',
|
|
'Horizontal',
|
|
'Vertical',
|
|
'All',
|
|
],
|
|
'LogLevel': [
|
|
'Error',
|
|
'Warn',
|
|
'Info',
|
|
'Debug',
|
|
'Verbose',
|
|
],
|
|
'ExperimentalFeature': [
|
|
# Mimic web flex-basis behavior.
|
|
'WebFlexBasis',
|
|
'MinFlexFix'
|
|
],
|
|
'PrintOptions': [
|
|
('Layout', 1),
|
|
('Style', 2),
|
|
('Children', 4),
|
|
],
|
|
}
|
|
|
|
LICENSE = """/**
|
|
* Copyright (c) 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
"""
|
|
|
|
def to_java_upper(symbol):
|
|
symbol = str(symbol)
|
|
out = ''
|
|
for i in range(0, len(symbol)):
|
|
c = symbol[i]
|
|
if str.istitle(c) and i is not 0 and not str.istitle(symbol[i - 1]):
|
|
out += '_'
|
|
out += c.upper()
|
|
return out
|
|
|
|
def to_log_lower(symbol):
|
|
symbol = str(symbol)
|
|
out = ''
|
|
for i in range(0, len(symbol)):
|
|
c = symbol[i]
|
|
if str.istitle(c) and i is not 0 and not str.istitle(symbol[i - 1]):
|
|
out += '-'
|
|
out += c.lower()
|
|
return out
|
|
|
|
|
|
root = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
# write out C & Objective-C headers
|
|
with open(root + '/yoga/YGEnums.h', 'w') as f:
|
|
f.write(LICENSE)
|
|
f.write('#pragma once\n\n')
|
|
f.write('#include "YGMacros.h"\n\n')
|
|
f.write('YG_EXTERN_C_BEGIN\n\n')
|
|
for name, values in sorted(ENUMS.items()):
|
|
f.write('#define YG%sCount %s\n' % (name, len(values)))
|
|
f.write('typedef YG_ENUM_BEGIN(YG%s) {\n' % name)
|
|
for value in values:
|
|
if isinstance(value, tuple):
|
|
f.write(' YG%s%s = %d,\n' % (name, value[0], value[1]))
|
|
else:
|
|
f.write(' YG%s%s,\n' % (name, value))
|
|
f.write('} YG_ENUM_END(YG%s);\n' % name)
|
|
f.write('WIN_EXPORT const char *YG%sToString(const YG%s value);\n' % (name, name))
|
|
f.write('\n')
|
|
f.write('YG_EXTERN_C_END\n')
|
|
|
|
# write out C body for printing
|
|
with open(root + '/yoga/YGEnums.c', 'w') as f:
|
|
f.write(LICENSE)
|
|
f.write('#include "YGEnums.h"\n\n')
|
|
for name, values in sorted(ENUMS.items()):
|
|
f.write('const char *YG%sToString(const YG%s value){\n' % (name, name))
|
|
f.write(' switch(value){\n')
|
|
for value in values:
|
|
if isinstance(value, tuple):
|
|
f.write(' case YG%s%s:\n' % (name, value[0]))
|
|
f.write(' return "%s";\n' % to_log_lower(value[0]))
|
|
else:
|
|
f.write(' case YG%s%s:\n' % (name, value))
|
|
f.write(' return "%s";\n' % to_log_lower(value))
|
|
f.write(' }\n')
|
|
f.write(' return "unknown";\n')
|
|
f.write('}\n\n')
|
|
|
|
# write out java files
|
|
for name, values in sorted(ENUMS.items()):
|
|
with open(root + '/java/com/facebook/yoga/Yoga%s.java' % name, 'w') as f:
|
|
f.write(LICENSE)
|
|
f.write('package com.facebook.yoga;\n\n')
|
|
f.write('import com.facebook.proguard.annotations.DoNotStrip;\n\n')
|
|
f.write('@DoNotStrip\n')
|
|
f.write('public enum Yoga%s {\n' % name)
|
|
if len(values) > 0:
|
|
for value in values:
|
|
if isinstance(value, tuple):
|
|
f.write(' %s(%d)' % (to_java_upper(value[0]), value[1]))
|
|
else:
|
|
f.write(' %s(%d)' % (to_java_upper(value), values.index(value)))
|
|
if values.index(value) is len(values) - 1:
|
|
f.write(';\n')
|
|
else:
|
|
f.write(',\n')
|
|
else:
|
|
f.write('__EMPTY(-1);')
|
|
f.write('\n')
|
|
f.write(' private int mIntValue;\n')
|
|
f.write('\n')
|
|
f.write(' Yoga%s(int intValue) {\n' % name)
|
|
f.write(' mIntValue = intValue;\n')
|
|
f.write(' }\n')
|
|
f.write('\n')
|
|
f.write(' public int intValue() {\n')
|
|
f.write(' return mIntValue;\n')
|
|
f.write(' }\n')
|
|
f.write('\n')
|
|
f.write(' public static Yoga%s fromInt(int value) {\n' % name)
|
|
f.write(' switch (value) {\n')
|
|
for value in values:
|
|
if isinstance(value, tuple):
|
|
f.write(' case %d: return %s;\n' % (value[1], to_java_upper(value[0])))
|
|
else:
|
|
f.write(' case %d: return %s;\n' % (values.index(value), to_java_upper(value)))
|
|
f.write(' default: throw new IllegalArgumentException("Unknown enum value: " + value);\n')
|
|
f.write(' }\n')
|
|
f.write(' }\n')
|
|
f.write('}\n')
|
|
|
|
# write out csharp files
|
|
for name, values in sorted(ENUMS.items()):
|
|
with open(root + '/csharp/Facebook.Yoga/Yoga%s.cs' % name, 'w') as f:
|
|
f.write(LICENSE)
|
|
f.write('namespace Facebook.Yoga\n{\n')
|
|
if isinstance(next(iter(values or []), None), tuple):
|
|
f.write(' [System.Flags]\n')
|
|
f.write(' public enum Yoga%s\n {\n' % name)
|
|
for value in values:
|
|
if isinstance(value, tuple):
|
|
f.write(' %s = %d,\n' % (value[0], value[1]))
|
|
else:
|
|
f.write(' %s,\n' % value)
|
|
f.write(' }\n')
|
|
f.write('}\n')
|
|
|
|
# write out javascript file
|
|
with open(root + '/javascript/sources/YGEnums.js', 'w') as f:
|
|
f.write(LICENSE)
|
|
f.write('module.exports = {\n\n')
|
|
for name, values in sorted(ENUMS.items()):
|
|
f.write(' %s_COUNT: %s,\n' % (to_java_upper(name), len(values)))
|
|
base = 0
|
|
for value in values:
|
|
if isinstance(value, tuple):
|
|
f.write(' %s_%s: %d,\n' % (to_java_upper(name), to_java_upper(value[0]), value[1]))
|
|
base = value[1] + 1
|
|
else:
|
|
f.write(' %s_%s: %d,\n' % (to_java_upper(name), to_java_upper(value), base))
|
|
base += 1
|
|
f.write('\n')
|
|
f.write('};\n')
|