diff options
-rw-r--r-- | pygments/lexers/web.py | 28 | ||||
-rw-r--r-- | tests/examplefiles/jbst_example1.jbst | 28 | ||||
-rw-r--r-- | tests/examplefiles/jbst_example2.jbst | 45 |
3 files changed, 100 insertions, 1 deletions
diff --git a/pygments/lexers/web.py b/pygments/lexers/web.py index 542051b2..9ab9d4f2 100644 --- a/pygments/lexers/web.py +++ b/pygments/lexers/web.py @@ -24,7 +24,7 @@ from pygments.lexers.agile import RubyLexer __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 @@ class CoffeeScriptLexer(RegexLexer): (r"'(\\\\|\\'|[^'])*'", String.Single), ] } + +class JbstLexer(RegexLexer): + """ + Lexer for JsonML+Browser-Side Template (JSBT) markup with JavaScript code blocks. + http://jsonml.org/jbst/ + """ + + 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 index 00000000..0e7d014f --- /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 index 00000000..2b5e0489 --- /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 |