mdformat
mdformat copied to clipboard
Improve line splitting when linebreak is forced
Context
The line split is not convienient when forcing a line break when running
mdformat --wrap 79 test.md
where test.md is
1. Lorem ipsum dolor sit amet, consectetur adipiscing\
elit. Aliquam nec odio bibendum lacus auctor auctor in non purus. Morbi dapibus mauris orci, a sollicitudin eros dapibus at. Suspendisse potenti. Phasellus tempor scelerisque nibh, vel condimentum felis sollicitudin vitae. Mauris consectetur ex quis elit laoreet congue. Proin rutrum turpis et efficitur dignissim. Sed aliquam sapien vitae rhoncus convallis. Nullam dictum erat suscipit justo eleifend tincidunt. Morbi mauris lectus, ullamcorper in accumsan non, commodo a sem.
because it becomes:
1. Lorem ipsum dolor sit amet, consectetur adipiscing\
elit. Aliquam nec odio
bibendum lacus auctor auctor in non purus. Morbi dapibus mauris orci, a
sollicitudin eros dapibus at. Suspendisse potenti. Phasellus tempor
scelerisque nibh, vel condimentum felis sollicitudin vitae. Mauris
consectetur ex quis elit laoreet congue. Proin rutrum turpis et efficitur
dignissim. Sed aliquam sapien vitae rhoncus convallis. Nullam dictum erat
suscipit justo eleifend tincidunt. Morbi mauris lectus, ullamcorper in
accumsan non, commodo a sem.
The new line after the forced line break seems to continue the line length count using the previous line.
Version info:
mdformat 0.7.13 (mdformat_frontmatter: 0.4.1, mdformat_gfm: 0.3.5, mdformat_tables: 0.4.1, mdformat_toc: 0.3.0)
Proposal
No response
Tasks and updates
No response
Thanks for the issue! A PR is welcome to fix this.
I hear you, but it"s not that obvious where the length of a line is managed.
This hack fixes test_wrap__hard_break which is currently skipped. I suspect a better solution is possible.
def paragraph(node: RenderTreeNode, context: RenderContext) -> str: # noqa: C901
inline_node = node.children[0]
text = inline_node.render(context)
lines = []
for line in text.split("\n"):
lines.append(_paragraph_line(line, context))
return "\n".join(lines)
def _paragraph_line(text: str, context: RenderContext) -> str:
if context.do_wrap:
wrap_mode = context.options["mdformat"]["wrap"]
if isinstance(wrap_mode, int):
wrap_mode -= context.env["indent_width"]
wrap_mode = max(1, wrap_mode)
text = _wrap(text, width=wrap_mode)
...
This could be caused by bad detection in makdown-it-py, see https://github.com/executablebooks/markdown-it-py/issues/172 for an example.