Skip to content

Commit 60f5572

Browse files
committed
Don't HTML escape source code blocks in Markdown
Adds a renderer in between to control whether or not we apply HTML escapes to source code blocks. Fixes dart-lang#2252
1 parent 95214ad commit 60f5572

File tree

5 files changed

+58
-1
lines changed

5 files changed

+58
-1
lines changed

lib/src/model/model_element.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import 'package:dartdoc/src/model/model.dart';
2626
import 'package:dartdoc/src/model_utils.dart' as utils;
2727
import 'package:dartdoc/src/render/model_element_renderer.dart';
2828
import 'package:dartdoc/src/render/parameter_renderer.dart';
29+
import 'package:dartdoc/src/render/source_code_renderer.dart';
2930
import 'package:dartdoc/src/source_linker.dart';
3031
import 'package:dartdoc/src/tuple.dart';
3132
import 'package:dartdoc/src/utils.dart';
@@ -929,6 +930,9 @@ abstract class ModelElement extends Canonicalization
929930
ParameterRenderer get _parameterRendererDetailed =>
930931
packageGraph.rendererFactory.parameterRendererDetailed;
931932

933+
SourceCodeRenderer get _sourceCodeRenderer =>
934+
packageGraph.rendererFactory.sourceCodeRenderer;
935+
932936
String get linkedParams => _parameterRenderer.renderLinkedParams(parameters);
933937

934938
String get linkedParamsLines =>
@@ -1090,6 +1094,13 @@ abstract class ModelElement extends Canonicalization
10901094
return __documentation;
10911095
}
10921096

1097+
String _sourceCode;
1098+
1099+
@override
1100+
String get sourceCode {
1101+
return _sourceCode ??= _sourceCodeRenderer.renderSourceCode(super.sourceCode);
1102+
}
1103+
10931104
bool canOverride() =>
10941105
element is ClassMemberElement || element is PropertyAccessorElement;
10951106

lib/src/model/model_node.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ class ModelNode {
6363
var start = _sourceOffset - (_sourceOffset - i);
6464
var source = contents.substring(start, _sourceEnd);
6565

66-
source = const HtmlEscape().convert(source);
6766
source = model_utils.stripIndentFromSource(source);
6867
source = model_utils.stripDartdocCommentsFromSource(source);
6968

lib/src/render/renderer_factory.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:dartdoc/src/render/enum_field_renderer.dart';
1010
import 'package:dartdoc/src/render/feature_renderer.dart';
1111
import 'package:dartdoc/src/render/model_element_renderer.dart';
1212
import 'package:dartdoc/src/render/parameter_renderer.dart';
13+
import 'package:dartdoc/src/render/source_code_renderer.dart';
1314
import 'package:dartdoc/src/render/template_renderer.dart';
1415
import 'package:dartdoc/src/render/type_parameters_renderer.dart';
1516
import 'package:dartdoc/src/render/typedef_renderer.dart';
@@ -50,6 +51,8 @@ abstract class RendererFactory {
5051

5152
ParameterRenderer get parameterRendererDetailed;
5253

54+
SourceCodeRenderer get sourceCodeRenderer;
55+
5356
TypeParametersRenderer get typeParametersRenderer;
5457

5558
TypedefRenderer get typedefRenderer;
@@ -102,6 +105,9 @@ class HtmlRenderFactory extends RendererFactory {
102105

103106
@override
104107
FeatureRenderer get featureRenderer => FeatureRendererHtml();
108+
109+
@override
110+
SourceCodeRenderer get sourceCodeRenderer => SourceCodeRendererHtml();
105111
}
106112

107113
class MdRenderFactory extends RendererFactory {
@@ -152,4 +158,7 @@ class MdRenderFactory extends RendererFactory {
152158

153159
@override
154160
FeatureRenderer get featureRenderer => FeatureRendererMd();
161+
162+
@override
163+
SourceCodeRenderer get sourceCodeRenderer => SourceCodeRendererNoop();
155164
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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 'dart:convert';
6+
7+
abstract class SourceCodeRenderer {
8+
String renderSourceCode(String source);
9+
}
10+
11+
class SourceCodeRendererNoop extends SourceCodeRenderer {
12+
@override
13+
String renderSourceCode(String source) => source;
14+
}
15+
16+
class SourceCodeRendererHtml extends SourceCodeRenderer {
17+
@override
18+
String renderSourceCode(String source) {
19+
return (const HtmlEscape()).convert(source);
20+
}
21+
}

tool/grind.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,9 +562,26 @@ Future<void> buildTestPackageDocs() async {
562562
testPackageDocsDir.absolute.path, Directory.current.path);
563563
}
564564

565+
@Task('Build generated test package docs in Markdown (with inherited docs and source code)')
566+
@Depends(clean)
567+
Future<void> buildTestPackageDocsMd() async {
568+
await _buildTestPackageDocs(
569+
testPackageDocsDir.absolute.path, Directory.current.path, params: ['--format', 'md']);
570+
}
571+
565572
@Task('Serve test package docs locally with dhttpd on port 8002')
566573
@Depends(buildTestPackageDocs)
567574
Future<void> serveTestPackageDocs() async {
575+
await startTestPackageDocsServer();
576+
}
577+
578+
@Task('Serve test package docs (in Markdown) locally with dhttpd on port 8002')
579+
@Depends(buildTestPackageDocsMd)
580+
Future<void> serveTestPackageDocsMd() async {
581+
await startTestPackageDocsServer();
582+
}
583+
584+
Future<void> startTestPackageDocsServer() async {
568585
log('launching dhttpd on port 8002 for SDK');
569586
var launcher = SubprocessLauncher('serve-test-package-docs');
570587
await launcher.runStreamed(sdkBin('pub'), [

0 commit comments

Comments
 (0)