Skip to content

Commit b9acd7d

Browse files
authored
Cleanup language feature usage and renderer (#2539)
* Cleanup language feature usage and renderer * Switch to actually using const constructur
1 parent 7645ef8 commit b9acd7d

File tree

3 files changed

+46
-29
lines changed

3 files changed

+46
-29
lines changed

lib/src/model/language_feature.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,17 @@ const Map<String, String> _featureUrls = {
1515
/// An abstraction for a language feature; used to render tags to notify
1616
/// the user that the documentation should be specially interpreted.
1717
class LanguageFeature {
18+
/// The description of this language feature.
1819
String get featureDescription => _featureDescriptions[name];
19-
String get featureUrl => _featureUrls[name];
20+
21+
/// A URL containing more information about this feature or `null` if there
22+
/// is none.
23+
String /*?*/ get featureUrl => _featureUrls[name];
24+
25+
/// The rendered label for this language feature.
2026
String get featureLabel => _featureRenderer.renderFeatureLabel(this);
2127

28+
/// The name of this language feature.
2229
final String name;
2330

2431
final FeatureRenderer _featureRenderer;

lib/src/render/feature_renderer.dart

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,49 +4,59 @@
44

55
import 'package:dartdoc/src/model/language_feature.dart';
66

7+
/// A renderer for a [LanguageFeature].
78
abstract class FeatureRenderer {
9+
const FeatureRenderer();
10+
11+
/// Render the label of this [feature].
812
String renderFeatureLabel(LanguageFeature feature);
913
}
1014

15+
/// A HTML renderer for a [LanguageFeature].
1116
class FeatureRendererHtml extends FeatureRenderer {
12-
static final FeatureRendererHtml _instance = FeatureRendererHtml._();
13-
14-
factory FeatureRendererHtml() {
15-
return _instance;
16-
}
17-
18-
FeatureRendererHtml._();
17+
const FeatureRendererHtml();
1918

2019
@override
2120
String renderFeatureLabel(LanguageFeature feature) {
22-
final classesText = [
23-
'feature',
24-
'feature-${feature.name.split(' ').join('-').toLowerCase()}'
25-
].join(' ');
26-
27-
if (feature.featureUrl != null) {
28-
return '<a href="${feature.featureUrl}" class="${classesText}"'
29-
' title="${feature.featureDescription}">${feature.name}</a>';
21+
final buffer = StringBuffer();
22+
final url = feature.featureUrl;
23+
24+
if (url != null) {
25+
buffer.write('<a href="');
26+
buffer.write(url);
27+
buffer.write('"');
28+
} else {
29+
buffer.write('<span');
3030
}
3131

32-
return '<span class="${classesText}" '
33-
'title="${feature.featureDescription}">${feature.name}</span>';
34-
}
35-
}
32+
final name = feature.name;
3633

37-
class FeatureRendererMd extends FeatureRenderer {
38-
static final FeatureRendererMd _instance = FeatureRendererMd._();
34+
buffer.write(' class="feature feature-');
35+
buffer.writeAll(name.toLowerCase().split(' '), '-');
36+
buffer.write('" title="');
37+
buffer.write(feature.featureDescription);
38+
buffer.write('">');
39+
buffer.write(name);
40+
41+
if (url != null) {
42+
buffer.write('</a>');
43+
} else {
44+
buffer.write('</span>');
45+
}
3946

40-
factory FeatureRendererMd() {
41-
return _instance;
47+
return buffer.toString();
4248
}
49+
}
4350

44-
FeatureRendererMd._();
51+
/// A markdown renderer for a [LanguageFeature].
52+
class FeatureRendererMd extends FeatureRenderer {
53+
const FeatureRendererMd();
4554

4655
@override
4756
String renderFeatureLabel(LanguageFeature feature) {
48-
if (feature.featureUrl != null) {
49-
return '*[\<${feature.name}\>](${feature.featureUrl})*';
57+
final featureUrl = feature.featureUrl;
58+
if (featureUrl != null) {
59+
return '*[\<${feature.name}\>]($featureUrl)*';
5060
}
5161
return '*\<${feature.name}\>*';
5262
}

lib/src/render/renderer_factory.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class HtmlRenderFactory extends RendererFactory {
104104
TypedefRenderer get typedefRenderer => const TypedefRendererHtml();
105105

106106
@override
107-
FeatureRenderer get featureRenderer => FeatureRendererHtml();
107+
FeatureRenderer get featureRenderer => const FeatureRendererHtml();
108108

109109
@override
110110
SourceCodeRenderer get sourceCodeRenderer => SourceCodeRendererHtml();
@@ -157,7 +157,7 @@ class MdRenderFactory extends RendererFactory {
157157
TypedefRenderer get typedefRenderer => const TypedefRendererMd();
158158

159159
@override
160-
FeatureRenderer get featureRenderer => FeatureRendererMd();
160+
FeatureRenderer get featureRenderer => const FeatureRendererMd();
161161

162162
@override
163163
SourceCodeRenderer get sourceCodeRenderer => SourceCodeRendererNoop();

0 commit comments

Comments
 (0)