diff options
-rw-r--r-- | pygments/lexers/_mapping.py | 2 | ||||
-rw-r--r-- | pygments/lexers/compiled.py | 100 | ||||
-rw-r--r-- | tests/examplefiles/example.gs | 106 | ||||
-rw-r--r-- | tests/examplefiles/example.gst | 7 |
4 files changed, 211 insertions, 4 deletions
diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py index 7bb462b4..770406ca 100644 --- a/pygments/lexers/_mapping.py +++ b/pygments/lexers/_mapping.py @@ -95,6 +95,8 @@ LEXERS = { 'GnuplotLexer': ('pygments.lexers.other', 'Gnuplot', ('gnuplot',), ('*.plot', '*.plt'), ('text/x-gnuplot',)), 'GoLexer': ('pygments.lexers.compiled', 'Go', ('go',), ('*.go',), ('text/x-gosrc',)), 'GoodDataCLLexer': ('pygments.lexers.other', 'GoodData-CL', ('gooddata-cl',), ('*.gdc',), ('text/x-gooddata-cl',)), + 'GosuLexer': ('pygments.lexers.compiled', 'Gosu', ('gosu',), ('*.gs', '*.gsx', '*.gsp'), ('text/x-gosu',)), + 'GosuTemplateLexer': ('pygments.lexers.compiled', 'Gosu Template', ('gst',), ('*.gst',), ('text/x-gosu-template',)), 'GroffLexer': ('pygments.lexers.text', 'Groff', ('groff', 'nroff', 'man'), ('*.[1234567]', '*.man'), ('application/x-troff', 'text/troff')), 'GroovyLexer': ('pygments.lexers.agile', 'Groovy', ('groovy',), ('*.groovy',), ('text/x-groovy',)), 'HamlLexer': ('pygments.lexers.web', 'Haml', ('haml', 'HAML'), ('*.haml',), ('text/x-haml',)), diff --git a/pygments/lexers/compiled.py b/pygments/lexers/compiled.py index 439a36eb..469f5743 100644 --- a/pygments/lexers/compiled.py +++ b/pygments/lexers/compiled.py @@ -26,7 +26,11 @@ __all__ = ['CLexer', 'CppLexer', 'DLexer', 'DelphiLexer', 'ECLexer', 'JavaLexer' 'ScalaLexer', 'DylanLexer', 'OcamlLexer', 'ObjectiveCLexer', 'FortranLexer', 'GLShaderLexer', 'PrologLexer', 'CythonLexer', 'ValaLexer', 'OocLexer', 'GoLexer', 'FelixLexer', 'AdaLexer', +<<<<<<< local + 'Modula2Lexer', 'BlitzMaxLexer', 'GosuLexer', 'GosuTemplateLexer'] +======= 'Modula2Lexer', 'BlitzMaxLexer', 'NimrodLexer'] +>>>>>>> other class CLexer(RegexLexer): @@ -2647,10 +2651,9 @@ class BlitzMaxLexer(RegexLexer): ], } - class NimrodLexer(RegexLexer): """ - For `Nimrod <http://nimrod-code.org/>`_ source code. + For `Nimrod `_ source code. *New in Pygments 1.5.* """ @@ -2741,8 +2744,7 @@ class NimrodLexer(RegexLexer): (r".", String.Char) ], 'strings': [ - (r'(?<!\$)\$(\d+|#|\w+)+', String.Interpol), - (r'[^\\\'"\$\n]+', String), + (r'(? (r'[^\\\'"\$\n]+', String), # quotes, dollars and backslashes must be parsed one at a time (r'[\'"\\]', String), # unhandled string formatting sign @@ -2787,3 +2789,93 @@ class NimrodLexer(RegexLexer): (r'', Text, '#pop') ], } + +class GosuLexer(RegexLexer): + """ + For `Gosu `_ source code. + """ + + name = 'Gosu' + aliases = ['gosu'] + filenames = ['*.gs', '*.gsx', '*.gsp', '*.vark'] + mimetypes = ['text/x-gosu'] + + flags = re.MULTILINE | re.DOTALL + + #: optional Comment or Whitespace + _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+' + + tokens = { + 'root': [ + # method names + (r'^(\s*(?:[a-zA-Z_][a-zA-Z0-9_\.\[\]]*\s+)+?)' # modifiers etc. + r'([a-zA-Z_][a-zA-Z0-9_]*)' # method name + r'(\s*)(\()', # signature start + bygroups(using(this), Name.Function, Text, Operator)), + (r'[^\S\n]+', Text), + (r'//.*?\n', Comment.Single), + (r'/\*.*?\*/', Comment.Multiline), + (r'@[a-zA-Z_][a-zA-Z0-9_\.]*', Name.Decorator), + (r'(in|as|typeof|statictypeof|typeis|typeas|if|else|foreach|' + r'for|index|while|do|continue|break|return|try|catch|finally|this|throw|' + r'new|switch|case|default|eval|super|outer|classpath|using)\b', + Keyword), + (r'(var|delegate|construct|function|private|internal|protected|public|' + r'abstract|override|final|static|extends|transient|implements|represents|' + r'readonly)\b', Keyword.Declaration), + (r'(property\s+)(get|set|)', Keyword.Declaration), + (r'(boolean|byte|char|double|float|int|long|short|void|block)\b', + Keyword.Type), + (r'(package)(\s+)', bygroups(Keyword.Namespace, Text)), + (r'(true|false|null|NaN|Infinity)\b', Keyword.Constant), + (r'(class|interface|enhancement|enum)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)', bygroups(Keyword.Declaration, Text, Name.Class)), + (r'(uses)(\s+)([a-zA-Z0-9_.]+\*?)', bygroups(Keyword.Namespace, Text, Name.Namespace)), + (r'"', String, 'string'), + (r'(\??[\.#])([a-zA-Z_][a-zA-Z0-9_]*)', bygroups(Operator, Name.Attribute)), + (r'(:)([a-zA-Z_][a-zA-Z0-9_]*)', bygroups(Operator, Name.Attribute)), + (r'[a-zA-Z_\$][a-zA-Z0-9_]*', Name), + (r'and|or|not|[\\~\^\*!%&\[\]\(\)\{\}<>\|+=:;,./?-]', Operator), + (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float), + (r'[0-9]+', Number.Integer), + (r'\n', Text) + ], + 'templateText': [ + (r'(\\<)|(\\\$)', String), + (r'(<%@\s+)(extends|params)', bygroups(Operator, Name.Decorator), 'stringTemplate'), + (r'<%!--.*?--%>', Comment.Multiline), + (r'(<%)|(<%=)', Operator, 'stringTemplate'), + (r'\$\{', Operator, 'stringTemplateShorthand'), + (r'.', String) + ], + 'string': [ + (r'"', String, '#pop'), + include('templateText') + ], + 'stringTemplate': [ + (r'"', String, 'string'), + (r'%>', Operator, '#pop'), + include('root') + ], + 'stringTemplateShorthand': [ + (r'"', String, 'string'), + (r'\{', Operator, 'stringTemplateShorthand'), + (r'\}', Operator, '#pop'), + include('root') + ], + } + +class GosuTemplateLexer(Lexer): + """ + For `Gosu `_ templates. + """ + + name = 'Gosu Template' + aliases = ['gst'] + filenames = ['*.gst'] + mimetypes = ['text/x-gosu-template'] + lexer = GosuLexer() + + def get_tokens_unprocessed(self, text): + stack = ['templateText'] + for item in self.lexer.get_tokens_unprocessed(text, stack): + yield item
\ No newline at end of file diff --git a/tests/examplefiles/example.gs b/tests/examplefiles/example.gs new file mode 100644 index 00000000..eb8372d6 --- /dev/null +++ b/tests/examplefiles/example.gs @@ -0,0 +1,106 @@ +package example + +uses java.util.* + +uses java.io.File + +class Person extends Contact implements IEmailable { + + var _name : String + var _age : Integer as Age + var _relationship : Relationship as readonly RelationshipOfPerson + + delegate _emailHelper represents IEmailable + + enum Relationship { + FRIEND, + FAMILY, + BUSINESS_CONTACT + } + + // Map of names to people + static var ALL_PEOPLE = new HashMap<String, Person>() + + /* Constructs a new Person */ + construct( name : String, age : Integer, relationship : Relationship ) { + _name = name + _age = age + _relationship = relationship + _emailHelper = new EmailHelper( this ) + } + + property get Name():String{ + return _name + } + + property set Name(name : String){ + _name = name + } + + /* Implement IEmailable#getEmailName() */ + override function getEmailName():String{ + return Name + } + + function incrementAge() { + _age++ + } + + @Deprecated + function printPersonInfo() { + print( "Person { Name : ${Name}, Age : ${Age}, Relationship : ${RelationshipOfPerson} }" ) + } + + static function addPerson(p : Person){ + if(ALL_PEOPLE.containsKey(p?.Name)) { + throw new IllegalArgumentException( "There is already someone named '${p.Name}'." ) + } + ALL_PEOPLE[p.Name] = p + } + + static function addAllPeople( contacts : List<Contact> ) { + for( contact in contacts ) { + if( contact typeis Person and not ALL_PEOPLE.containsKey( contact.Name )) { + addPerson( contact ) + } + } + } + + static function getAllPeopleOlderThanNOrderedByName( age : int ) { + var allPeople = ALL_PEOPLE.Values + + return allPeople.where( \ p -> p.Age > age ).orderBy( \ p -> p.Name ) + } + + static function loadPersonFromDB( id : Integer ) { + using( var conn = DBConnectionManager.getConnection(), + var stmt = conn.prepareStatement( "SELECT name, age, relationship FROM PEOPLE WHERE ID=?") ){ + + stmt.setInt( 0, 0 ) + var result = stmt.executeQuery() + if( result.next() ) { + addPerson( new Person( result.getString( "name" ), + result.getInt( "age" ), + Relationship.valueOf( result.getString( "relationship" ) ) ) ) + + } + } + } + + /* Loads in people from a CSV */ + static function loadFromFile( file : File ) { + file.eachLine( \ line -> { + if( line.HasContent ) { + addPerson( line.toPerson() ) + } + }) + } + + /* Save people to a CSV */ + static function saveToFile( file : File ) { + using( var writer = new FileWriter( file ) ) { + print( PersonCSVTemplate.renderToString( ALL_PEOPLE.Values ) ) + PersonCSVTemplate.render( writer, ALL_PEOPLE.Values ) + } + } +}
\ No newline at end of file diff --git a/tests/examplefiles/example.gst b/tests/examplefiles/example.gst new file mode 100644 index 00000000..55fedb4f --- /dev/null +++ b/tests/examplefiles/example.gst @@ -0,0 +1,7 @@ +<%!-- defined in example/PersonCSVTemplate.gst --%> + +<%@ params( users : Collection <User> ) %> + +<% for( user in users ) { %> + +${user.LastName}, ${user.FirstName}, ${user.Department} <% } %>
\ No newline at end of file |