summaryrefslogtreecommitdiff
path: root/public/vendor/codemirror/mode/haml
diff options
context:
space:
mode:
authorWu Cheng-Han2015-05-04 15:53:29 +0800
committerWu Cheng-Han2015-05-04 15:53:29 +0800
commit4b0ca55eb79e963523eb6c8197825e9e8ae904e2 (patch)
tree574f3923af77b37b41dbf1b00bcd7827ef724a28 /public/vendor/codemirror/mode/haml
parent61eb11d23c65c9e5c493c67d055f785cbec139e2 (diff)
First commit, version 0.2.7
Diffstat (limited to 'public/vendor/codemirror/mode/haml')
-rwxr-xr-xpublic/vendor/codemirror/mode/haml/haml.js159
-rwxr-xr-xpublic/vendor/codemirror/mode/haml/index.html79
-rwxr-xr-xpublic/vendor/codemirror/mode/haml/test.js97
3 files changed, 335 insertions, 0 deletions
diff --git a/public/vendor/codemirror/mode/haml/haml.js b/public/vendor/codemirror/mode/haml/haml.js
new file mode 100755
index 00000000..8fe63b02
--- /dev/null
+++ b/public/vendor/codemirror/mode/haml/haml.js
@@ -0,0 +1,159 @@
+// 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"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+ // full haml mode. This handled embeded ruby and html fragments too
+ CodeMirror.defineMode("haml", function(config) {
+ var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"});
+ var rubyMode = CodeMirror.getMode(config, "ruby");
+
+ function rubyInQuote(endQuote) {
+ return function(stream, state) {
+ var ch = stream.peek();
+ if (ch == endQuote && state.rubyState.tokenize.length == 1) {
+ // step out of ruby context as it seems to complete processing all the braces
+ stream.next();
+ state.tokenize = html;
+ return "closeAttributeTag";
+ } else {
+ return ruby(stream, state);
+ }
+ };
+ }
+
+ function ruby(stream, state) {
+ if (stream.match("-#")) {
+ stream.skipToEnd();
+ return "comment";
+ }
+ return rubyMode.token(stream, state.rubyState);
+ }
+
+ function html(stream, state) {
+ var ch = stream.peek();
+
+ // handle haml declarations. All declarations that cant be handled here
+ // will be passed to html mode
+ if (state.previousToken.style == "comment" ) {
+ if (state.indented > state.previousToken.indented) {
+ stream.skipToEnd();
+ return "commentLine";
+ }
+ }
+
+ if (state.startOfLine) {
+ if (ch == "!" && stream.match("!!")) {
+ stream.skipToEnd();
+ return "tag";
+ } else if (stream.match(/^%[\w:#\.]+=/)) {
+ state.tokenize = ruby;
+ return "hamlTag";
+ } else if (stream.match(/^%[\w:]+/)) {
+ return "hamlTag";
+ } else if (ch == "/" ) {
+ stream.skipToEnd();
+ return "comment";
+ }
+ }
+
+ if (state.startOfLine || state.previousToken.style == "hamlTag") {
+ if ( ch == "#" || ch == ".") {
+ stream.match(/[\w-#\.]*/);
+ return "hamlAttribute";
+ }
+ }
+
+ // donot handle --> as valid ruby, make it HTML close comment instead
+ if (state.startOfLine && !stream.match("-->", false) && (ch == "=" || ch == "-" )) {
+ state.tokenize = ruby;
+ return state.tokenize(stream, state);
+ }
+
+ if (state.previousToken.style == "hamlTag" ||
+ state.previousToken.style == "closeAttributeTag" ||
+ state.previousToken.style == "hamlAttribute") {
+ if (ch == "(") {
+ state.tokenize = rubyInQuote(")");
+ return state.tokenize(stream, state);
+ } else if (ch == "{") {
+ state.tokenize = rubyInQuote("}");
+ return state.tokenize(stream, state);
+ }
+ }
+
+ return htmlMode.token(stream, state.htmlState);
+ }
+
+ return {
+ // default to html mode
+ startState: function() {
+ var htmlState = htmlMode.startState();
+ var rubyState = rubyMode.startState();
+ return {
+ htmlState: htmlState,
+ rubyState: rubyState,
+ indented: 0,
+ previousToken: { style: null, indented: 0},
+ tokenize: html
+ };
+ },
+
+ copyState: function(state) {
+ return {
+ htmlState : CodeMirror.copyState(htmlMode, state.htmlState),
+ rubyState: CodeMirror.copyState(rubyMode, state.rubyState),
+ indented: state.indented,
+ previousToken: state.previousToken,
+ tokenize: state.tokenize
+ };
+ },
+
+ token: function(stream, state) {
+ if (stream.sol()) {
+ state.indented = stream.indentation();
+ state.startOfLine = true;
+ }
+ if (stream.eatSpace()) return null;
+ var style = state.tokenize(stream, state);
+ state.startOfLine = false;
+ // dont record comment line as we only want to measure comment line with
+ // the opening comment block
+ if (style && style != "commentLine") {
+ state.previousToken = { style: style, indented: state.indented };
+ }
+ // if current state is ruby and the previous token is not `,` reset the
+ // tokenize to html
+ if (stream.eol() && state.tokenize == ruby) {
+ stream.backUp(1);
+ var ch = stream.peek();
+ stream.next();
+ if (ch && ch != ",") {
+ state.tokenize = html;
+ }
+ }
+ // reprocess some of the specific style tag when finish setting previousToken
+ if (style == "hamlTag") {
+ style = "tag";
+ } else if (style == "commentLine") {
+ style = "comment";
+ } else if (style == "hamlAttribute") {
+ style = "attribute";
+ } else if (style == "closeAttributeTag") {
+ style = null;
+ }
+ return style;
+ }
+ };
+ }, "htmlmixed", "ruby");
+
+ CodeMirror.defineMIME("text/x-haml", "haml");
+});
diff --git a/public/vendor/codemirror/mode/haml/index.html b/public/vendor/codemirror/mode/haml/index.html
new file mode 100755
index 00000000..2894a938
--- /dev/null
+++ b/public/vendor/codemirror/mode/haml/index.html
@@ -0,0 +1,79 @@
+<!doctype html>
+
+<title>CodeMirror: HAML mode</title>
+<meta charset="utf-8"/>
+<link rel=stylesheet href="../../doc/docs.css">
+
+<link rel="stylesheet" href="../../lib/codemirror.css">
+<script src="../../lib/codemirror.js"></script>
+<script src="../xml/xml.js"></script>
+<script src="../htmlmixed/htmlmixed.js"></script>
+<script src="../javascript/javascript.js"></script>
+<script src="../ruby/ruby.js"></script>
+<script src="haml.js"></script>
+<style>.CodeMirror {background: #f8f8f8;}</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="#">HAML</a>
+ </ul>
+</div>
+
+<article>
+<h2>HAML mode</h2>
+<form><textarea id="code" name="code">
+!!!
+#content
+.left.column(title="title"){:href => "/hello", :test => "#{hello}_#{world}"}
+ <!-- This is a comment -->
+ %h2 Welcome to our site!
+ %p= puts "HAML MODE"
+ .right.column
+ = render :partial => "sidebar"
+
+.container
+ .row
+ .span8
+ %h1.title= @page_title
+%p.title= @page_title
+%p
+ /
+ The same as HTML comment
+ Hello multiline comment
+
+ -# haml comment
+ This wont be displayed
+ nor will this
+ Date/Time:
+ - now = DateTime.now
+ %strong= now
+ - if now > DateTime.parse("December 31, 2006")
+ = "Happy new " + "year!"
+
+%title
+ = @title
+ \= @title
+ <h1>Title</h1>
+ <h1 title="HELLO">
+ Title
+ </h1>
+ </textarea></form>
+ <script>
+ var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+ lineNumbers: true,
+ mode: "text/x-haml"
+ });
+ </script>
+
+ <p><strong>MIME types defined:</strong> <code>text/x-haml</code>.</p>
+
+ <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#haml_*">normal</a>, <a href="../../test/index.html#verbose,haml_*">verbose</a>.</p>
+
+ </article>
diff --git a/public/vendor/codemirror/mode/haml/test.js b/public/vendor/codemirror/mode/haml/test.js
new file mode 100755
index 00000000..508458a4
--- /dev/null
+++ b/public/vendor/codemirror/mode/haml/test.js
@@ -0,0 +1,97 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function() {
+ var mode = CodeMirror.getMode({tabSize: 4, indentUnit: 2}, "haml");
+ function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
+
+ // Requires at least one media query
+ MT("elementName",
+ "[tag %h1] Hey There");
+
+ MT("oneElementPerLine",
+ "[tag %h1] Hey There %h2");
+
+ MT("idSelector",
+ "[tag %h1][attribute #test] Hey There");
+
+ MT("classSelector",
+ "[tag %h1][attribute .hello] Hey There");
+
+ MT("docType",
+ "[tag !!! XML]");
+
+ MT("comment",
+ "[comment / Hello WORLD]");
+
+ MT("notComment",
+ "[tag %h1] This is not a / comment ");
+
+ MT("attributes",
+ "[tag %a]([variable title][operator =][string \"test\"]){[atom :title] [operator =>] [string \"test\"]}");
+
+ MT("htmlCode",
+ "[tag&bracket <][tag h1][tag&bracket >]Title[tag&bracket </][tag h1][tag&bracket >]");
+
+ MT("rubyBlock",
+ "[operator =][variable-2 @item]");
+
+ MT("selectorRubyBlock",
+ "[tag %a.selector=] [variable-2 @item]");
+
+ MT("nestedRubyBlock",
+ "[tag %a]",
+ " [operator =][variable puts] [string \"test\"]");
+
+ MT("multilinePlaintext",
+ "[tag %p]",
+ " Hello,",
+ " World");
+
+ MT("multilineRuby",
+ "[tag %p]",
+ " [comment -# this is a comment]",
+ " [comment and this is a comment too]",
+ " Date/Time",
+ " [operator -] [variable now] [operator =] [tag DateTime][operator .][property now]",
+ " [tag %strong=] [variable now]",
+ " [operator -] [keyword if] [variable now] [operator >] [tag DateTime][operator .][property parse]([string \"December 31, 2006\"])",
+ " [operator =][string \"Happy\"]",
+ " [operator =][string \"Belated\"]",
+ " [operator =][string \"Birthday\"]");
+
+ MT("multilineComment",
+ "[comment /]",
+ " [comment Multiline]",
+ " [comment Comment]");
+
+ MT("hamlComment",
+ "[comment -# this is a comment]");
+
+ MT("multilineHamlComment",
+ "[comment -# this is a comment]",
+ " [comment and this is a comment too]");
+
+ MT("multilineHTMLComment",
+ "[comment <!--]",
+ " [comment what a comment]",
+ " [comment -->]");
+
+ MT("hamlAfterRubyTag",
+ "[attribute .block]",
+ " [tag %strong=] [variable now]",
+ " [attribute .test]",
+ " [operator =][variable now]",
+ " [attribute .right]");
+
+ MT("stretchedRuby",
+ "[operator =] [variable puts] [string \"Hello\"],",
+ " [string \"World\"]");
+
+ MT("interpolationInHashAttribute",
+ //"[tag %div]{[atom :id] [operator =>] [string \"#{][variable test][string }_#{][variable ting][string }\"]} test");
+ "[tag %div]{[atom :id] [operator =>] [string \"#{][variable test][string }_#{][variable ting][string }\"]} test");
+
+ MT("interpolationInHTMLAttribute",
+ "[tag %div]([variable title][operator =][string \"#{][variable test][string }_#{][variable ting]()[string }\"]) Test");
+})();