From acbd44762e46a73b86a5fa2a3f9d748d49ad57aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Thu, 2 Dec 2021 18:47:27 +0100 Subject: [PATCH] WIP: code validity check --- naucse_render/markdown.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/naucse_render/markdown.py b/naucse_render/markdown.py index f12723b..835696b 100644 --- a/naucse_render/markdown.py +++ b/naucse_render/markdown.py @@ -1,3 +1,5 @@ +import logging +import traceback from textwrap import dedent import re @@ -147,6 +149,13 @@ def image(self, src, title, text): return super().image(self._convert_url(src), title, text) +def check_python_code_validity(code: str, execute=False): + compiled = compile(code, "fake-file", "exec") + + if execute: + exec(compiled) + + class Markdown(mistune.Markdown): def output_admonition(self): name = self.token['name'] @@ -158,6 +167,19 @@ def output_admonition(self): body += self.tok() return self.renderer.admonition(name, body) + def output_code(self): + text = self.token['text'] + lang = self.token['lang'] + + if lang.lower() == "python": + try: + check_python_code_validity(text, execute=True) + except BaseException: + logging.warning(f"Code {text} raises an error when compiled/executed: " + f"{traceback.format_exc()}") + + return self.renderer.block_code(text, lang) + def output_deflist_term(self): items = [['term', self.renderer.placeholder()]] while True: