@atlaskit/editor-plugin-code-block
Version:
Code block plugin for @atlaskit/editor-core
542 lines (536 loc) • 24.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createFormatCodeOnClick = exports.copyContentToClipboardWithAnalytics = exports.copyContentToClipboard = exports.changeLanguage = void 0;
exports.createInsertCodeBlockTransaction = createInsertCodeBlockTransaction;
exports.ignoreFollowingMutations = exports.detectLanguage = void 0;
exports.insertCodeBlockWithAnalytics = insertCodeBlockWithAnalytics;
exports.toggleWordWrapStateForCodeBlockNode = exports.toggleLineNumbersForCodeBlockNodeEditorCommand = exports.toggleLineNumbersForCodeBlockNode = exports.resetShouldIgnoreFollowingMutations = exports.resetCopiedState = exports.removeCodeBlockWithAnalytics = exports.removeCodeBlock = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _analytics = require("@atlaskit/editor-common/analytics");
var _clipboard = require("@atlaskit/editor-common/clipboard");
var _codeBlock = require("@atlaskit/editor-common/code-block");
var _editorAnalytics = require("@atlaskit/editor-common/editor-analytics");
var _insert = require("@atlaskit/editor-common/insert");
var _preset = require("@atlaskit/editor-common/preset");
var _transforms = require("@atlaskit/editor-common/transforms");
var _state = require("@atlaskit/editor-prosemirror/state");
var _utils = require("@atlaskit/editor-prosemirror/utils");
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
var _actions = require("../pm-plugins/actions");
var _autoDetectState = require("../pm-plugins/auto-detect-state");
var _codeBlockCopySelectionPlugin = require("../pm-plugins/codeBlockCopySelectionPlugin");
var _pluginKey = require("../pm-plugins/plugin-key");
var _transformToCodeBlock = require("../pm-plugins/transform-to-code-block");
var _autoDetectState2 = require("../utils/auto-detect-state");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var removeCodeBlockWithAnalytics = exports.removeCodeBlockWithAnalytics = function removeCodeBlockWithAnalytics(editorAnalyticsAPI) {
return (0, _editorAnalytics.withAnalytics)(editorAnalyticsAPI, {
action: _analytics.ACTION.DELETED,
actionSubject: _analytics.ACTION_SUBJECT.CODE_BLOCK,
attributes: {
inputMethod: _analytics.INPUT_METHOD.FLOATING_TB
},
eventType: _analytics.EVENT_TYPE.TRACK
})(removeCodeBlock);
};
var removeCodeBlock = exports.removeCodeBlock = function removeCodeBlock(state, dispatch) {
var nodes = state.schema.nodes,
tr = state.tr;
if (dispatch) {
var removeTr = tr;
if ((0, _utils.findSelectedNodeOfType)(nodes.codeBlock)(tr.selection)) {
removeTr = (0, _utils.removeSelectedNode)(tr);
} else {
removeTr = (0, _utils.removeParentNodeOfType)(nodes.codeBlock)(tr);
}
dispatch(removeTr);
}
return true;
};
var changeLanguage = exports.changeLanguage = function changeLanguage(editorAnalyticsAPI) {
return function (language, selectionSource) {
return function (state, dispatch) {
var _pluginKey$getState, _autoDetectPluginKey$;
var codeBlock = state.schema.nodes.codeBlock;
var pos = (_pluginKey$getState = _pluginKey.pluginKey.getState(state)) === null || _pluginKey$getState === void 0 ? void 0 : _pluginKey$getState.pos;
if (typeof pos !== 'number') {
return false;
}
var node = state.doc.nodeAt(pos);
var localId = node === null || node === void 0 ? void 0 : node.attrs.localId;
var shouldIncludeAutoDetectionContext = (0, _expValEquals.expValEquals)('platform_editor_code_block_q4_lovability', 'isEnabled', true) && (0, _platformFeatureFlags.fg)('platform_editor_code_block_language_detection_flow');
var previousAutoDetectEntry = shouldIncludeAutoDetectionContext ? (_autoDetectPluginKey$ = _autoDetectState.autoDetectPluginKey.getState(state)) === null || _autoDetectPluginKey$ === void 0 ? void 0 : _autoDetectPluginKey$.languageDetectionMap[localId] : undefined;
var tr = state.tr.setNodeMarkup(pos, codeBlock, _objectSpread(_objectSpread({}, node === null || node === void 0 ? void 0 : node.attrs), {}, {
language: language
})).setMeta('scrollIntoView', false);
if (shouldIncludeAutoDetectionContext) {
tr.setMeta(_autoDetectState.autoDetectPluginKey, {
type: _actions.ACTIONS.REMOVE_AUTO_DETECT_ENTRY,
data: {
localId: localId
}
});
}
var selection = (0, _utils.isNodeSelection)(state.selection) ? _state.NodeSelection.create(tr.doc, pos) : tr.selection;
var result = tr.setSelection(selection);
if (dispatch) {
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
action: _analytics.ACTION.LANGUAGE_SELECTED,
actionSubject: _analytics.ACTION_SUBJECT.CODE_BLOCK,
attributes: _objectSpread(_objectSpread({
language: language !== null && language !== void 0 ? language : 'none'
}, selectionSource ? {
selectionSource: selectionSource
} : {}), shouldIncludeAutoDetectionContext ? {
autoDetectionResult: previousAutoDetectEntry === null || previousAutoDetectEntry === void 0 ? void 0 : previousAutoDetectEntry.detectionResult,
autoDetectedLanguage: previousAutoDetectEntry === null || previousAutoDetectEntry === void 0 ? void 0 : previousAutoDetectEntry.autoDetectedLanguage
} : {}),
eventType: _analytics.EVENT_TYPE.TRACK
})(result);
dispatch(result);
}
return true;
};
};
};
/** Queue auto-detection for selected code block. */
var detectLanguage = exports.detectLanguage = function detectLanguage() {
return function (state, dispatch) {
var _pluginKey$getState2;
var pos = (_pluginKey$getState2 = _pluginKey.pluginKey.getState(state)) === null || _pluginKey$getState2 === void 0 ? void 0 : _pluginKey$getState2.pos;
if (typeof pos !== 'number') {
return false;
}
var node = state.doc.nodeAt(pos);
if (!node) {
return false;
}
var localId = (0, _autoDetectState2.getLocalId)(node);
if (!localId) {
return false;
}
var autoDetectState = _autoDetectState.autoDetectPluginKey.getState(state);
var previousEntry = autoDetectState === null || autoDetectState === void 0 ? void 0 : autoDetectState.languageDetectionMap[localId];
var entry = (0, _autoDetectState2.createAutoDetectEntry)(node, pos, (0, _autoDetectState2.hasEnoughTextForAutoDetection)(node.textContent), previousEntry, {
preserveDetectionResult: false
});
var tr = state.tr.setNodeMarkup(pos, state.schema.nodes.codeBlock, _objectSpread(_objectSpread({}, node.attrs), {}, {
language: null
})).setMeta(_autoDetectState.autoDetectPluginKey, {
type: _actions.ACTIONS.SET_AUTO_DETECT_ENTRY,
data: {
localId: localId,
entry: entry
}
}).setMeta('scrollIntoView', false);
var selection = (0, _utils.isNodeSelection)(state.selection) ? _state.NodeSelection.create(tr.doc, pos) : tr.selection;
var result = tr.setSelection(selection);
if (dispatch) {
dispatch(result);
}
return true;
};
};
var setResolveFormatCodeMeta = function setResolveFormatCodeMeta(tr, _ref) {
var languageSource = _ref.languageSource,
localId = _ref.localId,
outcome = _ref.outcome,
requestId = _ref.requestId,
errorType = _ref.errorType;
return tr.setMeta(_pluginKey.pluginKey, {
type: _actions.ACTIONS.RESOLVE_FORMAT_CODE,
data: _objectSpread({
languageSource: languageSource,
localId: localId,
outcome: outcome,
requestId: requestId
}, errorType ? {
errorType: errorType
} : {})
});
};
var replaceCodeBlockText = function replaceCodeBlockText(_ref2) {
var codeBlockNode = _ref2.codeBlockNode,
content = _ref2.content,
pos = _ref2.pos,
tr = _ref2.tr;
var from = pos + 1;
var to = pos + codeBlockNode.nodeSize - 1;
tr.delete(from, to);
if (content) {
tr.insertText(content, from);
}
// The editor scroll plugin scrolls doc-changing transactions by default.
return tr.setMeta('scrollIntoView', false);
};
var attachFormatCodeAnalytics = function attachFormatCodeAnalytics(_ref3) {
var editorAnalyticsAPI = _ref3.editorAnalyticsAPI,
languageSource = _ref3.languageSource,
result = _ref3.result,
tr = _ref3.tr;
if (result.status === 'failed') {
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
action: _analytics.ACTION.ERRORED,
actionSubject: _analytics.ACTION_SUBJECT.CODE_BLOCK,
attributes: {
errorType: result.errorType,
language: result.language,
languageSource: languageSource
},
eventType: _analytics.EVENT_TYPE.TRACK
})(tr);
return;
}
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
action: _analytics.ACTION.FORMATTED,
actionSubject: _analytics.ACTION_SUBJECT.CODE_BLOCK,
attributes: {
language: result.language,
languageSource: languageSource,
outcome: result.status
},
eventType: _analytics.EVENT_TYPE.TRACK
})(tr);
};
var createResolveFormatCodeTransaction = function createResolveFormatCodeTransaction(_ref4) {
var editorAnalyticsAPI = _ref4.editorAnalyticsAPI,
localId = _ref4.localId,
pendingFormat = _ref4.pendingFormat,
result = _ref4.result,
tr = _ref4.tr;
var languageSource = pendingFormat.languageSource,
requestId = pendingFormat.requestId;
var codeBlockNode = tr.doc.nodeAt(pendingFormat.pos);
var hasMatchingCodeBlock = (codeBlockNode === null || codeBlockNode === void 0 ? void 0 : codeBlockNode.type) === tr.doc.type.schema.nodes.codeBlock && (codeBlockNode === null || codeBlockNode === void 0 ? void 0 : codeBlockNode.attrs.localId) === localId;
if (!hasMatchingCodeBlock) {
// Keep failure telemetry even when the target block is no longer available.
if (result.status === 'failed') {
attachFormatCodeAnalytics({
editorAnalyticsAPI: editorAnalyticsAPI,
languageSource: languageSource,
result: result,
tr: tr
});
}
return setResolveFormatCodeMeta(tr, {
languageSource: languageSource,
localId: localId,
outcome: 'unchanged',
requestId: requestId
});
}
var resultTransaction = tr;
if (result.status === 'formatted') {
resultTransaction = replaceCodeBlockText({
codeBlockNode: codeBlockNode,
content: result.content,
pos: pendingFormat.pos,
tr: tr
});
}
attachFormatCodeAnalytics({
editorAnalyticsAPI: editorAnalyticsAPI,
languageSource: languageSource,
result: result,
tr: resultTransaction
});
return setResolveFormatCodeMeta(resultTransaction, {
errorType: result.status === 'failed' ? result.errorType : undefined,
languageSource: languageSource,
localId: localId,
outcome: result.status,
requestId: requestId
});
};
var createFormatCodeOnClick = exports.createFormatCodeOnClick = function createFormatCodeOnClick(_ref5) {
var api = _ref5.api,
editorAnalyticsAPI = _ref5.editorAnalyticsAPI,
formatCodeProvider = _ref5.formatCodeProvider;
return function (state, dispatch) {
var _currentNode$attrs$la, _autoDetectPluginKey$2, _api$core;
if (!formatCodeProvider) {
return false;
}
var currentCodeBlockState = _pluginKey.pluginKey.getState(state);
var currentPos = currentCodeBlockState === null || currentCodeBlockState === void 0 ? void 0 : currentCodeBlockState.pos;
if (!currentCodeBlockState || typeof currentPos !== 'number') {
return false;
}
var currentNode = state.doc.nodeAt(currentPos);
if (!currentNode || currentNode.type !== state.schema.nodes.codeBlock) {
return false;
}
var currentLanguage = (_currentNode$attrs$la = currentNode.attrs.language) !== null && _currentNode$attrs$la !== void 0 ? _currentNode$attrs$la : '';
var currentLocalId = currentNode.attrs.localId;
if (currentCodeBlockState.pendingFormats[currentLocalId]) {
return true;
}
var autoDetectEntry = (_autoDetectPluginKey$2 = _autoDetectState.autoDetectPluginKey.getState(state)) === null || _autoDetectPluginKey$2 === void 0 ? void 0 : _autoDetectPluginKey$2.languageDetectionMap[currentLocalId];
var languageSource = (autoDetectEntry === null || autoDetectEntry === void 0 ? void 0 : autoDetectEntry.autoDetectedLanguage) === currentLanguage ? 'auto-detected' : 'selected';
var content = currentNode.textContent;
var requestId = crypto.randomUUID();
api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(function (_ref6) {
var tr = _ref6.tr;
return tr.setMeta(_pluginKey.pluginKey, {
type: _actions.ACTIONS.START_FORMAT_CODE,
data: {
languageSource: languageSource,
localId: currentLocalId,
pos: currentPos,
requestId: requestId
}
});
});
void formatCodeProvider.formatCode({
content: content,
language: currentLanguage
}).catch(function () {
return {
errorType: 'formatter-execution-failed',
language: currentLanguage,
status: 'failed'
};
}).then(function (result) {
var _api$codeBlock, _api$core2;
var pendingFormat = api === null || api === void 0 || (_api$codeBlock = api.codeBlock) === null || _api$codeBlock === void 0 || (_api$codeBlock = _api$codeBlock.sharedState.currentState()) === null || _api$codeBlock === void 0 ? void 0 : _api$codeBlock.pendingFormats[currentLocalId];
if (!pendingFormat || pendingFormat.requestId !== requestId) {
return;
}
api === null || api === void 0 || (_api$core2 = api.core) === null || _api$core2 === void 0 || _api$core2.actions.execute(function (_ref7) {
var tr = _ref7.tr;
return createResolveFormatCodeTransaction({
editorAnalyticsAPI: editorAnalyticsAPI,
localId: currentLocalId,
pendingFormat: pendingFormat,
result: result,
tr: tr
});
});
});
return true;
};
};
var copyContentToClipboardWithAnalytics = exports.copyContentToClipboardWithAnalytics = function copyContentToClipboardWithAnalytics(editorAnalyticsAPI) {
return function (state, dispatch) {
var nodes = state.schema.nodes,
tr = state.tr;
var codeBlock = (0, _utils.findParentNodeOfType)(nodes.codeBlock)(tr.selection);
var textContent = codeBlock && codeBlock.node.textContent;
if (textContent) {
(0, _clipboard.copyToClipboard)(textContent);
var copyToClipboardTr = tr;
copyToClipboardTr.setMeta(_pluginKey.pluginKey, {
type: _actions.ACTIONS.SET_COPIED_TO_CLIPBOARD,
data: true
});
copyToClipboardTr.setMeta(_codeBlockCopySelectionPlugin.copySelectionPluginKey, 'remove-selection');
if (editorAnalyticsAPI) {
var analyticsPayload = (0, _clipboard.getAnalyticsPayload)(state, _analytics.ACTION.COPIED);
if (analyticsPayload) {
analyticsPayload.attributes.inputMethod = _analytics.INPUT_METHOD.FLOATING_TB;
analyticsPayload.attributes.nodeType = codeBlock === null || codeBlock === void 0 ? void 0 : codeBlock.node.type.name;
editorAnalyticsAPI.attachAnalyticsEvent(analyticsPayload)(copyToClipboardTr);
}
}
if (dispatch) {
dispatch(copyToClipboardTr);
}
}
return true;
};
};
var copyContentToClipboard = exports.copyContentToClipboard = function copyContentToClipboard(state, dispatch) {
var nodes = state.schema.nodes,
tr = state.tr;
var codeBlock = (0, _utils.findParentNodeOfType)(nodes.codeBlock)(tr.selection);
var textContent = codeBlock && codeBlock.node.textContent;
if (textContent) {
(0, _clipboard.copyToClipboard)(textContent);
var copyToClipboardTr = tr;
copyToClipboardTr.setMeta(_pluginKey.pluginKey, {
type: _actions.ACTIONS.SET_COPIED_TO_CLIPBOARD,
data: true
});
copyToClipboardTr.setMeta(_codeBlockCopySelectionPlugin.copySelectionPluginKey, 'remove-selection');
if (dispatch) {
dispatch(copyToClipboardTr);
}
}
return true;
};
var resetCopiedState = exports.resetCopiedState = function resetCopiedState(state, dispatch) {
var tr = state.tr;
var codeBlockState = _pluginKey.pluginKey.getState(state);
var resetCopiedStateTr = tr;
if (codeBlockState && codeBlockState.contentCopied) {
resetCopiedStateTr.setMeta(_pluginKey.pluginKey, {
type: _actions.ACTIONS.SET_COPIED_TO_CLIPBOARD,
data: false
});
resetCopiedStateTr.setMeta(_codeBlockCopySelectionPlugin.copySelectionPluginKey, 'remove-selection');
if (dispatch) {
dispatch(resetCopiedStateTr);
}
} else {
var clearSelectionStateTransaction = state.tr;
clearSelectionStateTransaction.setMeta(_codeBlockCopySelectionPlugin.copySelectionPluginKey, 'remove-selection');
// note: dispatch should always be defined when called from the
// floating toolbar. Howver the Command type which floating toolbar uses
// (and resetCopiedState) uses suggests it's optional.
if (dispatch) {
dispatch(clearSelectionStateTransaction);
}
}
return true;
};
var ignoreFollowingMutations = exports.ignoreFollowingMutations = function ignoreFollowingMutations(state, dispatch) {
var tr = state.tr;
var ignoreFollowingMutationsTr = tr;
ignoreFollowingMutationsTr.setMeta(_pluginKey.pluginKey, {
type: _actions.ACTIONS.SET_SHOULD_IGNORE_FOLLOWING_MUTATIONS,
data: true
});
if (dispatch) {
dispatch(ignoreFollowingMutationsTr);
}
return true;
};
var resetShouldIgnoreFollowingMutations = exports.resetShouldIgnoreFollowingMutations = function resetShouldIgnoreFollowingMutations(state, dispatch) {
var tr = state.tr;
var ignoreFollowingMutationsTr = tr;
ignoreFollowingMutationsTr.setMeta(_pluginKey.pluginKey, {
type: _actions.ACTIONS.SET_SHOULD_IGNORE_FOLLOWING_MUTATIONS,
data: false
});
if (dispatch) {
dispatch(ignoreFollowingMutationsTr);
}
return true;
};
/**
* This function creates a new transaction that inserts a code block,
* if there is text selected it will wrap the current selection if not it will
* append the codeblock to the end of the document.
*/
function createInsertCodeBlockTransaction(_ref8) {
var state = _ref8.state;
var tr = state.tr;
var from = state.selection.from;
var codeBlock = state.schema.nodes.codeBlock;
var codeBlockAttrs = (0, _codeBlock.getDefaultCodeBlockAttrs)();
var grandParentNode = state.selection.$from.node(-1);
var grandParentNodeType = grandParentNode === null || grandParentNode === void 0 ? void 0 : grandParentNode.type;
var parentNodeType = state.selection.$from.parent.type;
/** We always want to append a codeBlock unless we're inserting into a paragraph
* AND it's a valid child of the grandparent node.
* Insert the current selection as codeBlock content unless it contains nodes other
* than paragraphs and inline.
*/
var canInsertCodeBlock = (0, _insert.shouldSplitSelectedNodeOnNodeInsertion)({
parentNodeType: parentNodeType,
grandParentNodeType: grandParentNodeType,
content: codeBlock.createAndFill()
}) && (0, _insert.contentAllowedInCodeBlock)(state);
if (canInsertCodeBlock) {
tr = (0, _transformToCodeBlock.transformToCodeBlockAction)(state, from, codeBlockAttrs);
} else {
(0, _utils.safeInsert)(codeBlock.createAndFill(codeBlockAttrs))(tr).scrollIntoView();
}
return tr;
}
function insertCodeBlockWithAnalytics(inputMethod, analyticsAPI) {
return (0, _editorAnalytics.withAnalytics)(analyticsAPI, {
action: _analytics.ACTION.INSERTED,
actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
actionSubjectId: _analytics.ACTION_SUBJECT_ID.CODE_BLOCK,
attributes: {
inputMethod: inputMethod
},
eventType: _analytics.EVENT_TYPE.TRACK
})(function (state, dispatch) {
var tr = createInsertCodeBlockTransaction({
state: state
});
if (dispatch) {
dispatch(tr);
}
return true;
});
}
/**
* Add the given node to the codeBlockWrappedStates WeakMap with the toggle boolean value.
*/
var toggleWordWrapStateForCodeBlockNode = exports.toggleWordWrapStateForCodeBlockNode = function toggleWordWrapStateForCodeBlockNode(editorAnalyticsAPI) {
return function (state, dispatch) {
var codeBlock = (0, _transforms.findCodeBlock)(state);
var codeBlockNode = codeBlock === null || codeBlock === void 0 ? void 0 : codeBlock.node;
var tr = state.tr;
if (!_codeBlock.codeBlockWrappedStates || !codeBlockNode) {
return false;
}
var updatedToggleState = !(0, _codeBlock.isCodeBlockWordWrapEnabled)(codeBlockNode);
if ((0, _expValEquals.expValEquals)('platform_editor_code_block_q4_lovability', 'isEnabled', true)) {
tr.setNodeMarkup(codeBlock.pos, undefined, _objectSpread(_objectSpread({}, codeBlockNode.attrs), {}, {
wrap: updatedToggleState
}));
if ((0, _platformFeatureFlags.fg)('platform_editor_code_block_dogfooding_patch')) {
tr.setMeta('scrollIntoView', false);
}
} else {
_codeBlock.codeBlockWrappedStates.set(codeBlockNode, updatedToggleState);
}
tr.setMeta(_pluginKey.pluginKey, {
type: _actions.ACTIONS.SET_IS_WRAPPED,
data: updatedToggleState
});
if (dispatch) {
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
action: _analytics.ACTION.TOGGLE_CODE_BLOCK_WRAP,
actionSubject: _analytics.ACTION_SUBJECT.CODE_BLOCK,
attributes: {
platform: _analytics.PLATFORMS.WEB,
mode: _analytics.MODE.EDITOR,
wordWrapEnabled: updatedToggleState,
codeBlockNodeSize: codeBlockNode.nodeSize
},
eventType: _analytics.EVENT_TYPE.TRACK
})(tr);
dispatch(tr);
}
return true;
};
};
var toggleLineNumbersForCodeBlockNodeEditorCommand = exports.toggleLineNumbersForCodeBlockNodeEditorCommand = function toggleLineNumbersForCodeBlockNodeEditorCommand(editorAnalyticsAPI) {
return function (_ref9) {
var tr = _ref9.tr;
var codeBlockType = tr.doc.type.schema.nodes.codeBlock;
var codeBlock = (0, _utils.findSelectedNodeOfType)(codeBlockType)(tr.selection) || (0, _utils.findParentNodeOfType)(codeBlockType)(tr.selection);
if (!codeBlock) {
return null;
}
var codeBlockNode = codeBlock.node;
var lineNumbersHidden = !Boolean(codeBlockNode.attrs.hideLineNumbers);
tr.setNodeMarkup(codeBlock.pos, undefined, _objectSpread(_objectSpread({}, codeBlockNode.attrs), {}, {
hideLineNumbers: lineNumbersHidden
}));
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
action: _analytics.ACTION.TOGGLE_CODE_BLOCK_LINE_NUMBERS,
actionSubject: _analytics.ACTION_SUBJECT.CODE_BLOCK,
attributes: {
platform: _analytics.PLATFORMS.WEB,
lineNumbersHidden: lineNumbersHidden,
codeBlockNodeSize: codeBlockNode.nodeSize
},
eventType: _analytics.EVENT_TYPE.TRACK
})(tr);
return tr;
};
};
var toggleLineNumbersForCodeBlockNode = exports.toggleLineNumbersForCodeBlockNode = function toggleLineNumbersForCodeBlockNode(editorAnalyticsAPI) {
return (0, _preset.editorCommandToPMCommand)(toggleLineNumbersForCodeBlockNodeEditorCommand(editorAnalyticsAPI));
};