From 38533ac8b7b71853bf6c6d0415b0f9127d2c13a5 Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Tue, 4 Oct 2016 09:52:14 -0700 Subject: [PATCH] Add icon update tool (#6201) --- dev/tools/update_icons.dart | 102 +++++++++++++++++++ packages/flutter/lib/src/material/icons.dart | 9 +- 2 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 dev/tools/update_icons.dart diff --git a/dev/tools/update_icons.dart b/dev/tools/update_icons.dart new file mode 100644 index 0000000000..690ad2ed3e --- /dev/null +++ b/dev/tools/update_icons.dart @@ -0,0 +1,102 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Regenerates the material icons file. +// See https://github.com/flutter/flutter/wiki/Updating-Material-Design-Fonts + +import 'dart:convert' show LineSplitter; +import 'dart:io'; + +import 'package:args/args.dart'; +import 'package:path/path.dart' as path; + +const String kOptionCodepointsPath = 'codepoints'; +const String kOptionIconsPath = 'icons'; +const String kOptionDryRun = 'dry-run'; + +const String kDefaultCodepointsPath = 'bin/cache/artifacts/material_fonts/codepoints'; +const String kDefaultIconsPath = 'packages/flutter/lib/src/material/icons.dart'; + +const String kBeginGeneratedMark = '// BEGIN GENERATED'; +const String kEndGeneratedMark = '// END GENERATED'; + +const Map kIdentifierRewrites = const { + '360': 'threesixty', + '3d_rotation': 'threed_rotation', + '4k': 'four_k', + 'class': 'class_', +}; + +void main(List args) { + // If we're run from the `tools` dir, set the cwd to the repo root. + if (path.basename(Directory.current.path) == 'tools') + Directory.current = Directory.current.parent.parent; + + ArgParser argParser = new ArgParser(); + argParser.addOption(kOptionCodepointsPath, defaultsTo: kDefaultCodepointsPath); + argParser.addOption(kOptionIconsPath, defaultsTo: kDefaultIconsPath); + argParser.addFlag(kOptionDryRun, defaultsTo: false); + ArgResults argResults = argParser.parse(args); + + File iconFile = new File(path.absolute(argResults[kOptionIconsPath])); + if (!iconFile.existsSync()) { + stderr.writeln('Icons file not found: ${iconFile.path}'); + exit(1); + } + File codepointsFile = new File(path.absolute(argResults[kOptionCodepointsPath])); + if (!codepointsFile.existsSync()) { + stderr.writeln('Codepoints file not found: ${codepointsFile.path}'); + exit(1); + } + + String iconData = iconFile.readAsStringSync(); + String codepointData = codepointsFile.readAsStringSync(); + String newIconData = regenerateIconsFile(iconData, codepointData); + + if (argResults[kOptionDryRun]) + stdout.writeln(newIconData); + else + iconFile.writeAsStringSync(newIconData); +} + +String regenerateIconsFile(String iconData, String codepointData) { + StringBuffer buf = new StringBuffer(); + bool generating = false; + for (String line in LineSplitter.split(iconData)) { + if (!generating) + buf.writeln(line); + if (line.contains(kBeginGeneratedMark)) { + generating = true; + String iconDeclarations = generateIconDeclarations(codepointData); + buf.write(iconDeclarations); + } else if (line.contains(kEndGeneratedMark)) { + generating = false; + buf.writeln(line); + } + } + return buf.toString(); +} + +String generateIconDeclarations(String codepointData) { + return LineSplitter.split(codepointData) + .map((String l) => l.trim()) + .where((String l) => l.isNotEmpty) + .map(getIconDeclaration) + .join(); +} + +String getIconDeclaration(String line) { + List tokens = line.split(' '); + if (tokens.length != 2) + throw new FormatException('Unexpected codepoint data: $line'); + String name = tokens[0]; + String codepoint = tokens[1]; + String identifier = kIdentifierRewrites[name] ?? name; + String description = name.replaceAll('_', ' '); + return ''' + + ///

$name — material icon named "$description".

+ static const IconData $identifier = const IconData(0x$codepoint); +'''; +} diff --git a/packages/flutter/lib/src/material/icons.dart b/packages/flutter/lib/src/material/icons.dart index d3bd5412dd..1e86b3c034 100644 --- a/packages/flutter/lib/src/material/icons.dart +++ b/packages/flutter/lib/src/material/icons.dart @@ -42,11 +42,15 @@ class IconData { class Icons { Icons._(); + // Generated code: do not hand-edit. + // See https://github.com/flutter/flutter/wiki/Updating-Material-Design-Fonts + // BEGIN GENERATED + ///

360 — material icon named "360".

static const IconData threesixty = const IconData(0xe577); ///

3d_rotation — material icon named "3d rotation".

- static const IconData threed_rotation = const IconData(0xe84d); // 3d_rotation isn't a valid identifier. + static const IconData threed_rotation = const IconData(0xe84d); ///

4k — material icon named "4k".

static const IconData four_k = const IconData(0xe072); @@ -589,7 +593,7 @@ class Icons { static const IconData chrome_reader_mode = const IconData(0xe86d); ///

class — material icon named "class".

- static const IconData class_ = const IconData(0xe86e); // class is a reserved word in Dart. + static const IconData class_ = const IconData(0xe86e); ///

clear — material icon named "clear".

static const IconData clear = const IconData(0xe14c); @@ -2996,4 +3000,5 @@ class Icons { ///

zoom_out_map — material icon named "zoom out map".

static const IconData zoom_out_map = const IconData(0xe56b); + // END GENERATED }