OLD | NEW |
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others | 1 // CodeMirror, copyright (c) by Marijn Haverbeke and others |
2 // Distributed under an MIT license: http://codemirror.net/LICENSE | 2 // Distributed under an MIT license: http://codemirror.net/LICENSE |
3 | 3 |
4 // Utility function that allows modes to be combined. The mode given | 4 // Utility function that allows modes to be combined. The mode given |
5 // as the base argument takes care of most of the normal mode | 5 // as the base argument takes care of most of the normal mode |
6 // functionality, but a second (typically simple) mode is used, which | 6 // functionality, but a second (typically simple) mode is used, which |
7 // can override the style of text. Both modes get to parse all of the | 7 // can override the style of text. Both modes get to parse all of the |
8 // text, but when both assign a non-null style to a piece of code, the | 8 // text, but when both assign a non-null style to a piece of code, the |
9 // overlay wins, unless the combine argument was true and not overridden, | 9 // overlay wins, unless the combine argument was true and not overridden, |
10 // or state.overlay.combineTokens was true, in which case the styles are | 10 // or state.overlay.combineTokens was true, in which case the styles are |
(...skipping 10 matching lines...) Expand all Loading... |
21 "use strict"; | 21 "use strict"; |
22 | 22 |
23 CodeMirror.overlayMode = function(base, overlay, combine) { | 23 CodeMirror.overlayMode = function(base, overlay, combine) { |
24 return { | 24 return { |
25 startState: function() { | 25 startState: function() { |
26 return { | 26 return { |
27 base: CodeMirror.startState(base), | 27 base: CodeMirror.startState(base), |
28 overlay: CodeMirror.startState(overlay), | 28 overlay: CodeMirror.startState(overlay), |
29 basePos: 0, baseCur: null, | 29 basePos: 0, baseCur: null, |
30 overlayPos: 0, overlayCur: null, | 30 overlayPos: 0, overlayCur: null, |
31 lineSeen: null | 31 streamSeen: null |
32 }; | 32 }; |
33 }, | 33 }, |
34 copyState: function(state) { | 34 copyState: function(state) { |
35 return { | 35 return { |
36 base: CodeMirror.copyState(base, state.base), | 36 base: CodeMirror.copyState(base, state.base), |
37 overlay: CodeMirror.copyState(overlay, state.overlay), | 37 overlay: CodeMirror.copyState(overlay, state.overlay), |
38 basePos: state.basePos, baseCur: null, | 38 basePos: state.basePos, baseCur: null, |
39 overlayPos: state.overlayPos, overlayCur: null | 39 overlayPos: state.overlayPos, overlayCur: null |
40 }; | 40 }; |
41 }, | 41 }, |
42 | 42 |
43 token: function(stream, state) { | 43 token: function(stream, state) { |
44 if (stream.sol() || stream.string != state.lineSeen || | 44 if (stream != state.streamSeen || |
45 Math.min(state.basePos, state.overlayPos) < stream.start) { | 45 Math.min(state.basePos, state.overlayPos) < stream.start) { |
46 state.lineSeen = stream.string; | 46 state.streamSeen = stream; |
47 state.basePos = state.overlayPos = stream.start; | 47 state.basePos = state.overlayPos = stream.start; |
48 } | 48 } |
49 | 49 |
50 if (stream.start == state.basePos) { | 50 if (stream.start == state.basePos) { |
51 state.baseCur = base.token(stream, state.base); | 51 state.baseCur = base.token(stream, state.base); |
52 state.basePos = stream.pos; | 52 state.basePos = stream.pos; |
53 } | 53 } |
54 if (stream.start == state.overlayPos) { | 54 if (stream.start == state.overlayPos) { |
55 stream.pos = stream.start; | 55 stream.pos = stream.start; |
56 state.overlayCur = overlay.token(stream, state.overlay); | 56 state.overlayCur = overlay.token(stream, state.overlay); |
(...skipping 19 matching lines...) Expand all Loading... |
76 innerMode: function(state) { return {state: state.base, mode: base}; }, | 76 innerMode: function(state) { return {state: state.base, mode: base}; }, |
77 | 77 |
78 blankLine: function(state) { | 78 blankLine: function(state) { |
79 if (base.blankLine) base.blankLine(state.base); | 79 if (base.blankLine) base.blankLine(state.base); |
80 if (overlay.blankLine) overlay.blankLine(state.overlay); | 80 if (overlay.blankLine) overlay.blankLine(state.overlay); |
81 } | 81 } |
82 }; | 82 }; |
83 }; | 83 }; |
84 | 84 |
85 }); | 85 }); |
OLD | NEW |