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