blob: 6bdc33c25441e91a9af355c7df0f22057b6c3e1b [file] [log] [blame]
/// XML flatten.
import 'dart:convert';
import 'dart:io';
import 'package:args/args.dart' as args;
import 'package:xml/xml_events.dart';
final args.ArgParser argumentParser = args.ArgParser()
..addFlag(
'normalize',
abbr: 'n',
help: 'Normalize the output stream.',
)
..addFlag(
'text',
abbr: 't',
help: 'Only display text events.',
);
void printUsage() {
stdout.writeln('Usage: xml_flatten [options] {files}');
stdout.writeln();
stdout.writeln(argumentParser.usage);
exit(1);
}
Future<void> main(List<String> arguments) async {
final files = <File>[];
final results = argumentParser.parse(arguments);
final normalize = results['normalize'];
final text = results['text'];
for (final argument in results.rest) {
final file = File(argument);
if (file.existsSync()) {
files.add(file);
} else {
stderr.writeln('File not found: $file');
exit(2);
}
}
if (files.isEmpty) {
printUsage();
}
for (final file in files) {
var stream = file.openRead().transform(utf8.decoder).toXmlEvents();
if (normalize) {
stream = stream.normalizeEvents();
}
var flatStream = stream.flatten();
if (text) {
flatStream = flatStream.where((event) => event is XmlTextEvent);
}
await flatStream.forEach(stdout.writeln);
}
}