Пригодный парсер разметки 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 нужно заранее знать. Да и как ты догадаешься что именно делает каллабл — парсит или транслирует? В случае с вызовом функции такой проблемы нет. Да ты даже помощь по методу посмотреть не сможешь 🤦. Зачем форсить такие неочевидности — совершенно непонятно; какое-то безумие. Но работает.
2024.05.18 in python