diff options
Diffstat (limited to 'asciidoc/message.py')
-rw-r--r-- | asciidoc/message.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/asciidoc/message.py b/asciidoc/message.py new file mode 100644 index 0000000..46d4998 --- /dev/null +++ b/asciidoc/message.py @@ -0,0 +1,77 @@ +import os +import sys + +from .exceptions import EAsciiDoc + + +class Message: + """ + Message functions. + """ + PROG = 'asciidoc' + + def __init__(self, application_caller, document, config, reader): + # Set to True or False to globally override line numbers method + # argument. Has no effect when set to None. + self.linenos = None + self.messages = [] + self.prev_msg = '' + self.application_caller = application_caller + self.document = document + self.config = config + self.reader = reader + + def set_caller(self, application_caller): + self.application_caller = application_caller + + @staticmethod + def stdout(msg): + print(msg) + + def stderr(self, msg=''): + if msg == self.prev_msg: # Suppress repeated messages. + return + self.messages.append(msg) + if self.application_caller == '__main__': + sys.stderr.write('%s: %s%s' % (Message.PROG, msg, os.linesep)) + self.prev_msg = msg + + def verbose(self, msg, linenos=True): + if self.config.verbose: + msg = self.format(msg, linenos=linenos) + self.stderr(msg) + + def warning(self, msg, linenos=True, offset=0): + msg = self.format(msg, 'WARNING: ', linenos, offset=offset) + self.document.has_warnings = True + self.stderr(msg) + + def deprecated(self, msg, linenos=True): + msg = self.format(msg, 'DEPRECATED: ', linenos) + self.stderr(msg) + + def format(self, msg, prefix='', linenos=True, cursor=None, offset=0): + """Return formatted message string.""" + if self.linenos is not False and \ + ((linenos or self.linenos) and self.reader.cursor): + if cursor is None: + cursor = self.reader.cursor + prefix += '%s: line %d: ' % (os.path.basename(cursor[0]), cursor[1]+offset) + return prefix + msg + + def error(self, msg, cursor=None, halt=False): + """ + Report fatal error. + If halt=True raise EAsciiDoc exception. + If halt=False don't exit application, continue in the hope of reporting + all fatal errors finishing with a non-zero exit code. + """ + if halt: + raise EAsciiDoc(self.format(msg, linenos=False, cursor=cursor)) + else: + msg = self.format(msg, 'ERROR: ', cursor=cursor) + self.stderr(msg) + self.document.has_errors = True + + def unsafe(self, msg): + self.error('unsafe: '+msg) |