11import 'package:duit_kernel/src/ui/theme/index.dart' ;
2- import 'package:duit_kernel/src/ui/theme/theme_token.dart' ;
2+
3+ /// Function for custom tokenization of themes.
4+ typedef CustomTokenizer = ThemeToken ? Function (
5+ String type,
6+ Map <String , dynamic > themeData,
7+ );
38
49final class ThemePreprocessor {
10+ final CustomTokenizer ? customWidgetTokenizer, overrideWidgetTokenizer;
11+
12+ const ThemePreprocessor ({
13+ this .customWidgetTokenizer,
14+ this .overrideWidgetTokenizer,
15+ });
16+
17+ ///Creates token for default cases
18+ ThemeToken _createToken (
19+ String widgetType,
20+ Map <String , dynamic > themeData,
21+ ) {
22+ return switch (widgetType) {
23+ "Text" => TextThemeToken (
24+ themeData,
25+ ),
26+ "Image" => ImageThemeToken (
27+ themeData,
28+ ),
29+ "Align" ||
30+ "BackdropFilter" ||
31+ "ColoredBox" ||
32+ "ConstrainedBoxAttributes" ||
33+ "DecoratedBox" ||
34+ "Expanded" ||
35+ "FittedBox" ||
36+ "Row" ||
37+ "Column" ||
38+ "SizedBox" ||
39+ "Container" ||
40+ "OverflowBox" ||
41+ "Padding" ||
42+ "Positioned" ||
43+ "Opacity" ||
44+ "RotatedBox" ||
45+ "Stack" ||
46+ "Wrap" ||
47+ "Transform" =>
48+ AnimatedPropOwnerThemeToken (
49+ themeData,
50+ widgetType,
51+ ),
52+ "AnimatedOpacity" => ImplicitAnimatableThemeToken (
53+ themeData,
54+ widgetType,
55+ ),
56+ "ElevatedButton" ||
57+ "Center" ||
58+ "IgnorePointerAttributes" ||
59+ "RepaintBoundary" ||
60+ "SingleChildScrollView" =>
61+ DefaultThemeToken (
62+ themeData,
63+ widgetType,
64+ ),
65+ "CheckboxAttributes" ||
66+ "Switch" ||
67+ "TextField" =>
68+ AttendedWidgetThemeToken (
69+ themeData,
70+ widgetType,
71+ ),
72+ "RadioGroupContext" => RadioGroupContextThemeToken (
73+ themeData,
74+ ),
75+ "Radio" => RadioThemeToken (
76+ themeData,
77+ ),
78+ "Slider" => SliderThemeToken (
79+ themeData,
80+ ),
81+ _ => customWidgetTokenizer? .call (widgetType, themeData) ??
82+ const UnknownThemeToken (),
83+ };
84+ }
85+
586 DuitTheme tokenize (Map <String , dynamic > theme) {
687 final errors = < String > {};
788 final tokens = < String , ThemeToken > {};
@@ -11,76 +92,28 @@ final class ThemePreprocessor {
1192 final themeData = theme["data" ] as Map <String , dynamic >;
1293 final widgetType = theme["type" ];
1394
14- /* Ignored widget types:
15- - AnimatedBuilder
16- - GestureDetector
17- - IntrinsicHeight
18- - LifecycleStateListener
19- - ListView
20- - Meta
21- - Subtree
22- */
23- final ThemeToken token = switch (widgetType) {
24- "Text" => TextThemeToken (
25- themeData,
26- ),
27- "Image" => ImageThemeToken (
28- themeData,
29- ),
30- "Align" ||
31- "BackdropFilter" ||
32- "ColoredBox" ||
33- "ConstrainedBoxAttributes" ||
34- "DecoratedBox" ||
35- "Expanded" ||
36- "FittedBox" ||
37- "Row" ||
38- "Column" ||
39- "SizedBox" ||
40- "Container" ||
41- "OverflowBox" ||
42- "Padding" ||
43- "Positioned" ||
44- "Opacity" ||
45- "RotatedBox" ||
46- "Stack" ||
47- "Wrap" ||
48- "Transform" =>
49- AnimatedPropOwnerThemeToken (
50- themeData,
51- widgetType,
52- ),
53- "AnimatedOpacity" => ImplicitAnimatableThemeToken (
54- themeData,
55- widgetType,
56- ),
57- "ElevatedButton" ||
58- "Center" ||
59- "IgnorePointerAttributes" ||
60- "RepaintBoundary" ||
61- "SingleChildScrollView" =>
62- DefaultThemeToken (
63- themeData,
64- widgetType,
65- ),
66- "CheckboxAttributes" ||
67- "Switch" ||
68- "TextField" =>
69- AttendedWidgetThemeToken (
70- themeData,
95+ ThemeToken token;
96+
97+ if (overrideWidgetTokenizer != null ) {
98+ final overridedToken = overrideWidgetTokenizer !(
99+ widgetType,
100+ themeData,
101+ );
102+
103+ if (overridedToken != null ) {
104+ token = overridedToken;
105+ } else {
106+ token = _createToken (
71107 widgetType,
72- ),
73- "RadioGroupContext" => RadioGroupContextThemeToken (
74- themeData,
75- ),
76- "Radio" => RadioThemeToken (
77- themeData,
78- ),
79- "Slider" => SliderThemeToken (
80108 themeData,
81- ),
82- _ => const UnknownThemeToken (),
83- };
109+ );
110+ }
111+ } else {
112+ token = _createToken (
113+ widgetType,
114+ themeData,
115+ );
116+ }
84117
85118 for (var entry in themeData.entries) {
86119 final key = entry.key;
0 commit comments