Skip to content

Commit

Permalink
Fully replace mustache with mustachio
Browse files Browse the repository at this point in the history
  • Loading branch information
srawlins committed Mar 12, 2021
1 parent 0298fa6 commit d0dfa42
Show file tree
Hide file tree
Showing 9 changed files with 12,463 additions and 973 deletions.
91 changes: 44 additions & 47 deletions lib/src/generator/dartdoc_generator_backend.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,18 @@
// 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:analyzer/file_system/file_system.dart';
import 'package:dartdoc/dartdoc.dart';
import 'package:dartdoc/options.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/generator/templates.renderers.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/mustachio/renderer_base.dart';
import 'package:dartdoc/src/warnings.dart';
import 'package:mustache/mustache.dart';
import 'package:path/path.dart' as path show Context;

/// Configuration options for the Dartdoc's default backend.
Expand Down Expand Up @@ -63,56 +62,48 @@ class DartdocGeneratorBackendOptions implements TemplateOptions {
customInnerFooterText = '';
}

class SidebarGenerator<T extends Documentable> {
class SidebarGenerator<T extends TemplateData> {
final Template template;
final Map<T, String> _renderCache = {};
final RenderFunction<T> renderFunction;
final Map<Documentable, String> _renderCache = {};

SidebarGenerator(this.template);
SidebarGenerator(this.template, this.renderFunction);

// Retrieve the render for a specific key, or generate it using the given
// template data if you need.
String getRenderFor(T key, TemplateData templateData) {
return _renderCache[key] ??= template.renderString(templateData);
String getRenderFor(Documentable key, T templateData) {
return _renderCache[key] ??= renderFunction(templateData, template);
}
}

/// Base GeneratorBackend for Dartdoc's supported formats.
abstract class DartdocGeneratorBackend implements GeneratorBackend {
final DartdocGeneratorBackendOptions options;
final Templates templates;
final SidebarGenerator<Library> sidebarForLibrary;
final SidebarGenerator<Container> sidebarForContainer;
final SidebarGenerator<TemplateDataWithLibrary<Documentable>>
sidebarForLibrary;
final SidebarGenerator<TemplateDataWithContainer<Documentable>>
sidebarForContainer;
final path.Context _pathContext;

DartdocGeneratorBackend(
DartdocGeneratorBackendOptions options, this.templates, this._pathContext)
: options = options ?? DartdocGeneratorBackendOptions._defaults(),
sidebarForContainer =
SidebarGenerator(templates.sidebarContainerTemplate),
sidebarForLibrary = SidebarGenerator(templates.sidebarLibraryTemplate);
sidebarForLibrary = SidebarGenerator(
templates.sidebarLibraryTemplate, renderSidebarForLibrary),
sidebarForContainer = SidebarGenerator(
templates.sidebarContainerTemplate, renderSidebarForContainer);

/// Helper method to bind template data and emit the content to the writer.
void render0(FileWriter writer, String filename, Template template,
TemplateData data) {
var content = template.renderString(data);
void write(
FileWriter writer, String filename, TemplateData data, String content) {
if (!options.useBaseHref) {
content = content.replaceAll(htmlBasePlaceholder, data.htmlBase);
}
writer.write(filename, content,
element: data.self is Warnable ? data.self : null);
}

/// Helper method to bind template data and emit the content to the writer.
void render<T extends TemplateData>(FileWriter writer, String filename,
RenderFunction<T> renderTemplate, T data) {
var content = renderTemplate(data, FILE);
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) {
Expand Down Expand Up @@ -141,30 +132,34 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
@override
void generatePackage(FileWriter writer, PackageGraph graph, Package package) {
TemplateData data = PackageTemplateData(options, graph, package);
render0(writer, package.filePath, templates.indexTemplate, data);
var content = renderIndex(data, templates.indexTemplate);
write(writer, package.filePath, data, content);
}

@override
void generateCategory(
FileWriter writer, PackageGraph packageGraph, Category category) {
TemplateData data = CategoryTemplateData(options, packageGraph, category);
render(writer, category.filePath, templates.categoryTemplate, data);
var content = renderCategory(data, templates.categoryTemplate);
write(writer, category.filePath, data, content);
}

@override
void generateLibrary(
FileWriter writer, PackageGraph packageGraph, Library lib) {
TemplateData data = LibraryTemplateData(
options, packageGraph, lib, sidebarForLibrary.getRenderFor);
render0(writer, lib.filePath, templates.libraryTemplate, data);
var content = renderLibrary(data, templates.libraryTemplate);
write(writer, lib.filePath, data, content);
}

@override
void generateClass(
FileWriter writer, PackageGraph packageGraph, Library lib, Class clazz) {
TemplateData data = ClassTemplateData(options, packageGraph, lib, clazz,
sidebarForLibrary.getRenderFor, sidebarForContainer.getRenderFor);
render0(writer, clazz.filePath, templates.classTemplate, data);
var content = renderClass(data, templates.classTemplate);
write(writer, clazz.filePath, data, content);
}

@override
Expand All @@ -177,51 +172,53 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
extension,
sidebarForLibrary.getRenderFor,
sidebarForContainer.getRenderFor);
render0(writer, extension.filePath, templates.extensionTemplate, data);
var content = renderExtension(data, templates.extensionTemplate);
write(writer, extension.filePath, data, content);
}

@override
void generateMixin(
FileWriter writer, PackageGraph packageGraph, Library lib, Mixin mixin) {
TemplateData data = MixinTemplateData(options, packageGraph, lib, mixin,
sidebarForLibrary.getRenderFor, sidebarForContainer.getRenderFor);
render0(writer, mixin.filePath, templates.mixinTemplate, data);
var content = renderMixin(data, templates.mixinTemplate);
write(writer, mixin.filePath, data, content);
}

@override
void generateConstructor(FileWriter writer, PackageGraph packageGraph,
Library lib, Class clazz, Constructor constructor) {
TemplateData data = ConstructorTemplateData(options, packageGraph, lib,
clazz, constructor, sidebarForContainer.getRenderFor);

render0(writer, constructor.filePath, templates.constructorTemplate, data);
var content = renderConstructor(data, templates.constructorTemplate);
write(writer, constructor.filePath, data, content);
}

@override
void generateEnum(
FileWriter writer, PackageGraph packageGraph, Library lib, Enum eNum) {
TemplateData data = EnumTemplateData(options, packageGraph, lib, eNum,
sidebarForLibrary.getRenderFor, sidebarForContainer.getRenderFor);

render0(writer, eNum.filePath, templates.enumTemplate, data);
var content = renderEnum(data, templates.enumTemplate);
write(writer, eNum.filePath, data, content);
}

@override
void generateFunction(FileWriter writer, PackageGraph packageGraph,
Library lib, ModelFunction function) {
TemplateData data = FunctionTemplateData(
options, packageGraph, lib, function, sidebarForLibrary.getRenderFor);

render0(writer, function.filePath, templates.functionTemplate, data);
var content = renderFunction(data, templates.functionTemplate);
write(writer, function.filePath, data, content);
}

@override
void generateMethod(FileWriter writer, PackageGraph packageGraph, Library lib,
Container clazz, Method method) {
TemplateData data = MethodTemplateData(options, packageGraph, lib, clazz,
method, sidebarForContainer.getRenderFor);

render0(writer, method.filePath, templates.methodTemplate, data);
var content = renderMethod(data, templates.methodTemplate);
write(writer, method.filePath, data, content);
}

@override
Expand All @@ -234,18 +231,18 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
Library lib, Container clazz, Field property) {
TemplateData data = PropertyTemplateData(options, packageGraph, lib, clazz,
property, sidebarForContainer.getRenderFor);

render0(writer, property.filePath, templates.propertyTemplate, data);
var content = renderProperty(data, templates.propertyTemplate);
write(writer, property.filePath, data, content);
}

@override
void generateTopLevelProperty(FileWriter writer, PackageGraph packageGraph,
Library lib, TopLevelVariable property) {
TemplateData data = TopLevelPropertyTemplateData(
options, packageGraph, lib, property, sidebarForLibrary.getRenderFor);

render0(
writer, property.filePath, templates.topLevelPropertyTemplate, data);
var content =
renderTopLevelProperty(data, templates.topLevelPropertyTemplate);
write(writer, property.filePath, data, content);
}

@override
Expand All @@ -258,8 +255,8 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
Library lib, Typedef typeDef) {
TemplateData data = TypedefTemplateData(
options, packageGraph, lib, typeDef, sidebarForLibrary.getRenderFor);

render0(writer, typeDef.filePath, templates.typeDefTemplate, data);
var content = renderTypedef(data, templates.typeDefTemplate);
write(writer, typeDef.filePath, data, content);
}

@override
Expand Down
4 changes: 3 additions & 1 deletion lib/src/generator/html_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'package:dartdoc/src/generator/html_resources.g.dart' as resources;
import 'package:dartdoc/src/generator/resource_loader.dart';
import 'package:dartdoc/src/generator/template_data.dart';
import 'package:dartdoc/src/generator/templates.dart';
import 'package:dartdoc/src/generator/templates.renderers.dart';
import 'package:dartdoc/src/model/package.dart';
import 'package:dartdoc/src/model/package_graph.dart';
import 'package:path/path.dart' as path show Context;
Expand All @@ -36,7 +37,8 @@ class HtmlGeneratorBackend extends DartdocGeneratorBackend {
super.generatePackage(writer, graph, package);
// We have to construct the data again. This only happens once per package.
TemplateData data = PackageTemplateData(options, graph, package);
render0(writer, '__404error.html', templates.errorTemplate, data);
var content = renderError(data, templates.errorTemplate);
write(writer, '__404error.html', data, content);
}

@override
Expand Down
4 changes: 3 additions & 1 deletion lib/src/generator/markdown_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:dartdoc/src/generator/generator.dart';
import 'package:dartdoc/src/generator/generator_frontend.dart';
import 'package:dartdoc/src/generator/template_data.dart';
import 'package:dartdoc/src/generator/templates.dart';
import 'package:dartdoc/src/generator/templates.renderers.dart';
import 'package:dartdoc/src/model/package.dart';
import 'package:dartdoc/src/model/package_graph.dart';
import 'package:path/path.dart' as path show Context;
Expand All @@ -32,6 +33,7 @@ class MarkdownGeneratorBackend extends DartdocGeneratorBackend {
super.generatePackage(writer, graph, package);
// We have to construct the data again. This only happens once per package.
TemplateData data = PackageTemplateData(options, graph, package);
render0(writer, '__404error.md', templates.errorTemplate, data);
var content = renderError(data, templates.errorTemplate);
write(writer, '__404error.md', data, content);
}
}
6 changes: 5 additions & 1 deletion lib/src/generator/resource_loader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,12 @@ extension ResourceLoader on ResourceProvider {
throw ArgumentError('path must begin with package:');
}

return (await getResourceFile(path)).readAsBytesSync();
}

Future<File> getResourceFile(String path) async {
var uri = await resolveResourceUri(Uri.parse(path));
return getFile(uri.toFilePath()).readAsBytesSync();
return getFile(uri.toFilePath());
}

/// Helper function for resolving to a non-relative, non-package URI.
Expand Down
Loading

0 comments on commit d0dfa42

Please sign in to comment.