diff .cms/lib/codemirror/mode/mbox/mbox.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.cms/lib/codemirror/mode/mbox/mbox.js	Fri Oct 11 22:40:23 2024 +0000
@@ -0,0 +1,129 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/5/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");
+});