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