| // 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'); |
| } |
| } |