Skip to content

Commit 3163f52

Browse files
authored
Create generator subpackage for generator files (#2150)
* Create generator subpackage and start moving files * Make a base backend to extend from Html and Markdown don't need drastically different backends, so we can house most of the logic in a base class. * Move remaining files from html to generator * Fix references to html_resources.g.dart
1 parent bf9f568 commit 3163f52

18 files changed

+301
-287
lines changed

build.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ builders:
22
resource_builder:
33
import: "tool/builder.dart"
44
builder_factories: ["resourceBuilder"]
5-
build_extensions: {'$lib$': ['src/html/resources.g.dart']}
5+
build_extensions: {'$lib$': ['src/generator/html_resources.g.dart']}
66
build_to: "source"
77
auto_apply: none
88

lib/dartdoc.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import 'dart:convert';
1313
import 'dart:io';
1414

1515
import 'package:dartdoc/src/dartdoc_options.dart';
16-
import 'package:dartdoc/src/empty_generator.dart';
17-
import 'package:dartdoc/src/generator.dart';
18-
import 'package:dartdoc/src/html/html_generator.dart';
16+
import 'package:dartdoc/src/generator/empty_generator.dart';
17+
import 'package:dartdoc/src/generator/generator.dart';
18+
import 'package:dartdoc/src/generator/html_generator.dart';
1919
import 'package:dartdoc/src/logging.dart';
2020
import 'package:dartdoc/src/model/model.dart';
2121
import 'package:dartdoc/src/package_meta.dart';
@@ -29,7 +29,7 @@ import 'package:path/path.dart' as path;
2929

3030
export 'package:dartdoc/src/dartdoc_options.dart';
3131
export 'package:dartdoc/src/element_type.dart';
32-
export 'package:dartdoc/src/generator.dart';
32+
export 'package:dartdoc/src/generator/generator.dart';
3333
export 'package:dartdoc/src/model/model.dart';
3434
export 'package:dartdoc/src/package_meta.dart';
3535

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:dartdoc/dartdoc.dart';
6+
import 'package:dartdoc/src/generator/generator_frontend.dart';
7+
import 'package:dartdoc/src/generator/generator_utils.dart' as generator_util;
8+
import 'package:dartdoc/src/generator/template_data.dart';
9+
import 'package:dartdoc/src/generator/templates.dart';
10+
import 'package:dartdoc/src/model/model.dart';
11+
import 'package:dartdoc/src/model/package.dart';
12+
import 'package:dartdoc/src/model/package_graph.dart';
13+
import 'package:dartdoc/src/warnings.dart';
14+
import 'package:mustache/mustache.dart';
15+
import 'package:path/path.dart' as path;
16+
17+
/// Configuration options for the Dartdoc's default backend.
18+
class DartdocGeneratorBackendOptions implements TemplateOptions {
19+
@override
20+
final String relCanonicalPrefix;
21+
@override
22+
final String toolVersion;
23+
24+
final String favicon;
25+
26+
final bool prettyIndexJson;
27+
28+
@override
29+
final bool useBaseHref;
30+
31+
DartdocGeneratorBackendOptions.fromContext(
32+
DartdocGeneratorOptionContext context)
33+
: relCanonicalPrefix = context.relCanonicalPrefix,
34+
toolVersion = dartdocVersion,
35+
favicon = context.favicon,
36+
prettyIndexJson = context.prettyIndexJson,
37+
useBaseHref = context.useBaseHref;
38+
39+
DartdocGeneratorBackendOptions(
40+
{this.relCanonicalPrefix,
41+
this.toolVersion,
42+
this.favicon,
43+
this.prettyIndexJson = false,
44+
this.useBaseHref = false});
45+
}
46+
47+
/// Base GeneratorBackend for Dartdoc's supported formats.
48+
abstract class DartdocGeneratorBackend implements GeneratorBackend {
49+
final DartdocGeneratorBackendOptions options;
50+
final Templates templates;
51+
52+
DartdocGeneratorBackend(
53+
DartdocGeneratorBackendOptions options, this.templates)
54+
: this.options = (options ?? DartdocGeneratorBackendOptions());
55+
56+
/// Helper method to bind template data and emit the content to the writer.
57+
void render(FileWriter writer, String filename, Template template,
58+
TemplateData data) {
59+
String content = template.renderString(data);
60+
if (!options.useBaseHref) {
61+
content = content.replaceAll(HTMLBASE_PLACEHOLDER, data.htmlBase);
62+
}
63+
writer.write(filename, content,
64+
element: data.self is Warnable ? data.self : null);
65+
}
66+
67+
@override
68+
void generateCategoryJson(
69+
FileWriter writer, List<Categorization> categories) {
70+
String json = generator_util.generateCategoryJson(
71+
categories, options.prettyIndexJson);
72+
if (!options.useBaseHref) {
73+
json = json.replaceAll(HTMLBASE_PLACEHOLDER, '');
74+
}
75+
writer.write(path.join('categories.json'), '${json}\n');
76+
}
77+
78+
@override
79+
void generateSearchIndex(FileWriter writer, List<Indexable> indexedElements) {
80+
String json = generator_util.generateSearchIndexJson(
81+
indexedElements, options.prettyIndexJson);
82+
if (!options.useBaseHref) {
83+
json = json.replaceAll(HTMLBASE_PLACEHOLDER, '');
84+
}
85+
writer.write(path.join('index.json'), '${json}\n');
86+
}
87+
88+
@override
89+
void generatePackage(FileWriter writer, PackageGraph graph, Package package) {
90+
TemplateData data = PackageTemplateData(options, graph, package);
91+
render(writer, package.filePath, templates.indexTemplate, data);
92+
}
93+
94+
@override
95+
void generateCategory(
96+
FileWriter writer, PackageGraph packageGraph, Category category) {
97+
TemplateData data = CategoryTemplateData(options, packageGraph, category);
98+
render(writer, category.filePath, templates.categoryTemplate, data);
99+
}
100+
101+
@override
102+
void generateLibrary(
103+
FileWriter writer, PackageGraph packageGraph, Library lib) {
104+
TemplateData data = LibraryTemplateData(options, packageGraph, lib);
105+
render(writer, lib.filePath, templates.libraryTemplate, data);
106+
}
107+
108+
@override
109+
void generateClass(
110+
FileWriter writer, PackageGraph packageGraph, Library lib, Class clazz) {
111+
TemplateData data = ClassTemplateData(options, packageGraph, lib, clazz);
112+
render(writer, clazz.filePath, templates.classTemplate, data);
113+
}
114+
115+
@override
116+
void generateExtension(FileWriter writer, PackageGraph packageGraph,
117+
Library lib, Extension extension) {
118+
TemplateData data =
119+
ExtensionTemplateData(options, packageGraph, lib, extension);
120+
render(writer, extension.filePath, templates.extensionTemplate, data);
121+
}
122+
123+
@override
124+
void generateMixin(
125+
FileWriter writer, PackageGraph packageGraph, Library lib, Mixin mixin) {
126+
TemplateData data = MixinTemplateData(options, packageGraph, lib, mixin);
127+
render(writer, mixin.filePath, templates.mixinTemplate, data);
128+
}
129+
130+
@override
131+
void generateConstructor(FileWriter writer, PackageGraph packageGraph,
132+
Library lib, Class clazz, Constructor constructor) {
133+
TemplateData data =
134+
ConstructorTemplateData(options, packageGraph, lib, clazz, constructor);
135+
136+
render(writer, constructor.filePath, templates.constructorTemplate, data);
137+
}
138+
139+
@override
140+
void generateEnum(
141+
FileWriter writer, PackageGraph packageGraph, Library lib, Enum eNum) {
142+
TemplateData data = EnumTemplateData(options, packageGraph, lib, eNum);
143+
144+
render(writer, eNum.filePath, templates.enumTemplate, data);
145+
}
146+
147+
@override
148+
void generateFunction(FileWriter writer, PackageGraph packageGraph,
149+
Library lib, ModelFunction function) {
150+
TemplateData data =
151+
FunctionTemplateData(options, packageGraph, lib, function);
152+
153+
render(writer, function.filePath, templates.functionTemplate, data);
154+
}
155+
156+
@override
157+
void generateMethod(FileWriter writer, PackageGraph packageGraph, Library lib,
158+
Container clazz, Method method) {
159+
TemplateData data =
160+
MethodTemplateData(options, packageGraph, lib, clazz, method);
161+
162+
render(writer, method.filePath, templates.methodTemplate, data);
163+
}
164+
165+
@override
166+
void generateConstant(FileWriter writer, PackageGraph packageGraph,
167+
Library lib, Container clazz, Field property) =>
168+
generateProperty(writer, packageGraph, lib, clazz, property);
169+
170+
@override
171+
void generateProperty(FileWriter writer, PackageGraph packageGraph,
172+
Library lib, Container clazz, Field property) {
173+
TemplateData data =
174+
PropertyTemplateData(options, packageGraph, lib, clazz, property);
175+
176+
render(writer, property.filePath, templates.propertyTemplate, data);
177+
}
178+
179+
@override
180+
void generateTopLevelProperty(FileWriter writer, PackageGraph packageGraph,
181+
Library lib, TopLevelVariable property) {
182+
TemplateData data =
183+
TopLevelPropertyTemplateData(options, packageGraph, lib, property);
184+
185+
render(writer, property.filePath, templates.topLevelPropertyTemplate, data);
186+
}
187+
188+
@override
189+
void generateTopLevelConstant(FileWriter writer, PackageGraph packageGraph,
190+
Library lib, TopLevelVariable property) =>
191+
generateTopLevelProperty(writer, packageGraph, lib, property);
192+
193+
@override
194+
void generateTypeDef(FileWriter writer, PackageGraph packageGraph,
195+
Library lib, Typedef typeDef) {
196+
TemplateData data =
197+
TypedefTemplateData(options, packageGraph, lib, typeDef);
198+
199+
render(writer, typeDef.filePath, templates.typeDefTemplate, data);
200+
}
201+
202+
@override
203+
void generateAdditionalFiles(FileWriter writer, PackageGraph graph) {}
204+
}

lib/src/empty_generator.dart renamed to lib/src/generator/empty_generator.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ library dartdoc.empty_generator;
33
import 'dart:async';
44

55
import 'package:dartdoc/src/dartdoc_options.dart';
6-
import 'package:dartdoc/src/generator.dart';
6+
import 'package:dartdoc/src/generator/generator.dart';
77
import 'package:dartdoc/src/logging.dart';
88
import 'package:dartdoc/src/model/model.dart';
99
import 'package:dartdoc/src/model_utils.dart';
File renamed without changes.

lib/src/generator_frontend.dart renamed to lib/src/generator/generator_frontend.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import 'dart:async';
66

7-
import 'package:dartdoc/src/generator.dart';
7+
import 'package:dartdoc/src/generator/generator.dart';
88
import 'package:dartdoc/src/logging.dart';
99
import 'package:dartdoc/src/model/model.dart';
1010
import 'package:dartdoc/src/model_utils.dart';
File renamed without changes.

lib/src/generator/html_generator.dart

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
library dartdoc.html_generator;
6+
7+
import 'dart:async' show Future;
8+
import 'dart:io' show File;
9+
10+
import 'package:dartdoc/dartdoc.dart';
11+
import 'package:dartdoc/src/generator/dartdoc_generator_backend.dart';
12+
import 'package:dartdoc/src/generator/generator.dart';
13+
import 'package:dartdoc/src/generator/generator_frontend.dart';
14+
import 'package:dartdoc/src/generator/html_resources.g.dart' as resources;
15+
import 'package:dartdoc/src/generator/resource_loader.dart' as resource_loader;
16+
import 'package:dartdoc/src/generator/template_data.dart';
17+
import 'package:dartdoc/src/generator/templates.dart';
18+
import 'package:path/path.dart' as path;
19+
20+
Future<Generator> initHtmlGenerator(
21+
DartdocGeneratorOptionContext context) async {
22+
var templates = await Templates.fromContext(context);
23+
var options = DartdocGeneratorBackendOptions.fromContext(context);
24+
var backend = HtmlGeneratorBackend(options, templates);
25+
return GeneratorFrontEnd(backend);
26+
}
27+
28+
/// Generator backend for html output.
29+
class HtmlGeneratorBackend extends DartdocGeneratorBackend {
30+
HtmlGeneratorBackend(
31+
DartdocGeneratorBackendOptions options, Templates templates)
32+
: super(options, templates);
33+
34+
@override
35+
void generatePackage(FileWriter writer, PackageGraph graph, Package package) {
36+
super.generatePackage(writer, graph, package);
37+
// We have to construct the data again. This only happens once per package.
38+
TemplateData data = PackageTemplateData(options, graph, package);
39+
render(writer, '__404error.html', templates.errorTemplate, data);
40+
}
41+
42+
@override
43+
void generateAdditionalFiles(FileWriter writer, PackageGraph graph) async {
44+
await _copyResources(writer);
45+
if (options.favicon != null) {
46+
// Allow overwrite of favicon.
47+
var bytes = File(options.favicon).readAsBytesSync();
48+
writer.write(path.join('static-assets', 'favicon.png'), bytes,
49+
allowOverwrite: true);
50+
}
51+
}
52+
53+
Future _copyResources(FileWriter writer) async {
54+
final prefix = 'package:dartdoc/resources/';
55+
for (String resourcePath in resources.resource_names) {
56+
if (!resourcePath.startsWith(prefix)) {
57+
throw StateError('Resource paths must start with $prefix, '
58+
'encountered $resourcePath');
59+
}
60+
String destFileName = resourcePath.substring(prefix.length);
61+
writer.write(path.join('static-assets', destFileName),
62+
await resource_loader.loadAsBytes(resourcePath));
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)