@gravity-ui/markdown-editor 15.23.0 → 15.24.1
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/ToolbarView.js +2 -1
- package/build/cjs/bundle/ToolbarView.js.map +1 -1
- package/build/cjs/bundle/settings/index.d.ts +2 -1
- package/build/cjs/bundle/settings/index.js +6 -2
- package/build/cjs/bundle/settings/index.js.map +1 -1
- package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -1
- package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
- package/build/cjs/common/layout.d.ts +3 -0
- package/build/cjs/common/layout.js +7 -0
- package/build/cjs/common/layout.js.map +1 -0
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -1
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +11 -3
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Table/commands.d.ts +2 -0
- package/build/cjs/extensions/markdown/Table/commands.js +73 -0
- package/build/cjs/extensions/markdown/Table/commands.js.map +1 -0
- package/build/cjs/extensions/markdown/Table/helpers.d.ts +7 -2
- package/build/cjs/extensions/markdown/Table/helpers.js +22 -9
- package/build/cjs/extensions/markdown/Table/helpers.js.map +1 -1
- package/build/cjs/extensions/markdown/Table/index.js +3 -0
- package/build/cjs/extensions/markdown/Table/index.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +35 -0
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -0
- package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -0
- package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -0
- package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/utils.d.ts +6 -0
- package/build/cjs/extensions/yfm/ImgSize/utils.js +25 -0
- package/build/cjs/extensions/yfm/ImgSize/utils.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.d.ts +5 -0
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.js +6 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.js +2 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +6 -6
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.js +6 -6
- package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/const.d.ts +9 -1
- package/build/cjs/extensions/yfm/YfmCut/const.js +13 -6
- package/build/cjs/extensions/yfm/YfmCut/const.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/index.css +0 -3
- package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +6 -5
- package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.d.ts +5 -2
- package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js +26 -9
- package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/plugins/active.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmCut/plugins/active.js +6 -7
- package/build/cjs/extensions/yfm/YfmCut/plugins/active.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.js +8 -9
- package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.js.map +1 -1
- package/build/cjs/react-utils/index.d.ts +1 -0
- package/build/cjs/react-utils/index.js +1 -0
- package/build/cjs/react-utils/index.js.map +1 -1
- package/build/cjs/react-utils/useSticky.js +13 -2
- package/build/cjs/react-utils/useSticky.js.map +1 -1
- package/build/cjs/react-utils/useTargetZIndex.d.ts +1 -0
- package/build/cjs/react-utils/useTargetZIndex.js +50 -0
- package/build/cjs/react-utils/useTargetZIndex.js.map +1 -0
- package/build/cjs/toolbar/ToolbarListButton.js +4 -1
- package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
- package/build/cjs/utils/get-target-z-index.d.ts +1 -0
- package/build/cjs/utils/get-target-z-index.js +17 -0
- package/build/cjs/utils/get-target-z-index.js.map +1 -0
- package/build/cjs/utils/inputrules.d.ts +1 -0
- package/build/cjs/utils/inputrules.js +8 -3
- package/build/cjs/utils/inputrules.js.map +1 -1
- package/build/cjs/utils/rulebuilders.js +2 -0
- package/build/cjs/utils/rulebuilders.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/bundle/ToolbarView.js +2 -1
- package/build/esm/bundle/ToolbarView.js.map +1 -1
- package/build/esm/bundle/settings/index.d.ts +2 -1
- package/build/esm/bundle/settings/index.js +6 -2
- package/build/esm/bundle/settings/index.js.map +1 -1
- package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -1
- package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
- package/build/esm/common/layout.d.ts +3 -0
- package/build/esm/common/layout.js +4 -0
- package/build/esm/common/layout.js.map +1 -0
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -1
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +10 -2
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
- package/build/esm/extensions/markdown/Table/commands.d.ts +2 -0
- package/build/esm/extensions/markdown/Table/commands.js +69 -0
- package/build/esm/extensions/markdown/Table/commands.js.map +1 -0
- package/build/esm/extensions/markdown/Table/helpers.d.ts +7 -2
- package/build/esm/extensions/markdown/Table/helpers.js +9 -3
- package/build/esm/extensions/markdown/Table/helpers.js.map +1 -1
- package/build/esm/extensions/markdown/Table/index.js +3 -0
- package/build/esm/extensions/markdown/Table/index.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +36 -1
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -0
- package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -0
- package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -0
- package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/utils.d.ts +6 -0
- package/build/esm/extensions/yfm/ImgSize/utils.js +22 -0
- package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.d.ts +5 -0
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js +5 -0
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +7 -7
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js +5 -5
- package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/const.d.ts +9 -1
- package/build/esm/extensions/yfm/YfmCut/const.js +8 -1
- package/build/esm/extensions/yfm/YfmCut/const.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/index.css +0 -3
- package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +6 -5
- package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.d.ts +5 -2
- package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js +26 -9
- package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/plugins/active.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmCut/plugins/active.js +4 -5
- package/build/esm/extensions/yfm/YfmCut/plugins/active.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.js +6 -7
- package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.js.map +1 -1
- package/build/esm/react-utils/index.d.ts +1 -0
- package/build/esm/react-utils/index.js +1 -0
- package/build/esm/react-utils/index.js.map +1 -1
- package/build/esm/react-utils/useSticky.js +13 -2
- package/build/esm/react-utils/useSticky.js.map +1 -1
- package/build/esm/react-utils/useTargetZIndex.d.ts +1 -0
- package/build/esm/react-utils/useTargetZIndex.js +47 -0
- package/build/esm/react-utils/useTargetZIndex.js.map +1 -0
- package/build/esm/toolbar/ToolbarListButton.js +4 -1
- package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
- package/build/esm/utils/get-target-z-index.d.ts +1 -0
- package/build/esm/utils/get-target-z-index.js +14 -0
- package/build/esm/utils/get-target-z-index.js.map +1 -0
- package/build/esm/utils/inputrules.d.ts +1 -0
- package/build/esm/utils/inputrules.js +5 -1
- package/build/esm/utils/inputrules.js.map +1 -1
- package/build/esm/utils/rulebuilders.js +3 -1
- package/build/esm/utils/rulebuilders.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/styles.css +6 -8
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Table/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Table/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Node, ResolvedPos, Schema} from '#pm/model';\nimport type {EditorState} from '#pm/state';\nimport {\n findChildren,\n findChildrenByType,\n findParentNodeOfType,\n findParentNodeOfTypeClosestToPos,\n hasParentNodeOfType,\n} from '#pm/utils';\n\nimport {TableNode} from './const';\n\nexport const isIntoTable = (state: EditorState) =>\n hasParentNodeOfType(state.schema.nodes[TableNode.Table])(state.selection);\n\nexport const findParentTable = (state: EditorState) =>\n findParentNodeOfType(state.schema.nodes[TableNode.Table])(state.selection);\n\nexport const findParentTableOnPosOnPos = ($pos: ResolvedPos) =>\n findParentNodeOfTypeClosestToPos($pos, $pos.doc.type.schema.nodes[TableNode.Table]);\n\nexport const findParentHeadOnPos = ($pos: ResolvedPos) =>\n findParentNodeOfTypeClosestToPos($pos, $pos.doc.type.schema.nodes[TableNode.Head]);\n\nexport const findParentBody = (state: EditorState) =>\n findParentNodeOfType(state.schema.nodes[TableNode.Body])(state.selection);\n\nexport const findParentBodyOnPos = ($pos: ResolvedPos) =>\n findParentNodeOfTypeClosestToPos($pos, $pos.doc.type.schema.nodes[TableNode.Body]);\n\nexport const findParentRow = (state: EditorState) =>\n findParentNodeOfType(state.schema.nodes[TableNode.Row])(state.selection);\n\nexport const findParentRowOnPos = ($pos: ResolvedPos) =>\n findParentNodeOfTypeClosestToPos($pos, $pos.doc.type.schema.nodes[TableNode.Row]);\n\nexport const findParentCell = (state: EditorState) =>\n findParentNodeOfType([\n state.schema.nodes[TableNode.HeaderCell],\n state.schema.nodes[TableNode.DataCell],\n ])(state.selection);\n\nexport const findParentCellOnPos = ($pos: ResolvedPos) =>\n findParentNodeOfTypeClosestToPos($pos, [\n $pos.doc.type.schema.nodes[TableNode.HeaderCell],\n $pos.doc.type.schema.nodes[TableNode.DataCell],\n ]);\n\nexport const findTableRows = (table: Node, schema: Schema) =>\n findChildrenByType(table, schema.nodes[TableNode.Row]);\n\nexport const findTableCells = (table: Node, schema: Schema) =>\n findChildren(table, (node: Node) =>\n [schema.nodes[TableNode.HeaderCell].name, schema.nodes[TableNode.DataCell].name].includes(\n node.type.name,\n ),\n );\n"]}
|
|
@@ -2,6 +2,7 @@ import { goToNextCell } from "../../../table-utils/index.js";
|
|
|
2
2
|
import { TableSpecs } from "./TableSpecs/index.js";
|
|
3
3
|
import { createTableAction, deleteTableAction } from "./actions/tableActions.js";
|
|
4
4
|
import * as TableActions from "./actions/tableActions.js";
|
|
5
|
+
import { moveToNextRowCommand } from "./commands.js";
|
|
5
6
|
import * as TableHelpers from "./helpers.js";
|
|
6
7
|
import { tableCellContextPlugin } from "./plugins/TableCellContextPlugin/index.js";
|
|
7
8
|
export { TableHelpers, TableActions };
|
|
@@ -11,6 +12,8 @@ export const Table = (builder) => {
|
|
|
11
12
|
builder.addKeymap(() => ({
|
|
12
13
|
Tab: goToNextCell('next'),
|
|
13
14
|
'Shift-Tab': goToNextCell('prev'),
|
|
15
|
+
Enter: moveToNextRowCommand,
|
|
16
|
+
'Shift-Enter': moveToNextRowCommand,
|
|
14
17
|
}));
|
|
15
18
|
builder.addAction('createTable', createTableAction);
|
|
16
19
|
builder.addAction('deleteTable', () => deleteTableAction);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Table/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Table/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,sCAAwB;AAE7C,OAAO,EAAC,UAAU,EAAC,8BAAqB;AACxC,OAAO,EAAC,iBAAiB,EAAE,iBAAiB,EAAC,kCAA+B;AAC5E,OAAO,KAAK,YAAY,kCAA+B;AACvD,OAAO,EAAC,oBAAoB,EAAC,sBAAmB;AAChD,OAAO,KAAK,YAAY,qBAAkB;AAC1C,OAAO,EAAC,sBAAsB,EAAC,kDAAyC;AAExE,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,CAAC;AACpC,OAAO,EAAC,SAAS,EAAE,UAAU,EAAE,SAAS,IAAI,cAAc,EAAC,mBAAgB;AAE3E,MAAM,CAAC,MAAM,KAAK,GAAkB,CAAC,OAAO,EAAE,EAAE;IAC5C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAExB,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QACrB,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC;QACzB,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC;QACjC,KAAK,EAAE,oBAAoB;QAC3B,aAAa,EAAE,oBAAoB;KACtC,CAAC,CAAC,CAAC;IAEJ,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IACpD,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,CAAC;IAC1D,OAAO,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;AAC9C,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '#core';\nimport {goToNextCell} from 'src/table-utils';\n\nimport {TableSpecs} from './TableSpecs';\nimport {createTableAction, deleteTableAction} from './actions/tableActions';\nimport * as TableActions from './actions/tableActions';\nimport {moveToNextRowCommand} from './commands';\nimport * as TableHelpers from './helpers';\nimport {tableCellContextPlugin} from './plugins/TableCellContextPlugin';\n\nexport {TableHelpers, TableActions};\nexport {TableNode, TableAttrs, CellAlign as TableCellAlign} from './const';\n\nexport const Table: ExtensionAuto = (builder) => {\n builder.use(TableSpecs);\n\n builder.addKeymap(() => ({\n Tab: goToNextCell('next'),\n 'Shift-Tab': goToNextCell('prev'),\n Enter: moveToNextRowCommand,\n 'Shift-Enter': moveToNextRowCommand,\n }));\n\n builder.addAction('createTable', createTableAction);\n builder.addAction('deleteTable', () => deleteTableAction);\n builder.addPlugin(tableCellContextPlugin);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n createTable: Action;\n deleteTable: Action;\n }\n }\n}\n"]}
|
|
@@ -8,7 +8,7 @@ import { isFunction } from "../../../../lodash.js";
|
|
|
8
8
|
import { clipboardUtils } from "../../../behavior/Clipboard/index.js";
|
|
9
9
|
import { DataTransferType } from "../../../behavior/Clipboard/utils.js";
|
|
10
10
|
import { ImageAttr, ImgSizeAttr, imageType } from "../../../specs.js";
|
|
11
|
-
import { isImageNode } from "../utils.js";
|
|
11
|
+
import { checkSvg, findImageNode, getImageSize, getImageSizeNew, isImageNode, loadImageFromUrl, } from "../utils.js";
|
|
12
12
|
import { ImagesUploadProcess } from "./upload.js";
|
|
13
13
|
const { isFilesFromHtml, isFilesOnly, isImageFile } = clipboardUtils;
|
|
14
14
|
export const ImagePaste = (builder, opts) => {
|
|
@@ -43,13 +43,48 @@ export const ImagePaste = (builder, opts) => {
|
|
|
43
43
|
return false;
|
|
44
44
|
}
|
|
45
45
|
e.preventDefault();
|
|
46
|
+
const isSvg = checkSvg(imageUrl);
|
|
47
|
+
const trackingId = `img-${Math.random().toString(36).slice(2)}`;
|
|
46
48
|
const imageNode = imageType(view.state.schema).create({
|
|
47
49
|
src: imageUrl,
|
|
48
50
|
alt: title,
|
|
51
|
+
id: trackingId,
|
|
49
52
|
});
|
|
50
53
|
const tr = view.state.tr.replaceSelectionWith(imageNode);
|
|
51
54
|
view.dispatch(tr.scrollIntoView());
|
|
52
55
|
logger.event({ event: 'paste-url-as-image' });
|
|
56
|
+
loadImageFromUrl(imageUrl)
|
|
57
|
+
.then((img) => opts?.enableNewImageSizeCalculation || isSvg
|
|
58
|
+
? getImageSizeNew(img)
|
|
59
|
+
: getImageSize(img))
|
|
60
|
+
.then((sizes) => {
|
|
61
|
+
const currentState = view.state;
|
|
62
|
+
const imageResult = findImageNode(currentState.doc, trackingId);
|
|
63
|
+
if (imageResult === null) {
|
|
64
|
+
logger.error({
|
|
65
|
+
event: 'img-node-not-found',
|
|
66
|
+
trackingId,
|
|
67
|
+
});
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const { pos: targetPos } = imageResult;
|
|
71
|
+
const updateTr = currentState.tr
|
|
72
|
+
.setNodeAttribute(targetPos, ImgSizeAttr.Height, sizes.height)
|
|
73
|
+
.setNodeAttribute(targetPos, ImgSizeAttr.Width, sizes.width)
|
|
74
|
+
.setNodeAttribute(targetPos, 'id', null);
|
|
75
|
+
view.dispatch(updateTr);
|
|
76
|
+
logger.event({
|
|
77
|
+
event: 'img-dimensions-updated',
|
|
78
|
+
position: targetPos,
|
|
79
|
+
sizes,
|
|
80
|
+
});
|
|
81
|
+
})
|
|
82
|
+
.catch((error) => {
|
|
83
|
+
logger.error({
|
|
84
|
+
event: 'img-dimensions-load-failed',
|
|
85
|
+
error: error.message,
|
|
86
|
+
});
|
|
87
|
+
});
|
|
53
88
|
return true;
|
|
54
89
|
}
|
|
55
90
|
return false;
|
|
@@ -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 {InputState} from 'src/utils/input-state';\n\nimport type {ParseInsertedUrlAsImage} from '../../../../bundle';\nimport {type ExtensionAuto, getLoggerFromState} 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 const inputState = new InputState();\n\n builder.addPlugin(\n () =>\n new Plugin({\n props: {\n handleDOMEvents: {\n keydown(_view, e) {\n inputState.keydown(e);\n },\n keyup(_view, e) {\n inputState.keyup(e);\n },\n paste(view, e) {\n const logger = getLoggerFromState(view.state).nested({\n plugin: 'image-paste',\n domEvent: 'paste',\n });\n\n const files = getPastedImages(e.clipboardData);\n if (imageUploadHandler && files) {\n e.preventDefault();\n logger.event({event: 'paste-images'});\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 (!inputState.shiftKey && 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 logger.event({event: 'paste-url-as-image'});\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 const logger = getLoggerFromState(view.state);\n logger.event({\n event: 'drop-image',\n plugin: 'image-paste',\n domEvent: 'drop',\n runProcess: posToInsert !== null,\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
|
+
{"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 {InputState} from 'src/utils/input-state';\n\nimport type {ParseInsertedUrlAsImage} from '../../../../bundle';\nimport {type ExtensionAuto, getLoggerFromState} 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 {\n type CreateImageNodeOptions,\n checkSvg,\n findImageNode,\n getImageSize,\n getImageSizeNew,\n isImageNode,\n loadImageFromUrl,\n} 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 const inputState = new InputState();\n\n builder.addPlugin(\n () =>\n new Plugin({\n props: {\n handleDOMEvents: {\n keydown(_view, e) {\n inputState.keydown(e);\n },\n keyup(_view, e) {\n inputState.keyup(e);\n },\n paste(view, e) {\n const logger = getLoggerFromState(view.state).nested({\n plugin: 'image-paste',\n domEvent: 'paste',\n });\n\n const files = getPastedImages(e.clipboardData);\n if (imageUploadHandler && files) {\n e.preventDefault();\n logger.event({event: 'paste-images'});\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 (!inputState.shiftKey && 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 isSvg = checkSvg(imageUrl);\n\n const trackingId = `img-${Math.random().toString(36).slice(2)}`;\n\n const imageNode = imageType(view.state.schema).create({\n src: imageUrl,\n alt: title,\n id: trackingId,\n });\n\n const tr = view.state.tr.replaceSelectionWith(imageNode);\n view.dispatch(tr.scrollIntoView());\n logger.event({event: 'paste-url-as-image'});\n\n loadImageFromUrl(imageUrl)\n .then((img) =>\n opts?.enableNewImageSizeCalculation || isSvg\n ? getImageSizeNew(img)\n : getImageSize(img),\n )\n .then(\n (sizes: {\n [ImgSizeAttr.Height]?: string;\n [ImgSizeAttr.Width]?: string;\n }) => {\n const currentState = view.state;\n\n const imageResult = findImageNode(\n currentState.doc,\n trackingId,\n );\n\n if (imageResult === null) {\n logger.error({\n event: 'img-node-not-found',\n trackingId,\n });\n return;\n }\n\n const {pos: targetPos} = imageResult;\n\n const updateTr = currentState.tr\n .setNodeAttribute(\n targetPos,\n ImgSizeAttr.Height,\n sizes.height,\n )\n .setNodeAttribute(\n targetPos,\n ImgSizeAttr.Width,\n sizes.width,\n )\n .setNodeAttribute(targetPos, 'id', null);\n\n view.dispatch(updateTr);\n\n logger.event({\n event: 'img-dimensions-updated',\n position: targetPos,\n sizes,\n });\n },\n )\n .catch((error) => {\n logger.error({\n event: 'img-dimensions-load-failed',\n error: error.message,\n });\n });\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 const logger = getLoggerFromState(view.state);\n logger.event({\n event: 'drop-image',\n plugin: 'image-paste',\n domEvent: 'drop',\n runProcess: posToInsert !== null,\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImgSizeSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,iDAAiD,CAAC;AAE3E,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,GAAG,EAAE,UAAU,CAAC,GAAG;IACnB,GAAG,EAAE,UAAU,CAAC,GAAG;IACnB,KAAK,EAAE,UAAU,CAAC,KAAK;IACvB,KAAK,EAAE,UAAU,CAAC,KAAK;IACvB,MAAM,EAAE,UAAU,CAAC,MAAM;IACzB,OAAO,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImgSizeSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,iDAAiD,CAAC;AAE3E,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,GAAG,EAAE,UAAU,CAAC,GAAG;IACnB,GAAG,EAAE,UAAU,CAAC,GAAG;IACnB,KAAK,EAAE,UAAU,CAAC,KAAK;IACvB,KAAK,EAAE,UAAU,CAAC,KAAK;IACvB,MAAM,EAAE,UAAU,CAAC,MAAM;IACzB,OAAO,EAAE,SAAS;IAClB,EAAE,EAAE,IAAI;CACF,CAAC","sourcesContent":["import {ImsizeAttr} from '@diplodoc/transform/lib/plugins/imsize/const.js';\n\nexport const ImgSizeAttr = {\n Alt: ImsizeAttr.Alt,\n Src: ImsizeAttr.Src,\n Title: ImsizeAttr.Title,\n Width: ImsizeAttr.Width,\n Height: ImsizeAttr.Height,\n Loading: 'loading',\n Id: 'id',\n} as const;\n"]}
|
|
@@ -17,6 +17,7 @@ export const ImgSizeSpecs = (builder, opts) => {
|
|
|
17
17
|
[ImgSizeAttr.Height]: { default: null },
|
|
18
18
|
[ImgSizeAttr.Width]: { default: null },
|
|
19
19
|
[ImgSizeAttr.Loading]: { default: null },
|
|
20
|
+
[ImgSizeAttr.Id]: { default: null },
|
|
20
21
|
},
|
|
21
22
|
placeholder: placeholderContent ? { content: placeholderContent } : opts.placeholder,
|
|
22
23
|
group: 'inline',
|
|
@@ -34,6 +35,7 @@ export const ImgSizeSpecs = (builder, opts) => {
|
|
|
34
35
|
[ImgSizeAttr.Loading]: dom.getAttribute(ImgSizeAttr.Loading),
|
|
35
36
|
[ImgSizeAttr.Height]: isNumber(height) ? height : null,
|
|
36
37
|
[ImgSizeAttr.Width]: isNumber(width) ? height : null,
|
|
38
|
+
[ImgSizeAttr.Id]: dom.getAttribute(ImgSizeAttr.Id),
|
|
37
39
|
};
|
|
38
40
|
},
|
|
39
41
|
},
|
|
@@ -53,6 +55,7 @@ export const ImgSizeSpecs = (builder, opts) => {
|
|
|
53
55
|
[ImgSizeAttr.Width]: tok.attrGet(ImgSizeAttr.Width),
|
|
54
56
|
[ImgSizeAttr.Loading]: tok.attrGet(ImgSizeAttr.Loading),
|
|
55
57
|
[ImgSizeAttr.Alt]: tok.children?.[0]?.content || null,
|
|
58
|
+
[ImgSizeAttr.Id]: tok.attrGet(ImgSizeAttr.Id),
|
|
56
59
|
}),
|
|
57
60
|
},
|
|
58
61
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImgSizeSpecs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,gCAAgC,CAAC;AACnD,OAAO,MAAM,MAAM,iDAAiD,CAAC;AACrE,OAAO,QAAQ,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAC,aAAa,EAAC,yCAAsC;AAE5D,OAAO,EAAC,WAAW,EAAC,mBAAgB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImgSizeSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {log} from '@diplodoc/transform/lib/log.js';\nimport imsize from '@diplodoc/transform/lib/plugins/imsize/index.js';\nimport isNumber from 'is-number';\nimport type {NodeSpec} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {imageNodeName} from '../../../markdown/Image/const';\n\nimport {ImgSizeAttr} from './const';\n\ntype ImsizeTypedAttributes = {\n [ImgSizeAttr.Src]: string;\n [ImgSizeAttr.Title]: string | null;\n [ImgSizeAttr.Alt]: string | null;\n [ImgSizeAttr.Width]: string | null;\n [ImgSizeAttr.Height]: string | null;\n [ImgSizeAttr.Loading]: string | null;\n [ImgSizeAttr.Id]: string | null;\n};\n\nexport {ImgSizeAttr};\n\nexport type ImgSizeSpecsOptions = {\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n placeholder?: NodeSpec['placeholder'];\n};\n\nexport const ImgSizeSpecs: ExtensionAuto<ImgSizeSpecsOptions> = (builder, opts) => {\n const placeholderContent = builder.context.get('placeholder')?.imgSize;\n\n builder.configureMd((md) => md.use(imsize, {log, enableInlineStyling: true}));\n builder.addNode(imageNodeName, () => ({\n spec: {\n inline: true,\n attrs: {\n [ImgSizeAttr.Src]: {},\n [ImgSizeAttr.Alt]: {default: null},\n [ImgSizeAttr.Title]: {default: null},\n [ImgSizeAttr.Height]: {default: null},\n [ImgSizeAttr.Width]: {default: null},\n [ImgSizeAttr.Loading]: {default: null},\n [ImgSizeAttr.Id]: {default: null},\n },\n placeholder: placeholderContent ? {content: placeholderContent} : opts.placeholder,\n group: 'inline',\n draggable: true,\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs(dom) {\n const height = (dom as Element).getAttribute(ImgSizeAttr.Height);\n const width = (dom as Element).getAttribute(ImgSizeAttr.Width);\n\n return {\n [ImgSizeAttr.Src]: (dom as Element).getAttribute(ImgSizeAttr.Src),\n [ImgSizeAttr.Alt]: (dom as Element).getAttribute(ImgSizeAttr.Alt),\n [ImgSizeAttr.Title]: (dom as Element).getAttribute(ImgSizeAttr.Title),\n [ImgSizeAttr.Loading]: (dom as Element).getAttribute(\n ImgSizeAttr.Loading,\n ),\n [ImgSizeAttr.Height]: isNumber(height) ? height : null,\n [ImgSizeAttr.Width]: isNumber(width) ? height : null,\n [ImgSizeAttr.Id]: (dom as Element).getAttribute(ImgSizeAttr.Id),\n };\n },\n },\n ],\n toDOM(node) {\n return ['img', node.attrs];\n },\n },\n fromMd: {\n tokenSpec: {\n name: imageNodeName,\n type: 'node',\n getAttrs: (tok): ImsizeTypedAttributes => ({\n [ImgSizeAttr.Src]: tok.attrGet(ImgSizeAttr.Src)!,\n [ImgSizeAttr.Title]: tok.attrGet(ImgSizeAttr.Title),\n [ImgSizeAttr.Height]: tok.attrGet(ImgSizeAttr.Height),\n [ImgSizeAttr.Width]: tok.attrGet(ImgSizeAttr.Width),\n [ImgSizeAttr.Loading]: tok.attrGet(ImgSizeAttr.Loading),\n [ImgSizeAttr.Alt]: tok.children?.[0]?.content || null,\n [ImgSizeAttr.Id]: tok.attrGet(ImgSizeAttr.Id),\n }),\n },\n },\n toMd: (state, node) => {\n const attrs = node.attrs as ImsizeTypedAttributes;\n let result = ' {\n result += state.esc(attrs.src);\n }\n\n if (attrs.title) {\n result += ` ${state.quote(attrs.title)}`;\n }\n\n result += getSize(attrs);\n result += ')';\n\n state.write(result);\n },\n }));\n};\n\nfunction getSize({width, height}: ImsizeTypedAttributes): string {\n if (width || height) {\n return ` =${width || ''}x${height || ''}`;\n }\n\n return '';\n}\n"]}
|
|
@@ -9,6 +9,7 @@ export type CreateImageNodeOptions = {
|
|
|
9
9
|
};
|
|
10
10
|
export declare const createImageNode: (imgType: NodeType, opts: CreateImageNodeOptions, logger: Logger2.ILogger) => ({ result, file }: UploadSuccessItem) => Promise<Node>;
|
|
11
11
|
export declare function loadImage(imgFile: File): Promise<HTMLImageElement>;
|
|
12
|
+
export declare function loadImageFromUrl(url: string): Promise<HTMLImageElement>;
|
|
12
13
|
export declare function getImageSize(img: HTMLImageElement): {
|
|
13
14
|
[ImgSizeAttr.Height]?: string;
|
|
14
15
|
};
|
|
@@ -16,3 +17,8 @@ export declare function getImageSizeNew({ width, height }: HTMLImageElement): {
|
|
|
16
17
|
[ImgSizeAttr.Width]?: string;
|
|
17
18
|
[ImgSizeAttr.Height]?: string;
|
|
18
19
|
};
|
|
20
|
+
export declare function checkSvg(imageUrl?: string): boolean | "" | undefined;
|
|
21
|
+
export declare function findImageNode(doc: Node, id: string): {
|
|
22
|
+
node: Node;
|
|
23
|
+
pos: number;
|
|
24
|
+
} | null;
|
|
@@ -34,6 +34,14 @@ export async function loadImage(imgFile) {
|
|
|
34
34
|
img.onerror = (_e, _s, _l, _c, error) => reject(error);
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
+
export async function loadImageFromUrl(url) {
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
const img = new Image();
|
|
40
|
+
img.onload = () => resolve(img);
|
|
41
|
+
img.onerror = (_e, _s, _l, _c, error) => reject(error);
|
|
42
|
+
img.src = url;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
37
45
|
export function getImageSize(img) {
|
|
38
46
|
return { height: String(Math.min(IMG_MAX_HEIGHT, img.height)) };
|
|
39
47
|
}
|
|
@@ -45,4 +53,18 @@ export function getImageSizeNew({ width, height }) {
|
|
|
45
53
|
});
|
|
46
54
|
return { width: String(size.width), height: String(size.height) };
|
|
47
55
|
}
|
|
56
|
+
export function checkSvg(imageUrl) {
|
|
57
|
+
return imageUrl && (/\.svg($|\?|#)/i.test(imageUrl) || imageUrl.startsWith('data:image/svg'));
|
|
58
|
+
}
|
|
59
|
+
export function findImageNode(doc, id) {
|
|
60
|
+
let result = null;
|
|
61
|
+
doc.descendants((node, pos) => {
|
|
62
|
+
if (isImageNode(node) && node.attrs.id === id) {
|
|
63
|
+
result = { node, pos };
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
});
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
48
70
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,YAAY,EAAC,2BAAwB;AAC3D,OAAO,EAAyB,mBAAmB,EAAC,gCAAuB;AAC3E,OAAO,EAAC,aAAa,EAAC,gCAAuB;AAC7C,OAAO,EAAC,WAAW,EAAC,uBAAoB;AAExC,OAAO,EAAC,cAAc,EAAC,mBAAgB;AAEvC,MAAM,UAAU,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;AAC5C,CAAC;AAOD,MAAM,CAAC,MAAM,eAAe,GACxB,CAAC,OAAiB,EAAE,IAA4B,EAAE,MAAuB,EAAE,EAAE,CAC7E,KAAK,EAAE,EAAC,MAAM,EAAE,IAAI,EAAoB,EAAE,EAAE;IACxC,MAAM,KAAK,GAA2B;QAClC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG;QAC7B,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;KAC9C,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Node, NodeType} from 'prosemirror-model';\n\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {type UploadSuccessItem, getProportionalSize} from '../../../utils';\nimport {imageNodeName} from '../../markdown';\nimport {ImgSizeAttr} from '../../specs';\n\nimport {IMG_MAX_HEIGHT} from './const';\n\nexport function isImageNode(node: Node): boolean {\n return node.type.name === imageNodeName;\n}\n\nexport type CreateImageNodeOptions = {\n needDimensions: boolean;\n enableNewImageSizeCalculation?: boolean;\n};\n\nexport const createImageNode =\n (imgType: NodeType, opts: CreateImageNodeOptions, logger: Logger2.ILogger) =>\n async ({result, file}: UploadSuccessItem) => {\n const attrs: Record<string, string> = {\n [ImgSizeAttr.Src]: result.url,\n [ImgSizeAttr.Alt]: result.name ?? file.name,\n };\n\n if (opts.needDimensions) {\n try {\n const sizes = await loadImage(file).then(\n opts.enableNewImageSizeCalculation ? getImageSizeNew : getImageSize,\n );\n Object.assign(attrs, sizes);\n } catch (err) {\n globalLogger.error(err);\n logger.error({error: err});\n }\n }\n return imgType.create(attrs);\n };\n\nexport async function loadImage(imgFile: File) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const img = document.createElement('img');\n img.src = URL.createObjectURL(imgFile);\n img.onload = () => {\n URL.revokeObjectURL(img.src);\n resolve(img);\n };\n img.onerror = (_e, _s, _l, _c, error) => reject(error);\n });\n}\n\nexport async function loadImageFromUrl(url: string): Promise<HTMLImageElement> {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = (_e, _s, _l, _c, error) => reject(error);\n img.src = url;\n });\n}\n\nexport function getImageSize(img: HTMLImageElement): {[ImgSizeAttr.Height]?: string} {\n return {height: String(Math.min(IMG_MAX_HEIGHT, img.height))};\n}\n\nexport function getImageSizeNew({width, height}: HTMLImageElement): {\n [ImgSizeAttr.Width]?: string;\n [ImgSizeAttr.Height]?: string;\n} {\n const size = getProportionalSize({\n width,\n height,\n imgMaxHeight: IMG_MAX_HEIGHT,\n });\n return {width: String(size.width), height: String(size.height)};\n}\n\nexport function checkSvg(imageUrl?: string) {\n return imageUrl && (/\\.svg($|\\?|#)/i.test(imageUrl) || imageUrl.startsWith('data:image/svg'));\n}\n\nexport function findImageNode(doc: Node, id: string): {node: Node; pos: number} | null {\n let result: {node: Node; pos: number} | null = null;\n\n doc.descendants((node, pos) => {\n if (isImageNode(node) && node.attrs.id === id) {\n result = {node, pos};\n return false;\n }\n return true;\n });\n\n return result;\n}\n"]}
|
|
@@ -10,3 +10,8 @@ export declare enum CutAttr {
|
|
|
10
10
|
export declare const cutType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
|
|
11
11
|
export declare const cutTitleType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
|
|
12
12
|
export declare const cutContentType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
|
|
13
|
+
export declare const YfmCutClassName: {
|
|
14
|
+
readonly Cut: "yfm-cut";
|
|
15
|
+
readonly Title: "yfm-cut-title";
|
|
16
|
+
readonly Content: "yfm-cut-content";
|
|
17
|
+
};
|
|
@@ -13,4 +13,9 @@ export var CutAttr;
|
|
|
13
13
|
export const cutType = nodeTypeFactory(CutNode.Cut);
|
|
14
14
|
export const cutTitleType = nodeTypeFactory(CutNode.CutTitle);
|
|
15
15
|
export const cutContentType = nodeTypeFactory(CutNode.CutContent);
|
|
16
|
+
export const YfmCutClassName = {
|
|
17
|
+
Cut: 'yfm-cut',
|
|
18
|
+
Title: 'yfm-cut-title',
|
|
19
|
+
Content: 'yfm-cut-content',
|
|
20
|
+
};
|
|
16
21
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,oCAAyB;AAEjD,MAAM,CAAN,IAAY,OAIX;AAJD,WAAY,OAAO;IACf,0BAAe,CAAA;IACf,qCAA0B,CAAA;IAC1B,yCAA8B,CAAA;AAClC,CAAC,EAJW,OAAO,KAAP,OAAO,QAIlB;AAED,MAAM,CAAN,IAAY,OAGX;AAHD,WAAY,OAAO;IACf,0BAAe,CAAA;IACf,iCAAsB,CAAA;AAC1B,CAAC,EAHW,OAAO,KAAP,OAAO,QAGlB;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE,iBAAiB;CACpB,CAAC","sourcesContent":["import {nodeTypeFactory} from 'src/utils/schema';\n\nexport enum CutNode {\n Cut = 'yfm_cut',\n CutTitle = 'yfm_cut_title',\n CutContent = 'yfm_cut_content',\n}\n\nexport enum CutAttr {\n Class = 'class',\n Markup = 'data-markup',\n}\n\nexport const cutType = nodeTypeFactory(CutNode.Cut);\nexport const cutTitleType = nodeTypeFactory(CutNode.CutTitle);\nexport const cutContentType = nodeTypeFactory(CutNode.CutContent);\n\nexport const YfmCutClassName = {\n Cut: 'yfm-cut',\n Title: 'yfm-cut-title',\n Content: 'yfm-cut-content',\n} as const;\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ExtensionAuto, ExtensionNodeSpec } from "../../../../core/index.js";
|
|
2
2
|
import { type YfmCutSchemaOptions } from "./schema.js";
|
|
3
|
-
export { CutAttr, CutNode, cutType, cutTitleType, cutContentType } from "./const.js";
|
|
3
|
+
export { CutAttr, CutNode, cutType, cutTitleType, cutContentType, YfmCutClassName } from "./const.js";
|
|
4
4
|
declare global {
|
|
5
5
|
namespace MarkdownEditor {
|
|
6
6
|
interface DirectiveSyntaxAdditionalSupportedExtensions {
|
|
@@ -3,7 +3,7 @@ import { CutNode } from "./const.js";
|
|
|
3
3
|
import { parserTokens } from "./parser.js";
|
|
4
4
|
import { getSchemaSpecs } from "./schema.js";
|
|
5
5
|
import { getSerializerTokens } from "./serializer.js";
|
|
6
|
-
export { CutAttr, CutNode, cutType, cutTitleType, cutContentType } from "./const.js";
|
|
6
|
+
export { CutAttr, CutNode, cutType, cutTitleType, cutContentType, YfmCutClassName } from "./const.js";
|
|
7
7
|
export const YfmCutSpecs = (builder, opts) => {
|
|
8
8
|
const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));
|
|
9
9
|
const directiveSyntax = builder.context.get('directiveSyntax');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,IAAI,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAI5D,OAAO,EAAC,OAAO,EAAC,mBAAgB;AAChC,OAAO,EAAC,YAAY,EAAC,oBAAiB;AACtC,OAAO,EAA2B,cAAc,EAAC,oBAAiB;AAClE,OAAO,EAAC,mBAAmB,EAAC,wBAAqB;AAEjD,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAC,mBAAgB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,IAAI,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAI5D,OAAO,EAAC,OAAO,EAAC,mBAAgB;AAChC,OAAO,EAAC,YAAY,EAAC,oBAAiB;AACtC,OAAO,EAA2B,cAAc,EAAC,oBAAiB;AAClE,OAAO,EAAC,mBAAmB,EAAC,wBAAqB;AAEjD,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAC,mBAAgB;AAiBjG,MAAM,CAAC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7E,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,EAAC,eAAe,EAAC,CAAC,CAAC;IAEhE,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,EAAE,CAAC,GAAG,CACF,MAAM,CAAC;QACH,MAAM,EAAE,KAAK;QACb,eAAe,EAAE,eAAe,EAAE,gBAAgB,CAAC,QAAQ,CAAC;KAC/D,CAAC,CACL,CACJ;SACA,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;QAC9B,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC;QACnC,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;SACvC;QACD,IAAI,EAAE,IAAI,CAAC,OAAO;KACrB,CAAC,CAAC;SACF,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxC,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;SAC5C;QACD,IAAI,EAAE,IAAI,CAAC,YAAY;KAC1B,CAAC,CAAC;SACF,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;SAC9C;QACD,IAAI,EAAE,IAAI,CAAC,cAAc;KAC5B,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC","sourcesContent":["import {transform as yfmCut} from '@diplodoc/cut-extension';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '#core';\n\nimport {CutNode} from './const';\nimport {parserTokens} from './parser';\nimport {type YfmCutSchemaOptions, getSchemaSpecs} from './schema';\nimport {getSerializerTokens} from './serializer';\n\nexport {CutAttr, CutNode, cutType, cutTitleType, cutContentType, YfmCutClassName} from './const';\n\ndeclare global {\n namespace MarkdownEditor {\n interface DirectiveSyntaxAdditionalSupportedExtensions {\n // Mark in global types that YfmCut has support for directive syntax\n yfmCut: true;\n }\n }\n}\n\nexport type YfmCutSpecsOptions = YfmCutSchemaOptions & {\n cutView?: ExtensionNodeSpec['view'];\n cutTitleView?: ExtensionNodeSpec['view'];\n cutContentView?: ExtensionNodeSpec['view'];\n};\n\nexport const YfmCutSpecs: ExtensionAuto<YfmCutSpecsOptions> = (builder, opts) => {\n const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));\n const directiveSyntax = builder.context.get('directiveSyntax');\n const serializerTokens = getSerializerTokens({directiveSyntax});\n\n builder\n .configureMd((md) =>\n md.use(\n yfmCut({\n bundle: false,\n directiveSyntax: directiveSyntax?.mdPluginValueFor('yfmCut'),\n }),\n ),\n )\n .addNode(CutNode.Cut, () => ({\n spec: schemaSpecs[CutNode.Cut],\n toMd: serializerTokens[CutNode.Cut],\n fromMd: {\n tokenSpec: parserTokens[CutNode.Cut],\n },\n view: opts.cutView,\n }))\n .addNode(CutNode.CutTitle, () => ({\n spec: schemaSpecs[CutNode.CutTitle],\n toMd: serializerTokens[CutNode.CutTitle],\n fromMd: {\n tokenSpec: parserTokens[CutNode.CutTitle],\n },\n view: opts.cutTitleView,\n }))\n .addNode(CutNode.CutContent, () => ({\n spec: schemaSpecs[CutNode.CutContent],\n toMd: serializerTokens[CutNode.CutContent],\n fromMd: {\n tokenSpec: parserTokens[CutNode.CutContent],\n },\n view: opts.cutContentView,\n }));\n};\n"]}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { CutAttr, CutNode } from "./const.js";
|
|
1
|
+
import { CutAttr, CutNode, YfmCutClassName } from "./const.js";
|
|
2
2
|
const DEFAULT_PLACEHOLDERS = {
|
|
3
3
|
Title: 'Cut title',
|
|
4
4
|
Content: 'Cut content',
|
|
5
5
|
};
|
|
6
6
|
export const getSchemaSpecs = (opts, placeholder) => ({
|
|
7
7
|
[CutNode.Cut]: {
|
|
8
|
-
attrs: { class: { default:
|
|
8
|
+
attrs: { class: { default: YfmCutClassName.Cut }, [CutAttr.Markup]: { default: null } },
|
|
9
9
|
content: `${CutNode.CutTitle} ${CutNode.CutContent}`,
|
|
10
10
|
group: 'block yfm-cut',
|
|
11
11
|
parseDOM: [
|
|
12
12
|
{
|
|
13
|
-
tag:
|
|
13
|
+
tag: `.${YfmCutClassName.Cut}`,
|
|
14
14
|
getAttrs: (node) => ({ [CutAttr.Markup]: node.getAttribute(CutAttr.Markup) }),
|
|
15
15
|
},
|
|
16
16
|
],
|
|
@@ -23,10 +23,10 @@ export const getSchemaSpecs = (opts, placeholder) => ({
|
|
|
23
23
|
complex: 'root',
|
|
24
24
|
},
|
|
25
25
|
[CutNode.CutTitle]: {
|
|
26
|
-
attrs: { class: { default:
|
|
26
|
+
attrs: { class: { default: YfmCutClassName.Title } },
|
|
27
27
|
content: 'inline*',
|
|
28
28
|
group: 'block yfm-cut',
|
|
29
|
-
parseDOM: [{ tag:
|
|
29
|
+
parseDOM: [{ tag: `.${YfmCutClassName.Title}` }],
|
|
30
30
|
toDOM(node) {
|
|
31
31
|
return ['div', node.attrs, 0];
|
|
32
32
|
},
|
|
@@ -42,10 +42,10 @@ export const getSchemaSpecs = (opts, placeholder) => ({
|
|
|
42
42
|
complex: 'leaf',
|
|
43
43
|
},
|
|
44
44
|
[CutNode.CutContent]: {
|
|
45
|
-
attrs: { class: { default:
|
|
45
|
+
attrs: { class: { default: YfmCutClassName.Content } },
|
|
46
46
|
content: '(block | paragraph)+',
|
|
47
47
|
group: 'block yfm-cut',
|
|
48
|
-
parseDOM: [{ tag:
|
|
48
|
+
parseDOM: [{ tag: `.${YfmCutClassName.Content}` }],
|
|
49
49
|
toDOM(node) {
|
|
50
50
|
return ['div', node.attrs, 0];
|
|
51
51
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/schema.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAC,mBAAgB;AAa1D,MAAM,oBAAoB,GAAG;IACzB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,aAAa;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC1B,IAA0B,EAC1B,WAAgC,EACP,EAAE,CAAC,CAAC;IAC7B,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACX,KAAK,EAAE,EAAC,KAAK,EAAE,EAAC,OAAO,EAAE,eAAe,CAAC,GAAG,EAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,EAAC;QACjF,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE;QACpD,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE;YACN;gBACI,GAAG,EAAE,IAAI,eAAe,CAAC,GAAG,EAAE;gBAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAC,CAAC;aAC9E;SACJ;QACD,KAAK,CAAC,IAAI;YACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,MAAM;KAClB;IAED,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,KAAK,EAAE,EAAC,KAAK,EAAE,EAAC,OAAO,EAAE,eAAe,CAAC,KAAK,EAAC,EAAC;QAChD,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,IAAI,eAAe,CAAC,KAAK,EAAE,EAAC,CAAC;QAC9C,KAAK,CAAC,IAAI;YACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,WAAW,EAAE;YACT,OAAO,EACH,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC/B,IAAI,EAAE,sBAAsB;gBAC5B,oBAAoB,CAAC,KAAK;YAC9B,aAAa,EAAE,IAAI;SACtB;QACD,iBAAiB,EAAE,IAAI;QACvB,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,MAAM;KAClB;IAED,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;QAClB,KAAK,EAAE,EAAC,KAAK,EAAE,EAAC,OAAO,EAAE,eAAe,CAAC,OAAO,EAAC,EAAC;QAClD,OAAO,EAAE,sBAAsB;QAC/B,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,IAAI,eAAe,CAAC,OAAO,EAAE,EAAC,CAAC;QAChD,KAAK,CAAC,IAAI;YACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,WAAW,EAAE;YACT,OAAO,EACH,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;gBACjC,IAAI,EAAE,wBAAwB;gBAC9B,oBAAoB,CAAC,OAAO;YAChC,aAAa,EAAE,IAAI;SACtB;QACD,iBAAiB,EAAE,IAAI;QACvB,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,MAAM;KAClB;CACJ,CAAC,CAAC","sourcesContent":["import type {NodeSpec} from '#pm/model';\nimport type {PlaceholderOptions} from 'src/utils/placeholder';\n\nimport {CutAttr, CutNode, YfmCutClassName} from './const';\n\nexport type YfmCutSchemaOptions = {\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n yfmCutTitlePlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n yfmCutContentPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n};\n\nconst DEFAULT_PLACEHOLDERS = {\n Title: 'Cut title',\n Content: 'Cut content',\n};\n\nexport const getSchemaSpecs = (\n opts?: YfmCutSchemaOptions,\n placeholder?: PlaceholderOptions,\n): Record<CutNode, NodeSpec> => ({\n [CutNode.Cut]: {\n attrs: {class: {default: YfmCutClassName.Cut}, [CutAttr.Markup]: {default: null}},\n content: `${CutNode.CutTitle} ${CutNode.CutContent}`,\n group: 'block yfm-cut',\n parseDOM: [\n {\n tag: `.${YfmCutClassName.Cut}`,\n getAttrs: (node) => ({[CutAttr.Markup]: node.getAttribute(CutAttr.Markup)}),\n },\n ],\n toDOM(node) {\n return ['div', node.attrs, 0];\n },\n selectable: true,\n allowSelection: true,\n defining: true,\n complex: 'root',\n },\n\n [CutNode.CutTitle]: {\n attrs: {class: {default: YfmCutClassName.Title}},\n content: 'inline*',\n group: 'block yfm-cut',\n parseDOM: [{tag: `.${YfmCutClassName.Title}`}],\n toDOM(node) {\n return ['div', node.attrs, 0];\n },\n placeholder: {\n content:\n placeholder?.[CutNode.CutTitle] ??\n opts?.yfmCutTitlePlaceholder ??\n DEFAULT_PLACEHOLDERS.Title,\n alwaysVisible: true,\n },\n definingAsContext: true,\n selectable: false,\n allowSelection: false,\n complex: 'leaf',\n },\n\n [CutNode.CutContent]: {\n attrs: {class: {default: YfmCutClassName.Content}},\n content: '(block | paragraph)+',\n group: 'block yfm-cut',\n parseDOM: [{tag: `.${YfmCutClassName.Content}`}],\n toDOM(node) {\n return ['div', node.attrs, 0];\n },\n placeholder: {\n content:\n placeholder?.[CutNode.CutContent] ??\n opts?.yfmCutContentPlaceholder ??\n DEFAULT_PLACEHOLDERS.Content,\n alwaysVisible: true,\n },\n definingAsContext: true,\n selectable: false,\n allowSelection: false,\n complex: 'leaf',\n },\n});\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { TextSelection } from
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import { cutContentType, cutTitleType, cutType } from "../const.js";
|
|
1
|
+
import { TextSelection } from "../../../../pm/state.js";
|
|
2
|
+
import { findParentNodeClosestToPos } from "../../../../pm/utils.js";
|
|
3
|
+
import { YfmCutClassName, cutContentType, cutTitleType, cutType } from "../const.js";
|
|
5
4
|
const createYfmCutNode = (schema) => (content) => {
|
|
6
|
-
|
|
5
|
+
const className = `${YfmCutClassName.Cut} ${YfmCutClassName.Open}`;
|
|
6
|
+
return cutType(schema).create({ class: className }, [
|
|
7
7
|
cutTitleType(schema).create(null),
|
|
8
8
|
cutContentType(schema).create(null, content),
|
|
9
9
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toYfmCut.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/actions/toYfmCut.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toYfmCut.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/actions/toYfmCut.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ActionSpec} from '#core';\nimport type {Fragment, Node, Schema} from '#pm/model';\nimport {type Command, TextSelection} from '#pm/state';\nimport {findParentNodeClosestToPos} from '#pm/utils';\n\nimport {YfmCutClassName, cutContentType, cutTitleType, cutType} from '../const';\n\nconst createYfmCutNode = (schema: Schema) => (content?: Node | Node[] | Fragment) => {\n const className = `${YfmCutClassName.Cut} ${YfmCutClassName.Open}` as const;\n return cutType(schema).create({class: className}, [\n cutTitleType(schema).create(null),\n cutContentType(schema).create(null, content),\n ]);\n};\n\nexport const createYfmCut: Command = (state, dispatch) => {\n const {schema, selection: sel} = state;\n\n const textblock = findParentNodeClosestToPos(\n sel.$from,\n (node: Node) => node.isTextblock && !node.type.spec.complex,\n );\n\n if (!textblock) return false;\n\n if (dispatch) {\n const sliceFromPos = textblock.pos;\n let sliceToPos = sliceFromPos + textblock.node.nodeSize;\n\n const tbIndex = sel.$from.index(textblock.depth - 1);\n const tbParent = sel.$from.node(textblock.depth - 1);\n const tbParentStartPos = sel.$from.start(textblock.depth - 1);\n\n let flag = false;\n // find appropriate sliceToPos\n tbParent.forEach((node, offset, index) => {\n if (index < tbIndex || flag) return;\n if (node.type.spec.complex && node.type.spec.complex !== 'root') {\n flag = true;\n return;\n }\n\n const absoluteAfterPos = tbParentStartPos + offset + node.nodeSize;\n sliceToPos = absoluteAfterPos;\n\n if (sel.to < sliceToPos) flag = true;\n });\n\n const tr = state.tr;\n tr.replaceWith(\n sliceFromPos,\n sliceToPos,\n createYfmCutNode(schema)(tr.doc.slice(sliceFromPos, sliceToPos, false).content),\n );\n // set selection to start of cut title\n tr.setSelection(TextSelection.create(tr.doc, sliceFromPos + 2));\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n};\n\nexport const toYfmCut: ActionSpec = {\n isEnable(state) {\n return createYfmCut(state);\n },\n run(state, dispatch) {\n createYfmCut(state, dispatch);\n },\n};\n"]}
|
|
@@ -1 +1,9 @@
|
|
|
1
|
-
export { CutNode, cutType, cutTitleType, cutContentType } from "./YfmCutSpecs/
|
|
1
|
+
export { CutNode, cutType, cutTitleType, cutContentType } from "./YfmCutSpecs/const.js";
|
|
2
|
+
export declare const YfmCutClassName: {
|
|
3
|
+
readonly TitleInner: "g-md-yfm-cut-title-inner";
|
|
4
|
+
readonly Open: "yfm-cut-open";
|
|
5
|
+
readonly Active: "yfm-cut-active";
|
|
6
|
+
readonly Cut: "yfm-cut";
|
|
7
|
+
readonly Title: "yfm-cut-title";
|
|
8
|
+
readonly Content: "yfm-cut-content";
|
|
9
|
+
};
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { YfmCutClassName as YfmCutClassNameSpecs } from "./YfmCutSpecs/const.js";
|
|
2
|
+
export { CutNode, cutType, cutTitleType, cutContentType } from "./YfmCutSpecs/const.js";
|
|
3
|
+
export const YfmCutClassName = {
|
|
4
|
+
...YfmCutClassNameSpecs,
|
|
5
|
+
TitleInner: 'g-md-yfm-cut-title-inner',
|
|
6
|
+
Open: 'yfm-cut-open',
|
|
7
|
+
Active: 'yfm-cut-active',
|
|
8
|
+
};
|
|
2
9
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmCut/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAC,+
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmCut/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,IAAI,oBAAoB,EAAC,+BAA4B;AAE5E,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAC,+BAA4B;AAEnF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,GAAG,oBAAoB;IACvB,UAAU,EAAE,0BAA0B;IACtC,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,gBAAgB;CAClB,CAAC","sourcesContent":["import {YfmCutClassName as YfmCutClassNameSpecs} from './YfmCutSpecs/const';\n\nexport {CutNode, cutType, cutTitleType, cutContentType} from './YfmCutSpecs/const';\n\nexport const YfmCutClassName = {\n ...YfmCutClassNameSpecs,\n TitleInner: 'g-md-yfm-cut-title-inner',\n Open: 'yfm-cut-open',\n Active: 'yfm-cut-active',\n} as const;\n"]}
|