blob: d849f7a5e792747fe14895298f4293ea411277d5 [file] [edit]
// 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/render/documentation_renderer.dart';
import 'package:dartdoc/src/warnings.dart';
import 'package:markdown/markdown.dart' as md;
class Documentation {
final Warnable _warnable;
Documentation.forElement(this._warnable);
/// The documentation text, rendered with the appropriate
/// [DocumentationRenderer].
String? _asHtml;
/// The first sentence of the documentation text, rendered with the
/// appropriate [DocumentationRenderer].
String? _asOneLiner;
bool _fullTextRendered = false;
String get asHtml {
if (_fullTextRendered) {
return _asHtml!;
}
_renderDocumentation(storeFullText: true);
return _asHtml!;
}
String get asOneLiner {
if (_asOneLiner != null) {
return _asOneLiner!;
}
_renderDocumentation(storeFullText: _warnable.isCanonical);
return _asOneLiner!;
}
void _renderDocumentation({required bool storeFullText}) {
if (storeFullText && _fullTextRendered) return;
if (!storeFullText && _asOneLiner != null) return;
var parseResult = _parseDocumentation(processFullText: storeFullText);
var renderResult = _renderer.render(parseResult,
processFullDocs: storeFullText,
sanitizeHtml: _warnable.config.sanitizeHtml);
if (storeFullText) {
_asHtml = renderResult.asHtml;
_fullTextRendered = true;
}
_asOneLiner = renderResult.asOneLiner;
}
List<md.Node> _parseDocumentation({required bool processFullText}) {
final text = _warnable.documentation;
if (text == null || text.isEmpty) {
return const [];
}
showWarningsForGenericsOutsideSquareBracketsBlocks(text, _warnable);
var document = MarkdownDocument.withElementLinkResolver(_warnable);
return document.parseMarkdownText(text, processFullText: processFullText);
}
DocumentationRenderer get _renderer => const DocumentationRendererHtml();
}