// 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 'logical_key_data.dart'; import 'physical_key_data.dart'; String _injectDictionary(String template, Map<String, String> dictionary) { String result = template; for (final String key in dictionary.keys) { result = result.replaceAll('@@@$key@@@', dictionary[key] ?? '@@@$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, this.logicalData); /// 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<String, String> mappings(); /// Substitutes the various platform specific maps into the template file for /// keyboard_maps.g.dart. String generate() { final String template = File(templatePath).readAsStringSync(); return _injectDictionary(template, mappings()); } /// The database of keys loaded from disk. final PhysicalKeyData keyData; final LogicalKeyData logicalData; } /// A code generator which also defines platform-based behavior. abstract class PlatformCodeGenerator extends BaseCodeGenerator { PlatformCodeGenerator(super.keyData, super.logicalData); /// Absolute path to the output file. /// /// How this value will be used is based on the callee. String outputPath(String platform); static String engineRoot = ''; }