blob: 7d719ee246196accead88ab2428ad211ccc15ec9 [file] [log] [blame]
#!/usr/bin/env dart
// Copyright (c) 2013, 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.
/**
* This script uses the extract_messages.dart library to find the Intl.message
* calls in the target dart files and produces intl_messages.json containing the
* information on those messages. It uses the analyzer-experimental parser
* to find the information.
*
* This is intended to test the basic functioning of extracting messages and
* serve as an example for how a program to extract them to a translation
* file format could work. In the tests, this file is then run through a
* simulated translation and the results of that are used to generate code. See
* message_extraction_test.dart
*
* If the environment variable INTL_MESSAGE_OUTPUT is set then it will use
* that as the output directory, otherwise it will use the working directory.
*/
library extract_to_json;
import 'dart:io';
import 'package:intl/extract_messages.dart';
import 'dart:json' as json;
import 'package:pathos/path.dart' as path;
import 'package:intl/src/intl_message.dart';
import 'find_output_directory.dart';
main() {
var args = new Options().arguments;
if (args.length == 0) {
print('Usage: extract_to_json [--output-dir=<dir>] [files.dart]');
print('Accepts Dart files and produces intl_messages.json');
exit(0);
}
var allMessages = [];
for (var arg in args.where((x) => x.contains(".dart"))) {
var messages = parseFile(new File(arg));
messages.forEach((k, v) => allMessages.add(toJson(v)));
}
var targetDir = findOutputDirectory(args);
var file = new File(path.join(targetDir, 'intl_messages.json'));
file.writeAsStringSync(json.stringify(allMessages));
}
/**
* This is a placeholder for transforming a parameter substitution from
* the translation file format into a Dart interpolation. In our case we
* store it to the file in Dart interpolation syntax, so the transformation
* is trivial.
*/
String leaveTheInterpolationsInDartForm(IntlMessage msg, chunk) =>
(chunk is String) ? chunk : "\$${msg.arguments[chunk]}";
/**
* Convert the [IntlMessage] to a trivial JSON format.
*/
Map toJson(IntlMessage message) {
return {
"name" : message.name,
"description" : message.description,
"message" : message.fullMessage(leaveTheInterpolationsInDartForm),
"examples" : message.examples,
"arguments" : message.arguments
};
}