Парсер markdown на Питоне

Пригодный парсер разметки markdown — Marko. Распарсить — это, само собой, не самоцель, дальше его надо было оттранслировать в HTML. Для этого есть готовый класс HTMLRenderer, и остаётся только переопределить некоторые детали его поведения (ну вот, а говорили что ООП не нужно). В примере ниже на параграфы навешивается свой css-класс.

class MyHtmlRenderer(marko.HTMLRenderer):
  def render_paragraph(self, element):
    text = self.render_children(element)
    return f'<p class="para">{text}</p>'

class MyTestCase(unittest.TestCase):
  def test_1(self):
    translate = marko.Markdown(renderer=MyHtmlRenderer)
    markdown = 'hello'
    actual = translate(markdown)
    self.assertEqual(
      '<p class="para">hello</p>',
      actual)

Кстати, дизайн там такой себе — сплошные манипуляции со строками; в мире джавы это была бы дичь.

Ну и куда без callable головного мозга. Чтобы получить AST-дерево, делаем так:

Markdown().parse('hello')

А чтобы оттранслировать в другой язык — делаем нечто совершенно другое:

Markdown()('hello')

Просто напоминаю, что когда ты ставишь точку, то редактор подсказывает варианты, а то что перед нами callable нужно заранее знать. Да и как ты догадаешься что именно делает каллабл — парсит или транслирует? В случае с вызовом функции такой проблемы нет. Да ты даже помощь по методу посмотреть не сможешь 🤦. Зачем форсить такие неочевидности — совершенно непонятно; какое-то безумие. Но работает.