diff options
Diffstat (limited to 'public/vendor/codemirror/mode/velocity')
-rwxr-xr-x | public/vendor/codemirror/mode/velocity/index.html | 118 | ||||
-rwxr-xr-x | public/vendor/codemirror/mode/velocity/velocity.js | 201 |
2 files changed, 319 insertions, 0 deletions
diff --git a/public/vendor/codemirror/mode/velocity/index.html b/public/vendor/codemirror/mode/velocity/index.html new file mode 100755 index 00000000..27478786 --- /dev/null +++ b/public/vendor/codemirror/mode/velocity/index.html @@ -0,0 +1,118 @@ +<!doctype html> + +<title>CodeMirror: Velocity mode</title> +<meta charset="utf-8"/> +<link rel=stylesheet href="../../doc/docs.css"> + +<link rel="stylesheet" href="../../lib/codemirror.css"> +<link rel="stylesheet" href="../../theme/night.css"> +<script src="../../lib/codemirror.js"></script> +<script src="velocity.js"></script> +<style>.CodeMirror {border: 1px solid black;}</style> +<div id=nav> + <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a> + + <ul> + <li><a href="../../index.html">Home</a> + <li><a href="../../doc/manual.html">Manual</a> + <li><a href="https://github.com/codemirror/codemirror">Code</a> + </ul> + <ul> + <li><a href="../index.html">Language modes</a> + <li><a class=active href="#">Velocity</a> + </ul> +</div> + +<article> +<h2>Velocity mode</h2> +<form><textarea id="code" name="code"> +## Velocity Code Demo +#* + based on PL/SQL mode by Peter Raganitsch, adapted to Velocity by Steve O'Hara ( http://www.pivotal-solutions.co.uk ) + August 2011 +*# + +#* + This is a multiline comment. + This is the second line +*# + +#[[ hello steve + This has invalid syntax that would normally need "poor man's escaping" like: + + #define() + + ${blah +]]# + +#include( "disclaimer.txt" "opinion.txt" ) +#include( $foo $bar ) + +#parse( "lecorbusier.vm" ) +#parse( $foo ) + +#evaluate( 'string with VTL #if(true)will be displayed#end' ) + +#define( $hello ) Hello $who #end #set( $who = "World!") $hello ## displays Hello World! + +#foreach( $customer in $customerList ) + + $foreach.count $customer.Name + + #if( $foo == ${bar}) + it's true! + #break + #{else} + it's not! + #stop + #end + + #if ($foreach.parent.hasNext) + $velocityCount + #end +#end + +$someObject.getValues("this is a string split + across lines") + +$someObject("This plus $something in the middle").method(7567).property + +#macro( tablerows $color $somelist ) + #foreach( $something in $somelist ) + <tr><td bgcolor=$color>$something</td></tr> + <tr><td bgcolor=$color>$bodyContent</td></tr> + #end +#end + +#tablerows("red" ["dadsdf","dsa"]) +#@tablerows("red" ["dadsdf","dsa"]) some body content #end + + Variable reference: #set( $monkey = $bill ) + String literal: #set( $monkey.Friend = 'monica' ) + Property reference: #set( $monkey.Blame = $whitehouse.Leak ) + Method reference: #set( $monkey.Plan = $spindoctor.weave($web) ) + Number literal: #set( $monkey.Number = 123 ) + Range operator: #set( $monkey.Numbers = [1..3] ) + Object list: #set( $monkey.Say = ["Not", $my, "fault"] ) + Object map: #set( $monkey.Map = {"banana" : "good", "roast beef" : "bad"}) + +The RHS can also be a simple arithmetic expression, such as: +Addition: #set( $value = $foo + 1 ) + Subtraction: #set( $value = $bar - 1 ) + Multiplication: #set( $value = $foo * $bar ) + Division: #set( $value = $foo / $bar ) + Remainder: #set( $value = $foo % $bar ) + +</textarea></form> + <script> + var editor = CodeMirror.fromTextArea(document.getElementById("code"), { + theme: "night", + lineNumbers: true, + indentUnit: 4, + mode: "text/velocity" + }); + </script> + + <p><strong>MIME types defined:</strong> <code>text/velocity</code>.</p> + + </article> diff --git a/public/vendor/codemirror/mode/velocity/velocity.js b/public/vendor/codemirror/mode/velocity/velocity.js new file mode 100755 index 00000000..8fc4f95d --- /dev/null +++ b/public/vendor/codemirror/mode/velocity/velocity.js @@ -0,0 +1,201 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("velocity", function() { + function parseWords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = parseWords("#end #else #break #stop #[[ #]] " + + "#{end} #{else} #{break} #{stop}"); + var functions = parseWords("#if #elseif #foreach #set #include #parse #macro #define #evaluate " + + "#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}"); + var specials = parseWords("$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent"); + var isOperatorChar = /[+\-*&%=<>!?:\/|]/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + function tokenBase(stream, state) { + var beforeParams = state.beforeParams; + state.beforeParams = false; + var ch = stream.next(); + // start of unparsed string? + if ((ch == "'") && state.inParams) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenString(ch)); + } + // start of parsed string? + else if ((ch == '"')) { + state.lastTokenWasBuiltin = false; + if (state.inString) { + state.inString = false; + return "string"; + } + else if (state.inParams) + return chain(stream, state, tokenString(ch)); + } + // is it one of the special signs []{}().,;? Seperator? + else if (/[\[\]{}\(\),;\.]/.test(ch)) { + if (ch == "(" && beforeParams) + state.inParams = true; + else if (ch == ")") { + state.inParams = false; + state.lastTokenWasBuiltin = true; + } + return null; + } + // start of a number value? + else if (/\d/.test(ch)) { + state.lastTokenWasBuiltin = false; + stream.eatWhile(/[\w\.]/); + return "number"; + } + // multi line comment? + else if (ch == "#" && stream.eat("*")) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenComment); + } + // unparsed content? + else if (ch == "#" && stream.match(/ *\[ *\[/)) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenUnparsed); + } + // single line comment? + else if (ch == "#" && stream.eat("#")) { + state.lastTokenWasBuiltin = false; + stream.skipToEnd(); + return "comment"; + } + // variable? + else if (ch == "$") { + stream.eatWhile(/[\w\d\$_\.{}]/); + // is it one of the specials? + if (specials && specials.propertyIsEnumerable(stream.current())) { + return "keyword"; + } + else { + state.lastTokenWasBuiltin = true; + state.beforeParams = true; + return "builtin"; + } + } + // is it a operator? + else if (isOperatorChar.test(ch)) { + state.lastTokenWasBuiltin = false; + stream.eatWhile(isOperatorChar); + return "operator"; + } + else { + // get the whole word + stream.eatWhile(/[\w\$_{}@]/); + var word = stream.current(); + // is it one of the listed keywords? + if (keywords && keywords.propertyIsEnumerable(word)) + return "keyword"; + // is it one of the listed functions? + if (functions && functions.propertyIsEnumerable(word) || + (stream.current().match(/^#@?[a-z0-9_]+ *$/i) && stream.peek()=="(") && + !(functions && functions.propertyIsEnumerable(word.toLowerCase()))) { + state.beforeParams = true; + state.lastTokenWasBuiltin = false; + return "keyword"; + } + if (state.inString) { + state.lastTokenWasBuiltin = false; + return "string"; + } + if (stream.pos > word.length && stream.string.charAt(stream.pos-word.length-1)=="." && state.lastTokenWasBuiltin) + return "builtin"; + // default: just a "word" + state.lastTokenWasBuiltin = false; + return null; + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if ((next == quote) && !escaped) { + end = true; + break; + } + if (quote=='"' && stream.peek() == '$' && !escaped) { + state.inString = true; + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end) state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenUnparsed(stream, state) { + var maybeEnd = 0, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd == 2) { + state.tokenize = tokenBase; + break; + } + if (ch == "]") + maybeEnd++; + else if (ch != " ") + maybeEnd = 0; + } + return "meta"; + } + // Interface + + return { + startState: function() { + return { + tokenize: tokenBase, + beforeParams: false, + inParams: false, + inString: false, + lastTokenWasBuiltin: false + }; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + blockCommentStart: "#*", + blockCommentEnd: "*#", + lineComment: "##", + fold: "velocity" + }; +}); + +CodeMirror.defineMIME("text/velocity", "velocity"); + +}); |