@alisowski/codemirror-extensions-zebra-stripes
Version:
Styles alternating lines for CodeMirror6.
124 lines (123 loc) • 4.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.zebraStripes = zebraStripes;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _state = require("@codemirror/state");
var _view = require("@codemirror/view");
var lineNumber = _state.Facet.define({
combine: function combine(values) {
return values.length && Array.isArray(values) ? values.flat() : [];
}
});
var stepSize = _state.Facet.define({
combine: function combine(values) {
return values.length && Array.isArray(values) ? Math.min.apply(Math, (0, _toConsumableArray2["default"])(values)) : 2;
}
});
var stripe = _view.Decoration.line({
attributes: {
"class": 'cm-zebra-stripe'
}
});
function stripeDeco(view) {
var step = view.state.facet(stepSize);
var num = view.state.facet(lineNumber);
var builder = new _state.RangeSetBuilder();
var _iterator = (0, _createForOfIteratorHelper2["default"])(view.visibleRanges),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var _step$value = _step.value,
from = _step$value.from,
to = _step$value.to;
for (var pos = from; pos <= to;) {
var line = view.state.doc.lineAt(pos);
if (line.number % step === 0 && num.length === 0) {
builder.add(line.from, line.from, stripe);
}
if (num.length > 0 && num.flat().includes(line.number)) {
builder.add(line.from, line.from, stripe);
}
pos = line.to + 1;
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return builder.finish();
}
var showStripes = _view.ViewPlugin.fromClass(/*#__PURE__*/function () {
function _class(view) {
(0, _classCallCheck2["default"])(this, _class);
(0, _defineProperty2["default"])(this, "decorations", void 0);
this.decorations = stripeDeco(view);
}
return (0, _createClass2["default"])(_class, [{
key: "update",
value: function update(_update) {
this.decorations = stripeDeco(_update.view);
// if (update.docChanged || update.viewportChanged) {
// this.decorations = stripeDeco(update.view);
// }
}
}]);
}(), {
decorations: function decorations(v) {
return v.decorations;
}
});
var baseTheme = function baseTheme() {
var opt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return _view.EditorView.baseTheme((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, "&light .".concat(opt.className), {
backgroundColor: opt.lightColor || '#eef6ff'
}), "&dark .".concat(opt.className), {
backgroundColor: opt.darkColor || '#3a404d'
}));
};
var range = function range(start, stop, step) {
return Array.from({
length: (stop - start) / step + 1
}, function (_, i) {
return start + i * step;
});
};
function zebraStripes() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _options$className = options.className,
className = _options$className === void 0 ? 'cm-zebra-stripe' : _options$className;
stripe = _view.Decoration.line({
attributes: {
"class": className
}
});
if (options.lineNumber && Array.isArray(options.lineNumber)) {
options.step = null;
options.lineNumber = options.lineNumber.map(function (item) {
if (Array.isArray(item) && typeof item[0] === 'number' && typeof item[1] === 'number') {
return range(item[0], item[1], 1);
}
return item;
});
} else {
options.lineNumber = null;
}
var extensions = [options.lineNumber === null ? [] : lineNumber.of(options.lineNumber || []), options.step === null ? [] : stepSize.of(options.step || 2), showStripes];
if (className) {
var zebraStripeTheme = baseTheme({
lightColor: options.lightColor,
darkColor: options.darkColor,
className: className
});
extensions.push(zebraStripeTheme);
}
return extensions;
}