mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
92 lines
3.1 KiB
Dart
92 lines
3.1 KiB
Dart
// Copyright 2014 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'dart:io';
|
|
|
|
abstract class TokenTemplate {
|
|
const TokenTemplate(this.fileName, this.tokens);
|
|
|
|
static const String beginGeneratedComment = '''
|
|
|
|
// BEGIN GENERATED TOKEN PROPERTIES
|
|
''';
|
|
|
|
static const String headerComment = '''
|
|
|
|
// Generated code to the end of this file. Do not edit by hand.
|
|
// These defaults are generated from the Material Design Token
|
|
// database by the script dev/tools/gen_defaults/bin/gen_defaults.dart.
|
|
|
|
''';
|
|
|
|
static const String endGeneratedComment = '''
|
|
|
|
// END GENERATED TOKEN PROPERTIES
|
|
''';
|
|
|
|
final String fileName;
|
|
final Map<String, dynamic> tokens;
|
|
|
|
/// Replace or append the contents of the file with the text from [generate].
|
|
///
|
|
/// If the file already contains generated block at the end, it will
|
|
/// be replaced by the [generate] output. Otherwise the content will
|
|
/// just be appended to the end of the file.
|
|
Future<void> updateFile() async {
|
|
String contents = File(fileName).readAsStringSync();
|
|
final int previousGeneratedIndex = contents.indexOf(beginGeneratedComment);
|
|
if (previousGeneratedIndex != -1) {
|
|
contents = contents.substring(0, previousGeneratedIndex);
|
|
}
|
|
final StringBuffer buffer = StringBuffer(contents);
|
|
buffer.write(beginGeneratedComment);
|
|
buffer.write(headerComment);
|
|
buffer.write(generate());
|
|
buffer.write(endGeneratedComment);
|
|
File(fileName).writeAsStringSync(buffer.toString());
|
|
}
|
|
|
|
/// Provide the generated content for the template.
|
|
///
|
|
/// This abstract method needs to be implemented by subclasses
|
|
/// to provide the content that [updateFile] will append to the
|
|
/// bottom of the file.
|
|
String generate();
|
|
|
|
String color(String tokenName) {
|
|
final String tokenColor = '$tokenName.color';
|
|
final String tokenOpacity = '$tokenName.opacity';
|
|
String value = '${tokens[tokenColor]!}';
|
|
if (tokens.containsKey(tokenOpacity)) {
|
|
final String opacity = tokens[tokens[tokenOpacity]!]!.toString();
|
|
value += '.withOpacity($opacity)';
|
|
}
|
|
return value;
|
|
}
|
|
|
|
String elevation(String tokenName) {
|
|
final String elevationName = '$tokenName.elevation';
|
|
final Map<String, dynamic> elevationValue = tokens[tokens[elevationName]!]! as Map<String, dynamic>;
|
|
return elevationValue['value']!.toString();
|
|
}
|
|
|
|
String shape(String tokenName) {
|
|
// TODO(darrenaustin): handle more than just rounded rectangle shapes
|
|
final String shapeToken = tokens[tokenName]! as String;
|
|
final Map<String, dynamic> shape = tokens[shapeToken]! as Map<String, dynamic>;
|
|
final Map<String, dynamic> shapeValue = shape['value']! as Map<String, dynamic>;
|
|
return 'const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(${shapeValue['value']!})))';
|
|
}
|
|
|
|
String value(String tokenName) {
|
|
final Map<String, dynamic> value = tokens[tokenName]! as Map<String, dynamic>;
|
|
return value['value'].toString();
|
|
}
|
|
|
|
String textStyle(String tokenName) {
|
|
final String fontName = '$tokenName.font';
|
|
return tokens[fontName]!.toString();
|
|
}
|
|
}
|