blob: 162de81a474d5ca1fc89b2250a320eaf66f86e7a [file] [log] [blame]
// 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<String, String> 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].
/// 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.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<Key> get numpadKeyData {
return entry) {
return entry.constantName.startsWith('numpad') && entry.keyLabel != null;
// Used by platform code generators.
List<Key> get functionKeyData {
final RegExp functionKeyRe = RegExp(r'^f[0-9]+$');
return entry) {
return functionKeyRe.hasMatch(entry.constantName);
/// 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'));