@gravity-ui/markdown-editor 15.32.0 → 15.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +95 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +54 -30
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +27 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +5 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +55 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +80 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +9 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/index.d.ts +8 -0
- package/build/cjs/extensions/markdown/CodeBlock/index.js +4 -0
- package/build/cjs/extensions/markdown/CodeBlock/index.js.map +1 -1
- package/build/cjs/i18n/codeblock/en.json +1 -0
- package/build/cjs/i18n/codeblock/index.d.ts +2 -1
- package/build/cjs/i18n/codeblock/ru.json +1 -0
- package/build/cjs/i18n/viewer/en.json +3 -0
- package/build/cjs/i18n/viewer/index.d.ts +5 -0
- package/build/cjs/i18n/viewer/index.js +10 -0
- package/build/cjs/i18n/viewer/index.js.map +1 -0
- package/build/cjs/i18n/viewer/ru.json +3 -0
- package/build/cjs/plugins/BaseTooltip/index.d.ts +1 -1
- package/build/cjs/plugins/BaseTooltip/index.js +1 -1
- package/build/cjs/plugins/BaseTooltip/index.js.map +1 -1
- package/build/cjs/toolbar/ToolbarButton.d.ts +1 -1
- package/build/cjs/toolbar/ToolbarButton.js +2 -2
- package/build/cjs/toolbar/ToolbarButton.js.map +1 -1
- package/build/cjs/toolbar/types.d.ts +1 -0
- package/build/cjs/toolbar/types.js.map +1 -1
- package/build/cjs/types/node-view.d.ts +11 -0
- package/build/cjs/types/node-view.js +3 -0
- package/build/cjs/types/node-view.js.map +1 -0
- package/build/cjs/utils/truthy.d.ts +4 -0
- package/build/cjs/utils/truthy.js +11 -0
- package/build/cjs/utils/truthy.js.map +1 -0
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/cjs/view/hocs/index.d.ts +1 -0
- package/build/cjs/view/hocs/index.js +5 -0
- package/build/cjs/view/hocs/index.js.map +1 -0
- package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
- package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js +16 -0
- package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
- package/build/cjs/view/hocs/withCodeBlockActions/index.d.ts +15 -0
- package/build/cjs/view/hocs/withCodeBlockActions/index.js +63 -0
- package/build/cjs/view/hocs/withCodeBlockActions/index.js.map +1 -0
- package/build/cjs/view/hocs/withCodeBlockActions/styles.css +27 -0
- package/build/cjs/view/index.d.ts +1 -0
- package/build/cjs/view/index.js +1 -0
- package/build/cjs/view/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +91 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +57 -33
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +21 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +2 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +51 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +72 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +6 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/index.d.ts +8 -0
- package/build/esm/extensions/markdown/CodeBlock/index.js +4 -0
- package/build/esm/extensions/markdown/CodeBlock/index.js.map +1 -1
- package/build/esm/i18n/codeblock/en.json +1 -0
- package/build/esm/i18n/codeblock/index.d.ts +2 -1
- package/build/esm/i18n/codeblock/ru.json +1 -0
- package/build/esm/i18n/viewer/en.json +3 -0
- package/build/esm/i18n/viewer/index.d.ts +5 -0
- package/build/esm/i18n/viewer/index.js +6 -0
- package/build/esm/i18n/viewer/index.js.map +1 -0
- package/build/esm/i18n/viewer/ru.json +3 -0
- package/build/esm/plugins/BaseTooltip/index.d.ts +1 -1
- package/build/esm/plugins/BaseTooltip/index.js +1 -1
- package/build/esm/plugins/BaseTooltip/index.js.map +1 -1
- package/build/esm/toolbar/ToolbarButton.d.ts +1 -1
- package/build/esm/toolbar/ToolbarButton.js +2 -2
- package/build/esm/toolbar/ToolbarButton.js.map +1 -1
- package/build/esm/toolbar/types.d.ts +1 -0
- package/build/esm/toolbar/types.js.map +1 -1
- package/build/esm/types/node-view.d.ts +11 -0
- package/build/esm/types/node-view.js +2 -0
- package/build/esm/types/node-view.js.map +1 -0
- package/build/esm/utils/truthy.d.ts +4 -0
- package/build/esm/utils/truthy.js +7 -0
- package/build/esm/utils/truthy.js.map +1 -0
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/esm/view/hocs/index.d.ts +1 -0
- package/build/esm/view/hocs/index.js +2 -0
- package/build/esm/view/hocs/index.js.map +1 -0
- package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
- package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js +13 -0
- package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
- package/build/esm/view/hocs/withCodeBlockActions/index.d.ts +15 -0
- package/build/esm/view/hocs/withCodeBlockActions/index.js +60 -0
- package/build/esm/view/hocs/withCodeBlockActions/index.js.map +1 -0
- package/build/esm/view/hocs/withCodeBlockActions/styles.css +27 -0
- package/build/esm/view/index.d.ts +1 -0
- package/build/esm/view/index.js +1 -0
- package/build/esm/view/index.js.map +1 -1
- package/build/styles.css +46 -10
- package/package.json +1 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toggleLineWrapping = exports.toggleLineNumbers = exports.isLineNumbersVisible = void 0;
|
|
4
|
+
const CodeBlockSpecs_1 = require("../../CodeBlockSpecs/index.js");
|
|
5
|
+
const codeBlockLineWrappingPlugin_1 = require("../plugins/codeBlockLineWrappingPlugin.js");
|
|
6
|
+
const utils_1 = require("../utils.js");
|
|
7
|
+
/** @internal */
|
|
8
|
+
var utils_2 = require("../utils.js");
|
|
9
|
+
Object.defineProperty(exports, "isLineNumbersVisible", { enumerable: true, get: function () { return utils_2.isLineNumbersVisible; } });
|
|
10
|
+
/** @internal */
|
|
11
|
+
const toggleLineNumbers = ({ node, pos, state, dispatch }) => {
|
|
12
|
+
const showLineNumbers = (0, utils_1.isLineNumbersVisible)(node);
|
|
13
|
+
dispatch(state.tr.setNodeAttribute(pos, CodeBlockSpecs_1.CodeBlockNodeAttr.ShowLineNumbers, showLineNumbers ? '' : 'true'));
|
|
14
|
+
};
|
|
15
|
+
exports.toggleLineNumbers = toggleLineNumbers;
|
|
16
|
+
/** @internal */
|
|
17
|
+
const toggleLineWrapping = ({ pos, state, dispatch }) => {
|
|
18
|
+
const { tr } = state;
|
|
19
|
+
const hasLineWrapping = (0, codeBlockLineWrappingPlugin_1.isNodeHasLineWrapping)(state, pos);
|
|
20
|
+
if (hasLineWrapping)
|
|
21
|
+
(0, codeBlockLineWrappingPlugin_1.disableLineWrapping)(tr, pos);
|
|
22
|
+
else
|
|
23
|
+
(0, codeBlockLineWrappingPlugin_1.enableLineWrapping)(tr, pos);
|
|
24
|
+
dispatch(tr);
|
|
25
|
+
};
|
|
26
|
+
exports.toggleLineWrapping = toggleLineWrapping;
|
|
27
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.ts"],"names":[],"mappings":";;;AAGA,kEAAuD;AACvD,2FAIgD;AAChD,uCAA8C;AAE9C,gBAAgB;AAChB,qCAA8C;AAAtC,6GAAA,oBAAoB,OAAA;AAE5B,gBAAgB;AACT,MAAM,iBAAiB,GAKjB,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC1C,MAAM,eAAe,GAAG,IAAA,4BAAoB,EAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,CACJ,KAAK,CAAC,EAAE,CAAC,gBAAgB,CACrB,GAAG,EACH,kCAAiB,CAAC,eAAe,EACjC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAChC,CACJ,CAAC;AACN,CAAC,CAAC;AAdW,QAAA,iBAAiB,qBAc5B;AAEF,gBAAgB;AACT,MAAM,kBAAkB,GAKlB,CAAC,EAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAC,EAAE,EAAE;IACpC,MAAM,EAAC,EAAE,EAAC,GAAG,KAAK,CAAC;IACnB,MAAM,eAAe,GAAG,IAAA,mDAAqB,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,eAAe;QAAE,IAAA,iDAAmB,EAAC,EAAE,EAAE,GAAG,CAAC,CAAC;;QAC7C,IAAA,gDAAkB,EAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC,CAAC;AAXW,QAAA,kBAAkB,sBAW7B","sourcesContent":["import type {Node} from '#pm/model';\nimport type {EditorState, Transaction} from '#pm/state';\n\nimport {CodeBlockNodeAttr} from '../../CodeBlockSpecs';\nimport {\n disableLineWrapping,\n enableLineWrapping,\n isNodeHasLineWrapping,\n} from '../plugins/codeBlockLineWrappingPlugin';\nimport {isLineNumbersVisible} from '../utils';\n\n/** @internal */\nexport {isLineNumbersVisible} from '../utils';\n\n/** @internal */\nexport const toggleLineNumbers: (params: {\n node: Node;\n pos: number;\n state: EditorState;\n dispatch: (tr: Transaction) => void;\n}) => void = ({node, pos, state, dispatch}) => {\n const showLineNumbers = isLineNumbersVisible(node);\n dispatch(\n state.tr.setNodeAttribute(\n pos,\n CodeBlockNodeAttr.ShowLineNumbers,\n showLineNumbers ? '' : 'true',\n ),\n );\n};\n\n/** @internal */\nexport const toggleLineWrapping: (params: {\n node: Node;\n pos: number;\n state: EditorState;\n dispatch: (tr: Transaction) => void;\n}) => void = ({pos, state, dispatch}) => {\n const {tr} = state;\n const hasLineWrapping = isNodeHasLineWrapping(state, pos);\n if (hasLineWrapping) disableLineWrapping(tr, pos);\n else enableLineWrapping(tr, pos);\n dispatch(tr);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const PlainTextLang = "plaintext";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG,WAAW,CAAC","sourcesContent":["export const PlainTextLang = 'plaintext';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.codeBlockLineNumbersPlugin = void 0;
|
|
4
|
+
const state_1 = require("../../../../../pm/state.js");
|
|
5
|
+
const utils_1 = require("../../../../../pm/utils.js");
|
|
6
|
+
const view_1 = require("../../../../../pm/view.js");
|
|
7
|
+
const CodeBlockSpecs_1 = require("../../CodeBlockSpecs/index.js");
|
|
8
|
+
const utils_2 = require("../utils.js");
|
|
9
|
+
const pluginKey = new state_1.PluginKey('code_block_line_numbers_decorations');
|
|
10
|
+
/** @internal */
|
|
11
|
+
const codeBlockLineNumbersPlugin = () => {
|
|
12
|
+
return new state_1.Plugin({
|
|
13
|
+
key: pluginKey,
|
|
14
|
+
state: {
|
|
15
|
+
init(_config, state) {
|
|
16
|
+
return getDecorations(state.doc);
|
|
17
|
+
},
|
|
18
|
+
apply(tr, decos) {
|
|
19
|
+
if (tr.docChanged) {
|
|
20
|
+
return getDecorations(tr.doc);
|
|
21
|
+
}
|
|
22
|
+
return decos.map(tr.mapping, tr.doc);
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
props: {
|
|
26
|
+
decorations(state) {
|
|
27
|
+
return pluginKey.getState(state);
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
exports.codeBlockLineNumbersPlugin = codeBlockLineNumbersPlugin;
|
|
33
|
+
function getDecorations(doc) {
|
|
34
|
+
const decos = [];
|
|
35
|
+
for (const { node, pos } of (0, utils_1.findChildrenByType)(doc, (0, CodeBlockSpecs_1.codeBlockType)(doc.type.schema), true)) {
|
|
36
|
+
if (!(0, utils_2.isLineNumbersVisible)(node))
|
|
37
|
+
continue;
|
|
38
|
+
const codeContent = node.textContent;
|
|
39
|
+
const contentByLines = codeContent.split('\n');
|
|
40
|
+
const maxDigits = String(contentByLines.length).length;
|
|
41
|
+
let shift = 0;
|
|
42
|
+
for (let i = 0; i < contentByLines.length; i++) {
|
|
43
|
+
const line = contentByLines[i];
|
|
44
|
+
{
|
|
45
|
+
const elem = document.createElement('span');
|
|
46
|
+
elem.classList.add('yfm-line-number');
|
|
47
|
+
elem.textContent = String(i + 1).padStart(maxDigits, ' ');
|
|
48
|
+
decos.push(view_1.Decoration.widget(pos + shift + 1, elem, { side: 1, ignoreSelection: true }));
|
|
49
|
+
}
|
|
50
|
+
shift += line.length + 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return view_1.DecorationSet.create(doc, decos);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=codeBlockLineNumbersPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeBlockLineNumbersPlugin.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.ts"],"names":[],"mappings":";;;AACA,sDAA4C;AAC5C,sDAA6C;AAC7C,oDAAmD;AAEnD,kEAAmD;AACnD,uCAA8C;AAE9C,MAAM,SAAS,GAAG,IAAI,iBAAS,CAAgB,qCAAqC,CAAC,CAAC;AAEtF,gBAAgB;AACT,MAAM,0BAA0B,GAAG,GAAG,EAAE;IAC3C,OAAO,IAAI,cAAM,CAAgB;QAC7B,GAAG,EAAE,SAAS;QACd,KAAK,EAAE;YACH,IAAI,CAAC,OAAO,EAAE,KAAK;gBACf,OAAO,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;YACD,KAAK,CAAC,EAAE,EAAE,KAAK;gBACX,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBAClC,CAAC;gBAED,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;SACJ;QACD,KAAK,EAAE;YACH,WAAW,CAAC,KAAK;gBACb,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;SACJ;KACJ,CAAC,CAAC;AACP,CAAC,CAAC;AArBW,QAAA,0BAA0B,8BAqBrC;AAEF,SAAS,cAAc,CAAC,GAAS;IAC7B,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,EAAC,IAAI,EAAE,GAAG,EAAC,IAAI,IAAA,0BAAkB,EAAC,GAAG,EAAE,IAAA,8BAAa,EAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QACtF,IAAI,CAAC,IAAA,4BAAoB,EAAC,IAAI,CAAC;YAAE,SAAS;QAE1C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QAEvD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAE/B,CAAC;gBACG,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBACtC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAE1D,KAAK,CAAC,IAAI,CACN,iBAAU,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAC,CAAC,CAC7E,CAAC;YACN,CAAC;YAED,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,OAAO,oBAAa,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import type {Node} from '#pm/model';\nimport {Plugin, PluginKey} from '#pm/state';\nimport {findChildrenByType} from '#pm/utils';\nimport {Decoration, DecorationSet} from '#pm/view';\n\nimport {codeBlockType} from '../../CodeBlockSpecs';\nimport {isLineNumbersVisible} from '../utils';\n\nconst pluginKey = new PluginKey<DecorationSet>('code_block_line_numbers_decorations');\n\n/** @internal */\nexport const codeBlockLineNumbersPlugin = () => {\n return new Plugin<DecorationSet>({\n key: pluginKey,\n state: {\n init(_config, state) {\n return getDecorations(state.doc);\n },\n apply(tr, decos) {\n if (tr.docChanged) {\n return getDecorations(tr.doc);\n }\n\n return decos.map(tr.mapping, tr.doc);\n },\n },\n props: {\n decorations(state) {\n return pluginKey.getState(state);\n },\n },\n });\n};\n\nfunction getDecorations(doc: Node) {\n const decos: Decoration[] = [];\n\n for (const {node, pos} of findChildrenByType(doc, codeBlockType(doc.type.schema), true)) {\n if (!isLineNumbersVisible(node)) continue;\n\n const codeContent = node.textContent;\n const contentByLines = codeContent.split('\\n');\n\n const maxDigits = String(contentByLines.length).length;\n\n let shift = 0;\n for (let i = 0; i < contentByLines.length; i++) {\n const line = contentByLines[i];\n\n {\n const elem = document.createElement('span');\n elem.classList.add('yfm-line-number');\n elem.textContent = String(i + 1).padStart(maxDigits, ' ');\n\n decos.push(\n Decoration.widget(pos + shift + 1, elem, {side: 1, ignoreSelection: true}),\n );\n }\n\n shift += line.length + 1;\n }\n }\n\n return DecorationSet.create(doc, decos);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.codeBlockLineWrappingPlugin = exports.isNodeHasLineWrapping = exports.hasLineWrappingDecoration = void 0;
|
|
4
|
+
exports.enableLineWrapping = enableLineWrapping;
|
|
5
|
+
exports.disableLineWrapping = disableLineWrapping;
|
|
6
|
+
const state_1 = require("../../../../../pm/state.js");
|
|
7
|
+
const view_1 = require("../../../../../pm/view.js");
|
|
8
|
+
const CodeBlockSpecs_1 = require("../../CodeBlockSpecs/index.js");
|
|
9
|
+
const pluginKey = new state_1.PluginKey('code_block_line_wrapping');
|
|
10
|
+
const WRAPPING_SPEC_KEY = '__code_block_line_wrapping';
|
|
11
|
+
const WRAPPING_SPEC_VALUE = true;
|
|
12
|
+
const isLineWrappingDecoration = (deco) => deco.spec?.[WRAPPING_SPEC_KEY] === WRAPPING_SPEC_VALUE;
|
|
13
|
+
/** @internal */
|
|
14
|
+
const hasLineWrappingDecoration = (decorations) => {
|
|
15
|
+
return decorations.some(isLineWrappingDecoration);
|
|
16
|
+
};
|
|
17
|
+
exports.hasLineWrappingDecoration = hasLineWrappingDecoration;
|
|
18
|
+
/** @internal */
|
|
19
|
+
const isNodeHasLineWrapping = (state, pos) => {
|
|
20
|
+
const node = state.doc.nodeAt(pos);
|
|
21
|
+
if (!node || node.type !== (0, CodeBlockSpecs_1.codeBlockType)(state.doc.type.schema))
|
|
22
|
+
return false;
|
|
23
|
+
const decos = pluginKey.getState(state)?.decorations.find(pos + 1, pos + node.nodeSize - 1);
|
|
24
|
+
return decos?.some(isLineWrappingDecoration) ?? false;
|
|
25
|
+
};
|
|
26
|
+
exports.isNodeHasLineWrapping = isNodeHasLineWrapping;
|
|
27
|
+
/** @internal */
|
|
28
|
+
function enableLineWrapping(tr, pos) {
|
|
29
|
+
return tr.setMeta(pluginKey, { type: 'add', pos });
|
|
30
|
+
}
|
|
31
|
+
/** @internal */
|
|
32
|
+
function disableLineWrapping(tr, pos) {
|
|
33
|
+
return tr.setMeta(pluginKey, { type: 'remove', pos });
|
|
34
|
+
}
|
|
35
|
+
/** @internal */
|
|
36
|
+
const codeBlockLineWrappingPlugin = () => {
|
|
37
|
+
return new state_1.Plugin({
|
|
38
|
+
key: pluginKey,
|
|
39
|
+
state: {
|
|
40
|
+
init() {
|
|
41
|
+
return {
|
|
42
|
+
decorations: view_1.DecorationSet.empty,
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
apply(tr, value) {
|
|
46
|
+
let decorations = value.decorations.map(tr.mapping, tr.doc);
|
|
47
|
+
if (tr.getMeta(pluginKey)) {
|
|
48
|
+
const meta = tr.getMeta(pluginKey);
|
|
49
|
+
if (meta.type === 'add') {
|
|
50
|
+
const node = tr.doc.nodeAt(meta.pos);
|
|
51
|
+
if (node?.type === (0, CodeBlockSpecs_1.codeBlockType)(tr.doc.type.schema)) {
|
|
52
|
+
const from = meta.pos;
|
|
53
|
+
const to = meta.pos + node.nodeSize;
|
|
54
|
+
decorations = decorations.add(tr.doc, [
|
|
55
|
+
view_1.Decoration.node(from, to, {}, { [WRAPPING_SPEC_KEY]: WRAPPING_SPEC_VALUE }),
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else if (meta.type === 'remove') {
|
|
60
|
+
const node = tr.doc.nodeAt(meta.pos);
|
|
61
|
+
if (node?.type === (0, CodeBlockSpecs_1.codeBlockType)(tr.doc.type.schema)) {
|
|
62
|
+
const start = meta.pos + 1;
|
|
63
|
+
const end = meta.pos + node.nodeSize - 1;
|
|
64
|
+
const found = decorations.find(start, end);
|
|
65
|
+
decorations = decorations.remove(found);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { decorations };
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
props: {
|
|
73
|
+
decorations(state) {
|
|
74
|
+
return pluginKey.getState(state)?.decorations;
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
exports.codeBlockLineWrappingPlugin = codeBlockLineWrappingPlugin;
|
|
80
|
+
//# sourceMappingURL=codeBlockLineWrappingPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeBlockLineWrappingPlugin.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {type EditorState, Plugin, PluginKey, type Transaction} from '#pm/state';\nimport {Decoration, DecorationSet} from '#pm/view';\n\nimport {codeBlockType} from '../../CodeBlockSpecs';\n\ntype StateShape = {\n decorations: DecorationSet;\n};\n\nconst pluginKey = new PluginKey<StateShape>('code_block_line_wrapping');\n\ntype Meta = {\n type: 'add' | 'remove';\n pos: number;\n};\n\nconst WRAPPING_SPEC_KEY = '__code_block_line_wrapping';\nconst WRAPPING_SPEC_VALUE = true;\n\nconst isLineWrappingDecoration = (deco: Decoration) =>\n deco.spec?.[WRAPPING_SPEC_KEY] === WRAPPING_SPEC_VALUE;\n\n/** @internal */\nexport const hasLineWrappingDecoration = (decorations: readonly Decoration[]): boolean => {\n return decorations.some(isLineWrappingDecoration);\n};\n\n/** @internal */\nexport const isNodeHasLineWrapping = (state: EditorState, pos: number): boolean => {\n const node = state.doc.nodeAt(pos);\n if (!node || node.type !== codeBlockType(state.doc.type.schema)) return false;\n const decos = pluginKey.getState(state)?.decorations.find(pos + 1, pos + node.nodeSize - 1);\n return decos?.some(isLineWrappingDecoration) ?? false;\n};\n\n/** @internal */\nexport function enableLineWrapping(tr: Transaction, pos: number): Transaction {\n return tr.setMeta(pluginKey, {type: 'add', pos} satisfies Meta);\n}\n\n/** @internal */\nexport function disableLineWrapping(tr: Transaction, pos: number): Transaction {\n return tr.setMeta(pluginKey, {type: 'remove', pos} satisfies Meta);\n}\n\n/** @internal */\nexport const codeBlockLineWrappingPlugin = () => {\n return new Plugin<StateShape>({\n key: pluginKey,\n state: {\n init() {\n return {\n decorations: DecorationSet.empty,\n };\n },\n apply(tr, value) {\n let decorations = value.decorations.map(tr.mapping, tr.doc);\n\n if (tr.getMeta(pluginKey)) {\n const meta = tr.getMeta(pluginKey) as Meta;\n\n if (meta.type === 'add') {\n const node = tr.doc.nodeAt(meta.pos);\n if (node?.type === codeBlockType(tr.doc.type.schema)) {\n const from = meta.pos;\n const to = meta.pos + node.nodeSize;\n decorations = decorations.add(tr.doc, [\n Decoration.node(\n from,\n to,\n {},\n {[WRAPPING_SPEC_KEY]: WRAPPING_SPEC_VALUE},\n ),\n ]);\n }\n } else if (meta.type === 'remove') {\n const node = tr.doc.nodeAt(meta.pos);\n if (node?.type === codeBlockType(tr.doc.type.schema)) {\n const start = meta.pos + 1;\n const end = meta.pos + node.nodeSize - 1;\n const found = decorations.find(start, end);\n decorations = decorations.remove(found);\n }\n }\n }\n\n return {decorations};\n },\n },\n props: {\n decorations(state) {\n return pluginKey.getState(state)?.decorations;\n },\n },\n });\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isLineNumbersVisible = isLineNumbersVisible;
|
|
4
|
+
const CodeBlockSpecs_1 = require("../CodeBlockSpecs/index.js");
|
|
5
|
+
/** @internal */
|
|
6
|
+
function isLineNumbersVisible(node) {
|
|
7
|
+
return node.attrs[CodeBlockSpecs_1.CodeBlockNodeAttr.ShowLineNumbers] === 'true';
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/utils.ts"],"names":[],"mappings":";;AAKA,oDAEC;AALD,+DAAoD;AAEpD,gBAAgB;AAChB,SAAgB,oBAAoB,CAAC,IAAU;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,kCAAiB,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC;AACpE,CAAC","sourcesContent":["import type {Node} from '#pm/model';\n\nimport {CodeBlockNodeAttr} from '../CodeBlockSpecs';\n\n/** @internal */\nexport function isLineNumbersVisible(node: Node): boolean {\n return node.attrs[CodeBlockNodeAttr.ShowLineNumbers] === 'true';\n}\n"]}
|
|
@@ -22,6 +22,7 @@ export type LineNumbersOptions = {
|
|
|
22
22
|
};
|
|
23
23
|
export type CodeBlockSpecsOptions = {
|
|
24
24
|
nodeview?: ExtensionNodeSpec['view'];
|
|
25
|
+
/** Configure line numbers in code block */
|
|
25
26
|
lineNumbers?: LineNumbersOptions;
|
|
26
27
|
};
|
|
27
28
|
export declare const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport const CodeBlockNodeAttr = {\n Lang: 'data-language',\n Markup: 'data-markup',\n Line: 'data-line',\n ShowLineNumbers: 'data-show-line-numbers',\n} as const;\n\nexport const codeBlockNodeName = 'code_block';\nexport const codeBlockType = nodeTypeFactory(codeBlockNodeName);\n\nexport type LineNumbersOptions = {\n /**\n * Allow line numbers in codeblock.\n * Available with @diplodoc/transform v4.55.0 or higher.\n * @default true\n */\n // TODO [MAJOR]: enable by default and remove option\n enabled?: boolean;\n /**\n * By default, new code blocks are added with line numbers.\n * @default false\n */\n showByDefault?: boolean;\n};\n\nexport type CodeBlockSpecsOptions = {\n nodeview?: ExtensionNodeSpec['view'];\n lineNumbers?: LineNumbersOptions;\n};\n\nconst getLangOfNode = (node: Element) => {\n let result = node.getAttribute(CodeBlockNodeAttr.Lang) || '';\n\n if (!result) {\n const firstElementChild = node.firstElementChild;\n\n if (\n firstElementChild &&\n firstElementChild.nodeName.toLowerCase() === 'code' &&\n firstElementChild.classList.contains('hljs')\n ) {\n result = firstElementChild.getAttribute('class')?.split(' ')?.[1] || '';\n }\n }\n\n return result;\n};\n\nexport const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions> = (builder, opts) => {\n builder.addNode(codeBlockNodeName, () => ({\n view: opts.nodeview,\n spec: {\n attrs: {\n [CodeBlockNodeAttr.Lang]: {default: ''},\n [CodeBlockNodeAttr.Markup]: {default: '```'},\n [CodeBlockNodeAttr.Line]: {default: null},\n ...(opts.lineNumbers?.enabled\n ? {\n [CodeBlockNodeAttr.ShowLineNumbers]: {\n default: opts.lineNumbers.showByDefault ? 'true' : '',\n },\n }\n : {}),\n },\n content: 'text*',\n group: 'block',\n code: true,\n marks: '',\n selectable: true,\n allowSelection: false,\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node) => {\n return {\n [CodeBlockNodeAttr.Lang]: getLangOfNode(node as Element),\n };\n },\n },\n ],\n toDOM({attrs}) {\n return ['pre', attrs, ['code', 0]];\n },\n },\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n return {\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n [CodeBlockNodeAttr.ShowLineNumbers]: tok.info.includes('showLineNumbers')\n ? 'true'\n : '',\n };\n },\n prepareContent: removeNewLineAtEnd, // content of code blocks contains extra \\n at the end\n },\n },\n toMd: (state, node) => {\n const lang: string = node.attrs[CodeBlockNodeAttr.Lang];\n const markup: string = node.attrs[CodeBlockNodeAttr.Markup];\n const showLineNumbers: string = opts.lineNumbers?.enabled\n ? node.attrs[CodeBlockNodeAttr.ShowLineNumbers]\n : '';\n\n let info = lang;\n\n if (showLineNumbers === 'true') {\n info += ' showLineNumbers';\n }\n\n state.write(markup + info + '\\n');\n state.text(node.textContent, false);\n // Add a newline to the current content before adding closing marker\n state.write('\\n');\n state.write(markup);\n state.closeBlock(node);\n },\n }));\n builder.addNode('fence', () => ({\n // we adding this node only for define specific 'fence' parser token,\n // which parse fence md token to code_block node\n spec: {},\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n const attrs: Record<string, string | null> = {\n [CodeBlockNodeAttr.Markup]: tok.markup,\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n };\n if (tok.info) {\n // like in markdown-it\n // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37\n const parts = tok.info.split(/\\s+/);\n\n const isFirstPartForLineNumbers =\n opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';\n\n attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];\n }\n if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';\n } else {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';\n }\n\n return attrs;\n },\n prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \\n at the end\n },\n },\n toMd: () => {\n throw new Error('Unexpected toMd() call on fence node');\n },\n }));\n builder.addKeymap(() => ({\n Tab: (state, dispatch) => {\n const {$anchor, $head} = state.selection;\n if ($anchor.sameParent($head) && $anchor.parent.type.name === codeBlockNodeName) {\n dispatch?.(state.tr.replaceSelectionWith(state.schema.text('\\t')).scrollIntoView());\n return true;\n }\n return false;\n },\n }));\n};\n\nfunction removeNewLineAtEnd(content: string): string {\n return content.endsWith('\\n') ? content.slice(0, content.length - 1) : content;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport const CodeBlockNodeAttr = {\n Lang: 'data-language',\n Markup: 'data-markup',\n Line: 'data-line',\n ShowLineNumbers: 'data-show-line-numbers',\n} as const;\n\nexport const codeBlockNodeName = 'code_block';\nexport const codeBlockType = nodeTypeFactory(codeBlockNodeName);\n\nexport type LineNumbersOptions = {\n /**\n * Allow line numbers in codeblock.\n * Available with @diplodoc/transform v4.55.0 or higher.\n * @default true\n */\n // TODO [MAJOR]: enable by default and remove option\n enabled?: boolean;\n /**\n * By default, new code blocks are added with line numbers.\n * @default false\n */\n showByDefault?: boolean;\n};\n\nexport type CodeBlockSpecsOptions = {\n nodeview?: ExtensionNodeSpec['view'];\n /** Configure line numbers in code block */\n lineNumbers?: LineNumbersOptions;\n};\n\nconst getLangOfNode = (node: Element) => {\n let result = node.getAttribute(CodeBlockNodeAttr.Lang) || '';\n\n if (!result) {\n const firstElementChild = node.firstElementChild;\n\n if (\n firstElementChild &&\n firstElementChild.nodeName.toLowerCase() === 'code' &&\n firstElementChild.classList.contains('hljs')\n ) {\n result = firstElementChild.getAttribute('class')?.split(' ')?.[1] || '';\n }\n }\n\n return result;\n};\n\nexport const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions> = (builder, opts) => {\n builder.addNode(codeBlockNodeName, () => ({\n view: opts.nodeview,\n spec: {\n attrs: {\n [CodeBlockNodeAttr.Lang]: {default: ''},\n [CodeBlockNodeAttr.Markup]: {default: '```'},\n [CodeBlockNodeAttr.Line]: {default: null},\n ...(opts.lineNumbers?.enabled\n ? {\n [CodeBlockNodeAttr.ShowLineNumbers]: {\n default: opts.lineNumbers.showByDefault ? 'true' : '',\n },\n }\n : {}),\n },\n content: 'text*',\n group: 'block',\n code: true,\n marks: '',\n selectable: true,\n allowSelection: false,\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node) => {\n return {\n [CodeBlockNodeAttr.Lang]: getLangOfNode(node as Element),\n };\n },\n },\n ],\n toDOM({attrs}) {\n return ['pre', attrs, ['code', 0]];\n },\n },\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n return {\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n [CodeBlockNodeAttr.ShowLineNumbers]: tok.info.includes('showLineNumbers')\n ? 'true'\n : '',\n };\n },\n prepareContent: removeNewLineAtEnd, // content of code blocks contains extra \\n at the end\n },\n },\n toMd: (state, node) => {\n const lang: string = node.attrs[CodeBlockNodeAttr.Lang];\n const markup: string = node.attrs[CodeBlockNodeAttr.Markup];\n const showLineNumbers: string = opts.lineNumbers?.enabled\n ? node.attrs[CodeBlockNodeAttr.ShowLineNumbers]\n : '';\n\n let info = lang;\n\n if (showLineNumbers === 'true') {\n info += ' showLineNumbers';\n }\n\n state.write(markup + info + '\\n');\n state.text(node.textContent, false);\n // Add a newline to the current content before adding closing marker\n state.write('\\n');\n state.write(markup);\n state.closeBlock(node);\n },\n }));\n builder.addNode('fence', () => ({\n // we adding this node only for define specific 'fence' parser token,\n // which parse fence md token to code_block node\n spec: {},\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n const attrs: Record<string, string | null> = {\n [CodeBlockNodeAttr.Markup]: tok.markup,\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n };\n if (tok.info) {\n // like in markdown-it\n // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37\n const parts = tok.info.split(/\\s+/);\n\n const isFirstPartForLineNumbers =\n opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';\n\n attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];\n }\n if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';\n } else {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';\n }\n\n return attrs;\n },\n prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \\n at the end\n },\n },\n toMd: () => {\n throw new Error('Unexpected toMd() call on fence node');\n },\n }));\n builder.addKeymap(() => ({\n Tab: (state, dispatch) => {\n const {$anchor, $head} = state.selection;\n if ($anchor.sameParent($head) && $anchor.parent.type.name === codeBlockNodeName) {\n dispatch?.(state.tr.replaceSelectionWith(state.schema.text('\\t')).scrollIntoView());\n return true;\n }\n return false;\n },\n }));\n};\n\nfunction removeNewLineAtEnd(content: string): string {\n return content.endsWith('\\n') ? content.slice(0, content.length - 1) : content;\n}\n"]}
|
|
@@ -7,6 +7,14 @@ export { codeBlockNodeName, CodeBlockNodeAttr, codeBlockType } from "./CodeBlock
|
|
|
7
7
|
export type CodeBlockOptions = CodeBlockSpecsOptions & {
|
|
8
8
|
codeBlockKey?: string | null;
|
|
9
9
|
langs?: HighlightLangMap;
|
|
10
|
+
/** Configure line wrapping toggle in code block */
|
|
11
|
+
lineWrapping?: {
|
|
12
|
+
/**
|
|
13
|
+
* Enable line wrapping toggling in code block
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
enabled?: boolean;
|
|
17
|
+
};
|
|
10
18
|
};
|
|
11
19
|
export declare const CodeBlock: ExtensionAuto<CodeBlockOptions>;
|
|
12
20
|
declare global {
|
|
@@ -19,6 +19,9 @@ Object.defineProperty(exports, "codeBlockType", { enumerable: true, get: functio
|
|
|
19
19
|
const CodeBlock = (builder, opts) => {
|
|
20
20
|
const optsNormalized = {
|
|
21
21
|
...opts,
|
|
22
|
+
lineWrapping: {
|
|
23
|
+
enabled: opts.lineWrapping?.enabled || false,
|
|
24
|
+
},
|
|
22
25
|
lineNumbers: {
|
|
23
26
|
enabled: typeof opts.lineNumbers?.enabled === 'boolean'
|
|
24
27
|
? opts.lineNumbers.enabled
|
|
@@ -54,6 +57,7 @@ const CodeBlock = (builder, opts) => {
|
|
|
54
57
|
builder.use(CodeBlockHighlight_1.CodeBlockHighlight, {
|
|
55
58
|
langs: optsNormalized.langs,
|
|
56
59
|
lineNumbers: optsNormalized.lineNumbers,
|
|
60
|
+
lineWrapping: optsNormalized.lineWrapping,
|
|
57
61
|
});
|
|
58
62
|
}
|
|
59
63
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/index.ts"],"names":[],"mappings":";;;AAEA,gDAA8C;AAC9C,+CAAsC;AACtC,6DAA4D;AAC5D,qDAA+C;AAE/C,mFAAkG;AAClG,8DAA4E;AAC5E,4CAA2E;AAC3E,sCAA2E;AAC3E,4EAAoE;AAEpE,0CAA0C;AAAlC,0GAAA,cAAc,OAAA;AACtB,4DAAqF;AAA7E,mHAAA,iBAAiB,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAAE,+GAAA,aAAa,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Action, ExtensionAuto, Keymap} from '#core';\nimport type {NodeType} from '#pm/model';\nimport {hasParentNodeOfType} from '#pm/utils';\nimport {isFunction} from 'src/lodash';\nimport {textblockTypeInputRule} from 'src/utils/inputrules';\nimport {withLogAction} from 'src/utils/keymap';\n\nimport {CodeBlockHighlight, type HighlightLangMap} from './CodeBlockHighlight/CodeBlockHighlight';\nimport {CodeBlockSpecs, type CodeBlockSpecsOptions} from './CodeBlockSpecs';\nimport {newlineInCode, resetCodeblock, setCodeBlockType} from './commands';\nimport {cbAction, codeBlockType, lineNumbersOptionsDefault} from './const';\nimport {codeBlockPastePlugin} from './plugins/codeBlockPastePlugin';\n\nexport {resetCodeblock} from './commands';\nexport {codeBlockNodeName, CodeBlockNodeAttr, codeBlockType} from './CodeBlockSpecs';\n\nexport type CodeBlockOptions = CodeBlockSpecsOptions & {\n codeBlockKey?: string | null;\n langs?: HighlightLangMap;\n /** Configure line wrapping toggle in code block */\n lineWrapping?: {\n /**\n * Enable line wrapping toggling in code block\n * @default false\n */\n enabled?: boolean;\n };\n};\n\nexport const CodeBlock: ExtensionAuto<CodeBlockOptions> = (builder, opts) => {\n const optsNormalized: CodeBlockOptions = {\n ...opts,\n lineWrapping: {\n enabled: opts.lineWrapping?.enabled || false,\n },\n lineNumbers: {\n enabled:\n typeof opts.lineNumbers?.enabled === 'boolean'\n ? opts.lineNumbers.enabled\n : lineNumbersOptionsDefault.enabled,\n showByDefault:\n typeof opts.lineNumbers?.showByDefault === 'boolean'\n ? opts.lineNumbers.showByDefault\n : lineNumbersOptionsDefault.showByDefault,\n },\n };\n\n builder.use(CodeBlockSpecs, optsNormalized);\n\n builder.addKeymap((deps) => {\n const {codeBlockKey} = optsNormalized;\n const bindings: Keymap = {Enter: newlineInCode, Backspace: resetCodeblock};\n if (codeBlockKey) {\n bindings[codeBlockKey] = withLogAction('code_block', setCodeBlockType(deps));\n }\n return bindings;\n });\n\n builder.addInputRules(({schema}) => ({rules: [codeBlockRule(codeBlockType(schema))]}));\n builder.addAction(cbAction, (deps) => {\n const cb = codeBlockType(deps.schema);\n return {\n isActive: (state) => hasParentNodeOfType(cb)(state.selection),\n isEnable: setCodeBlockType(deps),\n run: setCodeBlockType(deps),\n };\n });\n\n builder.addPlugin(codeBlockPastePlugin, builder.Priority.High);\n\n if (isFunction(optsNormalized.langs)) {\n builder.use(optsNormalized.langs);\n } else {\n builder.use(CodeBlockHighlight, {\n langs: optsNormalized.langs,\n lineNumbers: optsNormalized.lineNumbers,\n lineWrapping: optsNormalized.lineWrapping,\n });\n }\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [cbAction]: Action;\n }\n }\n}\n\n// Given a code block node type, returns an input rule that turns a\n// textblock starting with three backticks into a code block.\nfunction codeBlockRule(nodeType: NodeType) {\n return textblockTypeInputRule(/^```$/, nodeType);\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
export declare const i18n: <G extends "remove" | "empty_option" | "show_line_numbers", S extends string>(key: G | (string extends S ? S : never), params?: {
|
|
1
|
+
export declare const i18n: <G extends "remove" | "empty_option" | "code_wrapping" | "show_line_numbers", S extends string>(key: G | (string extends S ? S : never), params?: {
|
|
2
2
|
[key: string]: any;
|
|
3
3
|
}) => S extends G ? {
|
|
4
4
|
remove: string;
|
|
5
5
|
empty_option: string;
|
|
6
|
+
code_wrapping: string;
|
|
6
7
|
show_line_numbers: string;
|
|
7
8
|
}[G] : string;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.i18n = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const i18n_1 = require("../i18n.js");
|
|
6
|
+
const en_json_1 = tslib_1.__importDefault(require("./en.json"));
|
|
7
|
+
const ru_json_1 = tslib_1.__importDefault(require("./ru.json"));
|
|
8
|
+
const KEYSET = 'widgets';
|
|
9
|
+
exports.i18n = (0, i18n_1.registerKeyset)(KEYSET, { en: en_json_1.default, ru: ru_json_1.default });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["i18n/viewer/index.ts"],"names":[],"mappings":";;;;AAAA,qCAAuC;AAEvC,gEAA2B;AAC3B,gEAA2B;AAE3B,MAAM,MAAM,GAAG,SAAS,CAAC;AAEZ,QAAA,IAAI,GAAG,IAAA,qBAAc,EAAC,MAAM,EAAE,EAAC,EAAE,EAAF,iBAAE,EAAE,EAAE,EAAF,iBAAE,EAAC,CAAC,CAAC","sourcesContent":["import {registerKeyset} from '../i18n';\n\nimport en from './en.json';\nimport ru from './ru.json';\n\nconst KEYSET = 'widgets';\n\nexport const i18n = registerKeyset(KEYSET, {en, ru});\n"]}
|
|
@@ -9,7 +9,7 @@ export type BaseTooltipNode = {
|
|
|
9
9
|
node: Node;
|
|
10
10
|
dom: HTMLElement | null;
|
|
11
11
|
};
|
|
12
|
-
export type TooltipContentCb = (view: EditorView, node: BaseTooltipNode, onChange?: (attrs: Record<string, string>) => void, forceEdit?: boolean, onOutsideClick?: () => void) => React.ReactElement | null;
|
|
12
|
+
export type TooltipContentCb = (view: EditorView, node: BaseTooltipNode, onChange?: (attrs: Record<string, string>) => void, forceEdit?: boolean, onOutsideClick?: () => void, rerender?: () => void) => React.ReactElement | null;
|
|
13
13
|
export interface BaseTooltipPluginOptions {
|
|
14
14
|
idPrefix: string;
|
|
15
15
|
content?: TooltipContentCb;
|
|
@@ -163,7 +163,7 @@ class BaseTooltipPluginView {
|
|
|
163
163
|
return null;
|
|
164
164
|
// hack for popup rerender
|
|
165
165
|
window.dispatchEvent(new CustomEvent('scroll'));
|
|
166
|
-
return ((0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, hasArrow: false, anchorElement: currentNode.dom, placement: this.popupPlacement || exports.defaultPlacement, onOpenChange: this.popupOpenChangeHandler, children: (0, jsx_runtime_1.jsx)("div", { className: b(), children: this.content(this.view, currentNode, this.changeAttrsCb) }) }));
|
|
166
|
+
return ((0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, hasArrow: false, anchorElement: currentNode.dom, placement: this.popupPlacement || exports.defaultPlacement, onOpenChange: this.popupOpenChangeHandler, children: (0, jsx_runtime_1.jsx)("div", { className: b(), children: this.content(this.view, currentNode, this.changeAttrsCb, undefined, undefined, () => this.render()) }) }));
|
|
167
167
|
}
|
|
168
168
|
createRenderItem() {
|
|
169
169
|
return (0, extensions_1.getReactRendererFromState)(this.view.state).createItem(this.idPrefix, () => this.currentNode && !this.manualHidden ? ((0, jsx_runtime_1.jsx)(ErrorBoundary_1.ErrorLoggerBoundary, { children: this.renderContent(this.currentNode) })) : null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["plugins/BaseTooltip/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {Mark, MarkType, Node, NodeType} from 'prosemirror-model';\nimport {NodeSelection, type PluginView} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findDomRefAtPos, findParentNodeOfType, findSelectedNodeOfType} from 'prosemirror-utils';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../classname';\nimport {type RendererItem, getReactRendererFromState} from '../../extensions';\nimport {ErrorLoggerBoundary} from '../../react-utils/ErrorBoundary';\n\nimport './index.scss';\n\nexport type BaseTooltipNode = {\n pos: number;\n node: Node;\n dom: HTMLElement | null;\n};\n\nexport type TooltipContentCb = (\n view: EditorView,\n node: BaseTooltipNode,\n onChange?: (attrs: Record<string, string>) => void,\n forceEdit?: boolean,\n onOutsideClick?: () => void,\n) => React.ReactElement | null;\n\nexport interface BaseTooltipPluginOptions {\n idPrefix: string;\n content?: TooltipContentCb;\n nodeType: NodeType | MarkType;\n popupPlacement?: PopupPlacement;\n disableHideOnEscapeKeyDown?: boolean;\n}\n\nexport const BaseTooltipCn = cn('base-tooltip');\nexport const defaultPlacement: PopupPlacement = [\n 'bottom-start',\n 'top-start',\n 'bottom-end',\n 'top-end',\n];\nconst b = BaseTooltipCn;\nexport const baseTooltipContentCn = cn('base-tooltip-content');\n\nexport type TooltipOnChangeCallback = (\n attrs: Record<string, string>,\n options?: {setFocus?: boolean; setSelection?: boolean; hideTooltip?: boolean; marks?: Mark[]},\n) => void;\n\nexport type TooltipContentProps = {\n node: BaseTooltipNode;\n view: EditorView;\n onChange?: TooltipOnChangeCallback;\n toggleEdit?: () => void;\n};\n\nexport class BaseTooltipPluginView implements PluginView {\n protected view: EditorView;\n protected currentNode: BaseTooltipNode | null = null;\n protected readonly content?: TooltipContentCb;\n protected readonly nodeType: NodeType | MarkType;\n protected readonly popupPlacement?: PopupPlacement;\n protected manualHidden = false;\n protected destroyed = false;\n\n protected readonly disableHideOnEscapeKeyDown?: boolean;\n\n protected focusTrackingRafId: number | null = null;\n\n private readonly idPrefix: string;\n private renderItem?: RendererItem;\n\n constructor(view: EditorView, options: BaseTooltipPluginOptions) {\n this.view = view;\n this.idPrefix = options.idPrefix;\n this.content = options.content;\n this.nodeType = options.nodeType;\n this.popupPlacement = options.popupPlacement;\n this.disableHideOnEscapeKeyDown = options.disableHideOnEscapeKeyDown;\n }\n\n update(view: EditorView) {\n this.view = view;\n\n this.updateTooltipView();\n }\n\n destroy() {\n this.destroyed = true;\n this.renderItem?.remove();\n this.renderItem = undefined;\n }\n\n onEscapeDown = (): boolean => {\n if (this.disableHideOnEscapeKeyDown) return false;\n if (this.currentNode && !this.manualHidden) {\n this.hidePopupManual();\n return true;\n }\n return false;\n };\n\n protected setCurrentNode(node: NodeType) {\n const view = this.view;\n const domAtPos = view.domAtPos.bind(view);\n\n const {selection} = view.state;\n const {$from, $to} = selection;\n\n const parent =\n findSelectedNodeOfType(node)(selection) || findParentNodeOfType(node)(selection);\n\n if (!parent || !$from.node(parent.depth).eq($to.node(parent.depth))) {\n this.currentNode = null;\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n return;\n }\n\n if (\n !this.currentNode ||\n !this.currentNode.node.eq(parent.node) ||\n this.currentNode.pos !== parent.pos\n ) {\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n }\n\n const {pos, node: parentNode} = parent;\n const dom = findDomRefAtPos(pos, domAtPos) as HTMLElement;\n\n this.currentNode = {\n pos,\n node: parentNode,\n dom,\n };\n }\n\n protected changeAttrsCb: TooltipOnChangeCallback = (attrs, options) => {\n if (this.currentNode) {\n let tr = this.view.state.tr.setNodeMarkup(\n this.currentNode.pos,\n undefined,\n {\n ...this.currentNode.node.attrs,\n ...attrs,\n },\n options?.marks || [],\n );\n\n if (options?.setSelection) {\n tr = tr.setSelection(NodeSelection.create(tr.doc, this.currentNode.pos));\n }\n\n this.view.dispatch(tr);\n\n if (options?.setFocus) {\n this.view.focus();\n }\n\n if (options?.hideTooltip) {\n this.hidePopupManual();\n }\n }\n };\n\n protected updateTooltipView() {\n const oldNode = this.currentNode;\n this.setCurrentNode(this.view.state.schema.nodes[this.nodeType.name]);\n\n // Do not rerender if we have the same node in selection\n if (\n oldNode &&\n this.currentNode?.node.eq(oldNode.node) &&\n this.currentNode.pos === oldNode.pos &&\n this.currentNode.dom === oldNode.dom\n )\n return;\n\n this.render();\n }\n\n protected render() {\n if (this.destroyed) return;\n this.renderItem = this.renderItem ?? this.createRenderItem();\n this.renderItem.rerender();\n }\n\n protected onOutsideClick: PopupProps['onOutsideClick'] = () => {\n this.hidePopupManual();\n };\n\n protected popupOpenChangeHandler: PopupProps['onOpenChange'] = (open, event, reason) => {\n if (open) return;\n if (reason === 'focus-out' && (event as FocusEvent).relatedTarget === this.view.dom) return;\n if (this.disableHideOnEscapeKeyDown && reason === 'escape-key') return;\n\n this.hidePopupManual();\n\n requestAnimationFrame(() => {\n if (this.destroyed || this.view.hasFocus()) return;\n this.startTrackingViewFocus();\n });\n };\n\n protected startTrackingViewFocus() {\n this.focusTrackingRafId = requestAnimationFrame(() => {\n if (this.destroyed) return;\n if (this.view.hasFocus()) {\n this.focusTrackingRafId = null;\n this.manualHidden = false;\n this.render();\n return;\n }\n this.startTrackingViewFocus();\n });\n }\n\n protected stopTrackingViewFocus() {\n if (this.focusTrackingRafId !== null) {\n cancelAnimationFrame(this.focusTrackingRafId);\n this.focusTrackingRafId = null;\n }\n }\n\n protected hidePopupManual() {\n this.manualHidden = true;\n this.render();\n }\n\n protected renderContent(currentNode: BaseTooltipNode): React.ReactNode {\n if (!this.content) return null;\n // hack for popup rerender\n window.dispatchEvent(new CustomEvent('scroll'));\n return (\n <Popup\n open\n hasArrow={false}\n anchorElement={currentNode.dom}\n placement={this.popupPlacement || defaultPlacement}\n onOpenChange={this.popupOpenChangeHandler}\n >\n <div className={b()}>\n {this.content(this.view, currentNode, this.changeAttrsCb)}\n </div>\n </Popup>\n );\n }\n\n protected createRenderItem() {\n return getReactRendererFromState(this.view.state)!.createItem(this.idPrefix, () =>\n this.currentNode && !this.manualHidden ? (\n <ErrorLoggerBoundary>{this.renderContent(this.currentNode)}</ErrorLoggerBoundary>\n ) : null,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["plugins/BaseTooltip/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {Mark, MarkType, Node, NodeType} from 'prosemirror-model';\nimport {NodeSelection, type PluginView} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findDomRefAtPos, findParentNodeOfType, findSelectedNodeOfType} from 'prosemirror-utils';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../classname';\nimport {type RendererItem, getReactRendererFromState} from '../../extensions';\nimport {ErrorLoggerBoundary} from '../../react-utils/ErrorBoundary';\n\nimport './index.scss';\n\nexport type BaseTooltipNode = {\n pos: number;\n node: Node;\n dom: HTMLElement | null;\n};\n\nexport type TooltipContentCb = (\n view: EditorView,\n node: BaseTooltipNode,\n onChange?: (attrs: Record<string, string>) => void,\n forceEdit?: boolean,\n onOutsideClick?: () => void,\n rerender?: () => void,\n) => React.ReactElement | null;\n\nexport interface BaseTooltipPluginOptions {\n idPrefix: string;\n content?: TooltipContentCb;\n nodeType: NodeType | MarkType;\n popupPlacement?: PopupPlacement;\n disableHideOnEscapeKeyDown?: boolean;\n}\n\nexport const BaseTooltipCn = cn('base-tooltip');\nexport const defaultPlacement: PopupPlacement = [\n 'bottom-start',\n 'top-start',\n 'bottom-end',\n 'top-end',\n];\nconst b = BaseTooltipCn;\nexport const baseTooltipContentCn = cn('base-tooltip-content');\n\nexport type TooltipOnChangeCallback = (\n attrs: Record<string, string>,\n options?: {setFocus?: boolean; setSelection?: boolean; hideTooltip?: boolean; marks?: Mark[]},\n) => void;\n\nexport type TooltipContentProps = {\n node: BaseTooltipNode;\n view: EditorView;\n onChange?: TooltipOnChangeCallback;\n toggleEdit?: () => void;\n};\n\nexport class BaseTooltipPluginView implements PluginView {\n protected view: EditorView;\n protected currentNode: BaseTooltipNode | null = null;\n protected readonly content?: TooltipContentCb;\n protected readonly nodeType: NodeType | MarkType;\n protected readonly popupPlacement?: PopupPlacement;\n protected manualHidden = false;\n protected destroyed = false;\n\n protected readonly disableHideOnEscapeKeyDown?: boolean;\n\n protected focusTrackingRafId: number | null = null;\n\n private readonly idPrefix: string;\n private renderItem?: RendererItem;\n\n constructor(view: EditorView, options: BaseTooltipPluginOptions) {\n this.view = view;\n this.idPrefix = options.idPrefix;\n this.content = options.content;\n this.nodeType = options.nodeType;\n this.popupPlacement = options.popupPlacement;\n this.disableHideOnEscapeKeyDown = options.disableHideOnEscapeKeyDown;\n }\n\n update(view: EditorView) {\n this.view = view;\n\n this.updateTooltipView();\n }\n\n destroy() {\n this.destroyed = true;\n this.renderItem?.remove();\n this.renderItem = undefined;\n }\n\n onEscapeDown = (): boolean => {\n if (this.disableHideOnEscapeKeyDown) return false;\n if (this.currentNode && !this.manualHidden) {\n this.hidePopupManual();\n return true;\n }\n return false;\n };\n\n protected setCurrentNode(node: NodeType) {\n const view = this.view;\n const domAtPos = view.domAtPos.bind(view);\n\n const {selection} = view.state;\n const {$from, $to} = selection;\n\n const parent =\n findSelectedNodeOfType(node)(selection) || findParentNodeOfType(node)(selection);\n\n if (!parent || !$from.node(parent.depth).eq($to.node(parent.depth))) {\n this.currentNode = null;\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n return;\n }\n\n if (\n !this.currentNode ||\n !this.currentNode.node.eq(parent.node) ||\n this.currentNode.pos !== parent.pos\n ) {\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n }\n\n const {pos, node: parentNode} = parent;\n const dom = findDomRefAtPos(pos, domAtPos) as HTMLElement;\n\n this.currentNode = {\n pos,\n node: parentNode,\n dom,\n };\n }\n\n protected changeAttrsCb: TooltipOnChangeCallback = (attrs, options) => {\n if (this.currentNode) {\n let tr = this.view.state.tr.setNodeMarkup(\n this.currentNode.pos,\n undefined,\n {\n ...this.currentNode.node.attrs,\n ...attrs,\n },\n options?.marks || [],\n );\n\n if (options?.setSelection) {\n tr = tr.setSelection(NodeSelection.create(tr.doc, this.currentNode.pos));\n }\n\n this.view.dispatch(tr);\n\n if (options?.setFocus) {\n this.view.focus();\n }\n\n if (options?.hideTooltip) {\n this.hidePopupManual();\n }\n }\n };\n\n protected updateTooltipView() {\n const oldNode = this.currentNode;\n this.setCurrentNode(this.view.state.schema.nodes[this.nodeType.name]);\n\n // Do not rerender if we have the same node in selection\n if (\n oldNode &&\n this.currentNode?.node.eq(oldNode.node) &&\n this.currentNode.pos === oldNode.pos &&\n this.currentNode.dom === oldNode.dom\n )\n return;\n\n this.render();\n }\n\n protected render() {\n if (this.destroyed) return;\n this.renderItem = this.renderItem ?? this.createRenderItem();\n this.renderItem.rerender();\n }\n\n protected onOutsideClick: PopupProps['onOutsideClick'] = () => {\n this.hidePopupManual();\n };\n\n protected popupOpenChangeHandler: PopupProps['onOpenChange'] = (open, event, reason) => {\n if (open) return;\n if (reason === 'focus-out' && (event as FocusEvent).relatedTarget === this.view.dom) return;\n if (this.disableHideOnEscapeKeyDown && reason === 'escape-key') return;\n\n this.hidePopupManual();\n\n requestAnimationFrame(() => {\n if (this.destroyed || this.view.hasFocus()) return;\n this.startTrackingViewFocus();\n });\n };\n\n protected startTrackingViewFocus() {\n this.focusTrackingRafId = requestAnimationFrame(() => {\n if (this.destroyed) return;\n if (this.view.hasFocus()) {\n this.focusTrackingRafId = null;\n this.manualHidden = false;\n this.render();\n return;\n }\n this.startTrackingViewFocus();\n });\n }\n\n protected stopTrackingViewFocus() {\n if (this.focusTrackingRafId !== null) {\n cancelAnimationFrame(this.focusTrackingRafId);\n this.focusTrackingRafId = null;\n }\n }\n\n protected hidePopupManual() {\n this.manualHidden = true;\n this.render();\n }\n\n protected renderContent(currentNode: BaseTooltipNode): React.ReactNode {\n if (!this.content) return null;\n // hack for popup rerender\n window.dispatchEvent(new CustomEvent('scroll'));\n return (\n <Popup\n open\n hasArrow={false}\n anchorElement={currentNode.dom}\n placement={this.popupPlacement || defaultPlacement}\n onOpenChange={this.popupOpenChangeHandler}\n >\n <div className={b()}>\n {this.content(\n this.view,\n currentNode,\n this.changeAttrsCb,\n undefined,\n undefined,\n () => this.render(),\n )}\n </div>\n </Popup>\n );\n }\n\n protected createRenderItem() {\n return getReactRendererFromState(this.view.state)!.createItem(this.idPrefix, () =>\n this.currentNode && !this.manualHidden ? (\n <ErrorLoggerBoundary>{this.renderContent(this.currentNode)}</ErrorLoggerBoundary>\n ) : null,\n );\n }\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import { type ReactNode } from 'react';
|
|
|
2
2
|
import type { ToolbarBaseProps, ToolbarItemData } from "./types.js";
|
|
3
3
|
import "./ToolbarButton.css";
|
|
4
4
|
export type ToolbarButtonProps<E> = ToolbarBaseProps<E> & ToolbarItemData<E>;
|
|
5
|
-
export type ToolbarButtonViewProps = Pick<ToolbarItemData<unknown>, 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa'> & {
|
|
5
|
+
export type ToolbarButtonViewProps = Pick<ToolbarItemData<unknown>, 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa' | 'theme'> & {
|
|
6
6
|
active: boolean;
|
|
7
7
|
enabled: boolean;
|
|
8
8
|
onClick: () => void;
|
|
@@ -12,7 +12,7 @@ const const_1 = require("./const.js");
|
|
|
12
12
|
require("./ToolbarButton.css");
|
|
13
13
|
const b = (0, classname_1.cn)('toolbar-button');
|
|
14
14
|
const DEFAULT_ICON_SIZE = 16;
|
|
15
|
-
exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({ title, hint, hotkey, hintWhenDisabled, active, enabled, onClick, className, qa, id, disableTooltip, ...props }, ref) {
|
|
15
|
+
exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({ title, hint, hotkey, theme = 'normal', hintWhenDisabled, active, enabled, onClick, className, qa, id, disableTooltip, ...props }, ref) {
|
|
16
16
|
const disabled = !active && !enabled;
|
|
17
17
|
const titleText = (0, lodash_1.isFunction)(title) ? title() : title;
|
|
18
18
|
const hintText = (0, lodash_1.isFunction)(hint) ? hint() : hint;
|
|
@@ -26,7 +26,7 @@ exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({
|
|
|
26
26
|
(0, uikit_1.setRef)(ref, elem);
|
|
27
27
|
(0, uikit_1.setRef)(refForPopover, elem);
|
|
28
28
|
(0, uikit_1.setRef)(refForTooltip, elem);
|
|
29
|
-
}, selected: active, disabled: disabled, view: active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), "aria-label": titleText, "data-toolbar-item": id, children: 'icon' in props ? ((0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: props.icon.data, size: props.icon.size ?? DEFAULT_ICON_SIZE })) : (props.children) })) })) }));
|
|
29
|
+
}, selected: active, disabled: disabled, view: theme === 'danger' ? 'flat-danger' : active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), "aria-label": titleText, "data-toolbar-item": id, children: 'icon' in props ? ((0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: props.icon.data, size: props.icon.size ?? DEFAULT_ICON_SIZE })) : (props.children) })) })) }));
|
|
30
30
|
});
|
|
31
31
|
function ToolbarButton(props) {
|
|
32
32
|
const { id, editor, focus, isActive, isEnable, exec, onClick } = props;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarButton.tsx"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"ToolbarButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type ReactNode, forwardRef} from 'react';\n\nimport {ActionTooltip, Button, Icon, Popover, setRef} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\n\nimport {ToolbarTooltipDelay} from './const';\nimport type {ToolbarBaseProps, ToolbarItemData} from './types';\n\nimport './ToolbarButton.scss';\n\nconst b = cn('toolbar-button');\n\nexport type ToolbarButtonProps<E> = ToolbarBaseProps<E> & ToolbarItemData<E>;\n\nexport type ToolbarButtonViewProps = Pick<\n ToolbarItemData<unknown>,\n 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa' | 'theme'\n> & {\n active: boolean;\n enabled: boolean;\n onClick: () => void;\n id?: string;\n className?: string;\n} & (Pick<ToolbarItemData<unknown>, 'icon'> | {children: ReactNode}) &\n Pick<ToolbarBaseProps<unknown>, 'disableTooltip'>;\n\nconst DEFAULT_ICON_SIZE = 16;\n\nexport const ToolbarButtonView = forwardRef<HTMLButtonElement, ToolbarButtonViewProps>(\n function ToolbarButtonView(\n {\n title,\n hint,\n hotkey,\n theme = 'normal',\n hintWhenDisabled,\n active,\n enabled,\n onClick,\n className,\n qa,\n id,\n disableTooltip,\n ...props\n },\n ref,\n ) {\n const disabled = !active && !enabled;\n const titleText: string = isFunction(title) ? title() : title;\n const hintText: string | undefined = isFunction(hint) ? hint() : hint;\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n return (\n <Popover\n content={<div className={b('action-disabled-tooltip')}>{hintWhenDisabledText}</div>}\n disabled={hideHintWhenDisabled}\n placement={['bottom']}\n >\n {(_, refForPopover) => (\n <ActionTooltip\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n description={hintText}\n title={titleText}\n hotkey={hotkey}\n disabled={disableTooltip}\n >\n {(__, refForTooltip) => (\n <Button\n qa={qa}\n size=\"m\"\n ref={(elem: HTMLButtonElement) => {\n setRef(ref, elem);\n setRef(refForPopover, elem);\n setRef(refForTooltip, elem);\n }}\n selected={active}\n disabled={disabled}\n view={\n theme === 'danger' ? 'flat-danger' : active ? 'normal' : 'flat'\n }\n onClick={onClick}\n className={b(null, [className])}\n aria-label={titleText}\n data-toolbar-item={id}\n >\n {'icon' in props ? (\n <Icon\n data={props.icon.data}\n size={props.icon.size ?? DEFAULT_ICON_SIZE}\n />\n ) : (\n props.children\n )}\n </Button>\n )}\n </ActionTooltip>\n )}\n </Popover>\n );\n },\n);\n\nexport function ToolbarButton<E>(props: ToolbarButtonProps<E>) {\n const {id, editor, focus, isActive, isEnable, exec, onClick} = props;\n\n const active = isActive(editor);\n const enabled = isEnable(editor);\n\n const handleClick = () => {\n focus();\n exec(editor);\n onClick?.(id);\n };\n\n return <ToolbarButtonView {...props} active={active} enabled={enabled} onClick={handleClick} />;\n}\n"]}
|