summaryrefslogtreecommitdiff
path: root/public/vendor/codemirror/mode/sieve
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xpublic/vendor/codemirror/mode/sieve/index.html93
-rwxr-xr-xpublic/vendor/codemirror/mode/sieve/sieve.js193
2 files changed, 286 insertions, 0 deletions
diff --git a/public/vendor/codemirror/mode/sieve/index.html b/public/vendor/codemirror/mode/sieve/index.html
new file mode 100755
index 00000000..6f029b62
--- /dev/null
+++ b/public/vendor/codemirror/mode/sieve/index.html
@@ -0,0 +1,93 @@
+<!doctype html>
+
+<title>CodeMirror: Sieve (RFC5228) 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="sieve.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="#">Sieve (RFC5228)</a>
+ </ul>
+</div>
+
+<article>
+<h2>Sieve (RFC5228) mode</h2>
+<form><textarea id="code" name="code">
+#
+# Example Sieve Filter
+# Declare any optional features or extension used by the script
+#
+
+require ["fileinto", "reject"];
+
+#
+# Reject any large messages (note that the four leading dots get
+# "stuffed" to three)
+#
+if size :over 1M
+{
+ reject text:
+Please do not send me large attachments.
+Put your file on a server and send me the URL.
+Thank you.
+.... Fred
+.
+;
+ stop;
+}
+
+#
+# Handle messages from known mailing lists
+# Move messages from IETF filter discussion list to filter folder
+#
+if header :is "Sender" "owner-ietf-mta-filters@imc.org"
+{
+ fileinto "filter"; # move to "filter" folder
+}
+#
+# Keep all messages to or from people in my company
+#
+elsif address :domain :is ["From", "To"] "example.com"
+{
+ keep; # keep in "In" folder
+}
+
+#
+# Try and catch unsolicited email. If a message is not to me,
+# or it contains a subject known to be spam, file it away.
+#
+elsif anyof (not address :all :contains
+ ["To", "Cc", "Bcc"] "me@example.com",
+ header :matches "subject"
+ ["*make*money*fast*", "*university*dipl*mas*"])
+{
+ # If message header does not contain my address,
+ # it's from a list.
+ fileinto "spam"; # move to "spam" folder
+}
+else
+{
+ # Move all other (non-company) mail to "personal"
+ # folder.
+ fileinto "personal";
+}
+</textarea></form>
+ <script>
+ var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
+ </script>
+
+ <p><strong>MIME types defined:</strong> <code>application/sieve</code>.</p>
+
+ </article>
diff --git a/public/vendor/codemirror/mode/sieve/sieve.js b/public/vendor/codemirror/mode/sieve/sieve.js
new file mode 100755
index 00000000..f67db2f5
--- /dev/null
+++ b/public/vendor/codemirror/mode/sieve/sieve.js
@@ -0,0 +1,193 @@
+// 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("sieve", function(config) {
+ function words(str) {
+ var obj = {}, words = str.split(" ");
+ for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
+ return obj;
+ }
+
+ var keywords = words("if elsif else stop require");
+ var atoms = words("true false not");
+ var indentUnit = config.indentUnit;
+
+ function tokenBase(stream, state) {
+
+ var ch = stream.next();
+ if (ch == "/" && stream.eat("*")) {
+ state.tokenize = tokenCComment;
+ return tokenCComment(stream, state);
+ }
+
+ if (ch === '#') {
+ stream.skipToEnd();
+ return "comment";
+ }
+
+ if (ch == "\"") {
+ state.tokenize = tokenString(ch);
+ return state.tokenize(stream, state);
+ }
+
+ if (ch == "(") {
+ state._indent.push("(");
+ // add virtual angel wings so that editor behaves...
+ // ...more sane incase of broken brackets
+ state._indent.push("{");
+ return null;
+ }
+
+ if (ch === "{") {
+ state._indent.push("{");
+ return null;
+ }
+
+ if (ch == ")") {
+ state._indent.pop();
+ state._indent.pop();
+ }
+
+ if (ch === "}") {
+ state._indent.pop();
+ return null;
+ }
+
+ if (ch == ",")
+ return null;
+
+ if (ch == ";")
+ return null;
+
+
+ if (/[{}\(\),;]/.test(ch))
+ return null;
+
+ // 1*DIGIT "K" / "M" / "G"
+ if (/\d/.test(ch)) {
+ stream.eatWhile(/[\d]/);
+ stream.eat(/[KkMmGg]/);
+ return "number";
+ }
+
+ // ":" (ALPHA / "_") *(ALPHA / DIGIT / "_")
+ if (ch == ":") {
+ stream.eatWhile(/[a-zA-Z_]/);
+ stream.eatWhile(/[a-zA-Z0-9_]/);
+
+ return "operator";
+ }
+
+ stream.eatWhile(/\w/);
+ var cur = stream.current();
+
+ // "text:" *(SP / HTAB) (hash-comment / CRLF)
+ // *(multiline-literal / multiline-dotstart)
+ // "." CRLF
+ if ((cur == "text") && stream.eat(":"))
+ {
+ state.tokenize = tokenMultiLineString;
+ return "string";
+ }
+
+ if (keywords.propertyIsEnumerable(cur))
+ return "keyword";
+
+ if (atoms.propertyIsEnumerable(cur))
+ return "atom";
+
+ return null;
+ }
+
+ function tokenMultiLineString(stream, state)
+ {
+ state._multiLineString = true;
+ // the first line is special it may contain a comment
+ if (!stream.sol()) {
+ stream.eatSpace();
+
+ if (stream.peek() == "#") {
+ stream.skipToEnd();
+ return "comment";
+ }
+
+ stream.skipToEnd();
+ return "string";
+ }
+
+ if ((stream.next() == ".") && (stream.eol()))
+ {
+ state._multiLineString = false;
+ state.tokenize = tokenBase;
+ }
+
+ return "string";
+ }
+
+ function tokenCComment(stream, state) {
+ var maybeEnd = false, ch;
+ while ((ch = stream.next()) != null) {
+ if (maybeEnd && ch == "/") {
+ state.tokenize = tokenBase;
+ break;
+ }
+ maybeEnd = (ch == "*");
+ }
+ return "comment";
+ }
+
+ function tokenString(quote) {
+ return function(stream, state) {
+ var escaped = false, ch;
+ while ((ch = stream.next()) != null) {
+ if (ch == quote && !escaped)
+ break;
+ escaped = !escaped && ch == "\\";
+ }
+ if (!escaped) state.tokenize = tokenBase;
+ return "string";
+ };
+ }
+
+ return {
+ startState: function(base) {
+ return {tokenize: tokenBase,
+ baseIndent: base || 0,
+ _indent: []};
+ },
+
+ token: function(stream, state) {
+ if (stream.eatSpace())
+ return null;
+
+ return (state.tokenize || tokenBase)(stream, state);;
+ },
+
+ indent: function(state, _textAfter) {
+ var length = state._indent.length;
+ if (_textAfter && (_textAfter[0] == "}"))
+ length--;
+
+ if (length <0)
+ length = 0;
+
+ return length * indentUnit;
+ },
+
+ electricChars: "}"
+ };
+});
+
+CodeMirror.defineMIME("application/sieve", "sieve");
+
+});