mdformat icon indicating copy to clipboard operation
mdformat copied to clipboard

Improve line splitting when linebreak is forced

Open mdeweerd opened this issue 3 years ago • 4 comments

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

mdeweerd avatar May 28 '22 22:05 mdeweerd

Thanks for the issue! A PR is welcome to fix this.

hukkin avatar May 30 '22 08:05 hukkin

I hear you, but it"s not that obvious where the length of a line is managed.

mdeweerd avatar May 30 '22 16:05 mdeweerd

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)
    ...

lofidevops avatar Jan 04 '23 21:01 lofidevops

This could be caused by bad detection in makdown-it-py, see https://github.com/executablebooks/markdown-it-py/issues/172 for an example.

lofidevops avatar Mar 01 '23 19:03 lofidevops