UNPKG

@alisowski/codemirror-extensions-zebra-stripes

Version:

Styles alternating lines for CodeMirror6.

124 lines (123 loc) 4.5 kB
"use strict"; 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; }