blob: 41c72b1eda377bc5055e427e31e31e9f8b0815cc [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:dartdoc/src/markdown_processor.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/render/documentation_renderer.dart';
import 'package:dartdoc/src/tuple.dart';
import 'package:markdown/markdown.dart' as md;
class Documentation {
final Canonicalization _element;
Documentation.forElement(this._element);
bool _hasExtendedDocs;
bool get hasExtendedDocs {
if (_hasExtendedDocs == null) {
_renderDocumentation(_element.isCanonical && _asHtml == null);
}
return _hasExtendedDocs;
}
String _asHtml;
String get asHtml {
if (_asHtml == null) {
assert(_asOneLiner == null || _element.isCanonical);
_renderDocumentation(true);
}
return _asHtml;
}
String _asOneLiner;
String get asOneLiner {
if (_asOneLiner == null) {
assert(_asHtml == null);
_renderDocumentation(_element.isCanonical);
}
return _asOneLiner;
}
List<ModelCommentReference> get commentRefs => _element.commentRefs;
void _renderDocumentation(bool processAllDocs) {
Tuple2<List<md.Node>, bool> parseResult =
_parseDocumentation(processAllDocs);
if (_hasExtendedDocs != null) {
assert(_hasExtendedDocs == parseResult.item2);
}
_hasExtendedDocs = parseResult.item2;
Tuple2<String, String> renderResult =
_renderer.render(parseResult.item1, processAllDocs);
if (processAllDocs) {
_asHtml = renderResult.item1;
}
if (_asOneLiner == null) {
_asOneLiner = renderResult.item2;
}
}
/// Returns a tuple of List<md.Node> and hasExtendedDocs
Tuple2<List<md.Node>, bool> _parseDocumentation(bool processFullDocs) {
if (!_element.hasDocumentation) {
return Tuple2([], false);
}
String text = _element.documentation;
showWarningsForGenericsOutsideSquareBracketsBlocks(text, _element);
MarkdownDocument document =
MarkdownDocument.withElementLinkResolver(_element, commentRefs);
return document.parseMarkdownText(text, processFullDocs);
}
DocumentationRenderer get _renderer =>
_element.packageGraph.rendererFactory.documentationRenderer;
}