Skip to content

Commit c535249

Browse files
authored
Generator backend for Markdown (#2151)
* Create Markdown generator backend * Load markdown templates Note we need to maintain enumerated lists of partials in order to build resource URIs.
1 parent 08756dc commit c535249

File tree

3 files changed

+83
-9
lines changed

3 files changed

+83
-9
lines changed

lib/dartdoc.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'package:dartdoc/src/dartdoc_options.dart';
1616
import 'package:dartdoc/src/generator/empty_generator.dart';
1717
import 'package:dartdoc/src/generator/generator.dart';
1818
import 'package:dartdoc/src/generator/html_generator.dart';
19+
import 'package:dartdoc/src/generator/markdown_generator.dart';
1920
import 'package:dartdoc/src/logging.dart';
2021
import 'package:dartdoc/src/model/model.dart';
2122
import 'package:dartdoc/src/package_meta.dart';
@@ -109,7 +110,7 @@ class Dartdoc extends PackageBuilder {
109110

110111
/// An asynchronous factory method that builds Dartdoc's file writers
111112
/// and returns a Dartdoc object with them.
112-
@Deprecated('Prefer withContext() instead')
113+
@Deprecated('Prefer fromContext() instead')
113114
static Future<Dartdoc> withDefaultGenerators(
114115
DartdocGeneratorOptionContext config) async {
115116
return Dartdoc._(config, await initHtmlGenerator(config));
@@ -130,8 +131,7 @@ class Dartdoc extends PackageBuilder {
130131
generator = await initHtmlGenerator(context);
131132
break;
132133
case 'md':
133-
// TODO(jdkoren): use a real generator
134-
generator = await initEmptyGenerator(context);
134+
generator = await initMarkdownGenerator(context);
135135
break;
136136
default:
137137
throw DartdocFailure('Unsupported output format: ${context.format}');
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright (c) 2020, 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/dartdoc_generator_backend.dart';
7+
import 'package:dartdoc/src/generator/generator.dart';
8+
import 'package:dartdoc/src/generator/generator_frontend.dart';
9+
import 'package:dartdoc/src/generator/template_data.dart';
10+
import 'package:dartdoc/src/generator/templates.dart';
11+
import 'package:dartdoc/src/model/package.dart';
12+
import 'package:dartdoc/src/model/package_graph.dart';
13+
14+
Future<Generator> initMarkdownGenerator(
15+
DartdocGeneratorOptionContext context) async {
16+
var templates = await Templates.fromContext(context);
17+
var options = DartdocGeneratorBackendOptions.fromContext(context);
18+
var backend = MarkdownGeneratorBackend(options, templates);
19+
return GeneratorFrontEnd(backend);
20+
}
21+
22+
/// Generator backend for markdown output.
23+
class MarkdownGeneratorBackend extends DartdocGeneratorBackend {
24+
MarkdownGeneratorBackend(
25+
DartdocGeneratorBackendOptions options, Templates templates)
26+
: super(options, templates);
27+
28+
@override
29+
void generatePackage(FileWriter writer, PackageGraph graph, Package package) {
30+
super.generatePackage(writer, graph, package);
31+
// We have to construct the data again. This only happens once per package.
32+
TemplateData data = PackageTemplateData(options, graph, package);
33+
render(writer, '__404error.md', templates.errorTemplate, data);
34+
}
35+
}

lib/src/generator/templates.dart

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import 'package:dartdoc/src/generator/resource_loader.dart' as loader;
1313
import 'package:mustache/mustache.dart';
1414
import 'package:path/path.dart' as path;
1515

16-
const _partials = <String>[
16+
// resource_loader and the Resource API doesn't support viewing resources like
17+
// a directory listing, so we have to explicitly list the partials.
18+
const _partials_html = <String>[
1719
'callable',
1820
'callable_multiline',
1921
'categorization',
@@ -42,6 +44,27 @@ const _partials = <String>[
4244
'accessor_setter',
4345
];
4446

47+
const _partials_md = <String>[
48+
'accessor_getter',
49+
'accessor_setter',
50+
'callable',
51+
'callable_multiline',
52+
'categorization',
53+
'class',
54+
'constant',
55+
'documentation',
56+
'extension',
57+
'features',
58+
'footer',
59+
'head',
60+
'library',
61+
'mixin',
62+
'name_summary',
63+
'property',
64+
'source_code',
65+
'source_link',
66+
];
67+
4568
const String _headerPlaceholder = '{{! header placeholder }}';
4669
const String _footerPlaceholder = '{{! footer placeholder }}';
4770
const String _footerTextPlaceholder = '{{! footer-text placeholder }}';
@@ -82,17 +105,33 @@ abstract class _TemplatesLoader {
82105
/// Loads default templates included in the Dartdoc program.
83106
class _DefaultTemplatesLoader extends _TemplatesLoader {
84107
final String _format;
108+
final List<String> _partials;
109+
110+
factory _DefaultTemplatesLoader.create(String format) {
111+
List<String> partials;
112+
switch (format) {
113+
case 'html':
114+
partials = _partials_html;
115+
break;
116+
case 'md':
117+
partials = _partials_md;
118+
break;
119+
default:
120+
partials = [];
121+
}
122+
return _DefaultTemplatesLoader(format, partials);
123+
}
85124

86-
_DefaultTemplatesLoader(this._format);
125+
_DefaultTemplatesLoader(this._format, this._partials);
87126

88127
@override
89128
Future<Map<String, String>> loadPartials() async {
90-
var partials = <String, String>{};
129+
var templates = <String, String>{};
91130
for (String name in _partials) {
92131
var uri = 'package:dartdoc/templates/$_format/_$name.$_format';
93-
partials[name] = await loader.loadAsString(uri);
132+
templates[name] = await loader.loadAsString(uri);
94133
}
95-
return partials;
134+
return templates;
96135
}
97136

98137
@override
@@ -178,7 +217,7 @@ class Templates {
178217
{List<String> headerPaths,
179218
List<String> footerPaths,
180219
List<String> footerTextPaths}) async {
181-
return _create(_DefaultTemplatesLoader(format),
220+
return _create(_DefaultTemplatesLoader.create(format),
182221
headerPaths: headerPaths,
183222
footerPaths: footerPaths,
184223
footerTextPaths: footerTextPaths);

0 commit comments

Comments
 (0)