Skip to content

Commit 0cbefb9

Browse files
jdkorenjcollins-g
authored andcommitted
Revert "Refactor html generator into frontend and backend (#2115)" (#2120)
This reverts commit 983b3d6.
1 parent 983b3d6 commit 0cbefb9

10 files changed

+633
-777
lines changed

lib/dartdoc.dart

Lines changed: 22 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -44,79 +44,40 @@ class DartdocGeneratorOptionContext extends DartdocOptionContext
4444
: super(optionSet, dir);
4545
}
4646

47-
class DartdocFileWriter implements FileWriter {
48-
final String outputDir;
49-
final Map<String, Warnable> _fileElementMap = {};
50-
@override
51-
final Set<String> writtenFiles = Set();
52-
53-
DartdocFileWriter(this.outputDir);
54-
55-
@override
56-
void write(String filePath, Object content,
57-
{bool allowOverwrite, Warnable element}) {
58-
// Replace '/' separators with proper separators for the platform.
59-
String outFile = path.joinAll(filePath.split('/'));
60-
61-
allowOverwrite ??= false;
62-
if (!allowOverwrite) {
63-
if (_fileElementMap.containsKey(outFile)) {
64-
assert(element != null,
65-
'Attempted overwrite of ${outFile} without corresponding element');
66-
Warnable originalElement = _fileElementMap[outFile];
67-
Iterable<Warnable> referredFrom =
68-
originalElement != null ? [originalElement] : null;
69-
element?.warn(PackageWarning.duplicateFile,
70-
message: outFile, referredFrom: referredFrom);
71-
}
72-
}
73-
_fileElementMap[outFile] = element;
74-
75-
var file = File(path.join(outputDir, outFile));
76-
var parent = file.parent;
77-
if (!parent.existsSync()) {
78-
parent.createSync(recursive: true);
79-
}
80-
81-
if (content is String) {
82-
file.writeAsStringSync(content);
83-
} else if (content is List<int>) {
84-
file.writeAsBytesSync(content);
85-
} else {
86-
throw ArgumentError.value(
87-
content, 'content', '`content` must be `String` or `List<int>`.');
88-
}
89-
90-
writtenFiles.add(outFile);
91-
logProgress(outFile);
92-
}
93-
}
94-
9547
/// Generates Dart documentation for all public Dart libraries in the given
9648
/// directory.
9749
class Dartdoc extends PackageBuilder {
98-
final Generator generator;
50+
final List<Generator> generators;
9951
final Set<String> writtenFiles = Set();
10052
Directory outputDir;
10153

10254
// Fires when the self checks make progress.
10355
final StreamController<String> _onCheckProgress =
10456
StreamController(sync: true);
10557

106-
Dartdoc._(DartdocOptionContext config, this.generator) : super(config) {
58+
Dartdoc._(DartdocOptionContext config, this.generators) : super(config) {
10759
outputDir = Directory(config.output)..createSync(recursive: true);
60+
generators.forEach((g) => g.onFileCreated.listen(logProgress));
10861
}
10962

11063
/// An asynchronous factory method that builds Dartdoc's file writers
11164
/// and returns a Dartdoc object with them.
11265
static Future<Dartdoc> withDefaultGenerators(
11366
DartdocGeneratorOptionContext config) async {
114-
return Dartdoc._(config, await initHtmlGenerator(config));
67+
List<Generator> generators = await initHtmlGenerators(config);
68+
return Dartdoc._(config, generators);
11569
}
11670

11771
/// An asynchronous factory method that builds
11872
static Future<Dartdoc> withEmptyGenerator(DartdocOptionContext config) async {
119-
return Dartdoc._(config, await initEmptyGenerator(config));
73+
List<Generator> generators = await initEmptyGenerators(config);
74+
return Dartdoc._(config, generators);
75+
}
76+
77+
/// Basic synchronous factory that gives a stripped down Dartdoc that won't
78+
/// use generators. Useful for testing.
79+
factory Dartdoc.withoutGenerators(DartdocOptionContext config) {
80+
return Dartdoc._(config, []);
12081
}
12182

12283
Stream<String> get onCheckProgress => _onCheckProgress.stream;
@@ -133,20 +94,19 @@ class Dartdoc extends PackageBuilder {
13394
double seconds;
13495
packageGraph = await buildPackageGraph();
13596
seconds = _stopwatch.elapsedMilliseconds / 1000.0;
136-
int libs = packageGraph.libraries.length;
137-
logInfo("Initialized dartdoc with ${libs} librar${libs == 1 ? 'y' : 'ies'} "
97+
logInfo(
98+
"Initialized dartdoc with ${packageGraph.libraries.length} librar${packageGraph.libraries.length == 1 ? 'y' : 'ies'} "
13899
"in ${seconds.toStringAsFixed(1)} seconds");
139100
_stopwatch.reset();
140101

141-
final generator = this.generator;
142-
if (generator != null) {
102+
if (generators.isNotEmpty) {
143103
// Create the out directory.
144104
if (!outputDir.existsSync()) outputDir.createSync(recursive: true);
145105

146-
DartdocFileWriter writer = DartdocFileWriter(outputDir.path);
147-
await generator.generate(packageGraph, writer);
148-
149-
writtenFiles.addAll(writer.writtenFiles);
106+
for (var generator in generators) {
107+
await generator.generate(packageGraph, outputDir.path);
108+
writtenFiles.addAll(generator.writtenFiles.keys.map(path.normalize));
109+
}
150110
if (config.validateLinks && writtenFiles.isNotEmpty) {
151111
validateLinks(packageGraph, outputDir.path);
152112
}
@@ -162,8 +122,8 @@ class Dartdoc extends PackageBuilder {
162122
}
163123

164124
seconds = _stopwatch.elapsedMilliseconds / 1000.0;
165-
libs = packageGraph.localPublicLibraries.length;
166-
logInfo("Documented ${libs} public librar${libs == 1 ? 'y' : 'ies'} "
125+
logInfo(
126+
"Documented ${packageGraph.localPublicLibraries.length} public librar${packageGraph.localPublicLibraries.length == 1 ? 'y' : 'ies'} "
167127
"in ${seconds.toStringAsFixed(1)} seconds");
168128
return DartdocResults(config.topLevelPackageMeta, packageGraph, outputDir);
169129
}

lib/src/empty_generator.dart

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import 'dart:async';
44

55
import 'package:dartdoc/src/dartdoc_options.dart';
66
import 'package:dartdoc/src/generator.dart';
7-
import 'package:dartdoc/src/logging.dart';
87
import 'package:dartdoc/src/model/model.dart';
98
import 'package:dartdoc/src/model_utils.dart';
109
import 'package:dartdoc/src/warnings.dart';
@@ -14,23 +13,34 @@ import 'package:dartdoc/src/warnings.dart';
1413
/// it were.
1514
class EmptyGenerator extends Generator {
1615
@override
17-
Future generate(PackageGraph _packageGraph, FileWriter writer) {
18-
logProgress(_packageGraph.defaultPackage.documentationAsHtml);
16+
Future generate(PackageGraph _packageGraph, String outputDirectoryPath) {
17+
_onFileCreated.add(_packageGraph.defaultPackage.documentationAsHtml);
1918
for (var package in Set.from([_packageGraph.defaultPackage])
2019
..addAll(_packageGraph.localPackages)) {
2120
for (var category in filterNonDocumented(package.categories)) {
22-
logProgress(category.documentationAsHtml);
21+
_onFileCreated.add(category.documentationAsHtml);
2322
}
2423

2524
for (Library lib in filterNonDocumented(package.libraries)) {
2625
filterNonDocumented(lib.allModelElements)
27-
.forEach((m) => logProgress(m.documentationAsHtml));
26+
.forEach((m) => _onFileCreated.add(m.documentationAsHtml));
2827
}
2928
}
3029
return null;
3130
}
31+
32+
final StreamController<void> _onFileCreated = StreamController(sync: true);
33+
34+
@override
35+
36+
/// Implementation fires on each model element processed rather than
37+
/// file creation.
38+
Stream<void> get onFileCreated => _onFileCreated.stream;
39+
40+
@override
41+
final Map<String, Warnable> writtenFiles = {};
3242
}
3343

34-
Future<Generator> initEmptyGenerator(DartdocOptionContext config) async {
35-
return EmptyGenerator();
44+
Future<List<Generator>> initEmptyGenerators(DartdocOptionContext config) async {
45+
return [EmptyGenerator()];
3646
}

lib/src/generator.dart

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,20 @@ import 'package:dartdoc/src/package_meta.dart';
1515
import 'package:dartdoc/src/warnings.dart';
1616
import 'package:path/path.dart' as path;
1717

18-
abstract class FileWriter {
19-
/// All filenames written by this generator.
20-
Set<String> get writtenFiles;
21-
22-
/// Write [content] to a file at [filePath].
23-
void write(String filePath, Object content,
24-
{bool allowOverwrite, Warnable element});
25-
}
26-
2718
/// An abstract class that defines a generator that generates documentation for
2819
/// a given package.
2920
///
3021
/// Generators can generate documentation in different formats: html, json etc.
3122
abstract class Generator {
32-
/// Generate the documentation for the given package using the specified
33-
/// writer. Completes the returned future when done.
34-
Future generate(PackageGraph packageGraph, FileWriter writer);
23+
/// Generate the documentation for the given package in the specified
24+
/// directory. Completes the returned future when done.
25+
Future generate(PackageGraph packageGraph, String outputDirectoryPath);
26+
27+
/// Fires when a file is created.
28+
Stream<void> get onFileCreated;
29+
30+
/// Fetches all filenames written by this generator.
31+
Map<String, Warnable> get writtenFiles;
3532
}
3633

3734
/// Dartdoc options related to generators generally.

0 commit comments

Comments
 (0)