Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Argument for Filtering Token Types #34

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 10 additions & 26 deletions bin/figma2flutter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,8 @@ import 'package:figma2flutter/generator.dart';
import 'package:figma2flutter/models/token_theme.dart';
import 'package:figma2flutter/processor.dart';
import 'package:figma2flutter/token_parser.dart';
import 'package:figma2flutter/transformers/border_radius_transformer.dart';
import 'package:figma2flutter/transformers/border_transformer.dart';
import 'package:figma2flutter/transformers/box_shadow_transformer.dart';
import 'package:figma2flutter/transformers/color_transformer.dart';
import 'package:figma2flutter/transformers/composition_transformer.dart';
import 'package:figma2flutter/transformers/linear_gradient_transformer.dart';
import 'package:figma2flutter/transformers/material_color_transformer.dart';
import 'package:figma2flutter/transformers/size_transformer.dart';
import 'package:figma2flutter/transformers/spacing_transformer.dart';
import 'package:figma2flutter/transformers/typography_transformer.dart';
import 'package:figma2flutter/transformers/single_token_factories.dart';
import 'package:figma2flutter/utils/sets_and_themes.dart';

/// Code for making terminal output foreground red
Expand All @@ -30,20 +22,6 @@ const _green = '\x1b[033;0;32m';
//No Color, reset terminal foreground color
const _nc = '\x1b[033;0m';

// All transformers that process single tokens should be added here
// These transformers will be applied to all tokens in the order they are listed
final singleTokenFactories = <TransformerFactory>[
(_) => ColorTransformer(),
(_) => SpacingTransformer(),
(_) => TypographyTransformer(),
(_) => BorderRadiusTransformer(),
(_) => CompositionTransformer(),
(_) => BoxShadowTransformer(),
(_) => BorderTransformer(),
(_) => SizeTransformer(),
(_) => LinearGradientTransformer(),
];

// All transformers that process multiple tokens should be added here
final multiTokenFactories = [
MaterialColorTransformer.new,
Expand All @@ -56,6 +34,9 @@ Future<void> main(List<String> arguments) async {
/// Get the input json file and output directory from the parsed arguments
final inputFileLocation = options.getOption<String>(kInput).value;
final outputDir = options.getOption<String>(kOutput).value;
final filteredTokenSets = options.getOption<String>(kFilteredTokenSets).value;
final List<String> filteredSets =
filteredTokenSets.isNotEmpty ? filteredTokenSets.split(',').toList() : [];

// Should remove the defaults because you get weird errors for data you didn't know about
if (inputFileLocation.isEmpty) {
Expand Down Expand Up @@ -92,7 +73,7 @@ Future<void> main(List<String> arguments) async {
_print('Found ${themes.length} themes, generating code', _green);

/// Process the tokens with all transformers
final result = _processTokens(themes);
final result = _processTokens(themes, filteredSets);

/// Print the number of tokens each transformer processed to the terminal output
for (final transformer in result.first.transformers) {
Expand Down Expand Up @@ -126,14 +107,17 @@ void _saveOutput(List<TokenTheme> themes, String outputDir) {
}

/// Process the tokens with all transformers
List<TokenTheme> _processTokens(List<TokenTheme> themes) {
List<TokenTheme> _processTokens(
List<TokenTheme> themes,
List<String> filteredSets,
) {
final processor = Processor(
themes: themes,
singleTokenTransformerFactories: singleTokenFactories,
multiTokenTransformerFactories: multiTokenFactories,
);

processor.process();
processor.process(filteredSets: filteredSets);

return processor.themes;
}
Expand Down
10 changes: 10 additions & 0 deletions lib/config/options.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ const kInputAbbr = 'i';
const kOutput = 'output';
const kOutputAbbr = 'o';

const kFilteredTokenSets = 'filtered-token-sets';
const kFilteredTokenSetsAbbr = 'f';

/// Options class to store a single option
class Option<T> {
/// The name of the option
Expand Down Expand Up @@ -72,6 +75,13 @@ class Options {
'Specify generated output directory.',
kOutputAbbr,
),
// Omits tokens by type, I.E. "core, source"
Option<String>(
kFilteredTokenSets,
'',
'Specify token sets to filter, separated by commas.',
kFilteredTokenSetsAbbr,
),
];

/// Returns the option with the given name
Expand Down
35 changes: 34 additions & 1 deletion lib/processor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,49 @@ class Processor {
this.multiTokenTransformerFactories = const [],
});

void process() {
void process({List<String> filteredSets = const []}) {
for (final theme in themes) {
//print('Generating Theme: ${theme.name}');
final resolved = theme.resolvedTokens;
if (filteredSets.isNotEmpty) {
resolved.removeWhere((element) {
final splitPath = element.path.split('.');
// Depending on the input method the path can start with a name or a '.'
final setName =
splitPath.first.isNotEmpty ? splitPath.first : splitPath[1];
for (final type in filteredSets) {
if (setName == type) {
return true;
}
}
return false;
});
}

final single = _loopProcess(singleTokenTransformerFactories, resolved);
final multi = _loopProcess(multiTokenTransformerFactories, resolved)
.cast<MultiTokenTransformer>()
..forEach((element) => element.postProcess());

// Remove transformers for ignored sets
if (filteredSets.isNotEmpty) {
single.removeWhere((transformer) {
for (final type in filteredSets) {
if (transformer.name == type) {
return true;
}
}
return false;
});
multi.removeWhere((transformer) {
for (final type in filteredSets) {
if (transformer.name == type) {
return true;
}
}
return false;
});
}
theme.transformers.addAll(
[...single, ...multi].where((element) => element.lines.isNotEmpty),
);
Expand Down
24 changes: 24 additions & 0 deletions lib/transformers/single_token_factories.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import 'package:figma2flutter/processor.dart';
import 'package:figma2flutter/transformers/border_radius_transformer.dart';
import 'package:figma2flutter/transformers/border_transformer.dart';
import 'package:figma2flutter/transformers/box_shadow_transformer.dart';
import 'package:figma2flutter/transformers/color_transformer.dart';
import 'package:figma2flutter/transformers/composition_transformer.dart';
import 'package:figma2flutter/transformers/linear_gradient_transformer.dart';
import 'package:figma2flutter/transformers/size_transformer.dart';
import 'package:figma2flutter/transformers/spacing_transformer.dart';
import 'package:figma2flutter/transformers/typography_transformer.dart';

// All transformers that process single tokens should be added here
// These transformers will be applied to all tokens in the order they are listed
final singleTokenFactories = <TransformerFactory>[
(_) => ColorTransformer(),
(_) => SpacingTransformer(),
(_) => TypographyTransformer(),
(_) => BorderRadiusTransformer(),
(_) => CompositionTransformer(),
(_) => BoxShadowTransformer(),
(_) => BorderTransformer(),
(_) => SizeTransformer(),
(_) => LinearGradientTransformer(),
];
Loading
Loading