Skip to content

Instantly share code, notes, and snippets.

@mckamey
Created August 14, 2010 16:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mckamey/524429 to your computer and use it in GitHub Desktop.
Save mckamey/524429 to your computer and use it in GitHub Desktop.
Pygments lexer support for JBST syntax
<%@ 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>
# -*- 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)),
],
}
<%@ 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>
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
@mckamey
Copy link
Author

mckamey commented Aug 14, 2010

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment