// Copyright 2014 The Flutter Authors. 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:io'; import 'package:path/path.dart' as path; import 'key_data.dart'; import 'utils.dart'; String _injectDictionary(String template, Map dictionary) { String result = template; for (final String key in dictionary.keys) { result = result.replaceAll('@@@$key@@@', dictionary[key]); } return result; } /// Generates a file based on the information in the key data structure given to /// it. /// /// [BaseCodeGenerator] finds tokens in the template file that has the form of /// `@@@TOKEN@@@`, and replace them by looking up the key `TOKEN` from the map /// returned by [mappings]. /// /// Subclasses must implement [templatePath] and [mappings]. abstract class BaseCodeGenerator { /// Create a code generator while providing [keyData] to be used in [mappings]. BaseCodeGenerator(this.keyData); /// Absolute path to the template file that this file is generated on. String get templatePath; /// A mapping from tokens to be replaced in the template to the result string. Map mappings(); /// Substitutes the various platform specific maps into the template file for /// keyboard_maps.dart. String generate() { final String template = File(templatePath).readAsStringSync(); return _injectDictionary(template, mappings()); } /// The database of keys loaded from disk. final KeyData keyData; } /// A code generator which also defines platform-based behavior. abstract class PlatformCodeGenerator extends BaseCodeGenerator { PlatformCodeGenerator(KeyData keyData) : super(keyData); // Used by platform code generators. List get numpadKeyData { return keyData.data.where((Key entry) { return entry.constantName.startsWith('numpad') && entry.keyLabel != null; }).toList(); } // Used by platform code generators. List get functionKeyData { final RegExp functionKeyRe = RegExp(r'^f[0-9]+$'); return keyData.data.where((Key entry) { return functionKeyRe.hasMatch(entry.constantName); }).toList(); } /// Absolute path to the output file. /// /// How this value will be used is based on the callee. String outputPath(String platform) => path.join(flutterRoot.path, '..', path.join('engine', 'src', 'flutter', 'shell', 'platform', platform, 'keycodes', 'keyboard_map_$platform.h')); }