blob: e53f70b4bedbafec01fcbbb3182ef9e145d83396 [file] [log] [blame]
// Copyright (c) 2022, 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:convert';
import 'dart:io';
import 'package:path/path.dart' as p;
// Generates and updates unicode case folding map.
// Here only extract status C + F capital letters.
void main() {
// Downloaded from http://www.unicode.org/Public/14.0.0/ucd/CaseFolding.txt
final file = File('${p.current}/tool/case_folding.txt');
final result = <String, String>{};
for (final line in file.readAsLinesSync()) {
if (line.startsWith('#') ||
line.trim().isEmpty ||
!line.contains('CAPITAL LETTER')) {
continue;
}
final content = line.substring(0, line.indexOf('#'));
final match =
RegExp(r'([0-9A-F]{1,6});\s+[CF];\s+(.+);').firstMatch(content);
if (match == null) {
continue;
}
final key = String.fromCharCode(int.parse(match[1]!, radix: 16));
final value = match[2]!.split(RegExp('[ ]+')).map((e) {
return String.fromCharCode(int.parse(e, radix: 16));
}).join();
result[key] = value;
}
final outputPath = '${p.current}/lib/src/assets/case_folding.dart';
final stringMap = const JsonEncoder.withIndent(' ').convert(result);
final output = '''
// Generated file. do not edit.
//
// Source: tool/case_folding.txt
// Script: tool/update_case_folding.dart
// ignore_for_file: prefer_single_quotes
const caseFoldingMap = $stringMap;
''';
File(outputPath).writeAsStringSync(output);
}