##// END OF EJS Templates
feat(configs): deprecared old hooks protocol and ssh wrapper....
feat(configs): deprecared old hooks protocol and ssh wrapper. New defaults are now set on v2 keys, so previous installation are automatically set to new keys. Fallback mode is still available.

File last commit:

r4105:10488616 default
r5496:cab50adf default
Show More
mbox.js
129 lines | 3.6 KiB | application/javascript | JavascriptLexer
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://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";
var rfc2822 = [
"From", "Sender", "Reply-To", "To", "Cc", "Bcc", "Message-ID",
"In-Reply-To", "References", "Resent-From", "Resent-Sender", "Resent-To",
"Resent-Cc", "Resent-Bcc", "Resent-Message-ID", "Return-Path", "Received"
];
var rfc2822NoEmail = [
"Date", "Subject", "Comments", "Keywords", "Resent-Date"
];
CodeMirror.registerHelper("hintWords", "mbox", rfc2822.concat(rfc2822NoEmail));
var whitespace = /^[ \t]/;
var separator = /^From /; // See RFC 4155
var rfc2822Header = new RegExp("^(" + rfc2822.join("|") + "): ");
var rfc2822HeaderNoEmail = new RegExp("^(" + rfc2822NoEmail.join("|") + "): ");
var header = /^[^:]+:/; // Optional fields defined in RFC 2822
var email = /^[^ ]+@[^ ]+/;
var untilEmail = /^.*?(?=[^ ]+?@[^ ]+)/;
var bracketedEmail = /^<.*?>/;
var untilBracketedEmail = /^.*?(?=<.*>)/;
function styleForHeader(header) {
if (header === "Subject") return "header";
return "string";
}
function readToken(stream, state) {
if (stream.sol()) {
// From last line
state.inSeparator = false;
if (state.inHeader && stream.match(whitespace)) {
// Header folding
return null;
} else {
state.inHeader = false;
state.header = null;
}
if (stream.match(separator)) {
state.inHeaders = true;
state.inSeparator = true;
return "atom";
}
var match;
var emailPermitted = false;
if ((match = stream.match(rfc2822HeaderNoEmail)) ||
(emailPermitted = true) && (match = stream.match(rfc2822Header))) {
state.inHeaders = true;
state.inHeader = true;
state.emailPermitted = emailPermitted;
state.header = match[1];
return "atom";
}
// Use vim's heuristics: recognize custom headers only if the line is in a
// block of legitimate headers.
if (state.inHeaders && (match = stream.match(header))) {
state.inHeader = true;
state.emailPermitted = true;
state.header = match[1];
return "atom";
}
state.inHeaders = false;
stream.skipToEnd();
return null;
}
if (state.inSeparator) {
if (stream.match(email)) return "link";
if (stream.match(untilEmail)) return "atom";
stream.skipToEnd();
return "atom";
}
if (state.inHeader) {
var style = styleForHeader(state.header);
if (state.emailPermitted) {
if (stream.match(bracketedEmail)) return style + " link";
if (stream.match(untilBracketedEmail)) return style;
}
stream.skipToEnd();
return style;
}
stream.skipToEnd();
return null;
};
CodeMirror.defineMode("mbox", function() {
return {
startState: function() {
return {
// Is in a mbox separator
inSeparator: false,
// Is in a mail header
inHeader: false,
// If bracketed email is permitted. Only applicable when inHeader
emailPermitted: false,
// Name of current header
header: null,
// Is in a region of mail headers
inHeaders: false
};
},
token: readToken,
blankLine: function(state) {
state.inHeaders = state.inSeparator = state.inHeader = false;
}
};
});
CodeMirror.defineMIME("application/mbox", "mbox");
});