summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pygments/lexers/_mapping.py2
-rw-r--r--pygments/lexers/compiled.py100
-rw-r--r--tests/examplefiles/example.gs106
-rw-r--r--tests/examplefiles/example.gst7
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