| // 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]); | |
| } | |
| } |