highlight.js icon indicating copy to clipboard operation
highlight.js copied to clipboard

(YAML) Multiline strings don't support empty lines

Open dmelikhov opened this issue 1 year ago • 3 comments
trafficstars

Describe the issue YAML multiline strings break on first empty line even when the rest of the block is properly indented.

Which language seems to have the issue? YAML

Are you using highlight or highlightAuto? highlight

Sample Code to Reproduce

foo:
  bar: |
    still: a string

    not: anymore

Additional context I was able to workaround the issue by replacing this regex with

[\\|>]([1-9]?[+-])?[ ]*\\n+( +)[^ ][^\\n]*\\n+(\\2[^\\n]+\\n*)*

It's not perfect and still has some false positives/negatives but should cover more valid cases.

dmelikhov avatar Aug 09 '24 00:08 dmelikhov

YAML is the worst. :) What are the valid rules for multi-line strings anyways? Is there some chance we could do this better with our own parser rather than a super complex regex?

Did we just change the \n+ to \n*?

joshgoebel avatar Aug 09 '24 22:08 joshgoebel

The first thing that came to my mind after seeing the regex is this. :)

I don't have enough knowledge about the library's architecture, but I think it's not possible to properly detect multiline strings using a regex, as it knows nothing about the property's indentation that contains the multiline string.

@joshgoebel In the regex I mentioned \n is replaced by \n+ and \n? is replaced by \n*. But I can't give you any guarantees that it's better than the currently used one.

dmelikhov avatar Aug 09 '24 23:08 dmelikhov

i believe added a fix for this @joshgoebel pls 🙏🙏🙏 review #4111 (and other prs)

Dxuian avatar Sep 01 '24 10:09 Dxuian