@atlaskit/editor-plugin-code-block
Version:
Code block plugin for @atlaskit/editor-core
80 lines (75 loc) • 3.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createCodeBlockInputRule = createCodeBlockInputRule;
var _analytics = require("@atlaskit/editor-common/analytics");
var _commands = require("@atlaskit/editor-common/commands");
var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
var _utils = require("@atlaskit/editor-common/utils");
var _utils2 = require("@atlaskit/editor-prosemirror/utils");
var _prosemirrorInputRules = require("@atlaskit/prosemirror-input-rules");
var _transformToCodeBlock = require("./transform-to-code-block");
function createCodeBlockInputRule(schema, editorAnalyticsAPI) {
var rules = getCodeBlockRules(editorAnalyticsAPI, schema);
return new _safePlugin.SafePlugin((0, _prosemirrorInputRules.createPlugin)('code-block-input-rule', rules, {
isBlockNodeRule: true
}));
}
/**
* Get all code block input rules
*
* @param {Schema} schema
* @returns {InputRuleWithHandler[]}
*/
function getCodeBlockRules(editorAnalyticsAPI, schema) {
var ruleAnalytics = (0, _utils.inputRuleWithAnalytics)({
action: _analytics.ACTION.INSERTED,
actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
actionSubjectId: _analytics.ACTION_SUBJECT_ID.CODE_BLOCK,
attributes: {
inputMethod: _analytics.INPUT_METHOD.FORMATTING
},
eventType: _analytics.EVENT_TYPE.TRACK
}, editorAnalyticsAPI);
var validMatchLength = function validMatchLength(match) {
return match.length > 0 && match[0].length === 3;
};
// eslint-disable-next-line require-unicode-regexp
var threeTildeRule = (0, _utils.createRule)(/(?!\s)(`{3,})$/, function (state, match, start, end) {
if (!validMatchLength(match)) {
return null;
}
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
var attributes = {};
if (match[4]) {
attributes.language = match[4];
}
if ((0, _transformToCodeBlock.isConvertableToCodeBlock)(state)) {
return (0, _transformToCodeBlock.transformToCodeBlockAction)(state, start, attributes);
}
var tr = state.tr;
tr.delete(start, end);
var codeBlock = tr.doc.type.schema.nodes.codeBlock.createChecked();
(0, _utils2.safeInsert)(codeBlock)(tr);
return tr;
});
var leftNodeReplacementThreeTildeRule = (0, _utils.createRule)(
// Ignored via go/ees005
// eslint-disable-next-line require-unicode-regexp
new RegExp("((".concat(_prosemirrorInputRules.leafNodeReplacementCharacter, "`{3,})|^\\s(`{3,}))(\\S*)$")), function (state, match, start, end) {
if (!validMatchLength(match)) {
return null;
}
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
var attributes = {};
if (match[4]) {
attributes.language = match[4];
}
var inlineStart = Math.max(match.index + state.selection.$from.start(), 1);
return (0, _commands.insertBlock)(state, schema.nodes.codeBlock, inlineStart, end, attributes);
});
return [ruleAnalytics(threeTildeRule), ruleAnalytics(leftNodeReplacementThreeTildeRule)];
}