@atlaskit/editor-plugin-code-block
Version:
Code block plugin for @atlaskit/editor-core
115 lines (114 loc) • 4.91 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.indent = void 0;
exports.insertIndent = insertIndent;
exports.insertNewlineWithIndent = insertNewlineWithIndent;
exports.outdent = void 0;
var _analytics = require("@atlaskit/editor-common/analytics");
var _state = require("@atlaskit/editor-prosemirror/state");
var _lineHandling = require("./line-handling");
/**
* Return the current indentation level
* @param indentText - Text in the code block that represent an indentation
* @param indentSize - Size of the indentation token in a string
*/
function getIndentLevel(indentText, indentSize) {
if (indentSize === 0 || indentText.length === 0) {
return 0;
}
return indentText.length / indentSize;
}
var indent = exports.indent = function indent(editorAnalyticsAPI) {
return function (state, dispatch) {
var _getLinesFromSelectio = (0, _lineHandling.getLinesFromSelection)(state),
text = _getLinesFromSelectio.text,
start = _getLinesFromSelectio.start;
var tr = state.tr,
selection = state.selection;
(0, _lineHandling.forEachLine)(text, function (line, offset) {
var _getLineInfo = (0, _lineHandling.getLineInfo)(line),
indentText = _getLineInfo.indentText,
indentToken = _getLineInfo.indentToken;
var indentLevel = getIndentLevel(indentText, indentToken.size);
var indentToAdd = indentToken.token.repeat(indentToken.size - indentText.length % indentToken.size || indentToken.size);
tr.insertText(indentToAdd, tr.mapping.map(start + offset, -1));
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
action: _analytics.ACTION.FORMATTED,
actionSubject: _analytics.ACTION_SUBJECT.TEXT,
actionSubjectId: _analytics.ACTION_SUBJECT_ID.FORMAT_INDENT,
eventType: _analytics.EVENT_TYPE.TRACK,
attributes: {
inputMethod: _analytics.INPUT_METHOD.KEYBOARD,
previousIndentationLevel: indentLevel,
newIndentLevel: indentLevel + 1,
direction: _analytics.INDENT_DIRECTION.INDENT,
indentType: _analytics.INDENT_TYPE.CODE_BLOCK
}
})(tr);
if (!selection.empty) {
tr.setSelection(_state.TextSelection.create(tr.doc, tr.mapping.map(selection.from, -1), tr.selection.to));
}
});
if (dispatch) {
dispatch(tr);
}
return true;
};
};
var outdent = exports.outdent = function outdent(editorAnalyticsAPI) {
return function (state, dispatch) {
var _getLinesFromSelectio2 = (0, _lineHandling.getLinesFromSelection)(state),
text = _getLinesFromSelectio2.text,
start = _getLinesFromSelectio2.start;
var tr = state.tr;
(0, _lineHandling.forEachLine)(text, function (line, offset) {
var _getLineInfo2 = (0, _lineHandling.getLineInfo)(line),
indentText = _getLineInfo2.indentText,
indentToken = _getLineInfo2.indentToken;
if (indentText) {
var indentLevel = getIndentLevel(indentText, indentToken.size);
var unindentLength = indentText.length % indentToken.size || indentToken.size;
tr.delete(tr.mapping.map(start + offset), tr.mapping.map(start + offset + unindentLength));
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
action: _analytics.ACTION.FORMATTED,
actionSubject: _analytics.ACTION_SUBJECT.TEXT,
actionSubjectId: _analytics.ACTION_SUBJECT_ID.FORMAT_INDENT,
eventType: _analytics.EVENT_TYPE.TRACK,
attributes: {
inputMethod: _analytics.INPUT_METHOD.KEYBOARD,
previousIndentationLevel: indentLevel,
newIndentLevel: indentLevel - 1,
direction: _analytics.INDENT_DIRECTION.OUTDENT,
indentType: _analytics.INDENT_TYPE.CODE_BLOCK
}
})(tr);
}
});
if (dispatch) {
dispatch(tr);
}
return true;
};
};
function insertIndent(state, dispatch) {
var _getStartOfCurrentLin = (0, _lineHandling.getStartOfCurrentLine)(state),
textAtStartOfLine = _getStartOfCurrentLin.text;
var _getLineInfo3 = (0, _lineHandling.getLineInfo)(textAtStartOfLine),
indentToken = _getLineInfo3.indentToken;
var indentToAdd = indentToken.token.repeat(indentToken.size - textAtStartOfLine.length % indentToken.size || indentToken.size);
dispatch(state.tr.insertText(indentToAdd));
return true;
}
function insertNewlineWithIndent(state, dispatch) {
var _getStartOfCurrentLin2 = (0, _lineHandling.getStartOfCurrentLine)(state),
textAtStartOfLine = _getStartOfCurrentLin2.text;
var _getLineInfo4 = (0, _lineHandling.getLineInfo)(textAtStartOfLine),
indentText = _getLineInfo4.indentText;
if (indentText && dispatch) {
dispatch(state.tr.insertText('\n' + indentText));
return true;
}
return false;
}