frostming / marko

A markdown parser with high extensibility.

Home Page:https://marko-py.readthedocs.io/en/latest/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Running Parser.parse_inline fails if Parser.parse was not invoked earlier

bluefish6 opened this issue · comments

Hi,

import marko
marko.parser.Parser().parse_inline('*vbdfgd* dsfjfio sio `dsfs fwer `')

leads to:

File ~/.../python3.10/site-packages/marko/inline.py:107, in LinkOrEmph.__new__(cls, match)
    106 def __new__(cls, match: "_Match") -> "LinkOrEmph":
--> 107     return parser.inline_elements[match.etype](match)

AttributeError: 'NoneType' object has no attribute 'inline_elements'

However:

import marko
marko.parser.Parser().parse('')
marko.parser.Parser().parse_inline('*vbdfgd* dsfjfio sio `dsfs fwer `')

runs properly:

[<marko.inline.Emphasis at 0x7f20ef920d60>,
 <marko.inline.RawText at 0x7f20f51c2140>,
 <marko.inline.CodeSpan at 0x7f20f51c0a90>]

After digging into code it becomes obvious as to why such behavior is observed - marko.inline.parser is indeed set to None (hence the error), but it's overwritten with the Parser() instance when Parser.parse() is run (hence it works in the second snippet above).
I'm not entirely sure why this initialization was moved from __init__ to this place, but it seems like it should be done in Parser.parse_inline() as well?

parse_inline() should never be called separately. It should be an internal implementation detail.

This does not seem to be mentioned in the documentation:

image

If this method is not supposed to be used publicly, maybe a good idea would be to rename it to _parse_inline?