blob: b4d48baa0f71d213de0b9c60a626b5c9e70b3ecd [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:dartdoc/dartdoc.dart';
import 'package:dartdoc/src/generator/generator_frontend.dart';
import 'package:dartdoc/src/generator/generator_utils.dart' as generator_util;
import 'package:dartdoc/src/generator/template_data.dart';
import 'package:dartdoc/src/generator/templates.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/model/package.dart';
import 'package:dartdoc/src/model/package_graph.dart';
import 'package:dartdoc/src/warnings.dart';
import 'package:mustache/mustache.dart';
import 'package:path/path.dart' as path;
/// Configuration options for the Dartdoc's default backend.
class DartdocGeneratorBackendOptions implements TemplateOptions {
@override
final String relCanonicalPrefix;
@override
final String toolVersion;
final String favicon;
final bool prettyIndexJson;
@override
final bool useBaseHref;
DartdocGeneratorBackendOptions.fromContext(
DartdocGeneratorOptionContext context)
: relCanonicalPrefix = context.relCanonicalPrefix,
toolVersion = dartdocVersion,
favicon = context.favicon,
prettyIndexJson = context.prettyIndexJson,
useBaseHref = context.useBaseHref;
DartdocGeneratorBackendOptions(
{this.relCanonicalPrefix,
this.toolVersion,
this.favicon,
this.prettyIndexJson = false,
this.useBaseHref = false});
}
/// Base GeneratorBackend for Dartdoc's supported formats.
abstract class DartdocGeneratorBackend implements GeneratorBackend {
final DartdocGeneratorBackendOptions options;
final Templates templates;
DartdocGeneratorBackend(
DartdocGeneratorBackendOptions options, this.templates)
: options = (options ?? DartdocGeneratorBackendOptions());
/// Helper method to bind template data and emit the content to the writer.
void render(FileWriter writer, String filename, Template template,
TemplateData data) {
var content = template.renderString(data);
if (!options.useBaseHref) {
content = content.replaceAll(HTMLBASE_PLACEHOLDER, data.htmlBase);
}
writer.write(filename, content,
element: data.self is Warnable ? data.self : null);
}
@override
void generateCategoryJson(
FileWriter writer, List<Categorization> categories) {
var json = generator_util.generateCategoryJson(
categories, options.prettyIndexJson);
if (!options.useBaseHref) {
json = json.replaceAll(HTMLBASE_PLACEHOLDER, '');
}
writer.write(path.join('categories.json'), '${json}\n');
}
@override
void generateSearchIndex(FileWriter writer, List<Indexable> indexedElements) {
var json = generator_util.generateSearchIndexJson(
indexedElements, options.prettyIndexJson);
if (!options.useBaseHref) {
json = json.replaceAll(HTMLBASE_PLACEHOLDER, '');
}
writer.write(path.join('index.json'), '${json}\n');
}
@override
void generatePackage(FileWriter writer, PackageGraph graph, Package package) {
TemplateData data = PackageTemplateData(options, graph, package);
render(writer, package.filePath, templates.indexTemplate, data);
}
@override
void generateCategory(
FileWriter writer, PackageGraph packageGraph, Category category) {
TemplateData data = CategoryTemplateData(options, packageGraph, category);
render(writer, category.filePath, templates.categoryTemplate, data);
}
@override
void generateLibrary(
FileWriter writer, PackageGraph packageGraph, Library lib) {
TemplateData data = LibraryTemplateData(options, packageGraph, lib);
render(writer, lib.filePath, templates.libraryTemplate, data);
}
@override
void generateClass(
FileWriter writer, PackageGraph packageGraph, Library lib, Class clazz) {
TemplateData data = ClassTemplateData(options, packageGraph, lib, clazz);
render(writer, clazz.filePath, templates.classTemplate, data);
}
@override
void generateExtension(FileWriter writer, PackageGraph packageGraph,
Library lib, Extension extension) {
TemplateData data =
ExtensionTemplateData(options, packageGraph, lib, extension);
render(writer, extension.filePath, templates.extensionTemplate, data);
}
@override
void generateMixin(
FileWriter writer, PackageGraph packageGraph, Library lib, Mixin mixin) {
TemplateData data = MixinTemplateData(options, packageGraph, lib, mixin);
render(writer, mixin.filePath, templates.mixinTemplate, data);
}
@override
void generateConstructor(FileWriter writer, PackageGraph packageGraph,
Library lib, Class clazz, Constructor constructor) {
TemplateData data =
ConstructorTemplateData(options, packageGraph, lib, clazz, constructor);
render(writer, constructor.filePath, templates.constructorTemplate, data);
}
@override
void generateEnum(
FileWriter writer, PackageGraph packageGraph, Library lib, Enum eNum) {
TemplateData data = EnumTemplateData(options, packageGraph, lib, eNum);
render(writer, eNum.filePath, templates.enumTemplate, data);
}
@override
void generateFunction(FileWriter writer, PackageGraph packageGraph,
Library lib, ModelFunction function) {
TemplateData data =
FunctionTemplateData(options, packageGraph, lib, function);
render(writer, function.filePath, templates.functionTemplate, data);
}
@override
void generateMethod(FileWriter writer, PackageGraph packageGraph, Library lib,
Container clazz, Method method) {
TemplateData data =
MethodTemplateData(options, packageGraph, lib, clazz, method);
render(writer, method.filePath, templates.methodTemplate, data);
}
@override
void generateConstant(FileWriter writer, PackageGraph packageGraph,
Library lib, Container clazz, Field property) =>
generateProperty(writer, packageGraph, lib, clazz, property);
@override
void generateProperty(FileWriter writer, PackageGraph packageGraph,
Library lib, Container clazz, Field property) {
TemplateData data =
PropertyTemplateData(options, packageGraph, lib, clazz, property);
render(writer, property.filePath, templates.propertyTemplate, data);
}
@override
void generateTopLevelProperty(FileWriter writer, PackageGraph packageGraph,
Library lib, TopLevelVariable property) {
TemplateData data =
TopLevelPropertyTemplateData(options, packageGraph, lib, property);
render(writer, property.filePath, templates.topLevelPropertyTemplate, data);
}
@override
void generateTopLevelConstant(FileWriter writer, PackageGraph packageGraph,
Library lib, TopLevelVariable property) =>
generateTopLevelProperty(writer, packageGraph, lib, property);
@override
void generateTypeDef(FileWriter writer, PackageGraph packageGraph,
Library lib, Typedef typeDef) {
TemplateData data =
TypedefTemplateData(options, packageGraph, lib, typeDef);
render(writer, typeDef.filePath, templates.typeDefTemplate, data);
}
@override
void generateAdditionalFiles(FileWriter writer, PackageGraph graph) {}
}