From e756acb31c54558ee16a0bbcda13f991b7d4f714 Mon Sep 17 00:00:00 2001 From: Aleksander Sadikov Date: Mon, 29 Feb 2016 03:24:17 +0100 Subject: General hint for noncapitalised variables added. --- prolog/common.py | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) (limited to 'prolog/common.py') diff --git a/prolog/common.py b/prolog/common.py index 4636936..65fc218 100644 --- a/prolog/common.py +++ b/prolog/common.py @@ -16,14 +16,38 @@ hint_type = { 'monkey_change': HintPopup('monkey_change', style='change'), 'monkey_insert': HintPopup('monkey_insert', style='insert'), 'monkey_remove': HintPopup('monkey_remove', style='remove'), + 'noncapitalised_variable': Hint('noncapitalised_variable'), + 'noncapitalised_variable_markup': HintPopup('noncapitalised_variable_markup'), } def hint(code, aux_code): - # Check program for syntax errors. - engine_id, output = prolog.engine.create(code=code) - if engine_id is not None: - prolog.engine.destroy(engine_id) - if 'error' in map(operator.itemgetter(0), output): - errors_msg = '\n'.join(['{}: {}'.format(m_type, m_text) for m_type, m_text in output]) - return [{'id': 'syntax_error', 'args': {'messages': errors_msg}}] + + try: + engine_id, output = prolog.engine.create(code=code+aux_code, timeout=1.0) + + # Check program for syntax errors. + if 'error' in map(operator.itemgetter(0), output): + errors_msg = '\n'.join(['{}: {}'.format(m_type, m_text) for m_type, m_text in output]) + return [{'id': 'syntax_error', 'args': {'messages': errors_msg}}] + + tokens = prolog.util.tokenize(code) + + # a,b,c are a bit dangerous when crossing the river exercise is being solved + # what about potential numbers after letters? + # this will have to be solved more generally + targets = [prolog.util.Token('NAME', 'x'), prolog.util.Token('NAME', 'y'), + prolog.util.Token('NAME', 'z'), prolog.util.Token('NAME', 'a'), + prolog.util.Token('NAME', 'b'), prolog.util.Token('NAME', 'c')] + marks = [(t.pos, t.pos + len(t.val)) for t in tokens if t in targets] + if marks: + return [{'id': 'noncapitalised_variable_markup', 'start': m[0], 'end': m[1]} for m in marks] + \ + [{'id': 'noncapitalised_variable'}] + + except socket.timeout as ex: + pass + + finally: + if engine_id is not None: + prolog.engine.destroy(engine_id) + return [] -- cgit v1.2.1