diff --git a/manual/template_lang.rst b/manual/template_lang.rst index 216f2e87c9..3f7d286136 100644 --- a/manual/template_lang.rst +++ b/manual/template_lang.rst @@ -195,7 +195,8 @@ The syntax of the language is shown by the following grammar. For a discussion o function ::= identifier '(' expression [ ',' expression ]* ')' compare ::= expression compare_op expression compare_op ::= '==' | '!=' | '>=' | '>' | '<=' | '<' | '==#' | '!=#' | '>=#' | '>#' | '<=#' | '<#' - if_expression ::= 'if' expression 'then' expression_list ['else' statement] 'fi' + if_expression ::= 'if' expression 'then' expression_list [elif_expression] ['else' expression_list] 'fi' + elif_expression ::= 'elif' expression 'then' expression_list elif_expression | '' assignment ::= identifier '=' expression constant ::= " string " | ' string ' | number identifier ::= sequence of letters or ``_`` characters diff --git a/src/calibre/gui2/dialogs/template_dialog.py b/src/calibre/gui2/dialogs/template_dialog.py index 0712369e9e..239a986a6e 100644 --- a/src/calibre/gui2/dialogs/template_dialog.py +++ b/src/calibre/gui2/dialogs/template_dialog.py @@ -44,7 +44,7 @@ class TemplateHighlighter(QSyntaxHighlighter): Formats = {} BN_FACTOR = 1000 - KEYWORDS = ["program", 'if', 'then', 'else', 'fi'] + KEYWORDS = ["program", 'if', 'then', 'else', 'elif', 'fi'] def __init__(self, parent=None): super(TemplateHighlighter, self).__init__(parent) diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index 2407551d2b..fa36965db1 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -233,6 +233,13 @@ class _Parser(object): except: return False + def token_is_elif(self): + try: + token = self.prog[self.lex_pos] + return token[1] == 'elif' and token[0] == self.LEX_KEYWORD + except: + return False + def token_is_fi(self): try: token = self.prog[self.lex_pos] @@ -282,6 +289,8 @@ class _Parser(object): self.error(_("Missing 'then' in if statement")) self.consume() then_part = self.expression_list() + if self.token_is_elif(): + return IfNode(condition, then_part, [self.if_expression(),]) if self.token_is_else(): self.consume() else_part = self.expression_list() @@ -609,7 +618,7 @@ class TemplateFormatter(string.Formatter): lex_scanner = re.Scanner([ (r'(==#|!=#|<=#|<#|>=#|>#)', lambda x,t: (_Parser.LEX_NUMERIC_INFIX, t)), (r'(==|!=|<=|<|>=|>)', lambda x,t: (_Parser.LEX_STRING_INFIX, t)), # noqa - (r'(if|then|else|fi)\b', lambda x,t: (_Parser.LEX_KEYWORD, t)), # noqa + (r'(if|then|else|elif|fi)\b',lambda x,t: (_Parser.LEX_KEYWORD, t)), # noqa (r'[(),=;]', lambda x,t: (_Parser.LEX_OP, t)), # noqa (r'-?[\d\.]+', lambda x,t: (_Parser.LEX_CONST, t)), # noqa (r'\$', lambda x,t: (_Parser.LEX_ID, t)), # noqa