ttscoff/mdless

Problem with codeblocks following lists

Opened this issue · 9 comments

If I add a list (it does not mind if it is numbered or not) and a code block just in the line after it, codeblock is not processed as such

version: mdless 2.1.42

Example file

- something
```
hello
```

As a bonus, if the code block contains an empty line at some point, mdless crashes:

Example files with empty line

- something
```

```

or

- something
```
hello

there
```

Example crash

#<Thread:0x00007f09490f2428 /home/myuser/.local/share/gem/ruby/gems/tty-spinner-0.9.3/lib/tty/spinner.rb:308 run> terminated with exception (report_on_exception is true):
/home/myuser/.local/share/gem/ruby/gems/mdless-2.1.42/lib/mdless/array.rb:5:in `longest_element': undefined method `last' for nil:NilClass (NoMethodError)

    group_by(&:size).max.last[0]
                        ^^^^^
        from /home/myuser/.local/share/gem/ruby/gems/mdless-2.1.42/lib/mdless/console.rb:69:in `hilite_code'
        from /home/myuser/.local/share/gem/ruby/gems/mdless-2.1.42/lib/mdless/console.rb:198:in `block_code'
        from /home/myuser/.local/share/gem/ruby/gems/mdless-2.1.42/lib/mdless/converter.rb:346:in `render'
        from /home/myuser/.local/share/gem/ruby/gems/mdless-2.1.42/lib/mdless/converter.rb:346:in `block (2 levels) in initialize'
        from /home/myuser/.local/share/gem/ruby/gems/tty-spinner-0.9.3/lib/tty/spinner.rb:225:in `execute_job'
        from /home/myuser/.local/share/gem/ruby/gems/tty-spinner-0.9.3/lib/tty/spinner.rb:308:in `block in run'
/home/myuser/.local/share/gem/ruby/gems/mdless-2.1.42/lib/mdless/array.rb:5:in `longest_element': undefined method `last' for nil:NilClass (NoMethodError)

    group_by(&:size).max.last[0]
                        ^^^^^
        from /home/myuser/.local/share/gem/ruby/gems/mdless-2.1.42/lib/mdless/console.rb:69:in `hilite_code'
        from /home/myuser/.local/share/gem/ruby/gems/mdless-2.1.42/lib/mdless/console.rb:198:in `block_code'
        from /home/myuser/.local/share/gem/ruby/gems/mdless-2.1.42/lib/mdless/converter.rb:346:in `render'
        from /home/myuser/.local/share/gem/ruby/gems/mdless-2.1.42/lib/mdless/converter.rb:346:in `block (2 levels) in initialize'
        from /home/myuser/.local/share/gem/ruby/gems/tty-spinner-0.9.3/lib/tty/spinner.rb:225:in `execute_job'
        from /home/myuser/.local/share/gem/ruby/gems/tty-spinner-0.9.3/lib/tty/spinner.rb:308:in `block in run'

Yeah, I discovered that the hard way :D

Anyway, other markdown tools work with that kind of syntax, which makes mdless not render properly markdown files that are written like that ...

But the scary thing is that mdless crashses on some conditions as explained above 😅

Example of that incorrect markdown rendering in github:

  • something
some code
  • other thing

I understand your point of view, but as a user, I want a tool I can use with files I did not produce. At least for me, it is the main use of mdless :)

However, the big concern is not that something is rendered incorrectly, but that the app crashes, and thus nothing is rendered

Here is how it looks when it does not render the code block properly, but the file is processed anyway:
image

And here is what happens when it crashes:
image

This is unfortunate as I get the same exact error with very little ability to understand why the parsing is broken.

mdless index.md
[⠋] Processing index.md...#<Thread:0x00000001249961a8 /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/tty-spinner-0.9.3/lib/tty/spinner.rb:308 run> terminated with exception (report_on_exception is true):
[⠙] Processing index.md.../usr/local/Cellar/mdless/2.1.42_1/libexec/gems/mdless-2.1.42/lib/mdless/array.rb:5:in `longest_element': undefined method `last' for nil (NoMethodError)

    group_by(&:size).max.last[0]
                        ^^^^^
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/mdless-2.1.42/lib/mdless/console.rb:69:in `hilite_code'
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/mdless-2.1.42/lib/mdless/console.rb:198:in `block_code'
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/mdless-2.1.42/lib/mdless/converter.rb:346:in `render'
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/mdless-2.1.42/lib/mdless/converter.rb:346:in `block (2 levels) in initialize'
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/tty-spinner-0.9.3/lib/tty/spinner.rb:225:in `execute_job'
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/tty-spinner-0.9.3/lib/tty/spinner.rb:308:in `block in run'
/usr/local/Cellar/mdless/2.1.42_1/libexec/gems/mdless-2.1.42/lib/mdless/array.rb:5:in `longest_element': undefined method `last' for nil (NoMethodError)

    group_by(&:size).max.last[0]
                        ^^^^^
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/mdless-2.1.42/lib/mdless/console.rb:69:in `hilite_code'
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/mdless-2.1.42/lib/mdless/console.rb:198:in `block_code'
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/mdless-2.1.42/lib/mdless/converter.rb:346:in `render'
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/mdless-2.1.42/lib/mdless/converter.rb:346:in `block (2 levels) in initialize'
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/tty-spinner-0.9.3/lib/tty/spinner.rb:225:in `execute_job'
	from /usr/local/Cellar/mdless/2.1.42_1/libexec/gems/tty-spinner-0.9.3/lib/tty/spinner.rb:308:in `block in run'

The markdown is GHFM.