annotate .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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 (function(mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 mod(require("../../lib/codemirror"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 define(["../../lib/codemirror"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 })(function(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 var rfc2822 = [
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 "From", "Sender", "Reply-To", "To", "Cc", "Bcc", "Message-ID",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 "In-Reply-To", "References", "Resent-From", "Resent-Sender", "Resent-To",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 "Resent-Cc", "Resent-Bcc", "Resent-Message-ID", "Return-Path", "Received"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 ];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 var rfc2822NoEmail = [
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 "Date", "Subject", "Comments", "Keywords", "Resent-Date"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 ];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 CodeMirror.registerHelper("hintWords", "mbox", rfc2822.concat(rfc2822NoEmail));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 var whitespace = /^[ \t]/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 var separator = /^From /; // See RFC 4155
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 var rfc2822Header = new RegExp("^(" + rfc2822.join("|") + "): ");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 var rfc2822HeaderNoEmail = new RegExp("^(" + rfc2822NoEmail.join("|") + "): ");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 var header = /^[^:]+:/; // Optional fields defined in RFC 2822
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 var email = /^[^ ]+@[^ ]+/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 var untilEmail = /^.*?(?=[^ ]+?@[^ ]+)/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 var bracketedEmail = /^<.*?>/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 var untilBracketedEmail = /^.*?(?=<.*>)/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 function styleForHeader(header) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 if (header === "Subject") return "header";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 function readToken(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 if (stream.sol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 // From last line
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 state.inSeparator = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 if (state.inHeader && stream.match(whitespace)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 // Header folding
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 state.inHeader = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 state.header = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 if (stream.match(separator)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 state.inHeaders = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 state.inSeparator = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 return "atom";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 var match;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 var emailPermitted = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 if ((match = stream.match(rfc2822HeaderNoEmail)) ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 (emailPermitted = true) && (match = stream.match(rfc2822Header))) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 state.inHeaders = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 state.inHeader = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 state.emailPermitted = emailPermitted;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 state.header = match[1];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 return "atom";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 // Use vim's heuristics: recognize custom headers only if the line is in a
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 // block of legitimate headers.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 if (state.inHeaders && (match = stream.match(header))) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 state.inHeader = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 state.emailPermitted = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 state.header = match[1];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 return "atom";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 state.inHeaders = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 if (state.inSeparator) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 if (stream.match(email)) return "link";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 if (stream.match(untilEmail)) return "atom";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 return "atom";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 if (state.inHeader) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 var style = styleForHeader(state.header);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 if (state.emailPermitted) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 if (stream.match(bracketedEmail)) return style + " link";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 if (stream.match(untilBracketedEmail)) return style;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 return style;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 CodeMirror.defineMode("mbox", function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 startState: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 // Is in a mbox separator
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 inSeparator: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 // Is in a mail header
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 inHeader: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 // If bracketed email is permitted. Only applicable when inHeader
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 emailPermitted: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 // Name of current header
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 header: null,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 // Is in a region of mail headers
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 inHeaders: false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 token: readToken,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 blankLine: function(state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 state.inHeaders = state.inSeparator = state.inHeader = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 CodeMirror.defineMIME("application/mbox", "mbox");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 });