| // Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file | |
| // for details. 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' show File, exit, stderr; | |
| import 'bin/generate_tables.dart' show generateTables, tableFile; | |
| import 'bin/generate_tests.dart' show generateTests, testFile; | |
| import 'src/args.dart'; | |
| import 'src/data_files.dart'; | |
| import 'src/grapheme_category_loader.dart'; | |
| import 'src/shared.dart'; | |
| /// Generates both tests and tables. | |
| /// | |
| /// Use this tool for updates, and only access `bin/generate_tables.dart` and | |
| /// `bin/generate_tests.dart` directly during development of those files. | |
| void main(List<String> args) async { | |
| var flags = parseArgs( | |
| args, | |
| 'generate', | |
| allowOptimize: true, | |
| allowFile: false, | |
| ); | |
| if (flags.update && !await checkLicense(flags.acceptLicenseChange)) { | |
| stderr.writeln('EXITING'); | |
| exit(1); | |
| } | |
| var (categories, graphemeTests, emojiTests) = await ( | |
| loadCategories(update: flags.update, verbose: flags.verbose), | |
| graphemeTestData.load(checkForUpdate: flags.update), | |
| emojiData.load(checkForUpdate: flags.update), | |
| ).wait; | |
| generateTables( | |
| File(path(packageRoot, tableFile)), | |
| categories, | |
| optimize: flags.optimize, | |
| dryrun: flags.dryrun, | |
| verbose: flags.verbose, | |
| ); | |
| generateTests( | |
| File(path(packageRoot, testFile)), | |
| [graphemeTests, emojiTests], | |
| categories, | |
| dryrun: flags.dryrun, | |
| verbose: flags.verbose, | |
| ); | |
| if (flags.update && !flags.dryrun) { | |
| var version = guessVersion(await graphemeBreakPropertyData.contents); | |
| updateReadmeVersion(version); | |
| } | |
| } | |
| // ----------------------------------------------------------------------------- | |
| // Unicode version number. | |
| String? guessVersion(String dataFile) { | |
| // If first line has format: | |
| // | |
| // # GraphemeBreakProperty-16.0.0.txt | |
| // | |
| // Then use 16.0.0 as version number. | |
| var match = RegExp(r'# \w+-(\d+\.\d+\.\d+)\.txt').matchAsPrefix(dataFile); | |
| return match?[1]; | |
| } | |
| void updateReadmeVersion(String? version) { | |
| var readmeFile = File(packagePath('README.md')); | |
| var contents = readmeFile.readAsStringSync(); | |
| String replacementText; | |
| if (version != null) { | |
| replacementText = 'version $version'; | |
| } else { | |
| var now = DateTime.timestamp(); | |
| replacementText = 'of ${now.year}-${lz(now.month)}-${lz(now.day)}'; | |
| } | |
| const startTag = '<!-- unicode-version -->'; | |
| const endTag = '<!-- /unicode-version -->'; | |
| var versionRE = RegExp('(?<=$startTag).*?(?=$endTag)'); | |
| var newContents = contents.replaceFirst(versionRE, replacementText); | |
| if (contents != newContents) { | |
| readmeFile.writeAsStringSync(newContents); | |
| } else if (versionRE.firstMatch(contents) == null) { | |
| stderr.writeln('MISSING VERSION TAGS IN README.md'); | |
| } | |
| } |