diff --git a/beat/web/ui/templatetags/markup.py b/beat/web/ui/templatetags/markup.py index de62becf23d67e80ec54d22e3016058b3c36b6a4..aefaa3e58e26dc7195959bd1f31da6b16aa2e9a7 100644 --- a/beat/web/ui/templatetags/markup.py +++ b/beat/web/ui/templatetags/markup.py @@ -95,6 +95,64 @@ def markdown(value, arg=''): )) +def get_rst_errors(s, config): + """Catch errors and syntax warnings and returns them + """ + + import docutils.utils + import docutils.parsers + import docutils.frontend + + class SilentReporter(docutils.utils.Reporter): + """ + Silent reporter + + All warnings and errors will be stored and can be used subsequently + through the reporter instance + """ + + def __init__(self, *args, **kwargs): + self.messages = [] + docutils.utils.Reporter.__init__(self, *args, **kwargs) + + def system_message(self, level, message, *children, **kwargs): + self.messages.append((level, message, children, kwargs)) + + parser = docutils.parsers.rst.Parser() + + defaults = docutils.frontend.OptionParser().get_default_values() + for key, val in config.items(): setattr(defaults, key, val) + defaults.tab_width = 4 + defaults.pep_references = None + defaults.rfc_references = None + defaults.report_level = 1 #info + defaults.halt_level = 4 #severe + defaults.debug = 0 #don't debug + + reporter = SilentReporter( + None, + defaults.report_level, #info + defaults.halt_level, #severe + stream=defaults.warning_stream, + debug=defaults.debug, #no debug + encoding=defaults.error_encoding, + error_handler=defaults.error_encoding_error_handler, + ) + + document = docutils.utils.new_document(None, defaults) + document.reporter = reporter + + try: + parser.parse(s, document) + except AttributeError: + pass + except TypeError: + # Catch ``TypeError`` to avoid problems with local roles + # NOTE: Is this still necessary ? + pass + return reporter.messages + + @register.filter(is_safe=True) @stringfilter def restructuredtext(value, full=False): @@ -107,6 +165,7 @@ def restructuredtext(value, full=False): else: docutils_settings = getattr(settings, "RESTRUCTUREDTEXT_FILTER_SETTINGS", {}) parts = publish_parts(source=force_bytes(value), writer_name="html4css1", settings_overrides=docutils_settings) + #errors = get_rst_errors(value, docutils_settings) if full: return mark_safe(force_text(parts["html_body"])) #with h1 title else: