Skip to content

Commit

Permalink
Close #16: preserve white spaces in front of each line if preserveSpa…
Browse files Browse the repository at this point in the history
…ce specified
  • Loading branch information
tomyeh committed Sep 5, 2024
1 parent 19a2afe commit eb269be
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 12 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

* List with checkbox
* Add the data-line attribute to indicate which line the checkbox is in the markdown.
* Support the `preserveSpace` option to work with WYSIWYG editors easier.
* `TableSyntax`
* `escapeFoward` introduced for skiping pipe characters (`|`) that shall not be considered as a column separator.
* `processCellContent` introduced for pre-processing cell's content
* Link enhancements:
* `LinkMapper` introduced to allow app for mapping to *application-specific* links.
Expand Down
28 changes: 17 additions & 11 deletions lib/src/html_renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -41,17 +41,23 @@ String markdownToHtml(
preserveSpace: preserveSpace,
);

if (inlineOnly) return renderToHtml(document.parseInline(markdown));
if (inlineOnly) {
return renderToHtml(document.parseInline(markdown),
preserveSpace: preserveSpace);
}

final nodes = document.parse(markdown);

return '${renderToHtml(nodes, enableTagfilter: enableTagfilter)}\n';
return '${renderToHtml(nodes, enableTagfilter: enableTagfilter,
preserveSpace: preserveSpace)}\n';
}

/// Renders [nodes] to HTML.
String renderToHtml(List<Node> nodes, {bool enableTagfilter = false}) =>
String renderToHtml(List<Node> nodes, {bool enableTagfilter = false,
bool preserveSpace = false}) =>
HtmlRenderer(
enableTagfilter: enableTagfilter,
preserveSpace: preserveSpace,
).render(nodes);

const _blockTags = {
Expand Down Expand Up @@ -106,10 +112,13 @@ class CondensedHtmlRenderer implements NodeVisitor {
final _elementStack = <Element>[];
String? _lastVisitedTag;
final bool _tagfilterEnabled;
final bool _spacePreserved;

CondensedHtmlRenderer({
bool enableTagfilter = false,
}) : _tagfilterEnabled = enableTagfilter;
bool preserveSpace = false,
}) : _tagfilterEnabled = enableTagfilter,
_spacePreserved = preserveSpace;

String render(List<Node> nodes) {
buffer = StringBuffer();
Expand All @@ -131,7 +140,7 @@ class CondensedHtmlRenderer implements NodeVisitor {
}
if (const {'br', 'p', 'li'}.contains(_lastVisitedTag)) {
final lines = LineSplitter.split(content);
content = !_trimLeft || content.contains('<pre>')
content = _spacePreserved || content.contains('<pre>')
? lines.join('\n')
: lines.map((line) => line.trimLeft()).join('\n');
if (text.textContent.endsWith('\n')) {
Expand Down Expand Up @@ -164,9 +173,6 @@ class CondensedHtmlRenderer implements NodeVisitor {
}
}

/// Whether to trim left if it is contained in `p` or `li`
bool get _trimLeft => true;

void _writeOpenTagStart(Element element) {
buffer.write('<${element.tag}');

Expand Down Expand Up @@ -254,7 +260,7 @@ class CondensedHtmlRenderer implements NodeVisitor {

/// Translates a parsed AST to HTML.
class HtmlRenderer extends CondensedHtmlRenderer {
HtmlRenderer({super.enableTagfilter = false});
HtmlRenderer({super.enableTagfilter = false, super.preserveSpace = false});

@override
bool _isBlockTag(String? tag)
Expand All @@ -268,8 +274,8 @@ class HtmlRenderer extends CondensedHtmlRenderer {
///
/// For better, you can use just [EmptyBlockSyntax] and [ParagraphSyntax].
class TextRenderer extends HtmlRenderer {
@override
bool get _trimLeft => false; //preserve the spaces
TextRenderer(): super(preserveSpace: true);

@override
void _writeOpenTagStart(Element element) {
if (_lastVisitedTag == 'p' && buffer.isNotEmpty) buffer.writeln();
Expand Down
21 changes: 21 additions & 0 deletions test/markdown_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,27 @@ Line 2
</ul>
<p>
Line 2</p>
''');

validate(
'Space in front of line',
'''
Line 1
* Item 1
* Item 2
Line 2
''', '''
<p> Line 1
</p>
<ul>
<li>Item 1</li>
<li> Item 2</li>
</ul>
<p>
Line 2</p>
''');

});
Expand Down

0 comments on commit eb269be

Please sign in to comment.