summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pygments/lexers/web.py28
-rw-r--r--tests/examplefiles/jbst_example1.jbst28
-rw-r--r--tests/examplefiles/jbst_example2.jbst45
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