| // Copyright (c) 2022, 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 '../ast.dart'; |
| import '../block_parser.dart'; |
| import '../patterns.dart'; |
| import 'block_syntax.dart'; |
| import 'setext_header_syntax.dart'; |
| |
| /// Parses paragraphs of regular text. |
| class ParagraphSyntax extends BlockSyntax { |
| @override |
| RegExp get pattern => dummyPattern; |
| |
| @override |
| bool canEndBlock(BlockParser parser) => false; |
| |
| const ParagraphSyntax(); |
| |
| @override |
| bool canParse(BlockParser parser) => true; |
| |
| @override |
| Node? parse(BlockParser parser) { |
| final childLines = <String>[parser.current.content]; |
| |
| parser.advance(); |
| var interruptedBySetextHeading = false; |
| // Eat until we hit something that ends a paragraph. |
| while (!parser.isDone) { |
| final syntax = interruptedBy(parser); |
| if (syntax != null) { |
| interruptedBySetextHeading = syntax is SetextHeaderSyntax; |
| break; |
| } |
| childLines.add(parser.current.content); |
| parser.advance(); |
| } |
| |
| // It is not a paragraph, but a setext heading. |
| if (interruptedBySetextHeading) { |
| return null; |
| } |
| |
| final contents = UnparsedContent(childLines.join('\n').trimRight()); |
| return Element('p', [contents]); |
| } |
| } |