html5 boiler plate
[scannr.git] / js / flotr2 / examples / lib / codemirror / mode / yaml / yaml.js
blob:a/js/flotr2/examples/lib/codemirror/mode/yaml/yaml.js -> blob:b/js/flotr2/examples/lib/codemirror/mode/yaml/yaml.js
--- a/js/flotr2/examples/lib/codemirror/mode/yaml/yaml.js
+++ b/js/flotr2/examples/lib/codemirror/mode/yaml/yaml.js
@@ -1,1 +1,96 @@
+CodeMirror.defineMode("yaml", function() {
+	
+	var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];
+	var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i');
+	
+	return {
+		token: function(stream, state) {
+			var ch = stream.peek();
+			var esc = state.escaped;
+			state.escaped = false;
+			/* comments */
+			if (ch == "#") { stream.skipToEnd(); return "comment"; }
+			if (state.literal && stream.indentation() > state.keyCol) {
+				stream.skipToEnd(); return "string";
+			} else if (state.literal) { state.literal = false; }
+			if (stream.sol()) {
+				state.keyCol = 0;
+				state.pair = false;
+				state.pairStart = false;
+				/* document start */
+				if(stream.match(/---/)) { return "def"; }
+				/* document end */
+				if (stream.match(/\.\.\./)) { return "def"; }
+				/* array list item */
+				if (stream.match(/\s*-\s+/)) { return 'meta'; }
+			}
+			/* pairs (associative arrays) -> key */
+			if (!state.pair && stream.match(/^\s*([a-z0-9\._-])+(?=\s*:)/i)) {
+				state.pair = true;
+				state.keyCol = stream.indentation();
+				return "atom";
+			}
+			if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; }
+			
+			/* inline pairs/lists */
+			if (stream.match(/^(\{|\}|\[|\])/)) {
+				if (ch == '{')
+					state.inlinePairs++;
+				else if (ch == '}')
+					state.inlinePairs--;
+				else if (ch == '[')
+					state.inlineList++;
+				else
+					state.inlineList--;
+				return 'meta';
+			}
+			
+			/* list seperator */
+			if (state.inlineList > 0 && !esc && ch == ',') {
+				stream.next();
+				return 'meta';
+			}
+			/* pairs seperator */
+			if (state.inlinePairs > 0 && !esc && ch == ',') {
+				state.keyCol = 0;
+				state.pair = false;
+				state.pairStart = false;
+				stream.next();
+				return 'meta';
+			}
+			
+			/* start of value of a pair */
+			if (state.pairStart) {
+				/* block literals */
+				if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; };
+				/* references */
+				if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; }
+				/* numbers */
+				if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; }
+				if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; }
+				/* keywords */
+				if (stream.match(keywordRegex)) { return 'keyword'; }
+			}
 
+			/* nothing found, continue */
+			state.pairStart = false;
+			state.escaped = (ch == '\\');
+			stream.next();
+			return null;
+		},
+		startState: function() {
+			return {
+				pair: false,
+				pairStart: false,
+				keyCol: 0,
+				inlinePairs: 0,
+				inlineList: 0,
+				literal: false,
+				escaped: false
+			};
+		}
+	};
+});
+
+CodeMirror.defineMIME("text/x-yaml", "yaml");
+