// 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' hide Platform; import 'package:meta/meta.dart'; import 'package:path/path.dart' as path; /// What type of snippet to produce. enum SnippetType { /// Produces a snippet that includes the code interpolated into an application /// template. sample, /// Produces a nicely formatted sample code, but no application. snippet, } /// Return the name of an enum item. String getEnumName(dynamic enumItem) { final String name = '$enumItem'; final int index = name.indexOf('.'); return index == -1 ? name : name.substring(index + 1); } /// A class to compute the configuration of the snippets input and output /// locations based in the current location of the snippets main.dart. class Configuration { Configuration({@required this.flutterRoot}) : assert(flutterRoot != null); final Directory flutterRoot; /// This is the configuration directory for the snippets system, containing /// the skeletons and templates. @visibleForTesting Directory get configDirectory { _configPath ??= Directory( path.canonicalize(path.join(flutterRoot.absolute.path, 'dev', 'snippets', 'config'))); return _configPath; } Directory _configPath; /// This is where the snippets themselves will be written, in order to be /// uploaded to the docs site. Directory get outputDirectory { _docsDirectory ??= Directory( path.canonicalize(path.join(flutterRoot.absolute.path, 'dev', 'docs', 'doc', 'snippets'))); return _docsDirectory; } Directory _docsDirectory; /// This makes sure that the output directory exists. void createOutputDirectory() { if (!outputDirectory.existsSync()) { outputDirectory.createSync(recursive: true); } } /// The directory containing the HTML skeletons to be filled out with metadata /// and returned to dartdoc for insertion in the output. Directory get skeletonsDirectory => Directory(path.join(configDirectory.path,'skeletons')); /// The directory containing the code templates that can be referenced by the /// dartdoc. Directory get templatesDirectory => Directory(path.join(configDirectory.path, 'templates')); /// Gets the skeleton file to use for the given [SnippetType] and DartPad preference. File getHtmlSkeletonFile(SnippetType type, {bool showDartPad = false}) { assert(!showDartPad || type == SnippetType.sample, 'Only application snippets work with dartpad.'); final String filename = '${showDartPad ? 'dartpad-' : ''}${getEnumName(type)}.html'; return File(path.join(skeletonsDirectory.path, filename)); } }