blob: d5ad00aa9216cbb9fd205fde9a5f0c7307826d36 [file] [log] [blame]
import 'dart:io';
import 'dart:convert';
import 'package:path/path.dart' as path;
import 'dart:async';
// TODO: use https://www.w3.org/TR/html51/entities.json instead?
Future<void> main() async {
const url = 'https://raw.githubusercontent.com/unbescape/unbescape/master/'
'src/main/java/org/unbescape/html/Html5EscapeSymbolsInitializer.java';
print('Downloading unbescape source file at $url.');
final client = HttpClient();
var req = await client.getUrl(Uri.parse(url));
var response = await req.close();
client.close();
final contents = await response
.cast<List<int>>()
.transform(utf8.decoder)
.transform(const LineSplitter())
.toList();
var refLines =
contents.where((line) => line.contains('html5References.addReference'));
var map = <String, String>{};
refLines.forEach((line) {
var csv = line
.replaceAll('html5References.addReference(', '')
.replaceAll(');', '');
var values = csv.split(', ');
var key = values.last.substring(1, values.last.length - 1);
var ord = int.parse(values.first);
if (ord >= 119964) {
// This is UTF-16 territory. Ignore that.
return;
}
var str = String.fromCharCode(ord);
map[key] = str;
});
await writeMapToFile(map, 'named_chars_all.dart');
var smallerMap = Map<String, String>.from(map);
for (var key in map.keys) {
var ord = map[key].runes.first;
if (ord > 255) {
smallerMap.remove(key);
}
}
await writeMapToFile(smallerMap, 'named_chars_basic.dart');
print('Done');
}
Future writeMapToFile(Map<String, String> map, String filename) async {
final jsonCodec = JsonEncoder.withIndent(' ');
var keysList = map.keys.toList();
keysList.sort((a, b) => b.length.compareTo(a.length));
var keysListLiteral = jsonCodec.convert(keysList);
var maxKeyLength = keysList.first.length;
var valuesList =
List<String>.generate(keysList.length, (index) => map[keysList[index]]);
var valuesListLiteral = jsonCodec.convert(valuesList);
valuesListLiteral = valuesListLiteral.replaceAll(r'"$"', r'"\$"');
var scriptDir = path.dirname(Platform.script.path);
var outputPath = path.join(scriptDir, '../lib/src/data/$filename');
print(outputPath);
var output = File(outputPath);
output = await output.create();
var sink = output.openWrite();
sink.writeln('// This is auto-generated from tool/generate_map.dart.');
sink.writeln('library html_unescape.${filename.split('.').first};');
sink.write('const List<String> keys = <String>');
sink.write(keysListLiteral);
sink.writeln(';');
sink.writeln('const int maxKeyLength = $maxKeyLength;');
sink.write('const List<String> values = <String>');
sink.write(valuesListLiteral);
sink.writeln(';');
await sink.close();
}