@gravity-ui/markdown-editor 15.0.1 → 15.1.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/bundle/config/dynamicModifiers.js +14 -6
- package/build/cjs/bundle/config/dynamicModifiers.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/index.d.ts +3 -1
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/index.js +2 -0
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/index.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.d.ts +15 -3
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.js +16 -8
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.d.ts +3 -0
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.js +13 -2
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/index.d.ts +2 -1
- package/build/cjs/extensions/yfm/ImgSize/index.js +2 -0
- package/build/cjs/extensions/yfm/ImgSize/index.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/index.css +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/cjs/view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.js +6 -4
- package/build/cjs/view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.js.map +1 -1
- package/build/esm/bundle/config/dynamicModifiers.js +13 -6
- package/build/esm/bundle/config/dynamicModifiers.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.d.ts +3 -1
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.js +2 -0
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.d.ts +15 -3
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.js +15 -7
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.d.ts +3 -0
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.js +14 -3
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/index.d.ts +2 -1
- package/build/esm/extensions/yfm/ImgSize/index.js +2 -0
- package/build/esm/extensions/yfm/ImgSize/index.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/index.css +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/esm/view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.js +6 -4
- package/build/esm/view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.js.map +1 -1
- package/build/styles.css +1 -1
- package/package.json +3 -3
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createDynamicModifiers = createDynamicModifiers;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const ts_dedent_1 = tslib_1.__importDefault(require("ts-dedent"));
|
|
4
6
|
const uuid_1 = require("uuid");
|
|
5
7
|
const YFM_TABLE_TOKEN_ATTR = 'data-token-id';
|
|
6
8
|
const YFM_TABLE_NODE_ATTR = 'data-node-id';
|
|
7
|
-
const PARENTS_WITH_AFFECT = ['blockquote', 'yfm_tabs'];
|
|
8
9
|
function createDynamicModifiers(markupManager) {
|
|
9
10
|
return [
|
|
10
11
|
{
|
|
@@ -17,10 +18,12 @@ function createDynamicModifiers(markupManager) {
|
|
|
17
18
|
process: (token, _, rawMarkup) => {
|
|
18
19
|
const { map } = token;
|
|
19
20
|
if (map) {
|
|
20
|
-
const content = rawMarkup.split('\n').slice(map[0], map[1]).join('\n');
|
|
21
|
+
const content = rawMarkup.split('\n').slice(map[0], map[1]).join('\n').trim();
|
|
21
22
|
const tokenId = (0, uuid_1.v5)(content, markupManager.getNamespace());
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
if (/^\s*#\|/.test(content)) {
|
|
24
|
+
token.attrSet(YFM_TABLE_TOKEN_ATTR, tokenId);
|
|
25
|
+
markupManager.setMarkup(tokenId, (0, ts_dedent_1.default)(content));
|
|
26
|
+
}
|
|
24
27
|
}
|
|
25
28
|
return token;
|
|
26
29
|
},
|
|
@@ -58,8 +61,13 @@ function createDynamicModifiers(markupManager) {
|
|
|
58
61
|
process: (state, node, parent, index, callback) => {
|
|
59
62
|
const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];
|
|
60
63
|
const savedNode = markupManager.getNode(nodeId);
|
|
61
|
-
if (
|
|
62
|
-
|
|
64
|
+
if (savedNode?.eq(node)) {
|
|
65
|
+
const content = markupManager.getMarkup(nodeId) || '';
|
|
66
|
+
state.ensureNewLine();
|
|
67
|
+
state.text(content, false);
|
|
68
|
+
state.ensureNewLine();
|
|
69
|
+
state.closeBlock();
|
|
70
|
+
state.write('\n');
|
|
63
71
|
return;
|
|
64
72
|
}
|
|
65
73
|
callback?.(state, node, parent, index);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["bundle/config/dynamicModifiers.ts"],"names":[],"mappings":";;AASA,
|
|
1
|
+
{"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["bundle/config/dynamicModifiers.ts"],"names":[],"mappings":";;AASA,wDAgFC;;AAzFD,kEAA+B;AAC/B,+BAAwB;AAKxB,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAC7C,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAE3C,SAAgB,sBAAsB,CAAC,aAA4B;IAC/D,OAAO;QACH;YACI,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,WAAW;YACtB;;;eAGG;YACH,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE;gBAC7B,MAAM,EAAC,GAAG,EAAC,GAAG,KAAK,CAAC;gBAEpB,IAAI,GAAG,EAAE,CAAC;oBACN,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC9E,MAAM,OAAO,GAAG,IAAA,SAAE,EAAC,OAAO,EAAE,aAAa,CAAC,YAAY,EAAE,CAAC,CAAC;oBAE1D,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC1B,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;wBAC7C,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE,IAAA,mBAAM,EAAC,OAAO,CAAC,CAAC,CAAC;oBACtD,CAAC;gBACL,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC;SACJ;QACD;YACI,IAAI,EAAE,iBAAiB;YACvB,SAAS,EAAE,WAAW;YACtB;;eAEG;YACH,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBACxB,GAAG,KAAK;gBACR,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC;aAC7D,CAAC;SACL;QACD;YACI,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,WAAW;YACrB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACd,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC/C,IAAI,MAAM,EAAE,CAAC;oBACT,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACxC,CAAC;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC;SACJ;QACD;YACI,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,WAAW;YACrB;;;;eAIG;YACH,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC/C,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAEhD,IAAI,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtB,MAAM,OAAO,GAAW,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC9D,KAAK,CAAC,aAAa,EAAE,CAAC;oBACtB,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBAC3B,KAAK,CAAC,aAAa,EAAE,CAAC;oBACtB,KAAK,CAAC,UAAU,EAAE,CAAC;oBACnB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAClB,OAAO;gBACX,CAAC;gBAED,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;SACJ;QACD;YACI,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,WAAW;YACrB;;eAEG;YACH,YAAY,EAAE,CAAC,mBAAmB,CAAC;SACtC;KACJ,CAAC;AACN,CAAC","sourcesContent":["import dedent from 'ts-dedent';\nimport {v5} from 'uuid';\n\nimport type {DynamicModifiers} from '../../core/types/dynamicModifiers';\nimport type {MarkupManager} from '../MarkupManager';\n\nconst YFM_TABLE_TOKEN_ATTR = 'data-token-id';\nconst YFM_TABLE_NODE_ATTR = 'data-node-id';\n\nexport function createDynamicModifiers(markupManager: MarkupManager): DynamicModifiers[] {\n return [\n {\n type: 'parserToken',\n tokenName: 'yfm_table',\n /**\n * - Assigns a unique `data-token-id` to each token.\n * - Captures and stores the raw Markdown using `MarkupManager`.\n */\n process: (token, _, rawMarkup) => {\n const {map} = token;\n\n if (map) {\n const content = rawMarkup.split('\\n').slice(map[0], map[1]).join('\\n').trim();\n const tokenId = v5(content, markupManager.getNamespace());\n\n if (/^\\s*#\\|/.test(content)) {\n token.attrSet(YFM_TABLE_TOKEN_ATTR, tokenId);\n markupManager.setMarkup(tokenId, dedent(content));\n }\n }\n return token;\n },\n },\n {\n type: 'parserNodeAttrs',\n tokenName: 'yfm_table',\n /**\n * - Links the token to its corresponding node via `data-node-id`.\n */\n process: (token, attrs) => ({\n ...attrs,\n [YFM_TABLE_NODE_ATTR]: token.attrGet(YFM_TABLE_TOKEN_ATTR),\n }),\n },\n {\n type: 'parserNode',\n nodeName: 'yfm_table',\n process: (node) => {\n const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];\n if (nodeId) {\n markupManager.setNode(nodeId, node);\n }\n return node;\n },\n },\n {\n type: 'serializerNode',\n nodeName: 'yfm_table',\n /**\n * - Retrieves the original Markdown using the `data-node-id` attribute.\n * - Uses the original Markdown if the node matches the saved version.\n * - Falls back to schema-based rendering if the node structure, attributes, or parent elements affect it.\n */\n process: (state, node, parent, index, callback) => {\n const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];\n const savedNode = markupManager.getNode(nodeId);\n\n if (savedNode?.eq(node)) {\n const content: string = markupManager.getMarkup(nodeId) || '';\n state.ensureNewLine();\n state.text(content, false);\n state.ensureNewLine();\n state.closeBlock();\n state.write('\\n');\n return;\n }\n\n callback?.(state, node, parent, index);\n },\n },\n {\n type: 'schemaNodeSpec',\n nodeName: 'yfm_table',\n /**\n * - Adds the `data-node-id` attribute to the list of allowed attributes.\n */\n allowedAttrs: [YFM_TABLE_NODE_ATTR],\n },\n ];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImagePaste/index.ts"],"names":[],"mappings":";;;AAAA,2DAA4D;AAC5D,yDAA0E;AAC1E,yDAAyC;AACzC,iEAAgD;AAIhD,kDAA8C;AAE9C,oEAA2D;AAC3D,gEAAmE;AACnE,6CAAiE;AACjE,uCAAkE;AAElE,wCAA6C;AAE7C,MAAM,EAAC,eAAe,EAAE,WAAW,EAAE,WAAW,EAAC,GAAG,0BAAc,CAAC;AAa5D,MAAM,UAAU,GAAqC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC1E,MAAM,EAAC,uBAAuB,EAAE,kBAAkB,EAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IAEjE,IAAI,CAAC,IAAA,mBAAU,EAAC,kBAAkB,IAAI,uBAAuB,CAAC;QAC1D,MAAM,IAAI,KAAK,CACX,yBACI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,yBACrD,oBAAoB,CACvB,CAAC;IAEN,OAAO,CAAC,SAAS,CACb,GAAG,EAAE,CACD,IAAI,0BAAM,CAAC;QACP,KAAK,EAAE;YACH,eAAe,EAAE;gBACb,KAAK,CAAC,IAAI,EAAE,CAAC;oBACT,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;oBAC/C,IAAI,kBAAkB,IAAI,KAAK,EAAE,CAAC;wBAC9B,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,IAAI,4BAAmB,CACnB,IAAI,EACJ,KAAK,EACL,kBAAkB,EAClB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAC5B,IAAI,CACP,CAAC,GAAG,EAAE,CAAC;wBACR,OAAO,IAAI,CAAC;oBAChB,CAAC;yBAAM,IAAI,uBAAuB,EAAE,CAAC;wBACjC,MAAM,EAAC,QAAQ,EAAE,KAAK,EAAC,GACnB,uBAAuB,CACnB,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,wBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CACxD,IAAI,EAAE,CAAC;wBAEZ,IAAI,CAAC,QAAQ,EAAE,CAAC;4BACZ,OAAO,KAAK,CAAC;wBACjB,CAAC;wBAED,CAAC,CAAC,cAAc,EAAE,CAAC;wBAEnB,MAAM,SAAS,GAAG,IAAA,iBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;4BAClD,GAAG,EAAE,QAAQ;4BACb,GAAG,EAAE,KAAK;yBACb,CAAC,CAAC;wBAEH,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;wBACzD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;wBAEnC,OAAO,IAAI,CAAC;oBAChB,CAAC;oBAED,OAAO,KAAK,CAAC;gBACjB,CAAC;gBACD,IAAI,CAAC,IAAI,EAAE,CAAC;oBACR,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBACtB,OAAO,KAAK,CAAC;oBACjB,CAAC;oBAED,iCAAiC;oBACjC,IAAI,IAAI,CAAC,QAAQ;wBAAE,OAAO,KAAK,CAAC;oBAEhC,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;oBAC9C,IAAI,CAAC,KAAK;wBAAE,OAAO,KAAK,CAAC;oBAEzB,MAAM,OAAO,GACT,IAAI,CAAC,WAAW,CAAC,EAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;oBACnE,IAAI,OAAO,KAAK,CAAC,CAAC;wBAAE,OAAO,KAAK,CAAC;oBAEjC,MAAM,WAAW,GAAG,IAAA,iCAAS,EACzB,IAAI,CAAC,KAAK,CAAC,GAAG,EACd,OAAO,EACP,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAC1C,CAAC;oBAEF,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;wBACvB,IAAI,4BAAmB,CACnB,IAAI,EACJ,KAAK,EACL,kBAAkB,EAClB,WAAW,EACX,IAAI,CACP,CAAC,GAAG,EAAE,CAAC;oBACZ,CAAC;oBAED,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,OAAO,IAAI,CAAC;gBAChB,CAAC;aACJ;YACD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK;gBAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBACtB,OAAO,KAAK,CAAC;gBACjB,CAAC;gBAED,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;gBACpC,IAAI,IAAI,IAAI,IAAA,mBAAW,EAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAW,CAAC,GAAG,CAAC,CAAC;oBAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC/C,IAAI,OAAO,EAAE,CAAC;wBACV,IAAI,4BAAmB,CACnB,IAAI,EACJ,CAAC,OAAO,CAAC,EACT,kBAAkB,EAClB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAC5B,IAAI,CACP,CAAC,GAAG,EAAE,CAAC;wBACR,OAAO,IAAI,CAAC;oBAChB,CAAC;gBACL,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC;SACJ;KACJ,CAAC,EACN,OAAO,CAAC,QAAQ,CAAC,IAAI,CACxB,CAAC;AACN,CAAC,CAAC;AAjHW,QAAA,UAAU,cAiHrB;AAEF,SAAS,eAAe,CAAC,IAAyB;IAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc;IACxC,OAAO,IAAI,yBAAK,CACZ,4BAAQ,CAAC,IAAI,CACT,IAAA,iBAAS,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QACrB,CAAC,iBAAS,CAAC,GAAG,CAAC,EAAE,MAAM;QACvB,CAAC,iBAAS,CAAC,KAAK,CAAC,EAAE,OAAO;KAC7B,CAAC,CACL,EACD,CAAC,EACD,CAAC,CACJ,CAAC;AACN,CAAC;AAED,wCAAwC;AACxC,SAAS,eAAe,CAAC,KAAY;IACjC,OAAO,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC;QACjF,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU;QAC1B,CAAC,CAAC,IAAI,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,QAAgB;IACpD,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC,CAAC,IAAA,2BAAc,EAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;AAC5E,CAAC","sourcesContent":["import {decode as base64ToBuffer} from 'base64-arraybuffer';\nimport {Fragment, type Node, type Schema, Slice} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\nimport {dropPoint} from 'prosemirror-transform';\n\nimport type {ParseInsertedUrlAsImage} from '../../../../bundle';\nimport type {ExtensionAuto} from '../../../../core';\nimport {isFunction} from '../../../../lodash';\nimport type {FileUploadHandler} from '../../../../utils';\nimport {clipboardUtils} from '../../../behavior/Clipboard';\nimport {DataTransferType} from '../../../behavior/Clipboard/utils';\nimport {ImageAttr, ImgSizeAttr, imageType} from '../../../specs';\nimport {type CreateImageNodeOptions, isImageNode} from '../utils';\n\nimport {ImagesUploadProcess} from './upload';\n\nconst {isFilesFromHtml, isFilesOnly, isImageFile} = clipboardUtils;\n\nexport type ImagePasteOptions = Pick<\n CreateImageNodeOptions,\n 'needDimensions' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n /**\n * The function, used to determine if the pasted text is the image url and should be inserted as an image\n */\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n};\n\nexport const ImagePaste: ExtensionAuto<ImagePasteOptions> = (builder, opts) => {\n const {parseInsertedUrlAsImage, imageUploadHandler} = opts ?? {};\n\n if (!isFunction(imageUploadHandler ?? parseInsertedUrlAsImage))\n throw new Error(\n `ImagePaste extension: ${\n opts.imageUploadHandler ? 'imageUploadHandler' : 'parseInsertedUrlAsImage'\n } is not a function`,\n );\n\n builder.addPlugin(\n () =>\n new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, e) {\n const files = getPastedImages(e.clipboardData);\n if (imageUploadHandler && files) {\n e.preventDefault();\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n } else if (parseInsertedUrlAsImage) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n e.clipboardData?.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (!imageUrl) {\n return false;\n }\n\n e.preventDefault();\n\n const imageNode = imageType(view.state.schema).create({\n src: imageUrl,\n alt: title,\n });\n\n const tr = view.state.tr.replaceSelectionWith(imageNode);\n view.dispatch(tr.scrollIntoView());\n\n return true;\n }\n\n return false;\n },\n drop(view, e) {\n if (!imageUploadHandler) {\n return false;\n }\n\n // handle drop images from device\n if (view.dragging) return false;\n\n const files = getPastedImages(e.dataTransfer);\n if (!files) return false;\n\n const dropPos =\n view.posAtCoords({left: e.clientX, top: e.clientY})?.pos ?? -1;\n if (dropPos === -1) return false;\n\n const posToInsert = dropPoint(\n view.state.doc,\n dropPos,\n createFakeImageSlice(view.state.schema),\n );\n\n if (posToInsert !== null) {\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n posToInsert,\n opts,\n ).run();\n }\n\n e.preventDefault();\n return true;\n },\n },\n handlePaste(view, _event, slice) {\n if (!imageUploadHandler) {\n return false;\n }\n\n const node = sliceSingleNode(slice);\n if (node && isImageNode(node)) {\n const imgUrl = node.attrs[ImgSizeAttr.Src];\n const imgFile = dataUrlToFile(imgUrl, 'image');\n if (imgFile) {\n new ImagesUploadProcess(\n view,\n [imgFile],\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n }\n }\n return false;\n },\n },\n }),\n builder.Priority.High,\n );\n};\n\nfunction getPastedImages(data: DataTransfer | null): File[] | null {\n if (!data || data.files.length === 0) return null;\n if (!isFilesOnly(data) && !isFilesFromHtml(data)) return null;\n const files = Array.from(data.files);\n return files.every(isImageFile) ? files : null;\n}\n\nfunction createFakeImageSlice(schema: Schema): Slice {\n return new Slice(\n Fragment.from(\n imageType(schema).create({\n [ImageAttr.Src]: 'fake',\n [ImageAttr.Title]: 'image',\n }),\n ),\n 0,\n 0,\n );\n}\n\n// copied from prosemirror-view input.ts\nfunction sliceSingleNode(slice: Slice): Node | null {\n return slice.openStart === 0 && slice.openEnd === 0 && slice.content.childCount === 1\n ? slice.content.firstChild\n : null;\n}\n\nfunction dataUrlToFile(dataUrl: string, filename: string): File | null {\n const [data, base64String] = dataUrl.split(',');\n if (!data || !base64String) return null;\n const mime = data.match(/^data:(.+);base64/)?.[1];\n if (!mime) return null;\n return new File([base64ToBuffer(base64String)], filename, {type: mime});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImagePaste/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {decode as base64ToBuffer} from 'base64-arraybuffer';\nimport {Fragment, type Node, type Schema, Slice} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\nimport {dropPoint} from 'prosemirror-transform';\n\nimport type {ParseInsertedUrlAsImage} from '../../../../bundle';\nimport type {ExtensionAuto} from '../../../../core';\nimport {isFunction} from '../../../../lodash';\nimport type {FileUploadHandler} from '../../../../utils';\nimport {clipboardUtils} from '../../../behavior/Clipboard';\nimport {DataTransferType} from '../../../behavior/Clipboard/utils';\nimport {ImageAttr, ImgSizeAttr, imageType} from '../../../specs';\nimport {type CreateImageNodeOptions, isImageNode} from '../utils';\n\nimport {ImagesUploadProcess} from './upload';\n\nconst {isFilesFromHtml, isFilesOnly, isImageFile} = clipboardUtils;\n\nexport type ImagePasteOptions = Pick<\n CreateImageNodeOptions,\n 'needDimensions' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n /**\n * The function, used to determine if the pasted text is the image url and should be inserted as an image\n */\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n};\n\nexport const ImagePaste: ExtensionAuto<ImagePasteOptions> = (builder, opts) => {\n const {parseInsertedUrlAsImage, imageUploadHandler} = opts ?? {};\n\n if (!isFunction(imageUploadHandler ?? parseInsertedUrlAsImage))\n throw new Error(\n `ImagePaste extension: ${\n opts.imageUploadHandler ? 'imageUploadHandler' : 'parseInsertedUrlAsImage'\n } is not a function`,\n );\n\n builder.addPlugin(\n () =>\n new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, e) {\n const files = getPastedImages(e.clipboardData);\n if (imageUploadHandler && files) {\n e.preventDefault();\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n } else if (parseInsertedUrlAsImage) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n e.clipboardData?.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (!imageUrl) {\n return false;\n }\n\n e.preventDefault();\n\n const imageNode = imageType(view.state.schema).create({\n src: imageUrl,\n alt: title,\n });\n\n const tr = view.state.tr.replaceSelectionWith(imageNode);\n view.dispatch(tr.scrollIntoView());\n\n return true;\n }\n\n return false;\n },\n drop(view, e) {\n if (!imageUploadHandler) {\n return false;\n }\n\n // handle drop images from device\n if (view.dragging) return false;\n\n const files = getPastedImages(e.dataTransfer);\n if (!files) return false;\n\n const dropPos =\n view.posAtCoords({left: e.clientX, top: e.clientY})?.pos ?? -1;\n if (dropPos === -1) return false;\n\n const posToInsert = dropPoint(\n view.state.doc,\n dropPos,\n createFakeImageSlice(view.state.schema),\n );\n\n if (posToInsert !== null) {\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n posToInsert,\n opts,\n ).run();\n }\n\n e.preventDefault();\n return true;\n },\n },\n handlePaste(view, _event, slice) {\n if (!imageUploadHandler) {\n return false;\n }\n\n const node = sliceSingleNode(slice);\n if (node && isImageNode(node)) {\n const imgUrl = node.attrs[ImgSizeAttr.Src];\n const imgFile = dataUrlToFile(imgUrl, 'image');\n if (imgFile) {\n new ImagesUploadProcess(\n view,\n [imgFile],\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n }\n }\n return false;\n },\n },\n }),\n builder.Priority.VeryHigh,\n );\n};\n\nfunction getPastedImages(data: DataTransfer | null): File[] | null {\n if (!data || data.files.length === 0) return null;\n if (!isFilesOnly(data) && !isFilesFromHtml(data)) return null;\n const files = Array.from(data.files);\n return files.every(isImageFile) ? files : null;\n}\n\nfunction createFakeImageSlice(schema: Schema): Slice {\n return new Slice(\n Fragment.from(\n imageType(schema).create({\n [ImageAttr.Src]: 'fake',\n [ImageAttr.Title]: 'image',\n }),\n ),\n 0,\n 0,\n );\n}\n\n// copied from prosemirror-view input.ts\nfunction sliceSingleNode(slice: Slice): Node | null {\n return slice.openStart === 0 && slice.openEnd === 0 && slice.content.childCount === 1\n ? slice.content.firstChild\n : null;\n}\n\nfunction dataUrlToFile(dataUrl: string, filename: string): File | null {\n const [data, base64String] = dataUrl.split(',');\n if (!data || !base64String) return null;\n const mime = data.match(/^data:(.+);base64/)?.[1];\n if (!mime) return null;\n return new File([base64ToBuffer(base64String)], filename, {type: mime});\n}\n"]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { Action, ExtensionAuto } from "../../../../core/index.js";
|
|
2
2
|
import type { FileUploadHandler } from "../../../../utils/upload.js";
|
|
3
|
+
import type { RenderImageWidgetFormFn } from "./view.js";
|
|
3
4
|
import type { ImageWidgetDescriptorOpts } from "./widget.js";
|
|
4
5
|
declare const addImageWidgetAction = "addImageWidget";
|
|
5
|
-
export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages'> & {
|
|
6
|
+
export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'> & {
|
|
6
7
|
imageUploadHandler?: FileUploadHandler;
|
|
8
|
+
renderImageWidgetForm?: RenderImageWidgetFormFn;
|
|
7
9
|
};
|
|
8
10
|
export declare const ImageWidget: ExtensionAuto<ImageWidgetOptions>;
|
|
9
11
|
declare global {
|
|
@@ -6,7 +6,9 @@ const addImageWidgetAction = 'addImageWidget';
|
|
|
6
6
|
const ImageWidget = (builder, opts) => {
|
|
7
7
|
builder.addAction(addImageWidgetAction, (deps) => (0, actions_1.addImageWidget)(deps, {
|
|
8
8
|
uploadImages: opts.imageUploadHandler,
|
|
9
|
+
renderImageForm: opts.renderImageWidgetForm,
|
|
9
10
|
needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,
|
|
11
|
+
enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,
|
|
10
12
|
}));
|
|
11
13
|
};
|
|
12
14
|
exports.ImageWidget = ImageWidget;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":";;;AAGA,0CAAyC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":";;;AAGA,0CAAyC;AAIzC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAUvC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7C,IAAA,wBAAc,EAAC,IAAI,EAAE;QACjB,YAAY,EAAE,IAAI,CAAC,kBAAkB;QACrC,eAAe,EAAE,IAAI,CAAC,qBAAqB;QAC3C,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;QAC/E,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;KACpE,CAAC,CACL,CAAC;AACN,CAAC,CAAC;AATW,QAAA,WAAW,eAStB","sourcesContent":["import type {Action, ExtensionAuto} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\n\nimport {addImageWidget} from './actions';\nimport type {RenderImageWidgetFormFn} from './view';\nimport type {ImageWidgetDescriptorOpts} from './widget';\n\nconst addImageWidgetAction = 'addImageWidget';\n\nexport type ImageWidgetOptions = Pick<\n ImageWidgetDescriptorOpts,\n 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n renderImageWidgetForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImageWidget: ExtensionAuto<ImageWidgetOptions> = (builder, opts) => {\n builder.addAction(addImageWidgetAction, (deps) =>\n addImageWidget(deps, {\n uploadImages: opts.imageUploadHandler,\n renderImageForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n }),\n );\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [addImageWidgetAction]: Action;\n }\n }\n}\n"]}
|
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
import { type ImageFormProps } from "../../../../forms/ImageForm.js";
|
|
1
|
+
import { type ImageFormProps, type ImageFormSubmitParams } from "../../../../forms/ImageForm.js";
|
|
2
2
|
import "./view.css";
|
|
3
|
-
export type
|
|
3
|
+
export type RenderImageWidgetFormProps = {
|
|
4
|
+
/** Handler for submitting form */
|
|
5
|
+
onSubmit: (params: ImageFormSubmitParams) => void;
|
|
6
|
+
/** Handler for cancellation */
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
/** Handler for attach file from device */
|
|
9
|
+
onAttach?: (files: File[]) => void;
|
|
10
|
+
/** Uploading attached file */
|
|
11
|
+
uploading?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;
|
|
14
|
+
export type ImagePlaceholderProps = {
|
|
4
15
|
onCancel: () => void;
|
|
5
16
|
onSubmit: ImageFormProps['onSubmit'];
|
|
6
17
|
onAttach?: (files: File[]) => Promise<void>;
|
|
18
|
+
renderForm?: RenderImageWidgetFormFn;
|
|
7
19
|
};
|
|
8
|
-
export declare const
|
|
20
|
+
export declare const ImagePlaceholder: React.FC<ImagePlaceholderProps>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.ImagePlaceholder = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
const icons_1 = require("@gravity-ui/icons");
|
|
@@ -13,23 +13,31 @@ const hooks_1 = require("../../../../react-utils/hooks.js");
|
|
|
13
13
|
require("./view.css");
|
|
14
14
|
const b = (0, classname_1.cn)('image-placeholder');
|
|
15
15
|
const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
|
|
16
|
-
const
|
|
16
|
+
const defaultFormRenderer = (props) => {
|
|
17
|
+
return ((0, jsx_runtime_1.jsx)(ImageForm_1.ImageForm, { autoFocus: true, loading: props.uploading, onCancel: props.onCancel, onSubmit: props.onSubmit, onAttach: props.onAttach }));
|
|
18
|
+
};
|
|
19
|
+
const ImagePlaceholder = ({ onCancel, onSubmit, onAttach, renderForm, }) => {
|
|
17
20
|
const isMounted = (0, react_use_1.useMountedState)();
|
|
18
|
-
const [
|
|
21
|
+
const [uploading, startUploading, stopUploading] = (0, hooks_1.useBooleanState)(false);
|
|
19
22
|
const [anchor, setAnchor] = (0, hooks_1.useElementState)();
|
|
20
23
|
const attachHandler = (0, react_1.useCallback)((files) => {
|
|
21
24
|
if (!onAttach)
|
|
22
25
|
return;
|
|
23
26
|
if (isMounted()) {
|
|
24
|
-
|
|
27
|
+
startUploading();
|
|
25
28
|
onAttach(files).finally(() => {
|
|
26
29
|
if (isMounted()) {
|
|
27
|
-
|
|
30
|
+
stopUploading();
|
|
28
31
|
}
|
|
29
32
|
});
|
|
30
33
|
}
|
|
31
|
-
}, [isMounted, onAttach,
|
|
32
|
-
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { ref: setAnchor, className: b(), children: [(0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Picture, size: 24 }), (0, widgets_1.i18n)('image')] }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: (
|
|
34
|
+
}, [isMounted, onAttach, startUploading, stopUploading]);
|
|
35
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { ref: setAnchor, className: b(), children: [(0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Picture, size: 24 }), (0, widgets_1.i18n)('image')] }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: (renderForm || defaultFormRenderer)({
|
|
36
|
+
onCancel,
|
|
37
|
+
onSubmit,
|
|
38
|
+
uploading,
|
|
39
|
+
onAttach: onAttach && attachHandler,
|
|
40
|
+
}) })] }));
|
|
33
41
|
};
|
|
34
|
-
exports.
|
|
42
|
+
exports.ImagePlaceholder = ImagePlaceholder;
|
|
35
43
|
//# sourceMappingURL=view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";;;;AAAA,iCAAkC;AAElC,6CAAuD;AACvD,6CAAmE;AACnE,yCAA0C;AAE1C,wDAAyC;AACzC,
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";;;;AAAA,iCAAkC;AAElC,6CAAuD;AACvD,6CAAmE;AACnE,yCAA0C;AAE1C,wDAAyC;AACzC,8DAIqC;AACrC,+DAA8C;AAC9C,4DAA+E;AAE/E,sBAAqB;AAErB,MAAM,CAAC,GAAG,IAAA,cAAE,EAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAczF,MAAM,mBAAmB,GAA4B,CAAC,KAAK,EAAE,EAAE;IAC3D,OAAO,CACH,uBAAC,qBAAS,IACN,SAAS,QACT,OAAO,EAAE,KAAK,CAAC,SAAS,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAC1B,CACL,CAAC;AACN,CAAC,CAAC;AASK,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,GACb,EAAE,EAAE;IACD,MAAM,SAAS,GAAG,IAAA,2BAAe,GAAE,CAAC;IACpC,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,CAAC,GAAG,IAAA,uBAAe,EAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,uBAAe,GAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAA,mBAAW,EAC7B,CAAC,KAAK,EAAE,EAAE;QACN,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,SAAS,EAAE,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;oBACd,aAAa,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EACD,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CACvD,CAAC;IAEF,OAAO,CACH,6DACI,iCAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,aAC/B,uBAAC,YAAI,IAAC,IAAI,EAAE,eAAS,EAAE,IAAI,EAAE,EAAE,GAAI,EAClC,IAAA,cAAI,EAAC,OAAO,CAAC,IACZ,EACN,uBAAC,aAAK,IAAC,IAAI,QAAC,KAAK,QAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,YAChF,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC;oBACjC,QAAQ;oBACR,QAAQ;oBACR,SAAS;oBACT,QAAQ,EAAE,QAAQ,IAAI,aAAa;iBACtC,CAAC,GACE,IACT,CACN,CAAC;AACN,CAAC,CAAC;AAxCW,QAAA,gBAAgB,oBAwC3B","sourcesContent":["import {useCallback} from 'react';\n\nimport {Picture as ImageIcon} from '@gravity-ui/icons';\nimport {Icon, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport {useMountedState} from 'react-use';\n\nimport {cn} from '../../../../classname';\nimport {\n ImageForm,\n type ImageFormProps,\n type ImageFormSubmitParams,\n} from '../../../../forms/ImageForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\n\nimport './view.scss';\n\nconst b = cn('image-placeholder');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type RenderImageWidgetFormProps = {\n /** Handler for submitting form */\n onSubmit: (params: ImageFormSubmitParams) => void;\n /** Handler for cancellation */\n onCancel: () => void;\n /** Handler for attach file from device */\n onAttach?: (files: File[]) => void;\n /** Uploading attached file */\n uploading?: boolean;\n};\nexport type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;\n\nconst defaultFormRenderer: RenderImageWidgetFormFn = (props) => {\n return (\n <ImageForm\n autoFocus\n loading={props.uploading}\n onCancel={props.onCancel}\n onSubmit={props.onSubmit}\n onAttach={props.onAttach}\n />\n );\n};\n\nexport type ImagePlaceholderProps = {\n onCancel: () => void;\n onSubmit: ImageFormProps['onSubmit'];\n onAttach?: (files: File[]) => Promise<void>;\n renderForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImagePlaceholder: React.FC<ImagePlaceholderProps> = ({\n onCancel,\n onSubmit,\n onAttach,\n renderForm,\n}) => {\n const isMounted = useMountedState();\n const [uploading, startUploading, stopUploading] = useBooleanState(false);\n const [anchor, setAnchor] = useElementState();\n const attachHandler = useCallback<NonNullable<ImageFormProps['onAttach']>>(\n (files) => {\n if (!onAttach) return;\n if (isMounted()) {\n startUploading();\n onAttach(files).finally(() => {\n if (isMounted()) {\n stopUploading();\n }\n });\n }\n },\n [isMounted, onAttach, startUploading, stopUploading],\n );\n\n return (\n <>\n <div ref={setAnchor} className={b()}>\n <Icon data={ImageIcon} size={24} />\n {i18n('image')}\n </div>\n <Popup open modal onOpenChange={onCancel} anchorElement={anchor} placement={placement}>\n {(renderForm || defaultFormRenderer)({\n onCancel,\n onSubmit,\n uploading,\n onAttach: onAttach && attachHandler,\n })}\n </Popup>\n </>\n );\n};\n"]}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { Transaction } from 'prosemirror-state';
|
|
2
2
|
import type { ExtensionDeps } from "../../../../core/index.js";
|
|
3
3
|
import type { FileUploadHandler } from "../../../../utils/upload.js";
|
|
4
|
+
import { type RenderImageWidgetFormFn } from "./view.js";
|
|
4
5
|
export declare const addWidget: (tr: Transaction, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) => Transaction;
|
|
5
6
|
export declare const removeWidget: (tr: Transaction, id: string) => Transaction;
|
|
6
7
|
export type ImageWidgetDescriptorOpts = {
|
|
7
8
|
needToSetDimensionsForUploadedImages: boolean;
|
|
8
9
|
uploadImages?: FileUploadHandler;
|
|
10
|
+
enableNewImageSizeCalculation?: boolean;
|
|
11
|
+
renderImageForm?: RenderImageWidgetFormFn;
|
|
9
12
|
};
|
|
@@ -19,13 +19,17 @@ class ImageWidgetDescriptor extends WidgetDecoration_1.ReactWidgetDescriptor {
|
|
|
19
19
|
deps;
|
|
20
20
|
uploadImages;
|
|
21
21
|
needToSetDimensionsForUploadedImages;
|
|
22
|
+
enableNewImageSizeCalculation;
|
|
23
|
+
renderImageForm;
|
|
22
24
|
widgetHandler = null;
|
|
23
25
|
constructor(initPos, deps, opts) {
|
|
24
26
|
super(initPos, 'image_placeholder');
|
|
25
27
|
this.domElem = document.createElement('span');
|
|
26
28
|
this.deps = deps;
|
|
27
29
|
this.uploadImages = opts.uploadImages;
|
|
30
|
+
this.renderImageForm = opts.renderImageForm;
|
|
28
31
|
this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;
|
|
32
|
+
this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;
|
|
29
33
|
}
|
|
30
34
|
getWidgetHandler(view, getPos) {
|
|
31
35
|
if (!this.widgetHandler) {
|
|
@@ -34,7 +38,9 @@ class ImageWidgetDescriptor extends WidgetDecoration_1.ReactWidgetDescriptor {
|
|
|
34
38
|
getPos,
|
|
35
39
|
decoId: this.id,
|
|
36
40
|
uploadImages: this.uploadImages,
|
|
41
|
+
renderImageForm: this.renderImageForm,
|
|
37
42
|
needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,
|
|
43
|
+
enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
|
|
38
44
|
}, this.deps);
|
|
39
45
|
}
|
|
40
46
|
return this.widgetHandler;
|
|
@@ -58,14 +64,18 @@ class ImageWidgetHandler {
|
|
|
58
64
|
uploadImages;
|
|
59
65
|
normalizeUrl;
|
|
60
66
|
needToSetDimensionsForUploadedImages;
|
|
67
|
+
enableNewImageSizeCalculation;
|
|
68
|
+
renderImageForm;
|
|
61
69
|
cancelled = false;
|
|
62
|
-
constructor({ decoId, view, getPos, uploadImages, needToSetDimensionsForUploadedImages, }, deps) {
|
|
70
|
+
constructor({ decoId, view, getPos, uploadImages, renderImageForm, needToSetDimensionsForUploadedImages, enableNewImageSizeCalculation, }, deps) {
|
|
63
71
|
this.decoId = decoId;
|
|
64
72
|
this.view = view;
|
|
65
73
|
this.getPos = getPos;
|
|
66
74
|
this.uploadImages = uploadImages;
|
|
67
75
|
this.normalizeUrl = (0, markdown_1.normalizeUrlFactory)(deps);
|
|
76
|
+
this.renderImageForm = renderImageForm;
|
|
68
77
|
this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;
|
|
78
|
+
this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;
|
|
69
79
|
}
|
|
70
80
|
destruct() {
|
|
71
81
|
this.cancelled = true;
|
|
@@ -73,7 +83,7 @@ class ImageWidgetHandler {
|
|
|
73
83
|
renderWidgetView(view, getPos) {
|
|
74
84
|
this.view = view;
|
|
75
85
|
this.getPos = getPos;
|
|
76
|
-
return ((0, jsx_runtime_1.jsx)(view_1.
|
|
86
|
+
return ((0, jsx_runtime_1.jsx)(view_1.ImagePlaceholder, { onCancel: this.onCancel, onSubmit: this.onSubmit, onAttach: this.uploadImages && this.onAttach, renderForm: this.renderImageForm }));
|
|
77
87
|
}
|
|
78
88
|
onCancel = () => {
|
|
79
89
|
this.cancelled = true;
|
|
@@ -102,6 +112,7 @@ class ImageWidgetHandler {
|
|
|
102
112
|
const { view } = this;
|
|
103
113
|
new upload_1.ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {
|
|
104
114
|
needDimensions: this.needToSetDimensionsForUploadedImages,
|
|
115
|
+
enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
|
|
105
116
|
}).run();
|
|
106
117
|
view.dispatch((0, exports.removeWidget)(view.state.tr, this.decoId));
|
|
107
118
|
view.focus();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {FilePlaceholder, type FilePlaceholderProps} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n needToSetDimensionsForUploadedImages: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n needToSetDimensionsForUploadedImages,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <FilePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n />\n );\n }\n\n private onCancel: FilePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: FilePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: FilePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {ImagePlaceholder, type ImagePlaceholderProps, type RenderImageWidgetFormFn} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n enableNewImageSizeCalculation?: boolean;\n renderImageForm?: RenderImageWidgetFormFn;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.renderImageForm = opts.renderImageForm;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n renderImageForm: this.renderImageForm,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n renderImageForm?: RenderImageWidgetFormFn;\n needToSetDimensionsForUploadedImages: boolean;\n enableNewImageSizeCalculation?: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n renderImageForm,\n needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.renderImageForm = renderImageForm;\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <ImagePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n renderForm={this.renderImageForm}\n />\n );\n }\n\n private onCancel: ImagePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: ImagePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: ImagePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Action, ExtensionAuto } from "../../../core/index.js";
|
|
2
2
|
import { type ImagePasteOptions } from "./ImagePaste/index.js";
|
|
3
|
+
import { type ImageWidgetOptions } from "./ImageWidget/index.js";
|
|
3
4
|
import { type ImgSizeSpecsOptions } from "./ImgSizeSpecs/index.js";
|
|
4
5
|
import { type AddImageAttrs } from "./actions.js";
|
|
5
6
|
import { addImageAction } from "./const.js";
|
|
@@ -10,7 +11,7 @@ export type ImgSizeOptions = ImgSizeSpecsOptions & {
|
|
|
10
11
|
* @default false
|
|
11
12
|
*/
|
|
12
13
|
needToSetDimensionsForUploadedImages?: boolean;
|
|
13
|
-
} & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'>;
|
|
14
|
+
} & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'> & Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;
|
|
14
15
|
export declare const ImgSize: ExtensionAuto<ImgSizeOptions>;
|
|
15
16
|
declare global {
|
|
16
17
|
namespace WysiwygEditor {
|
|
@@ -11,7 +11,9 @@ const ImgSize = (builder, opts) => {
|
|
|
11
11
|
builder.use(ImgSizeSpecs_1.ImgSizeSpecs, opts);
|
|
12
12
|
builder.use(ImageWidget_1.ImageWidget, {
|
|
13
13
|
imageUploadHandler: opts.imageUploadHandler,
|
|
14
|
+
renderImageWidgetForm: opts.renderImageWidgetForm,
|
|
14
15
|
needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),
|
|
16
|
+
enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),
|
|
15
17
|
});
|
|
16
18
|
if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {
|
|
17
19
|
builder.use(ImagePaste_1.ImagePaste, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":";;;AAEA,sDAAgE;AAChE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":";;;AAEA,sDAAgE;AAChE,wDAAmE;AACnE,0DAAsE;AACtE,0CAAuD;AACvD,sCAAuC;AACvC,wEAAgE;AAezD,MAAM,OAAO,GAAkC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACpE,OAAO,CAAC,GAAG,CAAC,2BAAY,EAAE,IAAI,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,yBAAW,EAAE;QACrB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,oCAAoC,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;QACxF,6BAA6B,EAAE,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC;KAC7E,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,uBAAU,EAAE;YACpB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;YAClE,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;SACpE,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,sBAAc,EAAE,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,IAAA,kBAAQ,EAAC,MAAM,CAAC,CAAC,CAAC;IAElE,OAAO,CAAC,SAAS,CAAC,uCAAqB,CAAC,CAAC;AAC7C,CAAC,CAAC;AAtBW,QAAA,OAAO,WAsBlB","sourcesContent":["import type {Action, ExtensionAuto} from '../../../core';\n\nimport {ImagePaste, type ImagePasteOptions} from './ImagePaste';\nimport {ImageWidget, type ImageWidgetOptions} from './ImageWidget';\nimport {ImgSizeSpecs, type ImgSizeSpecsOptions} from './ImgSizeSpecs';\nimport {type AddImageAttrs, addImage} from './actions';\nimport {addImageAction} from './const';\nimport {imgSizeNodeViewPlugin} from './plugins/ImgSizeNodeView';\n\nexport type ImgSizeOptions = ImgSizeSpecsOptions & {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n} & Pick<\n ImagePasteOptions,\n 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'\n > &\n Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;\n\nexport const ImgSize: ExtensionAuto<ImgSizeOptions> = (builder, opts) => {\n builder.use(ImgSizeSpecs, opts);\n\n builder.use(ImageWidget, {\n imageUploadHandler: opts.imageUploadHandler,\n renderImageWidgetForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),\n enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),\n });\n\n if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {\n builder.use(ImagePaste, {\n imageUploadHandler: opts.imageUploadHandler,\n needDimensions: Boolean(opts.needToSetDimensionsForUploadedImages),\n parseInsertedUrlAsImage: opts.parseInsertedUrlAsImage,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n });\n }\n\n builder.addAction(addImageAction, ({schema}) => addImage(schema));\n\n builder.addPlugin(imgSizeNodeViewPlugin);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n // @ts-expect-error\n [addImageAction]: Action<AddImageAttrs>;\n }\n }\n}\n"]}
|
package/build/cjs/version.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VERSION = void 0;
|
|
4
4
|
/** During build process, the current version will be injected here */
|
|
5
|
-
exports.VERSION = typeof '15.0
|
|
5
|
+
exports.VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';
|
|
6
6
|
//# sourceMappingURL=version.js.map
|
package/build/cjs/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.0
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';\n"]}
|
|
@@ -3,9 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.useYfmShowElemWithId = useYfmShowElemWithId;
|
|
4
4
|
const react_1 = require("react");
|
|
5
5
|
const YfmCutCN = {
|
|
6
|
-
Open: 'open',
|
|
7
6
|
Cut: 'yfm-cut',
|
|
8
7
|
};
|
|
8
|
+
const YfmCutAttrs = {
|
|
9
|
+
Open: 'open',
|
|
10
|
+
};
|
|
9
11
|
const YfmTabsCN = {
|
|
10
12
|
Active: 'active',
|
|
11
13
|
Tabs: 'yfm-tabs',
|
|
@@ -32,9 +34,9 @@ function useYfmShowElemWithId(ref, id) {
|
|
|
32
34
|
}
|
|
33
35
|
}, [id]);
|
|
34
36
|
}
|
|
35
|
-
function openYfmCut(
|
|
36
|
-
if (classList.contains(YfmCutCN.Cut) && !
|
|
37
|
-
|
|
37
|
+
function openYfmCut(cutElement) {
|
|
38
|
+
if (cutElement.classList.contains(YfmCutCN.Cut) && !cutElement.hasAttribute(YfmCutAttrs.Open)) {
|
|
39
|
+
cutElement.setAttribute(YfmCutAttrs.Open, '');
|
|
38
40
|
return true;
|
|
39
41
|
}
|
|
40
42
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useYfmShowElemWithId.js","sourceRoot":"../../../../../src","sources":["view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useYfmShowElemWithId.js","sourceRoot":"../../../../../src","sources":["view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.ts"],"names":[],"mappings":"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","sourcesContent":["import {type RefObject, useEffect} from 'react';\n\nconst YfmCutCN = {\n Cut: 'yfm-cut',\n} as const;\n\nconst YfmCutAttrs = {\n Open: 'open',\n} as const;\n\nconst YfmTabsCN = {\n Active: 'active',\n Tabs: 'yfm-tabs',\n TabList: 'yfm-tab-list',\n Tab: 'yfm-tab',\n TabPanel: 'yfm-tab-panel',\n} as const;\n\nconst FoldingHeadingsCN = {\n Open: 'open',\n Section: 'heading-section',\n} as const;\n\nexport function useYfmShowElemWithId(ref: RefObject<HTMLElement>, id: string) {\n useEffect(() => {\n const {current: containerDom} = ref;\n if (!id || !containerDom) return;\n\n let elem = document.getElementById(id);\n if (!elem || !containerDom.contains(elem)) return;\n\n while (elem && elem !== containerDom) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n openYfmCut(elem) || openFoldingHeadings(elem, id) || switchYfmTabs(elem);\n elem = elem.parentElement;\n }\n }, [id]);\n}\n\nfunction openYfmCut(cutElement: Element): boolean {\n if (cutElement.classList.contains(YfmCutCN.Cut) && !cutElement.hasAttribute(YfmCutAttrs.Open)) {\n cutElement.setAttribute(YfmCutAttrs.Open, '');\n return true;\n }\n return false;\n}\n\nfunction switchYfmTabs(tabPanelElem: Element): boolean {\n if (\n !tabPanelElem.id ||\n !tabPanelElem.classList.contains(YfmTabsCN.TabPanel) ||\n tabPanelElem.classList.contains(YfmTabsCN.Active)\n )\n return false;\n const tabsElem = tabPanelElem.parentElement;\n if (!tabsElem?.classList.contains(YfmTabsCN.Tabs)) return false;\n const yfmTabList = tabsElem.firstElementChild;\n if (!yfmTabList?.classList.contains(YfmTabsCN.TabList)) return false;\n\n const tabPanelId = tabPanelElem.id;\n for (const tabElem of Array.from(yfmTabList.children)) {\n if (!tabElem.classList.contains(YfmTabsCN.Tab)) continue;\n\n const isDesiredElem = tabElem.hasAttribute('aria-controls')\n ? tabElem.getAttribute('aria-controls') === tabPanelId\n : tabElem.textContent === tabPanelElem.getAttribute('data-title');\n tabElem.setAttribute('data-diplodoc-is-active', String(isDesiredElem));\n tabElem.setAttribute('aria-selected', String(isDesiredElem));\n tabElem.classList.toggle(YfmTabsCN.Active, isDesiredElem);\n }\n for (const panelElem of Array.from(tabsElem.children)) {\n if (!panelElem.classList.contains(YfmTabsCN.TabPanel)) continue;\n\n const isDesiredElem = panelElem.id === tabPanelId;\n panelElem.classList.toggle(YfmTabsCN.Active, isDesiredElem);\n }\n return true;\n}\n\nfunction openFoldingHeadings(elem: Element, id: string): boolean {\n if (\n elem.classList.contains(FoldingHeadingsCN.Section) &&\n !elem.classList.contains(FoldingHeadingsCN.Open) &&\n id !== elem.firstElementChild?.id\n ) {\n elem.classList.add(FoldingHeadingsCN.Open);\n return true;\n }\n return false;\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import dedent from 'ts-dedent';
|
|
1
2
|
import { v5 } from 'uuid';
|
|
2
3
|
const YFM_TABLE_TOKEN_ATTR = 'data-token-id';
|
|
3
4
|
const YFM_TABLE_NODE_ATTR = 'data-node-id';
|
|
4
|
-
const PARENTS_WITH_AFFECT = ['blockquote', 'yfm_tabs'];
|
|
5
5
|
export function createDynamicModifiers(markupManager) {
|
|
6
6
|
return [
|
|
7
7
|
{
|
|
@@ -14,10 +14,12 @@ export function createDynamicModifiers(markupManager) {
|
|
|
14
14
|
process: (token, _, rawMarkup) => {
|
|
15
15
|
const { map } = token;
|
|
16
16
|
if (map) {
|
|
17
|
-
const content = rawMarkup.split('\n').slice(map[0], map[1]).join('\n');
|
|
17
|
+
const content = rawMarkup.split('\n').slice(map[0], map[1]).join('\n').trim();
|
|
18
18
|
const tokenId = v5(content, markupManager.getNamespace());
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
if (/^\s*#\|/.test(content)) {
|
|
20
|
+
token.attrSet(YFM_TABLE_TOKEN_ATTR, tokenId);
|
|
21
|
+
markupManager.setMarkup(tokenId, dedent(content));
|
|
22
|
+
}
|
|
21
23
|
}
|
|
22
24
|
return token;
|
|
23
25
|
},
|
|
@@ -55,8 +57,13 @@ export function createDynamicModifiers(markupManager) {
|
|
|
55
57
|
process: (state, node, parent, index, callback) => {
|
|
56
58
|
const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];
|
|
57
59
|
const savedNode = markupManager.getNode(nodeId);
|
|
58
|
-
if (
|
|
59
|
-
|
|
60
|
+
if (savedNode?.eq(node)) {
|
|
61
|
+
const content = markupManager.getMarkup(nodeId) || '';
|
|
62
|
+
state.ensureNewLine();
|
|
63
|
+
state.text(content, false);
|
|
64
|
+
state.ensureNewLine();
|
|
65
|
+
state.closeBlock();
|
|
66
|
+
state.write('\n');
|
|
60
67
|
return;
|
|
61
68
|
}
|
|
62
69
|
callback?.(state, node, parent, index);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["bundle/config/dynamicModifiers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAC,MAAM,MAAM,CAAC;AAKxB,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAC7C,MAAM,mBAAmB,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["bundle/config/dynamicModifiers.ts"],"names":[],"mappings":"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","sourcesContent":["import dedent from 'ts-dedent';\nimport {v5} from 'uuid';\n\nimport type {DynamicModifiers} from '../../core/types/dynamicModifiers';\nimport type {MarkupManager} from '../MarkupManager';\n\nconst YFM_TABLE_TOKEN_ATTR = 'data-token-id';\nconst YFM_TABLE_NODE_ATTR = 'data-node-id';\n\nexport function createDynamicModifiers(markupManager: MarkupManager): DynamicModifiers[] {\n return [\n {\n type: 'parserToken',\n tokenName: 'yfm_table',\n /**\n * - Assigns a unique `data-token-id` to each token.\n * - Captures and stores the raw Markdown using `MarkupManager`.\n */\n process: (token, _, rawMarkup) => {\n const {map} = token;\n\n if (map) {\n const content = rawMarkup.split('\\n').slice(map[0], map[1]).join('\\n').trim();\n const tokenId = v5(content, markupManager.getNamespace());\n\n if (/^\\s*#\\|/.test(content)) {\n token.attrSet(YFM_TABLE_TOKEN_ATTR, tokenId);\n markupManager.setMarkup(tokenId, dedent(content));\n }\n }\n return token;\n },\n },\n {\n type: 'parserNodeAttrs',\n tokenName: 'yfm_table',\n /**\n * - Links the token to its corresponding node via `data-node-id`.\n */\n process: (token, attrs) => ({\n ...attrs,\n [YFM_TABLE_NODE_ATTR]: token.attrGet(YFM_TABLE_TOKEN_ATTR),\n }),\n },\n {\n type: 'parserNode',\n nodeName: 'yfm_table',\n process: (node) => {\n const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];\n if (nodeId) {\n markupManager.setNode(nodeId, node);\n }\n return node;\n },\n },\n {\n type: 'serializerNode',\n nodeName: 'yfm_table',\n /**\n * - Retrieves the original Markdown using the `data-node-id` attribute.\n * - Uses the original Markdown if the node matches the saved version.\n * - Falls back to schema-based rendering if the node structure, attributes, or parent elements affect it.\n */\n process: (state, node, parent, index, callback) => {\n const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];\n const savedNode = markupManager.getNode(nodeId);\n\n if (savedNode?.eq(node)) {\n const content: string = markupManager.getMarkup(nodeId) || '';\n state.ensureNewLine();\n state.text(content, false);\n state.ensureNewLine();\n state.closeBlock();\n state.write('\\n');\n return;\n }\n\n callback?.(state, node, parent, index);\n },\n },\n {\n type: 'schemaNodeSpec',\n nodeName: 'yfm_table',\n /**\n * - Adds the `data-node-id` attribute to the list of allowed attributes.\n */\n allowedAttrs: [YFM_TABLE_NODE_ATTR],\n },\n ];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImagePaste/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {decode as base64ToBuffer} from 'base64-arraybuffer';\nimport {Fragment, type Node, type Schema, Slice} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\nimport {dropPoint} from 'prosemirror-transform';\n\nimport type {ParseInsertedUrlAsImage} from '../../../../bundle';\nimport type {ExtensionAuto} from '../../../../core';\nimport {isFunction} from '../../../../lodash';\nimport type {FileUploadHandler} from '../../../../utils';\nimport {clipboardUtils} from '../../../behavior/Clipboard';\nimport {DataTransferType} from '../../../behavior/Clipboard/utils';\nimport {ImageAttr, ImgSizeAttr, imageType} from '../../../specs';\nimport {type CreateImageNodeOptions, isImageNode} from '../utils';\n\nimport {ImagesUploadProcess} from './upload';\n\nconst {isFilesFromHtml, isFilesOnly, isImageFile} = clipboardUtils;\n\nexport type ImagePasteOptions = Pick<\n CreateImageNodeOptions,\n 'needDimensions' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n /**\n * The function, used to determine if the pasted text is the image url and should be inserted as an image\n */\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n};\n\nexport const ImagePaste: ExtensionAuto<ImagePasteOptions> = (builder, opts) => {\n const {parseInsertedUrlAsImage, imageUploadHandler} = opts ?? {};\n\n if (!isFunction(imageUploadHandler ?? parseInsertedUrlAsImage))\n throw new Error(\n `ImagePaste extension: ${\n opts.imageUploadHandler ? 'imageUploadHandler' : 'parseInsertedUrlAsImage'\n } is not a function`,\n );\n\n builder.addPlugin(\n () =>\n new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, e) {\n const files = getPastedImages(e.clipboardData);\n if (imageUploadHandler && files) {\n e.preventDefault();\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n } else if (parseInsertedUrlAsImage) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n e.clipboardData?.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (!imageUrl) {\n return false;\n }\n\n e.preventDefault();\n\n const imageNode = imageType(view.state.schema).create({\n src: imageUrl,\n alt: title,\n });\n\n const tr = view.state.tr.replaceSelectionWith(imageNode);\n view.dispatch(tr.scrollIntoView());\n\n return true;\n }\n\n return false;\n },\n drop(view, e) {\n if (!imageUploadHandler) {\n return false;\n }\n\n // handle drop images from device\n if (view.dragging) return false;\n\n const files = getPastedImages(e.dataTransfer);\n if (!files) return false;\n\n const dropPos =\n view.posAtCoords({left: e.clientX, top: e.clientY})?.pos ?? -1;\n if (dropPos === -1) return false;\n\n const posToInsert = dropPoint(\n view.state.doc,\n dropPos,\n createFakeImageSlice(view.state.schema),\n );\n\n if (posToInsert !== null) {\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n posToInsert,\n opts,\n ).run();\n }\n\n e.preventDefault();\n return true;\n },\n },\n handlePaste(view, _event, slice) {\n if (!imageUploadHandler) {\n return false;\n }\n\n const node = sliceSingleNode(slice);\n if (node && isImageNode(node)) {\n const imgUrl = node.attrs[ImgSizeAttr.Src];\n const imgFile = dataUrlToFile(imgUrl, 'image');\n if (imgFile) {\n new ImagesUploadProcess(\n view,\n [imgFile],\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n }\n }\n return false;\n },\n },\n }),\n builder.Priority.High,\n );\n};\n\nfunction getPastedImages(data: DataTransfer | null): File[] | null {\n if (!data || data.files.length === 0) return null;\n if (!isFilesOnly(data) && !isFilesFromHtml(data)) return null;\n const files = Array.from(data.files);\n return files.every(isImageFile) ? files : null;\n}\n\nfunction createFakeImageSlice(schema: Schema): Slice {\n return new Slice(\n Fragment.from(\n imageType(schema).create({\n [ImageAttr.Src]: 'fake',\n [ImageAttr.Title]: 'image',\n }),\n ),\n 0,\n 0,\n );\n}\n\n// copied from prosemirror-view input.ts\nfunction sliceSingleNode(slice: Slice): Node | null {\n return slice.openStart === 0 && slice.openEnd === 0 && slice.content.childCount === 1\n ? slice.content.firstChild\n : null;\n}\n\nfunction dataUrlToFile(dataUrl: string, filename: string): File | null {\n const [data, base64String] = dataUrl.split(',');\n if (!data || !base64String) return null;\n const mime = data.match(/^data:(.+);base64/)?.[1];\n if (!mime) return null;\n return new File([base64ToBuffer(base64String)], filename, {type: mime});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImagePaste/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {decode as base64ToBuffer} from 'base64-arraybuffer';\nimport {Fragment, type Node, type Schema, Slice} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\nimport {dropPoint} from 'prosemirror-transform';\n\nimport type {ParseInsertedUrlAsImage} from '../../../../bundle';\nimport type {ExtensionAuto} from '../../../../core';\nimport {isFunction} from '../../../../lodash';\nimport type {FileUploadHandler} from '../../../../utils';\nimport {clipboardUtils} from '../../../behavior/Clipboard';\nimport {DataTransferType} from '../../../behavior/Clipboard/utils';\nimport {ImageAttr, ImgSizeAttr, imageType} from '../../../specs';\nimport {type CreateImageNodeOptions, isImageNode} from '../utils';\n\nimport {ImagesUploadProcess} from './upload';\n\nconst {isFilesFromHtml, isFilesOnly, isImageFile} = clipboardUtils;\n\nexport type ImagePasteOptions = Pick<\n CreateImageNodeOptions,\n 'needDimensions' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n /**\n * The function, used to determine if the pasted text is the image url and should be inserted as an image\n */\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n};\n\nexport const ImagePaste: ExtensionAuto<ImagePasteOptions> = (builder, opts) => {\n const {parseInsertedUrlAsImage, imageUploadHandler} = opts ?? {};\n\n if (!isFunction(imageUploadHandler ?? parseInsertedUrlAsImage))\n throw new Error(\n `ImagePaste extension: ${\n opts.imageUploadHandler ? 'imageUploadHandler' : 'parseInsertedUrlAsImage'\n } is not a function`,\n );\n\n builder.addPlugin(\n () =>\n new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, e) {\n const files = getPastedImages(e.clipboardData);\n if (imageUploadHandler && files) {\n e.preventDefault();\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n } else if (parseInsertedUrlAsImage) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n e.clipboardData?.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (!imageUrl) {\n return false;\n }\n\n e.preventDefault();\n\n const imageNode = imageType(view.state.schema).create({\n src: imageUrl,\n alt: title,\n });\n\n const tr = view.state.tr.replaceSelectionWith(imageNode);\n view.dispatch(tr.scrollIntoView());\n\n return true;\n }\n\n return false;\n },\n drop(view, e) {\n if (!imageUploadHandler) {\n return false;\n }\n\n // handle drop images from device\n if (view.dragging) return false;\n\n const files = getPastedImages(e.dataTransfer);\n if (!files) return false;\n\n const dropPos =\n view.posAtCoords({left: e.clientX, top: e.clientY})?.pos ?? -1;\n if (dropPos === -1) return false;\n\n const posToInsert = dropPoint(\n view.state.doc,\n dropPos,\n createFakeImageSlice(view.state.schema),\n );\n\n if (posToInsert !== null) {\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n posToInsert,\n opts,\n ).run();\n }\n\n e.preventDefault();\n return true;\n },\n },\n handlePaste(view, _event, slice) {\n if (!imageUploadHandler) {\n return false;\n }\n\n const node = sliceSingleNode(slice);\n if (node && isImageNode(node)) {\n const imgUrl = node.attrs[ImgSizeAttr.Src];\n const imgFile = dataUrlToFile(imgUrl, 'image');\n if (imgFile) {\n new ImagesUploadProcess(\n view,\n [imgFile],\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n }\n }\n return false;\n },\n },\n }),\n builder.Priority.VeryHigh,\n );\n};\n\nfunction getPastedImages(data: DataTransfer | null): File[] | null {\n if (!data || data.files.length === 0) return null;\n if (!isFilesOnly(data) && !isFilesFromHtml(data)) return null;\n const files = Array.from(data.files);\n return files.every(isImageFile) ? files : null;\n}\n\nfunction createFakeImageSlice(schema: Schema): Slice {\n return new Slice(\n Fragment.from(\n imageType(schema).create({\n [ImageAttr.Src]: 'fake',\n [ImageAttr.Title]: 'image',\n }),\n ),\n 0,\n 0,\n );\n}\n\n// copied from prosemirror-view input.ts\nfunction sliceSingleNode(slice: Slice): Node | null {\n return slice.openStart === 0 && slice.openEnd === 0 && slice.content.childCount === 1\n ? slice.content.firstChild\n : null;\n}\n\nfunction dataUrlToFile(dataUrl: string, filename: string): File | null {\n const [data, base64String] = dataUrl.split(',');\n if (!data || !base64String) return null;\n const mime = data.match(/^data:(.+);base64/)?.[1];\n if (!mime) return null;\n return new File([base64ToBuffer(base64String)], filename, {type: mime});\n}\n"]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { Action, ExtensionAuto } from "../../../../core/index.js";
|
|
2
2
|
import type { FileUploadHandler } from "../../../../utils/upload.js";
|
|
3
|
+
import type { RenderImageWidgetFormFn } from "./view.js";
|
|
3
4
|
import type { ImageWidgetDescriptorOpts } from "./widget.js";
|
|
4
5
|
declare const addImageWidgetAction = "addImageWidget";
|
|
5
|
-
export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages'> & {
|
|
6
|
+
export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'> & {
|
|
6
7
|
imageUploadHandler?: FileUploadHandler;
|
|
8
|
+
renderImageWidgetForm?: RenderImageWidgetFormFn;
|
|
7
9
|
};
|
|
8
10
|
export declare const ImageWidget: ExtensionAuto<ImageWidgetOptions>;
|
|
9
11
|
declare global {
|
|
@@ -3,7 +3,9 @@ const addImageWidgetAction = 'addImageWidget';
|
|
|
3
3
|
export const ImageWidget = (builder, opts) => {
|
|
4
4
|
builder.addAction(addImageWidgetAction, (deps) => addImageWidget(deps, {
|
|
5
5
|
uploadImages: opts.imageUploadHandler,
|
|
6
|
+
renderImageForm: opts.renderImageWidgetForm,
|
|
6
7
|
needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,
|
|
8
|
+
enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,
|
|
7
9
|
}));
|
|
8
10
|
};
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,qBAAkB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,qBAAkB;AAIzC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAU9C,MAAM,CAAC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7C,cAAc,CAAC,IAAI,EAAE;QACjB,YAAY,EAAE,IAAI,CAAC,kBAAkB;QACrC,eAAe,EAAE,IAAI,CAAC,qBAAqB;QAC3C,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;QAC/E,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;KACpE,CAAC,CACL,CAAC;AACN,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\n\nimport {addImageWidget} from './actions';\nimport type {RenderImageWidgetFormFn} from './view';\nimport type {ImageWidgetDescriptorOpts} from './widget';\n\nconst addImageWidgetAction = 'addImageWidget';\n\nexport type ImageWidgetOptions = Pick<\n ImageWidgetDescriptorOpts,\n 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n renderImageWidgetForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImageWidget: ExtensionAuto<ImageWidgetOptions> = (builder, opts) => {\n builder.addAction(addImageWidgetAction, (deps) =>\n addImageWidget(deps, {\n uploadImages: opts.imageUploadHandler,\n renderImageForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n }),\n );\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [addImageWidgetAction]: Action;\n }\n }\n}\n"]}
|
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
import { type ImageFormProps } from "../../../../forms/ImageForm.js";
|
|
1
|
+
import { type ImageFormProps, type ImageFormSubmitParams } from "../../../../forms/ImageForm.js";
|
|
2
2
|
import "./view.css";
|
|
3
|
-
export type
|
|
3
|
+
export type RenderImageWidgetFormProps = {
|
|
4
|
+
/** Handler for submitting form */
|
|
5
|
+
onSubmit: (params: ImageFormSubmitParams) => void;
|
|
6
|
+
/** Handler for cancellation */
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
/** Handler for attach file from device */
|
|
9
|
+
onAttach?: (files: File[]) => void;
|
|
10
|
+
/** Uploading attached file */
|
|
11
|
+
uploading?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;
|
|
14
|
+
export type ImagePlaceholderProps = {
|
|
4
15
|
onCancel: () => void;
|
|
5
16
|
onSubmit: ImageFormProps['onSubmit'];
|
|
6
17
|
onAttach?: (files: File[]) => Promise<void>;
|
|
18
|
+
renderForm?: RenderImageWidgetFormFn;
|
|
7
19
|
};
|
|
8
|
-
export declare const
|
|
20
|
+
export declare const ImagePlaceholder: React.FC<ImagePlaceholderProps>;
|
|
@@ -4,28 +4,36 @@ import { Picture as ImageIcon } from '@gravity-ui/icons';
|
|
|
4
4
|
import { Icon, Popup } from '@gravity-ui/uikit';
|
|
5
5
|
import { useMountedState } from 'react-use';
|
|
6
6
|
import { cn } from "../../../../classname.js";
|
|
7
|
-
import { ImageForm } from "../../../../forms/ImageForm.js";
|
|
7
|
+
import { ImageForm, } from "../../../../forms/ImageForm.js";
|
|
8
8
|
import { i18n } from "../../../../i18n/widgets/index.js";
|
|
9
9
|
import { useBooleanState, useElementState } from "../../../../react-utils/hooks.js";
|
|
10
10
|
import "./view.css";
|
|
11
11
|
const b = cn('image-placeholder');
|
|
12
12
|
const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
|
|
13
|
-
|
|
13
|
+
const defaultFormRenderer = (props) => {
|
|
14
|
+
return (_jsx(ImageForm, { autoFocus: true, loading: props.uploading, onCancel: props.onCancel, onSubmit: props.onSubmit, onAttach: props.onAttach }));
|
|
15
|
+
};
|
|
16
|
+
export const ImagePlaceholder = ({ onCancel, onSubmit, onAttach, renderForm, }) => {
|
|
14
17
|
const isMounted = useMountedState();
|
|
15
|
-
const [
|
|
18
|
+
const [uploading, startUploading, stopUploading] = useBooleanState(false);
|
|
16
19
|
const [anchor, setAnchor] = useElementState();
|
|
17
20
|
const attachHandler = useCallback((files) => {
|
|
18
21
|
if (!onAttach)
|
|
19
22
|
return;
|
|
20
23
|
if (isMounted()) {
|
|
21
|
-
|
|
24
|
+
startUploading();
|
|
22
25
|
onAttach(files).finally(() => {
|
|
23
26
|
if (isMounted()) {
|
|
24
|
-
|
|
27
|
+
stopUploading();
|
|
25
28
|
}
|
|
26
29
|
});
|
|
27
30
|
}
|
|
28
|
-
}, [isMounted, onAttach,
|
|
29
|
-
return (_jsxs(_Fragment, { children: [_jsxs("div", { ref: setAnchor, className: b(), children: [_jsx(Icon, { data: ImageIcon, size: 24 }), i18n('image')] }), _jsx(Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children:
|
|
31
|
+
}, [isMounted, onAttach, startUploading, stopUploading]);
|
|
32
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { ref: setAnchor, className: b(), children: [_jsx(Icon, { data: ImageIcon, size: 24 }), i18n('image')] }), _jsx(Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: (renderForm || defaultFormRenderer)({
|
|
33
|
+
onCancel,
|
|
34
|
+
onSubmit,
|
|
35
|
+
uploading,
|
|
36
|
+
onAttach: onAttach && attachHandler,
|
|
37
|
+
}) })] }));
|
|
30
38
|
};
|
|
31
39
|
//# sourceMappingURL=view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAC,IAAI,EAAE,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAC,IAAI,EAAE,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EACH,SAAS,GAGZ,uCAAoC;AACrC,OAAO,EAAC,IAAI,EAAC,0CAAiC;AAC9C,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,yCAAsC;AAE/E,oBAAqB;AAErB,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAczF,MAAM,mBAAmB,GAA4B,CAAC,KAAK,EAAE,EAAE;IAC3D,OAAO,CACH,KAAC,SAAS,IACN,SAAS,QACT,OAAO,EAAE,KAAK,CAAC,SAAS,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAC1B,CACL,CAAC;AACN,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,GACb,EAAE,EAAE;IACD,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,eAAe,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,WAAW,CAC7B,CAAC,KAAK,EAAE,EAAE;QACN,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,SAAS,EAAE,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;oBACd,aAAa,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EACD,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CACvD,CAAC;IAEF,OAAO,CACH,8BACI,eAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,aAC/B,KAAC,IAAI,IAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAI,EAClC,IAAI,CAAC,OAAO,CAAC,IACZ,EACN,KAAC,KAAK,IAAC,IAAI,QAAC,KAAK,QAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,YAChF,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC;oBACjC,QAAQ;oBACR,QAAQ;oBACR,SAAS;oBACT,QAAQ,EAAE,QAAQ,IAAI,aAAa;iBACtC,CAAC,GACE,IACT,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Picture as ImageIcon} from '@gravity-ui/icons';\nimport {Icon, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport {useMountedState} from 'react-use';\n\nimport {cn} from '../../../../classname';\nimport {\n ImageForm,\n type ImageFormProps,\n type ImageFormSubmitParams,\n} from '../../../../forms/ImageForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\n\nimport './view.scss';\n\nconst b = cn('image-placeholder');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type RenderImageWidgetFormProps = {\n /** Handler for submitting form */\n onSubmit: (params: ImageFormSubmitParams) => void;\n /** Handler for cancellation */\n onCancel: () => void;\n /** Handler for attach file from device */\n onAttach?: (files: File[]) => void;\n /** Uploading attached file */\n uploading?: boolean;\n};\nexport type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;\n\nconst defaultFormRenderer: RenderImageWidgetFormFn = (props) => {\n return (\n <ImageForm\n autoFocus\n loading={props.uploading}\n onCancel={props.onCancel}\n onSubmit={props.onSubmit}\n onAttach={props.onAttach}\n />\n );\n};\n\nexport type ImagePlaceholderProps = {\n onCancel: () => void;\n onSubmit: ImageFormProps['onSubmit'];\n onAttach?: (files: File[]) => Promise<void>;\n renderForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImagePlaceholder: React.FC<ImagePlaceholderProps> = ({\n onCancel,\n onSubmit,\n onAttach,\n renderForm,\n}) => {\n const isMounted = useMountedState();\n const [uploading, startUploading, stopUploading] = useBooleanState(false);\n const [anchor, setAnchor] = useElementState();\n const attachHandler = useCallback<NonNullable<ImageFormProps['onAttach']>>(\n (files) => {\n if (!onAttach) return;\n if (isMounted()) {\n startUploading();\n onAttach(files).finally(() => {\n if (isMounted()) {\n stopUploading();\n }\n });\n }\n },\n [isMounted, onAttach, startUploading, stopUploading],\n );\n\n return (\n <>\n <div ref={setAnchor} className={b()}>\n <Icon data={ImageIcon} size={24} />\n {i18n('image')}\n </div>\n <Popup open modal onOpenChange={onCancel} anchorElement={anchor} placement={placement}>\n {(renderForm || defaultFormRenderer)({\n onCancel,\n onSubmit,\n uploading,\n onAttach: onAttach && attachHandler,\n })}\n </Popup>\n </>\n );\n};\n"]}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { Transaction } from 'prosemirror-state';
|
|
2
2
|
import type { ExtensionDeps } from "../../../../core/index.js";
|
|
3
3
|
import type { FileUploadHandler } from "../../../../utils/upload.js";
|
|
4
|
+
import { type RenderImageWidgetFormFn } from "./view.js";
|
|
4
5
|
export declare const addWidget: (tr: Transaction, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) => Transaction;
|
|
5
6
|
export declare const removeWidget: (tr: Transaction, id: string) => Transaction;
|
|
6
7
|
export type ImageWidgetDescriptorOpts = {
|
|
7
8
|
needToSetDimensionsForUploadedImages: boolean;
|
|
8
9
|
uploadImages?: FileUploadHandler;
|
|
10
|
+
enableNewImageSizeCalculation?: boolean;
|
|
11
|
+
renderImageForm?: RenderImageWidgetFormFn;
|
|
9
12
|
};
|
|
@@ -4,7 +4,7 @@ import { ReactWidgetDescriptor, removeDecoration } from "../../../behavior/Widge
|
|
|
4
4
|
import { imageType, normalizeUrlFactory } from "../../../markdown/index.js";
|
|
5
5
|
import { ImgSizeAttr } from "../../../specs.js";
|
|
6
6
|
import { ImagesUploadProcess } from "../ImagePaste/upload.js";
|
|
7
|
-
import {
|
|
7
|
+
import { ImagePlaceholder } from "./view.js";
|
|
8
8
|
export const addWidget = (tr, deps, opts) => {
|
|
9
9
|
return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);
|
|
10
10
|
};
|
|
@@ -14,13 +14,17 @@ class ImageWidgetDescriptor extends ReactWidgetDescriptor {
|
|
|
14
14
|
deps;
|
|
15
15
|
uploadImages;
|
|
16
16
|
needToSetDimensionsForUploadedImages;
|
|
17
|
+
enableNewImageSizeCalculation;
|
|
18
|
+
renderImageForm;
|
|
17
19
|
widgetHandler = null;
|
|
18
20
|
constructor(initPos, deps, opts) {
|
|
19
21
|
super(initPos, 'image_placeholder');
|
|
20
22
|
this.domElem = document.createElement('span');
|
|
21
23
|
this.deps = deps;
|
|
22
24
|
this.uploadImages = opts.uploadImages;
|
|
25
|
+
this.renderImageForm = opts.renderImageForm;
|
|
23
26
|
this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;
|
|
27
|
+
this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;
|
|
24
28
|
}
|
|
25
29
|
getWidgetHandler(view, getPos) {
|
|
26
30
|
if (!this.widgetHandler) {
|
|
@@ -29,7 +33,9 @@ class ImageWidgetDescriptor extends ReactWidgetDescriptor {
|
|
|
29
33
|
getPos,
|
|
30
34
|
decoId: this.id,
|
|
31
35
|
uploadImages: this.uploadImages,
|
|
36
|
+
renderImageForm: this.renderImageForm,
|
|
32
37
|
needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,
|
|
38
|
+
enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
|
|
33
39
|
}, this.deps);
|
|
34
40
|
}
|
|
35
41
|
return this.widgetHandler;
|
|
@@ -53,14 +59,18 @@ class ImageWidgetHandler {
|
|
|
53
59
|
uploadImages;
|
|
54
60
|
normalizeUrl;
|
|
55
61
|
needToSetDimensionsForUploadedImages;
|
|
62
|
+
enableNewImageSizeCalculation;
|
|
63
|
+
renderImageForm;
|
|
56
64
|
cancelled = false;
|
|
57
|
-
constructor({ decoId, view, getPos, uploadImages, needToSetDimensionsForUploadedImages, }, deps) {
|
|
65
|
+
constructor({ decoId, view, getPos, uploadImages, renderImageForm, needToSetDimensionsForUploadedImages, enableNewImageSizeCalculation, }, deps) {
|
|
58
66
|
this.decoId = decoId;
|
|
59
67
|
this.view = view;
|
|
60
68
|
this.getPos = getPos;
|
|
61
69
|
this.uploadImages = uploadImages;
|
|
62
70
|
this.normalizeUrl = normalizeUrlFactory(deps);
|
|
71
|
+
this.renderImageForm = renderImageForm;
|
|
63
72
|
this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;
|
|
73
|
+
this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;
|
|
64
74
|
}
|
|
65
75
|
destruct() {
|
|
66
76
|
this.cancelled = true;
|
|
@@ -68,7 +78,7 @@ class ImageWidgetHandler {
|
|
|
68
78
|
renderWidgetView(view, getPos) {
|
|
69
79
|
this.view = view;
|
|
70
80
|
this.getPos = getPos;
|
|
71
|
-
return (_jsx(
|
|
81
|
+
return (_jsx(ImagePlaceholder, { onCancel: this.onCancel, onSubmit: this.onSubmit, onAttach: this.uploadImages && this.onAttach, renderForm: this.renderImageForm }));
|
|
72
82
|
}
|
|
73
83
|
onCancel = () => {
|
|
74
84
|
this.cancelled = true;
|
|
@@ -97,6 +107,7 @@ class ImageWidgetHandler {
|
|
|
97
107
|
const { view } = this;
|
|
98
108
|
new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {
|
|
99
109
|
needDimensions: this.needToSetDimensionsForUploadedImages,
|
|
110
|
+
enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
|
|
100
111
|
}).run();
|
|
101
112
|
view.dispatch(removeWidget(view.state.tr, this.decoId));
|
|
102
113
|
view.focus();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {FilePlaceholder, type FilePlaceholderProps} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n needToSetDimensionsForUploadedImages: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n needToSetDimensionsForUploadedImages,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <FilePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n />\n );\n }\n\n private onCancel: FilePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: FilePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: FilePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {ImagePlaceholder, type ImagePlaceholderProps, type RenderImageWidgetFormFn} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n enableNewImageSizeCalculation?: boolean;\n renderImageForm?: RenderImageWidgetFormFn;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.renderImageForm = opts.renderImageForm;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n renderImageForm: this.renderImageForm,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n renderImageForm?: RenderImageWidgetFormFn;\n needToSetDimensionsForUploadedImages: boolean;\n enableNewImageSizeCalculation?: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n renderImageForm,\n needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.renderImageForm = renderImageForm;\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <ImagePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n renderForm={this.renderImageForm}\n />\n );\n }\n\n private onCancel: ImagePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: ImagePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: ImagePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Action, ExtensionAuto } from "../../../core/index.js";
|
|
2
2
|
import { type ImagePasteOptions } from "./ImagePaste/index.js";
|
|
3
|
+
import { type ImageWidgetOptions } from "./ImageWidget/index.js";
|
|
3
4
|
import { type ImgSizeSpecsOptions } from "./ImgSizeSpecs/index.js";
|
|
4
5
|
import { type AddImageAttrs } from "./actions.js";
|
|
5
6
|
import { addImageAction } from "./const.js";
|
|
@@ -10,7 +11,7 @@ export type ImgSizeOptions = ImgSizeSpecsOptions & {
|
|
|
10
11
|
* @default false
|
|
11
12
|
*/
|
|
12
13
|
needToSetDimensionsForUploadedImages?: boolean;
|
|
13
|
-
} & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'>;
|
|
14
|
+
} & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'> & Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;
|
|
14
15
|
export declare const ImgSize: ExtensionAuto<ImgSizeOptions>;
|
|
15
16
|
declare global {
|
|
16
17
|
namespace WysiwygEditor {
|
|
@@ -8,7 +8,9 @@ export const ImgSize = (builder, opts) => {
|
|
|
8
8
|
builder.use(ImgSizeSpecs, opts);
|
|
9
9
|
builder.use(ImageWidget, {
|
|
10
10
|
imageUploadHandler: opts.imageUploadHandler,
|
|
11
|
+
renderImageWidgetForm: opts.renderImageWidgetForm,
|
|
11
12
|
needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),
|
|
13
|
+
enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),
|
|
12
14
|
});
|
|
13
15
|
if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {
|
|
14
16
|
builder.use(ImagePaste, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,UAAU,EAAyB,8BAAqB;AAChE,OAAO,EAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,UAAU,EAAyB,8BAAqB;AAChE,OAAO,EAAC,WAAW,EAA0B,+BAAsB;AACnE,OAAO,EAAC,YAAY,EAA2B,gCAAuB;AACtE,OAAO,EAAqB,QAAQ,EAAC,qBAAkB;AACvD,OAAO,EAAC,cAAc,EAAC,mBAAgB;AACvC,OAAO,EAAC,qBAAqB,EAAC,2CAAkC;AAehE,MAAM,CAAC,MAAM,OAAO,GAAkC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACpE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;QACrB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,oCAAoC,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;QACxF,6BAA6B,EAAE,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC;KAC7E,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;YACpB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;YAClE,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;SACpE,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAElE,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;AAC7C,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../core';\n\nimport {ImagePaste, type ImagePasteOptions} from './ImagePaste';\nimport {ImageWidget, type ImageWidgetOptions} from './ImageWidget';\nimport {ImgSizeSpecs, type ImgSizeSpecsOptions} from './ImgSizeSpecs';\nimport {type AddImageAttrs, addImage} from './actions';\nimport {addImageAction} from './const';\nimport {imgSizeNodeViewPlugin} from './plugins/ImgSizeNodeView';\n\nexport type ImgSizeOptions = ImgSizeSpecsOptions & {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n} & Pick<\n ImagePasteOptions,\n 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'\n > &\n Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;\n\nexport const ImgSize: ExtensionAuto<ImgSizeOptions> = (builder, opts) => {\n builder.use(ImgSizeSpecs, opts);\n\n builder.use(ImageWidget, {\n imageUploadHandler: opts.imageUploadHandler,\n renderImageWidgetForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),\n enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),\n });\n\n if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {\n builder.use(ImagePaste, {\n imageUploadHandler: opts.imageUploadHandler,\n needDimensions: Boolean(opts.needToSetDimensionsForUploadedImages),\n parseInsertedUrlAsImage: opts.parseInsertedUrlAsImage,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n });\n }\n\n builder.addAction(addImageAction, ({schema}) => addImage(schema));\n\n builder.addPlugin(imgSizeNodeViewPlugin);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n // @ts-expect-error\n [addImageAction]: Action<AddImageAttrs>;\n }\n }\n}\n"]}
|
package/build/esm/version.js
CHANGED
package/build/esm/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.0
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';\n"]}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { useEffect } from 'react';
|
|
2
2
|
const YfmCutCN = {
|
|
3
|
-
Open: 'open',
|
|
4
3
|
Cut: 'yfm-cut',
|
|
5
4
|
};
|
|
5
|
+
const YfmCutAttrs = {
|
|
6
|
+
Open: 'open',
|
|
7
|
+
};
|
|
6
8
|
const YfmTabsCN = {
|
|
7
9
|
Active: 'active',
|
|
8
10
|
Tabs: 'yfm-tabs',
|
|
@@ -29,9 +31,9 @@ export function useYfmShowElemWithId(ref, id) {
|
|
|
29
31
|
}
|
|
30
32
|
}, [id]);
|
|
31
33
|
}
|
|
32
|
-
function openYfmCut(
|
|
33
|
-
if (classList.contains(YfmCutCN.Cut) && !
|
|
34
|
-
|
|
34
|
+
function openYfmCut(cutElement) {
|
|
35
|
+
if (cutElement.classList.contains(YfmCutCN.Cut) && !cutElement.hasAttribute(YfmCutAttrs.Open)) {
|
|
36
|
+
cutElement.setAttribute(YfmCutAttrs.Open, '');
|
|
35
37
|
return true;
|
|
36
38
|
}
|
|
37
39
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useYfmShowElemWithId.js","sourceRoot":"../../../../../src","sources":["view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAC,MAAM,OAAO,CAAC;AAEhD,MAAM,QAAQ,GAAG;IACb,
|
|
1
|
+
{"version":3,"file":"useYfmShowElemWithId.js","sourceRoot":"../../../../../src","sources":["view/hooks/useYfmShowElemWithId/useYfmShowElemWithId.ts"],"names":[],"mappings":"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","sourcesContent":["import {type RefObject, useEffect} from 'react';\n\nconst YfmCutCN = {\n Cut: 'yfm-cut',\n} as const;\n\nconst YfmCutAttrs = {\n Open: 'open',\n} as const;\n\nconst YfmTabsCN = {\n Active: 'active',\n Tabs: 'yfm-tabs',\n TabList: 'yfm-tab-list',\n Tab: 'yfm-tab',\n TabPanel: 'yfm-tab-panel',\n} as const;\n\nconst FoldingHeadingsCN = {\n Open: 'open',\n Section: 'heading-section',\n} as const;\n\nexport function useYfmShowElemWithId(ref: RefObject<HTMLElement>, id: string) {\n useEffect(() => {\n const {current: containerDom} = ref;\n if (!id || !containerDom) return;\n\n let elem = document.getElementById(id);\n if (!elem || !containerDom.contains(elem)) return;\n\n while (elem && elem !== containerDom) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n openYfmCut(elem) || openFoldingHeadings(elem, id) || switchYfmTabs(elem);\n elem = elem.parentElement;\n }\n }, [id]);\n}\n\nfunction openYfmCut(cutElement: Element): boolean {\n if (cutElement.classList.contains(YfmCutCN.Cut) && !cutElement.hasAttribute(YfmCutAttrs.Open)) {\n cutElement.setAttribute(YfmCutAttrs.Open, '');\n return true;\n }\n return false;\n}\n\nfunction switchYfmTabs(tabPanelElem: Element): boolean {\n if (\n !tabPanelElem.id ||\n !tabPanelElem.classList.contains(YfmTabsCN.TabPanel) ||\n tabPanelElem.classList.contains(YfmTabsCN.Active)\n )\n return false;\n const tabsElem = tabPanelElem.parentElement;\n if (!tabsElem?.classList.contains(YfmTabsCN.Tabs)) return false;\n const yfmTabList = tabsElem.firstElementChild;\n if (!yfmTabList?.classList.contains(YfmTabsCN.TabList)) return false;\n\n const tabPanelId = tabPanelElem.id;\n for (const tabElem of Array.from(yfmTabList.children)) {\n if (!tabElem.classList.contains(YfmTabsCN.Tab)) continue;\n\n const isDesiredElem = tabElem.hasAttribute('aria-controls')\n ? tabElem.getAttribute('aria-controls') === tabPanelId\n : tabElem.textContent === tabPanelElem.getAttribute('data-title');\n tabElem.setAttribute('data-diplodoc-is-active', String(isDesiredElem));\n tabElem.setAttribute('aria-selected', String(isDesiredElem));\n tabElem.classList.toggle(YfmTabsCN.Active, isDesiredElem);\n }\n for (const panelElem of Array.from(tabsElem.children)) {\n if (!panelElem.classList.contains(YfmTabsCN.TabPanel)) continue;\n\n const isDesiredElem = panelElem.id === tabPanelId;\n panelElem.classList.toggle(YfmTabsCN.Active, isDesiredElem);\n }\n return true;\n}\n\nfunction openFoldingHeadings(elem: Element, id: string): boolean {\n if (\n elem.classList.contains(FoldingHeadingsCN.Section) &&\n !elem.classList.contains(FoldingHeadingsCN.Open) &&\n id !== elem.firstElementChild?.id\n ) {\n elem.classList.add(FoldingHeadingsCN.Open);\n return true;\n }\n return false;\n}\n"]}
|
package/build/styles.css
CHANGED
|
@@ -1162,7 +1162,7 @@ body :has(.g-md-resizable_resizing) {
|
|
|
1162
1162
|
.ProseMirror.yfm .yfm-cut .yfm-cut-title:focus {
|
|
1163
1163
|
outline: 0;
|
|
1164
1164
|
}
|
|
1165
|
-
.ProseMirror.yfm .yfm-cut.open .yfm-cut-title:before {
|
|
1165
|
+
.ProseMirror.yfm .yfm-cut.open > .yfm-cut-title:before {
|
|
1166
1166
|
transform: translateY(-50%);
|
|
1167
1167
|
}
|
|
1168
1168
|
.yfm-editor .yfm-file {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gravity-ui/markdown-editor",
|
|
3
|
-
"version": "15.0
|
|
3
|
+
"version": "15.1.0",
|
|
4
4
|
"description": "Markdown wysiwyg and markup editor",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -203,6 +203,7 @@
|
|
|
203
203
|
"react-error-boundary": "^3.1.4",
|
|
204
204
|
"react-hotkeys-hook": "4.5.0",
|
|
205
205
|
"react-use": "^17.3.2",
|
|
206
|
+
"ts-dedent": "2.2.0",
|
|
206
207
|
"tslib": "^2.3.1",
|
|
207
208
|
"uuid": "11.0.5"
|
|
208
209
|
},
|
|
@@ -258,7 +259,7 @@
|
|
|
258
259
|
"jsdom": "25.0.1",
|
|
259
260
|
"lowlight": "3.0.0",
|
|
260
261
|
"markdown-it-testgen": "^0.1.6",
|
|
261
|
-
"mermaid": "
|
|
262
|
+
"mermaid": "11.4.1",
|
|
262
263
|
"npm-run-all": "^4.1.5",
|
|
263
264
|
"postcss": "^8.4.27",
|
|
264
265
|
"prettier": "3.1.1",
|
|
@@ -269,7 +270,6 @@
|
|
|
269
270
|
"sass": "^1.84.0",
|
|
270
271
|
"sass-loader": "^13.3.2",
|
|
271
272
|
"stylelint": "15.11.0",
|
|
272
|
-
"ts-dedent": "2.2.0",
|
|
273
273
|
"ts-jest": "^29.2.5",
|
|
274
274
|
"typescript": "^5.7.3"
|
|
275
275
|
},
|