diff --git a/doc/manual.html b/doc/manual.html index b912a78f1966aa8cbc307feb5c39b55b57f17ef4..8da9cbb2a31fd3a7075d1435f6c0821c7b02dcca 100644 --- a/doc/manual.html +++ b/doc/manual.html @@ -1435,11 +1435,21 @@ editor.setOption("extraKeys", { spec</a> or a mode object (an object with a <a href="#token"><code>token</code></a> method). The <code>options</code> parameter is optional. If given, it - should be an object. Currently, only the <code>opaque</code> - option is recognized. This defaults to off, but can be given to - allow the overlay styling, when not <code>null</code>, to - override the styling of the base mode entirely, instead of the - two being applied together.</dd> + should be an object, optionally containing the following options: + <dl> + <dt><code><strong>opaque</strong>: bool</code></dt> + <dd>Defaults to off, but can be given to allow the overlay + styling, when not <code>null</code>, to override the styling of + the base mode entirely, instead of the two being applied + together.</dd> + <dt><code><strong>priority</strong>: number</code></dt> + <dd>Determines the ordering in which the overlays are + applied. Those with high priority are applied after those + with lower priority, and able to override the opaqueness of + the ones that come before. Defaults to 0.</dd> + </dl> + </dd> + <dt id="removeOverlay"><code><strong>cm.removeOverlay</strong>(mode: string|object)</code></dt> <dd>Pass this the exact value passed for the <code>mode</code> parameter to <a href="#addOverlay"><code>addOverlay</code></a>, diff --git a/lib/codemirror.js b/lib/codemirror.js index 0d34b8521a96f6159d9c38d0e32998e11d957cc2..b36b3697faa407a81829b220bca23df41ba53373 100644 --- a/lib/codemirror.js +++ b/lib/codemirror.js @@ -4952,7 +4952,10 @@ addOverlay: methodOp(function(spec, options) { var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); if (mode.startState) throw new Error("Overlays may not be stateful."); - this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque}); + insertSorted(this.state.overlays, + {mode: mode, modeSpec: spec, opaque: options && options.opaque, + priority: (options && options.priority) || 0}, + function(overlay) { return overlay.priority }) this.state.modeGen++; regChange(this); }), @@ -8370,6 +8373,13 @@ return out; } + function insertSorted(array, value, score) { + console.log(array) + var pos = 0, priority = score(value) + while (pos < array.length && score(array[pos]) <= priority) pos++ + array.splice(pos, 0, value) + } + function nothing() {} function createObj(base, props) {