forked from native-html/render
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCSSNativeParseRun.ts
More file actions
128 lines (120 loc) · 3.65 KB
/
CSSNativeParseRun.ts
File metadata and controls
128 lines (120 loc) · 3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import { CSSParseRun } from './CSSParseRun';
import { MixedStyleDeclaration } from './CSSProcessor';
import { CSSPropertiesValidationRegistry } from './CSSPropertiesValidationRegistry';
import { lookupRecord } from './helpers';
import { ValidatorsType } from './makepropertiesValidators';
import {
ExtraNativeTextStyle,
NativeDirectionalStyleKeys,
ExtraNativeLongViewStyleKeys
} from './native-types';
import { CSSPropertySpecs } from './processor-types';
import { ShortMergeRequest } from './ShortMergeRequest';
const nativeDirectionalStyleKeys: Record<NativeDirectionalStyleKeys, 'block'> =
{
borderBottomEndRadius: 'block',
borderBottomStartRadius: 'block',
borderEndColor: 'block',
borderEndWidth: 'block',
borderStartColor: 'block',
borderStartWidth: 'block',
borderTopEndRadius: 'block',
borderTopStartRadius: 'block',
end: 'block',
marginEnd: 'block',
marginStart: 'block',
paddingEnd: 'block',
paddingStart: 'block',
start: 'block'
};
const extraLongViewStyles: Record<ExtraNativeLongViewStyleKeys, 'block'> = {
elevation: 'block',
overflow: 'block',
overlayColor: 'block',
resizeMode: 'block',
rotation: 'block',
scaleX: 'block',
scaleY: 'block',
shadowColor: 'block',
shadowOffset: 'block',
shadowOpacity: 'block',
shadowRadius: 'block',
tintColor: 'block',
transformMatrix: 'block',
gap: 'block',
inset: 'block',
insetBlock: 'block',
insetInline: 'block',
marginBlock: 'block',
marginInline: 'block',
paddingBlock: 'block',
paddingInline: 'block',
objectFit: 'block'
};
const extraTextStyles: Record<keyof ExtraNativeTextStyle, 'text'> = {
includeFontPadding: 'text',
textAlignVertical: 'text',
textShadowColor: 'text',
textShadowOffset: 'text',
textShadowRadius: 'text',
writingDirection: 'text'
};
const extraStylesRegistry = {
...extraTextStyles,
...extraLongViewStyles
};
export class CSSNativeParseRun extends CSSParseRun {
private declaration: MixedStyleDeclaration;
constructor(
declaration: MixedStyleDeclaration,
registry: CSSPropertiesValidationRegistry
) {
super(registry);
this.declaration = declaration;
}
private fillProp<K extends keyof MixedStyleDeclaration>(
key: K,
value: MixedStyleDeclaration[K]
): void {
const validator = this.validationMap.getValidatorForProperty(
String(key) as keyof ValidatorsType
);
if (validator && 'normalizeNativeValue' in validator) {
const normalizedValue = validator.normalizeNativeValue(value);
if (normalizedValue instanceof ShortMergeRequest) {
normalizedValue.forEach(([innerKey, innerValue]) => {
this.fillProp(innerKey, innerValue);
});
} else {
// assume longhand merge
this.processedProps.withProperty(
key,
normalizedValue,
validator as CSSPropertySpecs
);
}
} else if (lookupRecord(extraStylesRegistry, key)) {
this.processedProps.withProperty(key, value, {
compatCategory: 'native',
displayCategory: extraStylesRegistry[key],
propagationCategory: 'retain'
});
} else if (lookupRecord(nativeDirectionalStyleKeys, key)) {
console.warn(
`Native style property "${key}" is a directional style property. These are not yet supported.`
);
} else {
console.warn(
`Native style property "${String(
key
)}" is not supported and has been ignored.`
);
}
}
protected fillProcessedProps(): void {
const declaration = this.declaration;
for (const [key, value] of Object.entries(declaration)) {
this.fillProp(key as keyof MixedStyleDeclaration, value);
}
}
}