Created
August 14, 2010 16:02
-
-
Save mckamey/524429 to your computer and use it in GitHub Desktop.
Pygments lexer support for JBST syntax
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<%@ Control Name="Foo.MyZebraList" Language="JavaScript" %> | |
<script type="text/javascript"> | |
/* private members ------------------------------------------ */ | |
/*int*/ function digits(/*int*/ n) { | |
return (n < 10) ? '0' + n : n; | |
} | |
/* public members ------------------------------------------- */ | |
// use the item index to alternate colors and highlight | |
/*string*/ this.zebraStripe = function(/*bool*/ selected, /*int*/ index, /*int*/ count) { | |
var css = [ "item" ]; | |
if (index % 2 === 0) { | |
css.push("item-alt"); | |
} | |
if (selected) { | |
css.push("item-selected"); | |
} | |
return css.join(" "); | |
}; | |
/*string*/ this.formatTime = function(/*Date*/ time) { | |
return time.getHours() + ':' + digits(time.getMinutes()) + ':' + digits(time.getSeconds()); | |
}; | |
</script> | |
<div class="example"> | |
<h2><%= this.data.title %> as of <%= this.formatTime(this.data.timestamp) %>!</h2> | |
<p><%= this.data.description %></p> | |
<ul class="items" jbst:visible="<%= this.data.children.length > 0 %>"> | |
<!-- anonymous inner template --> | |
<jbst:control data="<%= this.data.children %>"> | |
<!-- populate list item for each item of the parent's children property --> | |
<li class="<%= Foo.MyZebraList.zebraStripe(this.data.selected, this.index, this.count) %>"> | |
<%= this.data.label %> (<%= this.index+1 %> of <%= this.count %>) | |
</li> | |
</jbst:control> | |
</ul> | |
</div> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
pygments.lexers.jbst | |
~~~~~~~~~~~~~~~~~~~~~~ | |
Lexers for JBST markup. | |
:copyright: Copyright 2006-2010 by the Pygments team, see AUTHORS. | |
:license: BSD, see LICENSE for details. | |
""" | |
import re | |
from pygments.lexer import RegexLexer, DelegatingLexer, bygroups, using, this | |
from pygments.token import Punctuation, \ | |
Text, Comment, Operator, Keyword, Name, String, Number, Literal | |
from pygments.util import get_choice_opt | |
from pygments import unistring as uni | |
from pygments.lexers.web import HtmlLexer, JavascriptLexer | |
__all__ = ['JbstLexer'] | |
class JbstLexer(RegexLexer): | |
""" | |
Lexer for JsonML+BST markup with JavaScript code blocks. | |
http://jsonml.org/bst/ | |
""" | |
name = 'JBST' | |
aliases = ['jbst', 'JsonML+BST'] | |
filenames = ['*.jbst'] | |
mimetypes = ['text/x-jbst'] | |
flags = re.DOTALL | |
tokens = { | |
'root': [ | |
(r'(<%[@=#!:]?)(.*?)(%>)', bygroups(Name.Tag, JavascriptLexer, Name.Tag)), | |
(r'(<%\$)(.*?)(:)(.*?)(%>)', bygroups(Name.Tag, Name.Function, Punctuation, String, Name.Tag)), | |
(r'(<%--)(.*?)(--%>)', bygroups(Name.Tag, Comment.Multiline, Name.Tag)), | |
(r'(<script.*?>)(.*?)(</script>)', bygroups(using(HtmlLexer), | |
JavascriptLexer, | |
using(HtmlLexer))), | |
(r'(.+?)(?=<)', using(HtmlLexer)), | |
(r'.+', using(HtmlLexer)), | |
], | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<%@ Control Name="MyApp.MyJbstControl" Language="JavaScript" %> | |
<script type="text/javascript"> | |
/* initialization code block, executed only once as control is loaded */ | |
this.generateValue = function() { | |
return new Date().toString(); | |
}; | |
</script> | |
<%! | |
/* initialization code block, executed only once as control is loaded */ | |
/* alternate syntax to script block above */ | |
this.myInitTime = this.generateValue(); | |
%> | |
<% | |
/* data binding code block, executed each time as control is data bound */ | |
this.myBindTime = this.generateValue(); | |
%> | |
<%-- JBST Comment --%> | |
<span style="color:red"><%= this.myBindTime /* data binding expression */ %></span> | |
<span style="color:green"><%= this.myInitTime /* data binding expression */ %></span> | |
<!-- HTML Comment --> | |
<span style="color:blue"><%$ Resources: localizationKey %><%-- JBST globalization--%></span> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/pygments/lexers/web.py b/pygments/lexers/web.py | |
--- a/pygments/lexers/web.py | |
+++ b/pygments/lexers/web.py | |
@@ -24,7 +24,7 @@ | |
__all__ = ['HtmlLexer', 'XmlLexer', 'JavascriptLexer', 'CssLexer', | |
'PhpLexer', 'ActionScriptLexer', 'XsltLexer', 'ActionScript3Lexer', | |
'MxmlLexer', 'HaxeLexer', 'HamlLexer', 'SassLexer', 'ScssLexer', | |
- 'ObjectiveJLexer', 'CoffeeScriptLexer'] | |
+ 'ObjectiveJLexer', 'CoffeeScriptLexer', 'JbstLexer'] | |
class JavascriptLexer(RegexLexer): | |
@@ -1667,3 +1667,29 @@ | |
(r"'(\\\\|\\'|[^'])*'", String.Single), | |
] | |
} | |
+ | |
+class JbstLexer(RegexLexer): | |
+ """ | |
+ Lexer for JsonML+BST markup with JavaScript code blocks. | |
+ http://jsonml.org/bst/ | |
+ """ | |
+ | |
+ name = 'JBST' | |
+ aliases = ['jbst', 'JsonML+BST'] | |
+ filenames = ['*.jbst'] | |
+ mimetypes = ['text/x-jbst'] | |
+ | |
+ flags = re.DOTALL | |
+ | |
+ tokens = { | |
+ 'root': [ | |
+ (r'(<%[@=#!:]?)(.*?)(%>)', bygroups(Name.Tag, JavascriptLexer, Name.Tag)), | |
+ (r'(<%\$)(.*?)(:)(.*?)(%>)', bygroups(Name.Tag, Name.Function, Punctuation, String, Name.Tag)), | |
+ (r'(<%--)(.*?)(--%>)', bygroups(Name.Tag, Comment.Multiline, Name.Tag)), | |
+ (r'(<script.*?>)(.*?)(</script>)', bygroups(using(HtmlLexer), | |
+ JavascriptLexer, | |
+ using(HtmlLexer))), | |
+ (r'(.+?)(?=<)', using(HtmlLexer)), | |
+ (r'.+', using(HtmlLexer)), | |
+ ], | |
+ } | |
diff --git a/tests/examplefiles/jbst_example1.jbst b/tests/examplefiles/jbst_example1.jbst | |
new file mode 100644 | |
--- /dev/null | |
+++ b/tests/examplefiles/jbst_example1.jbst | |
@@ -0,0 +1,28 @@ | |
+<%@ Control Name="MyApp.MyJbstControl" Language="JavaScript" %> | |
+ | |
+<script type="text/javascript"> | |
+ | |
+ /* initialization code block, executed only once as control is loaded */ | |
+ this.generateValue = function() { | |
+ return new Date().toString(); | |
+ }; | |
+ | |
+</script> | |
+ | |
+<%! | |
+ /* initialization code block, executed only once as control is loaded */ | |
+ /* alternate syntax to script block above */ | |
+ this.myInitTime = this.generateValue(); | |
+%> | |
+ | |
+<% | |
+ /* data binding code block, executed each time as control is data bound */ | |
+ this.myBindTime = this.generateValue(); | |
+%> | |
+ | |
+<%-- JBST Comment --%> | |
+<span style="color:red"><%= this.myBindTime /* data binding expression */ %></span> | |
+<span style="color:green"><%= this.myInitTime /* data binding expression */ %></span> | |
+ | |
+<!-- HTML Comment --> | |
+<span style="color:blue"><%$ Resources: localizationKey %><%-- JBST globalization--%></span> | |
\ No newline at end of file | |
diff --git a/tests/examplefiles/jbst_example2.jbst b/tests/examplefiles/jbst_example2.jbst | |
new file mode 100644 | |
--- /dev/null | |
+++ b/tests/examplefiles/jbst_example2.jbst | |
@@ -0,0 +1,45 @@ | |
+<%@ Control Name="Foo.MyZebraList" Language="JavaScript" %> | |
+ | |
+<script type="text/javascript"> | |
+ | |
+ /* private members ------------------------------------------ */ | |
+ | |
+ /*int*/ function digits(/*int*/ n) { | |
+ return (n < 10) ? '0' + n : n; | |
+ } | |
+ | |
+ /* public members ------------------------------------------- */ | |
+ | |
+ // use the item index to alternate colors and highlight | |
+ /*string*/ this.zebraStripe = function(/*bool*/ selected, /*int*/ index, /*int*/ count) { | |
+ var css = [ "item" ]; | |
+ if (index % 2 === 0) { | |
+ css.push("item-alt"); | |
+ } | |
+ if (selected) { | |
+ css.push("item-selected"); | |
+ } | |
+ return css.join(" "); | |
+ }; | |
+ | |
+ /*string*/ this.formatTime = function(/*Date*/ time) { | |
+ return time.getHours() + ':' + digits(time.getMinutes()) + ':' + digits(time.getSeconds()); | |
+ }; | |
+ | |
+</script> | |
+ | |
+<div class="example"> | |
+ <h2><%= this.data.title %> as of <%= this.formatTime(this.data.timestamp) %>!</h2> | |
+ <p><%= this.data.description %></p> | |
+ <ul class="items" jbst:visible="<%= this.data.children.length > 0 %>"> | |
+ | |
+ <!-- anonymous inner template --> | |
+ <jbst:control data="<%= this.data.children %>"> | |
+ <!-- populate list item for each item of the parent's children property --> | |
+ <li class="<%= Foo.MyZebraList.zebraStripe(this.data.selected, this.index, this.count) %>"> | |
+ <%= this.data.label %> (<%= this.index+1 %> of <%= this.count %>) | |
+ </li> | |
+ </jbst:control> | |
+ | |
+ </ul> | |
+</div> | |
\ No newline at end of file |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I opened Ticket #522 to have this included in the next release: http://dev.pocoo.org/projects/pygments/ticket/522
I've included a patch file for ease of adding this to web.py.