annotate .cms/lib/codemirror/addon/mode/overlay.js @ 1:1d486627aa1e draft default tip

24.10
author Coffee CMS <info@coffee-cms.ru>
date Sat, 12 Oct 2024 02:51:39 +0000
parents 78edf6b517a0
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 // Utility function that allows modes to be combined. The mode given
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 // as the base argument takes care of most of the normal mode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 // functionality, but a second (typically simple) mode is used, which
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 // can override the style of text. Both modes get to parse all of the
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 // text, but when both assign a non-null style to a piece of code, the
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 // overlay wins, unless the combine argument was true and not overridden,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 // or state.overlay.combineTokens was true, in which case the styles are
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 // combined.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 (function(mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 mod(require("../../lib/codemirror"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 define(["../../lib/codemirror"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 })(function(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 CodeMirror.overlayMode = function(base, overlay, combine) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 startState: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 base: CodeMirror.startState(base),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 overlay: CodeMirror.startState(overlay),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 basePos: 0, baseCur: null,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 overlayPos: 0, overlayCur: null,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 streamSeen: null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 copyState: function(state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 base: CodeMirror.copyState(base, state.base),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 overlay: CodeMirror.copyState(overlay, state.overlay),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 basePos: state.basePos, baseCur: null,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 overlayPos: state.overlayPos, overlayCur: null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 token: function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 if (stream != state.streamSeen ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 Math.min(state.basePos, state.overlayPos) < stream.start) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 state.streamSeen = stream;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 state.basePos = state.overlayPos = stream.start;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 if (stream.start == state.basePos) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 state.baseCur = base.token(stream, state.base);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 state.basePos = stream.pos;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 if (stream.start == state.overlayPos) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 stream.pos = stream.start;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 state.overlayCur = overlay.token(stream, state.overlay);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 state.overlayPos = stream.pos;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 stream.pos = Math.min(state.basePos, state.overlayPos);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 // state.overlay.combineTokens always takes precedence over combine,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 // unless set to null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 if (state.overlayCur == null) return state.baseCur;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 else if (state.baseCur != null &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 state.overlay.combineTokens ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 combine && state.overlay.combineTokens == null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 return state.baseCur + " " + state.overlayCur;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 else return state.overlayCur;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 indent: base.indent && function(state, textAfter, line) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 return base.indent(state.base, textAfter, line);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 electricChars: base.electricChars,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 innerMode: function(state) { return {state: state.base, mode: base}; },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 blankLine: function(state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 var baseToken, overlayToken;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 if (base.blankLine) baseToken = base.blankLine(state.base);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 if (overlay.blankLine) overlayToken = overlay.blankLine(state.overlay);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 return overlayToken == null ?
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 baseToken :
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 (combine && baseToken != null ? baseToken + " " + overlayToken : overlayToken);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 };
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 });