From 93947af62a2629af18bb569bc11fe18be29fb671 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 19 May 2013 10:09:06 +0200 Subject: Rexx lexer: add changelog entry and simplify analyse_text --- CHANGES | 1 + pygments/lexers/other.py | 49 +++++++++++++++++++--------------------------- tests/test_lexers_other.py | 1 + 3 files changed, 22 insertions(+), 29 deletions(-) diff --git a/CHANGES b/CHANGES index 3cad33ea..f8794be7 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,7 @@ Version 1.7 * BlitzBasic (PR#197) * EBNF (PR#193) * Igor Pro (PR#172) + * Rexx (PR#199) - Pygments will now recognize "vim" modelines when guessing the lexer for a file based on content (PR#118). diff --git a/pygments/lexers/other.py b/pygments/lexers/other.py index ed31b218..10598fb4 100644 --- a/pygments/lexers/other.py +++ b/pygments/lexers/other.py @@ -14,7 +14,7 @@ import re from pygments.lexer import RegexLexer, include, bygroups, using, \ this, combined, ExtendedRegexLexer from pygments.token import Error, Punctuation, Literal, Token, \ - Text, Comment, Operator, Keyword, Name, String, Number, Generic, Other, \ + Text, Comment, Operator, Keyword, Name, String, Number, Generic, \ Whitespace from pygments.util import get_bool_opt from pygments.lexers.web import HtmlLexer @@ -3691,7 +3691,8 @@ class RexxLexer(RegexLexer): (r"'", String, 'string_single'), (r'[0-9]+(\.[0-9]+)?(e[+-]?[0-9])?', Number), (r'([a-z_][a-z0-9_]*)(\s*)(:)(\s*)(procedure)\b', - bygroups(Name.Function, Whitespace, Operator, Whitespace, Keyword.Declaration)), + bygroups(Name.Function, Whitespace, Operator, Whitespace, + Keyword.Declaration)), (r'([a-z_][a-z0-9_]*)(\s*)(:)', bygroups(Name.Label, Whitespace, Operator)), include('function'), @@ -3740,14 +3741,15 @@ class RexxLexer(RegexLexer): ] } - _ADDRESS_COMMAND_PATTERN = r'^\s*address\s+command\b' - _ADDRESS_PATTERN = r'^\s*address\s+' - _DO_WHILE_PATTERN = r'^\s*do\s+while\b' - _IF_THEN_DO_PATTERN = r'^\s*if\b.+\bthen\s+do\s*$' - _PROCEDURE_PATTERN = r'^\s*([a-z_][a-z0-9_]*)(\s*)(:)(\s*)(procedure)\b' - _ELSE_DO_PATTERN = r'\belse\s+do\s*$' - _PARSE_ARG_PATTERN = r'^\s*parse\s+(upper\s+)?(arg|value)\b' - _PATTERNS_AND_WEIGHTS = ( + _c = lambda s: re.compile(s, re.MULTILINE) + _ADDRESS_COMMAND_PATTERN = _c(r'^\s*address\s+command\b') + _ADDRESS_PATTERN = _c(r'^\s*address\s+') + _DO_WHILE_PATTERN = _c(r'^\s*do\s+while\b') + _IF_THEN_DO_PATTERN = _c(r'^\s*if\b.+\bthen\s+do\s*$') + _PROCEDURE_PATTERN = _c(r'^\s*([a-z_][a-z0-9_]*)(\s*)(:)(\s*)(procedure)\b') + _ELSE_DO_PATTERN = _c(r'\belse\s+do\s*$') + _PARSE_ARG_PATTERN = _c(r'^\s*parse\s+(upper\s+)?(arg|value)\b') + PATTERNS_AND_WEIGHTS = ( (_ADDRESS_COMMAND_PATTERN, 0.2), (_ADDRESS_PATTERN, 0.05), (_DO_WHILE_PATTERN, 0.1), @@ -3757,31 +3759,20 @@ class RexxLexer(RegexLexer): (_PARSE_ARG_PATTERN, 0.2), ) - @staticmethod - def _analyse_text_for_weighted_patterns(text, patternsAndWeights): - result = 0.0 - lowerText = text.lower() - for pattern, weight in patternsAndWeights: - regex = re.compile(pattern, re.MULTILINE) - if regex.search(lowerText): - result += weight - return result - def analyse_text(text): """ - Check for inital comment. + Check for inital comment and patterns that distinguish Rexx from other + C-like languages. """ - result = 0.0 if re.search(r'/\*\**\s*rexx', text, re.IGNORECASE): # Header matches MVS Rexx requirements, this is certainly a Rexx # script. - result = 1.0 + return 1.0 elif text.startswith('/*'): # Header matches general Rexx requirements; the source code might # still be any language using C comments such as C++, C# or Java. - result = 0.01 - result += RexxLexer._analyse_text_for_weighted_patterns( - text, RexxLexer._PATTERNS_AND_WEIGHTS) - result = min(result, 1.0) - assert 0.0 <= result <= 1.0 - return result + lowerText = text.lower() + result = sum(weight + for (pattern, weight) in RexxLexer.PATTERNS_AND_WEIGHTS + if pattern.search(lowerText)) + 0.01 + return min(result, 1.0) diff --git a/tests/test_lexers_other.py b/tests/test_lexers_other.py index 44685d5e..d3cfa246 100644 --- a/tests/test_lexers_other.py +++ b/tests/test_lexers_other.py @@ -6,6 +6,7 @@ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ + import glob import os import unittest -- cgit v1.2.1