blob: 00e29a58082e7d357c5bf5dae6e703e037a6a71a [file] [log] [blame]
//
// Copyright 2014 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
//
library charted.tool.build_unicode_segmentation_data;
import 'dart:async';
import 'package:http/http.dart' as http;
import 'package:charted/core/text_metrics/segmentation_utils.dart';
/// Unicode version
/// A new version of unicode is available every June.
const VERSION = '7.0.0';
/// URI for downloading the grapheme properties file.
const UCD_PROPERTIES_URL =
'http://www.unicode.org/Public/${VERSION}/ucd/auxiliary/GraphemeBreakProperty.txt';
const LIBRARY_NAME = 'charted.core.text_metrics.segmentation_data';
/// License header for the generated file.
const HEADER = """
//
// Copyright 2014 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
//
// This is a generated file.
// Please use tool/build_unicode_segmentation-data.dart to update
//
/// Code ranges by their types for use with grapheme segmentation
/// of text in charts.
library $LIBRARY_NAME;
import "package:charted/core/text_metrics/segmentation_utils.dart";
""";
Future<String> _getPropertiesFile() => http.read(UCD_PROPERTIES_URL);
void _dumpPropertiesData(String data) {
StringBuffer buffer = new StringBuffer();
RegExp lineRegExp =
new RegExp(r'([0-9A-F]{4})..([0-9A-F]{4})?\s+;\s([a-zA-Z]+)\s');
buffer.write(HEADER);
buffer.writeln('const CODE_POINT_BLOCKS = const[');
List<List> items = [];
data.split('\n').forEach((String line) {
Match match = lineRegExp.matchAsPrefix(line);
if (match == null) return;
int start = int.parse(match.group(1), radix:16);
int end =
match.group(2) == null ? start : int.parse(match.group(2), radix:16);
items.add([start, end, CodeUnitCategory[match.group(3)]]);
items.sort((a, b) => a.first.compareTo(b.first));
});
buffer.write(items.map((List range) => range.join(', ')).join(',\n '));
buffer.writeln();
buffer.writeln('];');
print(buffer.toString());
}
main() {
_getPropertiesFile().then((data) => _dumpPropertiesData(data));
}