| // 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:analyzer/dart/ast/ast.dart'; |
| |
| /// Return the raw text of the given comment node. |
| String? getCommentNodeRawText(Comment? node) { |
| if (node == null) return null; |
| |
| var tokens = node.tokens; |
| var count = tokens.length; |
| if (count == 1) { |
| // The comment might be a block-style doc comment with embedded end-of-line |
| // markers. |
| return tokens[0].lexeme.replaceAll('\r\n', '\n'); |
| } |
| |
| var buffer = StringBuffer(); |
| for (var i = 0; i < count; i++) { |
| if (i > 0) { |
| buffer.write('\n'); |
| } |
| buffer.write(tokens[i].lexeme); |
| } |
| return buffer.toString(); |
| } |
| |
| /// Return the plain text from the given DartDoc [rawText], without delimiters. |
| String? getDartDocPlainText(String? rawText) { |
| if (rawText == null) return null; |
| |
| // Remove /** */. |
| var isBlock = false; |
| if (rawText.startsWith('/**')) { |
| isBlock = true; |
| rawText = rawText.substring(3); |
| if (rawText.endsWith('*/')) { |
| rawText = rawText.substring(0, rawText.length - 2); |
| } |
| } |
| rawText = rawText.trim(); |
| |
| // Remove leading '* ' and '/// '. |
| var result = StringBuffer(); |
| var lines = rawText.split('\n'); |
| for (var line in lines) { |
| line = line.trim(); |
| if (isBlock && line.startsWith('*')) { |
| line = line.substring(1); |
| if (line.startsWith(' ')) { |
| line = line.substring(1); |
| } |
| } else if (!isBlock && line.startsWith('///')) { |
| line = line.substring(3); |
| if (line.startsWith(' ')) { |
| line = line.substring(1); |
| } |
| } |
| if (result.isNotEmpty) { |
| result.write('\n'); |
| } |
| result.write(line); |
| } |
| |
| return result.toString(); |
| } |
| |
| /// Return the DartDoc summary, i.e. the portion before the first empty line. |
| String? getDartDocSummary(String? completeText) { |
| if (completeText == null) { |
| return null; |
| } |
| var lines = completeText.split('\n'); |
| int count = lines.length; |
| if (count == 1) { |
| return lines[0]; |
| } |
| var result = StringBuffer(); |
| for (var i = 0; i < count; i++) { |
| var line = lines[i]; |
| if (i > 0) { |
| if (line.isEmpty) { |
| return result.toString(); |
| } |
| result.write('\n'); |
| } |
| result.write(line); |
| } |
| return result.toString(); |
| } |