1197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// CodeMirror, copyright (c) by Marijn Haverbeke and others 2197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Distributed under an MIT license: http://codemirror.net/LICENSE 3197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 45267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// Utility function that allows modes to be combined. The mode given 55267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// as the base argument takes care of most of the normal mode 65267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// functionality, but a second (typically simple) mode is used, which 75267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// can override the style of text. Both modes get to parse all of the 85267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// text, but when both assign a non-null style to a piece of code, the 9197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// overlay wins, unless the combine argument was true and not overridden, 10197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// or state.overlay.combineTokens was true, in which case the styles are 11197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// combined. 12197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 13197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch(function(mod) { 14197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (typeof exports == "object" && typeof module == "object") // CommonJS 15197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch mod(require("../../lib/codemirror")); 16197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else if (typeof define == "function" && define.amd) // AMD 17197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch define(["../../lib/codemirror"], mod); 18197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else // Plain browser env 19197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch mod(CodeMirror); 20197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch})(function(CodeMirror) { 21197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch"use strict"; 225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 23197021e6b966cfb06891637935ef33fff06433d1Ben MurdochCodeMirror.overlayMode = function(base, overlay, combine) { 245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return { 255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) startState: function() { 265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return { 275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) base: CodeMirror.startState(base), 285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) overlay: CodeMirror.startState(overlay), 295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) basePos: 0, baseCur: null, 30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch overlayPos: 0, overlayCur: null, 31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch lineSeen: null 325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }; 335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }, 345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) copyState: function(state) { 355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return { 365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) base: CodeMirror.copyState(base, state.base), 375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) overlay: CodeMirror.copyState(overlay, state.overlay), 385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) basePos: state.basePos, baseCur: null, 395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) overlayPos: state.overlayPos, overlayCur: null 405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }; 415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }, 425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) token: function(stream, state) { 44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (stream.sol() || stream.string != state.lineSeen || 45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Math.min(state.basePos, state.overlayPos) < stream.start) { 46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch state.lineSeen = stream.string; 47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch state.basePos = state.overlayPos = stream.start; 48197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (stream.start == state.basePos) { 515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) state.baseCur = base.token(stream, state.base); 525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) state.basePos = stream.pos; 535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (stream.start == state.overlayPos) { 555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) stream.pos = stream.start; 565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) state.overlayCur = overlay.token(stream, state.overlay); 575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) state.overlayPos = stream.pos; 585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) stream.pos = Math.min(state.basePos, state.overlayPos); 605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // state.overlay.combineTokens always takes precedence over combine, 62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // unless set to null 635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (state.overlayCur == null) return state.baseCur; 64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else if (state.baseCur != null && 65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch state.overlay.combineTokens || 66197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch combine && state.overlay.combineTokens == null) 67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return state.baseCur + " " + state.overlayCur; 685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) else return state.overlayCur; 695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }, 705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) indent: base.indent && function(state, textAfter) { 725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return base.indent(state.base, textAfter); 735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }, 745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) electricChars: base.electricChars, 755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) innerMode: function(state) { return {state: state.base, mode: base}; }, 775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) blankLine: function(state) { 795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (base.blankLine) base.blankLine(state.base); 805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (overlay.blankLine) overlay.blankLine(state.overlay); 815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }; 835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}; 84197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}); 86