@gravity-ui/markdown-editor 15.35.1 → 15.37.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/README.md +87 -0
- package/build/cjs/core/Editor.js +2 -0
- package/build/cjs/core/Editor.js.map +1 -1
- package/build/cjs/core/index.d.ts +1 -0
- package/build/cjs/core/index.js +3 -1
- package/build/cjs/core/index.js.map +1 -1
- package/build/cjs/core/markdown/MarkdownParser.d.ts +1 -0
- package/build/cjs/core/markdown/MarkdownParser.js +3 -0
- package/build/cjs/core/markdown/MarkdownParser.js.map +1 -1
- package/build/cjs/core/types/parser.d.ts +1 -0
- package/build/cjs/core/types/parser.js.map +1 -1
- package/build/cjs/core/utils/parser.d.ts +3 -0
- package/build/cjs/core/utils/parser.js +12 -0
- package/build/cjs/core/utils/parser.js.map +1 -0
- package/build/cjs/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js +1 -0
- package/build/cjs/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js.map +1 -1
- package/build/cjs/extensions/behavior/Clipboard/clipboard.js +2 -13
- package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
- package/build/cjs/extensions/behavior/Clipboard/selection-content.d.ts +1 -0
- package/build/cjs/extensions/behavior/Clipboard/selection-content.js +35 -0
- package/build/cjs/extensions/behavior/Clipboard/selection-content.js.map +1 -0
- package/build/cjs/extensions/behavior/Selection/commands.d.ts +2 -1
- package/build/cjs/extensions/behavior/Selection/commands.js +47 -1
- package/build/cjs/extensions/behavior/Selection/commands.js.map +1 -1
- package/build/cjs/extensions/behavior/Selection/selection.d.ts +15 -0
- package/build/cjs/extensions/behavior/Selection/selection.js +1 -0
- package/build/cjs/extensions/behavior/Selection/selection.js.map +1 -1
- package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +3 -0
- package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
- package/build/cjs/extensions/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
- package/build/cjs/extensions/markdown/Blockquote/BlockquoteSpecs/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Bold/index.js +1 -1
- package/build/cjs/extensions/markdown/Bold/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Code/index.js +1 -1
- package/build/cjs/extensions/markdown/Code/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +2 -2
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +79 -128
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.d.ts +14 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js +117 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.d.ts +9 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js +22 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +2 -3
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +5 -93
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.d.ts +23 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js +88 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +42 -22
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +20 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -1
- package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/schema.js +2 -0
- package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/schema.js.map +1 -1
- package/build/cjs/extensions/markdown/Italic/index.js +1 -1
- package/build/cjs/extensions/markdown/Italic/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Mark/index.js +1 -1
- package/build/cjs/extensions/markdown/Mark/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Strike/index.js +1 -1
- package/build/cjs/extensions/markdown/Strike/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Table/TableSpecs/schema.js +1 -0
- package/build/cjs/extensions/markdown/Table/TableSpecs/schema.js.map +1 -1
- package/build/cjs/extensions/markdown/Underline/index.js +1 -1
- package/build/cjs/extensions/markdown/Underline/index.js.map +1 -1
- package/build/cjs/extensions/yfm/Monospace/index.js +1 -1
- package/build/cjs/extensions/yfm/Monospace/index.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +2 -0
- package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js +2 -0
- package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.css +20 -0
- package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.d.ts +9 -0
- package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js +77 -0
- package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js.map +1 -0
- package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.d.ts +1 -2
- package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js +5 -65
- package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/schema.js +2 -0
- package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/schema.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +3 -0
- package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js.map +1 -1
- package/build/cjs/plugins/BaseTooltip/index.d.ts +1 -0
- package/build/cjs/plugins/BaseTooltip/index.js +4 -3
- package/build/cjs/plugins/BaseTooltip/index.js.map +1 -1
- package/build/cjs/toolbar/ToolbarGroup.js +4 -3
- package/build/cjs/toolbar/ToolbarGroup.js.map +1 -1
- package/build/cjs/toolbar/types.d.ts +2 -0
- package/build/cjs/toolbar/types.js.map +1 -1
- package/build/cjs/utils/actions.d.ts +6 -0
- package/build/cjs/utils/actions.js +24 -0
- package/build/cjs/utils/actions.js.map +1 -1
- package/build/cjs/utils/marks.d.ts +6 -0
- package/build/cjs/utils/marks.js +31 -0
- package/build/cjs/utils/marks.js.map +1 -1
- package/build/cjs/utils/transaction.d.ts +1 -0
- package/build/cjs/utils/transaction.js +40 -0
- package/build/cjs/utils/transaction.js.map +1 -0
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/core/Editor.js +2 -0
- package/build/esm/core/Editor.js.map +1 -1
- package/build/esm/core/index.d.ts +1 -0
- package/build/esm/core/index.js +1 -0
- package/build/esm/core/index.js.map +1 -1
- package/build/esm/core/markdown/MarkdownParser.d.ts +1 -0
- package/build/esm/core/markdown/MarkdownParser.js +3 -0
- package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
- package/build/esm/core/types/parser.d.ts +1 -0
- package/build/esm/core/types/parser.js.map +1 -1
- package/build/esm/core/utils/parser.d.ts +3 -0
- package/build/esm/core/utils/parser.js +8 -0
- package/build/esm/core/utils/parser.js.map +1 -0
- package/build/esm/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js +1 -0
- package/build/esm/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js.map +1 -1
- package/build/esm/extensions/behavior/Clipboard/clipboard.js +1 -12
- package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
- package/build/esm/extensions/behavior/Clipboard/selection-content.d.ts +1 -0
- package/build/esm/extensions/behavior/Clipboard/selection-content.js +32 -0
- package/build/esm/extensions/behavior/Clipboard/selection-content.js.map +1 -0
- package/build/esm/extensions/behavior/Selection/commands.d.ts +2 -1
- package/build/esm/extensions/behavior/Selection/commands.js +47 -2
- package/build/esm/extensions/behavior/Selection/commands.js.map +1 -1
- package/build/esm/extensions/behavior/Selection/selection.d.ts +15 -0
- package/build/esm/extensions/behavior/Selection/selection.js +2 -1
- package/build/esm/extensions/behavior/Selection/selection.js.map +1 -1
- package/build/esm/extensions/behavior/SelectionContext/tooltip.js +3 -0
- package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
- package/build/esm/extensions/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
- package/build/esm/extensions/markdown/Blockquote/BlockquoteSpecs/index.js.map +1 -1
- package/build/esm/extensions/markdown/Bold/index.js +2 -2
- package/build/esm/extensions/markdown/Bold/index.js.map +1 -1
- package/build/esm/extensions/markdown/Code/index.js +2 -2
- package/build/esm/extensions/markdown/Code/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +2 -2
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +79 -128
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.d.ts +14 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js +114 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.d.ts +9 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js +19 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +2 -3
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +6 -94
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.d.ts +23 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js +83 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +43 -23
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +20 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -1
- package/build/esm/extensions/markdown/Deflist/DeflistSpecs/schema.js +2 -0
- package/build/esm/extensions/markdown/Deflist/DeflistSpecs/schema.js.map +1 -1
- package/build/esm/extensions/markdown/Italic/index.js +2 -2
- package/build/esm/extensions/markdown/Italic/index.js.map +1 -1
- package/build/esm/extensions/markdown/Mark/index.js +2 -2
- package/build/esm/extensions/markdown/Mark/index.js.map +1 -1
- package/build/esm/extensions/markdown/Strike/index.js +2 -2
- package/build/esm/extensions/markdown/Strike/index.js.map +1 -1
- package/build/esm/extensions/markdown/Table/TableSpecs/schema.js +1 -0
- package/build/esm/extensions/markdown/Table/TableSpecs/schema.js.map +1 -1
- package/build/esm/extensions/markdown/Underline/index.js +2 -2
- package/build/esm/extensions/markdown/Underline/index.js.map +1 -1
- package/build/esm/extensions/yfm/Monospace/index.js +2 -2
- package/build/esm/extensions/yfm/Monospace/index.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +2 -0
- package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
- package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js +2 -0
- package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js.map +1 -1
- package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.css +20 -0
- package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.d.ts +9 -0
- package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js +74 -0
- package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js.map +1 -0
- package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.d.ts +1 -2
- package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js +4 -64
- package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/schema.js +2 -0
- package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/schema.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +3 -0
- package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js.map +1 -1
- package/build/esm/plugins/BaseTooltip/index.d.ts +1 -0
- package/build/esm/plugins/BaseTooltip/index.js +4 -3
- package/build/esm/plugins/BaseTooltip/index.js.map +1 -1
- package/build/esm/toolbar/ToolbarGroup.js +4 -3
- package/build/esm/toolbar/ToolbarGroup.js.map +1 -1
- package/build/esm/toolbar/types.d.ts +2 -0
- package/build/esm/toolbar/types.js.map +1 -1
- package/build/esm/utils/actions.d.ts +6 -0
- package/build/esm/utils/actions.js +24 -1
- package/build/esm/utils/actions.js.map +1 -1
- package/build/esm/utils/marks.d.ts +6 -0
- package/build/esm/utils/marks.js +30 -0
- package/build/esm/utils/marks.js.map +1 -1
- package/build/esm/utils/transaction.d.ts +1 -0
- package/build/esm/utils/transaction.js +36 -0
- package/build/esm/utils/transaction.js.map +1 -0
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/styles.css +9 -5
- package/package.json +4 -3
- package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.css +0 -16
- package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.css +0 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/QuoteLink/QuoteLinkSpecs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,IAAI,SAAS,EAAC,MAAM,gCAAgC,CAAC;AAItE,OAAO,EAAC,eAAe,EAAC,mCAAkB;AAE1C,OAAO,EAAC,yBAAyB,EAAC,0CAAuC;AAEzE,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC;AAEpF,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACrB,8BAAa,CAAA;IACb,6CAA4B,CAAA;AAChC,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAED,MAAM,CAAC,MAAM,cAAc,GAAkB,CAAC,OAAO,EAAE,EAAE;IACrD,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,EAAE;SACG,GAAG,CACA,SAAS,CAAC;QACN,MAAM,EAAE,KAAK;KAChB,CAAC,CACL;SACA,GAAG,CAAC,yBAAyB,CAAC,CACtC;SACA,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE;YACF,KAAK,EAAE;gBACH,KAAK,EAAE,EAAC,OAAO,EAAE,gBAAgB,EAAC;gBAClC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBACnC,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;aAC7C;YACD,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE;gBACN;oBACI,GAAG,EAAE,iBAAiB;oBACtB,QAAQ,CAAC,GAAG;wBACR,OAAO;4BACH,CAAC,aAAa,CAAC,IAAI,CAAC,EAAG,GAAe,CAAC,YAAY,CAC/C,aAAa,CAAC,IAAI,CACrB;4BACD,CAAC,aAAa,CAAC,WAAW,CAAC,EAAG,GAAe,CAAC,YAAY,CACtD,aAAa,CAAC,WAAW,CAC5B;yBACJ,CAAC;oBACN,CAAC;oBACD,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ;iBACtC;aACJ;YACD,KAAK,CAAC,IAAI;gBACN,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC;YACD,UAAU,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/QuoteLink/QuoteLinkSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {transform as quoteLink} from '@diplodoc/quote-link-extension';\nimport type {Node} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '#core';\nimport {nodeTypeFactory} from 'src/utils';\n\nimport {moveLinkToQuoteAttributes} from './md/moveLinkToQuoteAttributes';\n\nexport const quoteLinkNodeName = 'yfm_quote-link';\nexport const quoteLinkType = nodeTypeFactory(quoteLinkNodeName);\nexport const isQuoteLinkNode = (node: Node) => node.type.name === quoteLinkNodeName;\n\nexport enum QuoteLinkAttr {\n Cite = 'cite',\n DataContent = 'data-content',\n}\n\nexport const QuoteLinkSpecs: ExtensionAuto = (builder) => {\n builder\n .configureMd((md) =>\n md\n .use(\n quoteLink({\n bundle: false,\n }),\n )\n .use(moveLinkToQuoteAttributes),\n )\n .addNode(quoteLinkNodeName, () => ({\n spec: {\n attrs: {\n class: {default: 'yfm-quote-link'},\n [QuoteLinkAttr.Cite]: {default: ''},\n [QuoteLinkAttr.DataContent]: {default: ''},\n },\n content: 'block+',\n group: 'block',\n defining: true,\n parseDOM: [\n {\n tag: '.yfm-quote-link',\n getAttrs(dom) {\n return {\n [QuoteLinkAttr.Cite]: (dom as Element).getAttribute(\n QuoteLinkAttr.Cite,\n ),\n [QuoteLinkAttr.DataContent]: (dom as Element).getAttribute(\n QuoteLinkAttr.DataContent,\n ),\n };\n },\n priority: builder.Priority.VeryHigh,\n },\n ],\n toDOM(node) {\n return ['blockquote', node.attrs, 0];\n },\n selectable: true,\n selectAll: 'node',\n },\n fromMd: {\n tokenSpec: {\n name: quoteLinkNodeName,\n type: 'block',\n getAttrs: (tok) => ({\n [QuoteLinkAttr.Cite]: tok.attrGet('cite'),\n [QuoteLinkAttr.DataContent]: tok.attrGet('data-content') || null,\n }),\n },\n },\n toMd: (state, node) => {\n state.wrapBlock('> ', null, node, () => {\n state.write(\n `[${node.attrs[QuoteLinkAttr.DataContent]}](${\n node.attrs[QuoteLinkAttr.Cite]\n }){data-quotelink=true}`,\n );\n state.write('\\n');\n state.write('\\n');\n state.renderContent(node);\n });\n },\n }));\n};\n"]}
|
|
@@ -7,6 +7,7 @@ import { tryCatch } from "../../../utils/helpers.js";
|
|
|
7
7
|
import { isNodeSelection, isTextSelection, isWholeSelection } from "../../../utils/selection.js";
|
|
8
8
|
import { BaseNode, pType } from "../../base/BaseSchema/index.js";
|
|
9
9
|
import { isInsideCode } from "./code.js";
|
|
10
|
+
import { getSelectionContent } from "./selection-content.js";
|
|
10
11
|
import { trimTextSelection } from "./trim-selection.js";
|
|
11
12
|
import { DataTransferType, extractTextContentFromHtml, isIosSafariShare, trimContent } from "./utils.js";
|
|
12
13
|
export const clipboard = ({ logger, textParser, mdParser, serializer, pasteFileHandler, }) => {
|
|
@@ -258,18 +259,6 @@ function createFragmentFromInlineSelection(state, sel) {
|
|
|
258
259
|
}
|
|
259
260
|
return Fragment.from(sel.$from.parent.copy(inlineSlice.content));
|
|
260
261
|
}
|
|
261
|
-
/**
|
|
262
|
-
* Like `selection.content()`, but smarter.
|
|
263
|
-
* Copy a structure of complex nodes,
|
|
264
|
-
* e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text
|
|
265
|
-
* it works well with simple nodes, but to handle cases as described above, custom logic needed
|
|
266
|
-
*/
|
|
267
|
-
function getSelectionContent(sel) {
|
|
268
|
-
const sharedNodeType = getSharedDepthNode(sel).type;
|
|
269
|
-
const sharedNodeComplex = sharedNodeType.spec.complex;
|
|
270
|
-
const includeParents = sharedNodeComplex && sharedNodeComplex !== 'leaf';
|
|
271
|
-
return sel.$from.doc.slice(sel.$from.pos, sel.to, includeParents);
|
|
272
|
-
}
|
|
273
262
|
function getSharedDepthNode({ $from, $to }) {
|
|
274
263
|
return $from.node($from.sharedDepth($to.pos));
|
|
275
264
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipboard.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import {type Parser, type Serializer, trackTransactionMetrics} from '#core';\nimport {Fragment, type Node, type ResolvedPos, type Schema, Slice} from '#pm/model';\nimport {type EditorState, Plugin, type Selection} from '#pm/state';\nimport type {EditorView} from '#pm/view';\nimport {type Logger2, globalLogger} from 'src/logger';\nimport 'src/types/spec';\nimport {tryCatch} from 'src/utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from 'src/utils/selection';\n\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\nimport {trimTextSelection} from './trim-selection';\nimport {DataTransferType, extractTextContentFromHtml, isIosSafariShare, trimContent} from './utils';\n\nexport type ClipboardPluginOptions = {\n logger: Logger2.ILogger;\n mdParser: Parser;\n textParser: Parser;\n serializer: Serializer;\n pasteFileHandler?: (file: File) => void;\n};\n\nexport const clipboard = ({\n logger,\n textParser,\n mdParser,\n serializer,\n pasteFileHandler,\n}: ClipboardPluginOptions) => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n copy(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n return true;\n }\n return false;\n },\n cut(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n view.dispatch(\n view.state.tr\n .deleteSelection()\n .scrollIntoView()\n .setMeta('uiEvent', 'cut'),\n );\n return true;\n }\n return false;\n },\n paste(view, e) {\n if (!e.clipboardData) return false;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: e.clipboardData.types,\n });\n\n let data: string;\n let isPasteHandled = false;\n\n if (\n isIosSafariShare(e.clipboardData) &&\n (data = e.clipboardData.getData(DataTransferType.UriList))\n ) {\n const schema: Schema = view.state.schema;\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(\n // paste link inline\n new Slice(\n Fragment.from(\n pType(schema).create(null, schema.text(data)),\n ),\n 1,\n 1,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.UriList},\n ),\n );\n pasteLogger.event({\n event: 'paste-uri-list',\n });\n isPasteHandled = true;\n e.preventDefault();\n return true;\n }\n\n if (\n !e.clipboardData.types.includes(DataTransferType.Yfm) &&\n (data = e.clipboardData.getData(DataTransferType.Html))\n ) {\n const textFromHtml = extractTextContentFromHtml(data);\n if (textFromHtml) {\n const res = tryCatch(() => textParser.parse(textFromHtml));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: DataTransferType.Html},\n ),\n );\n pasteLogger.event({\n event: 'paste-parsed-html',\n });\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'parse-html',\n });\n console.error(res.error);\n }\n } else return false; // default html pasting\n }\n\n if (\n !isPasteHandled &&\n ((data = e.clipboardData.getData(DataTransferType.Yfm)) ||\n (data = e.clipboardData.getData(DataTransferType.Text)))\n ) {\n let parser: Parser;\n let dataFormat: string;\n if (e.clipboardData.types.includes(DataTransferType.Yfm)) {\n parser = mdParser;\n dataFormat = DataTransferType.Yfm;\n } else {\n parser = textParser;\n dataFormat = DataTransferType.Text;\n }\n const codeType = isInsideCode(view.state);\n if (codeType) {\n const schema: Schema = view.state.schema;\n const insideCodeData = e.clipboardData.getData(DataTransferType.Text);\n\n pasteLogger.event({\n event: 'paste-text-to-code',\n codeType,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelectionWith(\n schema.text(\n codeType === 'inline'\n ? insideCodeData.trim()\n : insideCodeData,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.Text, code: codeType},\n ),\n );\n isPasteHandled = true;\n } else {\n const res = tryCatch(() => parser.parse(data));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n pasteLogger.event({\n event: 'paste-parsed-content',\n dataFormat,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: dataFormat},\n ),\n );\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'paste',\n dataFormat,\n });\n console.error(res.error);\n }\n }\n }\n\n if (e.clipboardData.files.length && pasteFileHandler) {\n pasteLogger.event({\n event: 'paste-files',\n });\n for (const file of Array.from(e.clipboardData.files)) {\n pasteFileHandler(file);\n }\n isPasteHandled = true;\n }\n\n if (isPasteHandled) {\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n};\n\nfunction getSliceFromMarkupFragment(fragment: Fragment) {\n let start = 0;\n let end = 0;\n if (fragment.firstChild?.isTextblock) {\n start = 1;\n if (fragment.childCount === 1) {\n end = 1;\n }\n }\n return new Slice(fragment, start, end);\n}\n\ntype SerializeResult = {\n text: string;\n html?: string;\n markup?: string;\n};\nfunction serializeSelected(view: EditorView, serializer: Serializer): SerializeResult | null {\n const sel = view.state.selection;\n\n if (sel.empty) return null;\n\n // handle selection in codeblocks\n if (getSharedDepthNode(sel).type.spec.code) {\n const fragment = sel.content().content;\n return {text: fragment.textBetween(0, fragment.size)};\n }\n\n // FIXME: Verify and use Node instead of Fragment\n const markup = serializer.serialize(getCopyContent(view.state).content as any);\n const {dom, text} = view.serializeForClipboard(sel.content());\n return {markup, text, html: dom.innerHTML};\n}\n\nfunction setClipboardData(data: DataTransfer, result: SerializeResult) {\n data.clearData();\n if (typeof result.markup === 'string') data.setData(DataTransferType.Yfm, result.markup);\n if (typeof result.html === 'string') data.setData(DataTransferType.Html, result.html);\n data.setData(DataTransferType.Text, result.text);\n}\n\nfunction getCopyContent(state: EditorState): Slice {\n let sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isNodeSelection(sel)) {\n const {node} = sel;\n if (node.type.spec.complex) {\n if (node.isTextblock) {\n return new Slice(\n Fragment.from(state.schema.node(BaseNode.Paragraph, {}, node.content)),\n 1,\n 1,\n );\n } else {\n const {complex} = node.type.spec;\n if (complex === 'root') {\n return new Slice(Fragment.from(node), 1, 1);\n } else if (complex === 'leaf') {\n return new Slice(Fragment.from(node.content), 1, 1);\n } else {\n // TODO: handle copy of intermediate complex block node\n }\n }\n } else {\n return new Slice(Fragment.from(node), 1, 1);\n }\n }\n\n if (isTextSelection(sel)) {\n sel = trimTextSelection(sel);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state, sel), 0, 0);\n }\n\n let slice = getSelectionContent(sel);\n\n // replace first node with paragraph if needed\n if (\n slice.content.firstChild?.isTextblock &&\n slice.content.firstChild.type.name !== BaseNode.Paragraph\n ) {\n let shouldTransformFirstChildToPara = true;\n const {firstChild} = slice.content;\n\n // if all text selected inside first node, don't replace it with paragraph\n if (firstChild.eq(sel.$from.parent)) {\n shouldTransformFirstChildToPara = false;\n }\n\n if (shouldTransformFirstChildToPara) {\n slice = new Slice(\n slice.content.replaceChild(\n 0,\n state.schema.node(BaseNode.Paragraph, {}, firstChild.content),\n ),\n slice.openStart,\n slice.openStart,\n );\n }\n } else {\n // trim empty list items\n const createEmptyParagraph = () => Fragment.from(pType(state.schema).createAndFill());\n const trimmedContent = trimContent(slice.content, createEmptyParagraph);\n if (trimmedContent !== slice.content) {\n slice = new Slice(trimmedContent, 1, 1);\n }\n }\n\n return slice;\n}\n\nfunction isTextSelectionWithinSameTextBlock(sel: Selection) {\n return isTextSelection(sel) && sel.$from.sameParent(sel.$to) && sel.$from.parent.isTextblock;\n}\n\nfunction createFragmentFromInlineSelection(state: EditorState, sel: Selection) {\n const inlineSlice = state.doc.slice(sel.from, sel.to);\n const isComplexTextblock = Boolean(sel.$from.parent.type.spec.complex);\n const isAllContentSelected = sel.$from.parent.content.eq(inlineSlice.content);\n if (isComplexTextblock || !isAllContentSelected) {\n // copy selected inline content to paragraph if current node is complex\n // or if only part of it's content was selected\n return Fragment.from(state.schema.node(BaseNode.Paragraph, {}, inlineSlice.content));\n }\n return Fragment.from(sel.$from.parent.copy(inlineSlice.content));\n}\n\n/**\n * Like `selection.content()`, but smarter.\n * Copy a structure of complex nodes,\n * e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text\n * it works well with simple nodes, but to handle cases as described above, custom logic needed\n */\nfunction getSelectionContent(sel: Selection) {\n const sharedNodeType = getSharedDepthNode(sel).type;\n const sharedNodeComplex = sharedNodeType.spec.complex;\n const includeParents = sharedNodeComplex && sharedNodeComplex !== 'leaf';\n return sel.$from.doc.slice(sel.$from.pos, sel.to, includeParents);\n}\n\nfunction getSharedDepthNode({$from, $to}: {$from: ResolvedPos; $to: ResolvedPos}): Node {\n return $from.node($from.sharedDepth($to.pos));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import {type Parser, type Serializer, trackTransactionMetrics} from '#core';\nimport {Fragment, type Node, type ResolvedPos, type Schema, Slice} from '#pm/model';\nimport {type EditorState, Plugin, type Selection} from '#pm/state';\nimport type {EditorView} from '#pm/view';\nimport {type Logger2, globalLogger} from 'src/logger';\nimport 'src/types/spec';\nimport {tryCatch} from 'src/utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from 'src/utils/selection';\n\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\nimport {getSelectionContent} from './selection-content';\nimport {trimTextSelection} from './trim-selection';\nimport {DataTransferType, extractTextContentFromHtml, isIosSafariShare, trimContent} from './utils';\n\nexport type ClipboardPluginOptions = {\n logger: Logger2.ILogger;\n mdParser: Parser;\n textParser: Parser;\n serializer: Serializer;\n pasteFileHandler?: (file: File) => void;\n};\n\nexport const clipboard = ({\n logger,\n textParser,\n mdParser,\n serializer,\n pasteFileHandler,\n}: ClipboardPluginOptions) => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n copy(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n return true;\n }\n return false;\n },\n cut(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n view.dispatch(\n view.state.tr\n .deleteSelection()\n .scrollIntoView()\n .setMeta('uiEvent', 'cut'),\n );\n return true;\n }\n return false;\n },\n paste(view, e) {\n if (!e.clipboardData) return false;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: e.clipboardData.types,\n });\n\n let data: string;\n let isPasteHandled = false;\n\n if (\n isIosSafariShare(e.clipboardData) &&\n (data = e.clipboardData.getData(DataTransferType.UriList))\n ) {\n const schema: Schema = view.state.schema;\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(\n // paste link inline\n new Slice(\n Fragment.from(\n pType(schema).create(null, schema.text(data)),\n ),\n 1,\n 1,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.UriList},\n ),\n );\n pasteLogger.event({\n event: 'paste-uri-list',\n });\n isPasteHandled = true;\n e.preventDefault();\n return true;\n }\n\n if (\n !e.clipboardData.types.includes(DataTransferType.Yfm) &&\n (data = e.clipboardData.getData(DataTransferType.Html))\n ) {\n const textFromHtml = extractTextContentFromHtml(data);\n if (textFromHtml) {\n const res = tryCatch(() => textParser.parse(textFromHtml));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: DataTransferType.Html},\n ),\n );\n pasteLogger.event({\n event: 'paste-parsed-html',\n });\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'parse-html',\n });\n console.error(res.error);\n }\n } else return false; // default html pasting\n }\n\n if (\n !isPasteHandled &&\n ((data = e.clipboardData.getData(DataTransferType.Yfm)) ||\n (data = e.clipboardData.getData(DataTransferType.Text)))\n ) {\n let parser: Parser;\n let dataFormat: string;\n if (e.clipboardData.types.includes(DataTransferType.Yfm)) {\n parser = mdParser;\n dataFormat = DataTransferType.Yfm;\n } else {\n parser = textParser;\n dataFormat = DataTransferType.Text;\n }\n const codeType = isInsideCode(view.state);\n if (codeType) {\n const schema: Schema = view.state.schema;\n const insideCodeData = e.clipboardData.getData(DataTransferType.Text);\n\n pasteLogger.event({\n event: 'paste-text-to-code',\n codeType,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelectionWith(\n schema.text(\n codeType === 'inline'\n ? insideCodeData.trim()\n : insideCodeData,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.Text, code: codeType},\n ),\n );\n isPasteHandled = true;\n } else {\n const res = tryCatch(() => parser.parse(data));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n pasteLogger.event({\n event: 'paste-parsed-content',\n dataFormat,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: dataFormat},\n ),\n );\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'paste',\n dataFormat,\n });\n console.error(res.error);\n }\n }\n }\n\n if (e.clipboardData.files.length && pasteFileHandler) {\n pasteLogger.event({\n event: 'paste-files',\n });\n for (const file of Array.from(e.clipboardData.files)) {\n pasteFileHandler(file);\n }\n isPasteHandled = true;\n }\n\n if (isPasteHandled) {\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n};\n\nfunction getSliceFromMarkupFragment(fragment: Fragment) {\n let start = 0;\n let end = 0;\n if (fragment.firstChild?.isTextblock) {\n start = 1;\n if (fragment.childCount === 1) {\n end = 1;\n }\n }\n return new Slice(fragment, start, end);\n}\n\ntype SerializeResult = {\n text: string;\n html?: string;\n markup?: string;\n};\nfunction serializeSelected(view: EditorView, serializer: Serializer): SerializeResult | null {\n const sel = view.state.selection;\n\n if (sel.empty) return null;\n\n // handle selection in codeblocks\n if (getSharedDepthNode(sel).type.spec.code) {\n const fragment = sel.content().content;\n return {text: fragment.textBetween(0, fragment.size)};\n }\n\n // FIXME: Verify and use Node instead of Fragment\n const markup = serializer.serialize(getCopyContent(view.state).content as any);\n const {dom, text} = view.serializeForClipboard(sel.content());\n return {markup, text, html: dom.innerHTML};\n}\n\nfunction setClipboardData(data: DataTransfer, result: SerializeResult) {\n data.clearData();\n if (typeof result.markup === 'string') data.setData(DataTransferType.Yfm, result.markup);\n if (typeof result.html === 'string') data.setData(DataTransferType.Html, result.html);\n data.setData(DataTransferType.Text, result.text);\n}\n\nfunction getCopyContent(state: EditorState): Slice {\n let sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isNodeSelection(sel)) {\n const {node} = sel;\n if (node.type.spec.complex) {\n if (node.isTextblock) {\n return new Slice(\n Fragment.from(state.schema.node(BaseNode.Paragraph, {}, node.content)),\n 1,\n 1,\n );\n } else {\n const {complex} = node.type.spec;\n if (complex === 'root') {\n return new Slice(Fragment.from(node), 1, 1);\n } else if (complex === 'leaf') {\n return new Slice(Fragment.from(node.content), 1, 1);\n } else {\n // TODO: handle copy of intermediate complex block node\n }\n }\n } else {\n return new Slice(Fragment.from(node), 1, 1);\n }\n }\n\n if (isTextSelection(sel)) {\n sel = trimTextSelection(sel);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state, sel), 0, 0);\n }\n\n let slice = getSelectionContent(sel);\n\n // replace first node with paragraph if needed\n if (\n slice.content.firstChild?.isTextblock &&\n slice.content.firstChild.type.name !== BaseNode.Paragraph\n ) {\n let shouldTransformFirstChildToPara = true;\n const {firstChild} = slice.content;\n\n // if all text selected inside first node, don't replace it with paragraph\n if (firstChild.eq(sel.$from.parent)) {\n shouldTransformFirstChildToPara = false;\n }\n\n if (shouldTransformFirstChildToPara) {\n slice = new Slice(\n slice.content.replaceChild(\n 0,\n state.schema.node(BaseNode.Paragraph, {}, firstChild.content),\n ),\n slice.openStart,\n slice.openStart,\n );\n }\n } else {\n // trim empty list items\n const createEmptyParagraph = () => Fragment.from(pType(state.schema).createAndFill());\n const trimmedContent = trimContent(slice.content, createEmptyParagraph);\n if (trimmedContent !== slice.content) {\n slice = new Slice(trimmedContent, 1, 1);\n }\n }\n\n return slice;\n}\n\nfunction isTextSelectionWithinSameTextBlock(sel: Selection) {\n return isTextSelection(sel) && sel.$from.sameParent(sel.$to) && sel.$from.parent.isTextblock;\n}\n\nfunction createFragmentFromInlineSelection(state: EditorState, sel: Selection) {\n const inlineSlice = state.doc.slice(sel.from, sel.to);\n const isComplexTextblock = Boolean(sel.$from.parent.type.spec.complex);\n const isAllContentSelected = sel.$from.parent.content.eq(inlineSlice.content);\n if (isComplexTextblock || !isAllContentSelected) {\n // copy selected inline content to paragraph if current node is complex\n // or if only part of it's content was selected\n return Fragment.from(state.schema.node(BaseNode.Paragraph, {}, inlineSlice.content));\n }\n return Fragment.from(sel.$from.parent.copy(inlineSlice.content));\n}\n\nfunction getSharedDepthNode({$from, $to}: {$from: ResolvedPos; $to: ResolvedPos}): Node {\n return $from.node($from.sharedDepth($to.pos));\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal
|
|
3
|
+
*
|
|
4
|
+
* Like `selection.content()`, but smarter.
|
|
5
|
+
* Copy a structure of complex nodes,
|
|
6
|
+
* e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text
|
|
7
|
+
* it works well with simple nodes, but to handle cases as described above, custom logic needed
|
|
8
|
+
*/
|
|
9
|
+
export function getSelectionContent(sel) {
|
|
10
|
+
const sharedDepth = sel.$from.sharedDepth(sel.$to.pos);
|
|
11
|
+
const sharedNode = sel.$from.node(sharedDepth);
|
|
12
|
+
const sharedNodeComplex = sharedNode.type.spec.complex;
|
|
13
|
+
if (sharedNodeComplex && sharedNodeComplex !== 'leaf') {
|
|
14
|
+
// Find the nearest ancestor with complex='root' to avoid
|
|
15
|
+
// wrapping copied content in outer containers (blockquote, table cell, etc.)
|
|
16
|
+
let rootDepth = sharedDepth;
|
|
17
|
+
for (let d = sharedDepth; d >= 0; d--) {
|
|
18
|
+
if (sel.$from.node(d).type.spec.complex === 'root') {
|
|
19
|
+
rootDepth = d;
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Slice from the parent of the root node so that the root node itself
|
|
24
|
+
// (e.g. bullet_list) is included in the slice, but its outer containers are not.
|
|
25
|
+
const parentDepth = Math.max(0, rootDepth - 1);
|
|
26
|
+
const parentNode = sel.$from.node(parentDepth);
|
|
27
|
+
const parentStart = sel.$from.start(parentDepth);
|
|
28
|
+
return parentNode.slice(sel.$from.pos - parentStart, sel.$to.pos - parentStart, true);
|
|
29
|
+
}
|
|
30
|
+
return sel.$from.doc.slice(sel.$from.pos, sel.to, false);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=selection-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-content.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/selection-content.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAc;IAC9C,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAEvD,IAAI,iBAAiB,IAAI,iBAAiB,KAAK,MAAM,EAAE,CAAC;QACpD,yDAAyD;QACzD,6EAA6E;QAC7E,IAAI,SAAS,GAAG,WAAW,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;gBACjD,SAAS,GAAG,CAAC,CAAC;gBACd,MAAM;YACV,CAAC;QACL,CAAC;QAED,sEAAsE;QACtE,iFAAiF;QACjF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjD,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,WAAW,EAAE,IAAI,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC","sourcesContent":["import type {Selection} from '#pm/state';\n\n/**\n * @internal\n *\n * Like `selection.content()`, but smarter.\n * Copy a structure of complex nodes,\n * e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text\n * it works well with simple nodes, but to handle cases as described above, custom logic needed\n */\nexport function getSelectionContent(sel: Selection) {\n const sharedDepth = sel.$from.sharedDepth(sel.$to.pos);\n const sharedNode = sel.$from.node(sharedDepth);\n const sharedNodeComplex = sharedNode.type.spec.complex;\n\n if (sharedNodeComplex && sharedNodeComplex !== 'leaf') {\n // Find the nearest ancestor with complex='root' to avoid\n // wrapping copied content in outer containers (blockquote, table cell, etc.)\n let rootDepth = sharedDepth;\n for (let d = sharedDepth; d >= 0; d--) {\n if (sel.$from.node(d).type.spec.complex === 'root') {\n rootDepth = d;\n break;\n }\n }\n\n // Slice from the parent of the root node so that the root node itself\n // (e.g. bullet_list) is included in the slice, but its outer containers are not.\n const parentDepth = Math.max(0, rootDepth - 1);\n const parentNode = sel.$from.node(parentDepth);\n const parentStart = sel.$from.start(parentDepth);\n return parentNode.slice(sel.$from.pos - parentStart, sel.$to.pos - parentStart, true);\n }\n\n return sel.$from.doc.slice(sel.$from.pos, sel.to, false);\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ResolvedPos } from 'prosemirror-model';
|
|
2
|
-
import type
|
|
2
|
+
import { type Command, type NodeSelection, TextSelection, type Transaction } from 'prosemirror-state';
|
|
3
3
|
import { GapCursorSelection } from "../Cursor/GapCursorSelection.js";
|
|
4
4
|
export type Direction = 'before' | 'after';
|
|
5
5
|
type TextSelectionFinder = (selection: TextSelection, dir: Direction) => ResolvedPos | null;
|
|
@@ -16,4 +16,5 @@ export declare const arrowDown: Command;
|
|
|
16
16
|
export declare const arrowUp: Command;
|
|
17
17
|
export declare const arrowRight: Command;
|
|
18
18
|
export declare const backspace: Command;
|
|
19
|
+
export declare const selectAll: Command;
|
|
19
20
|
export {};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Selection } from 'prosemirror-state';
|
|
2
|
-
import { isCodeBlock } from "../../../utils/nodes.js";
|
|
1
|
+
import { Selection, TextSelection as TextSel, TextSelection, } from 'prosemirror-state';
|
|
2
|
+
import { isCodeBlock, isNodeEmpty } from "../../../utils/nodes.js";
|
|
3
3
|
import { isNodeSelection, isTextSelection } from "../../../utils/selection.js";
|
|
4
4
|
import { GapCursorSelection, isGapCursorSelection } from "../Cursor/GapCursorSelection.js";
|
|
5
|
+
import { hideSelectionMenu } from "../SelectionContext/index.js";
|
|
5
6
|
const isUp = (dir) => dir === 'left' || dir === 'up';
|
|
6
7
|
function isTextblock(node) {
|
|
7
8
|
return node.isTextblock && !isCodeBlock(node);
|
|
@@ -143,4 +144,48 @@ export const backspace = (state, dispatch) => {
|
|
|
143
144
|
}
|
|
144
145
|
return false;
|
|
145
146
|
};
|
|
147
|
+
function hasContentToSelect(node) {
|
|
148
|
+
if (node.isTextblock)
|
|
149
|
+
return node.content.size > 0;
|
|
150
|
+
return !isNodeEmpty(node);
|
|
151
|
+
}
|
|
152
|
+
export const selectAll = (state, dispatch) => {
|
|
153
|
+
const { selection } = state;
|
|
154
|
+
const { $from, $to } = selection;
|
|
155
|
+
const sharedDepth = $from.sharedDepth($to.pos);
|
|
156
|
+
for (let depth = sharedDepth; depth > 0; depth--) {
|
|
157
|
+
const node = $from.node(depth);
|
|
158
|
+
const { spec } = node.type;
|
|
159
|
+
if (spec.selectAll === false)
|
|
160
|
+
continue;
|
|
161
|
+
let mode;
|
|
162
|
+
if (spec.selectAll)
|
|
163
|
+
mode = spec.selectAll;
|
|
164
|
+
else if (node.isTextblock || spec.code)
|
|
165
|
+
mode = 'content';
|
|
166
|
+
else
|
|
167
|
+
continue;
|
|
168
|
+
if (!hasContentToSelect(node))
|
|
169
|
+
continue;
|
|
170
|
+
if (mode === 'node') {
|
|
171
|
+
const selAroundNode = TextSelection.create(state.doc, $from.before(depth), $from.after(depth));
|
|
172
|
+
if (selection.from <= selAroundNode.from && selection.to >= selAroundNode.to)
|
|
173
|
+
continue;
|
|
174
|
+
dispatch?.(hideSelectionMenu(state.tr.setSelection(selAroundNode)));
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
const start = $from.start(depth);
|
|
178
|
+
const end = start + node.content.size;
|
|
179
|
+
const startCursor = Selection.findFrom(state.doc.resolve(start), 1);
|
|
180
|
+
const endCursor = Selection.findFrom(state.doc.resolve(end), -1);
|
|
181
|
+
if (startCursor &&
|
|
182
|
+
endCursor &&
|
|
183
|
+
selection.from <= startCursor.from &&
|
|
184
|
+
selection.to >= endCursor.to)
|
|
185
|
+
continue;
|
|
186
|
+
dispatch?.(state.tr.setSelection(TextSel.create(state.doc, start, end)));
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
return false;
|
|
190
|
+
};
|
|
146
191
|
//# sourceMappingURL=commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Selection/commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,WAAW,EAAC,gCAA6B;AACjD,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,oCAAiC;AAC1E,OAAO,EAAC,kBAAkB,EAAE,oBAAoB,EAAC,wCAAqC;AActF,MAAM,IAAI,GAAG,CAAC,GAAmB,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC;AAErE,SAAS,WAAW,CAAC,IAAU;IAC3B,OAAO,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,OAAoB,EAAE,GAAc;IACzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/C,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,KAAK,CAAC,CAAC;IACzC,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;IACrF,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,wCAAwC,GAA6B,CAAC,EAAC,IAAI,EAAC,EAAE,GAAG,EAAE,EAAE;IAC9F,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IACtE,OAAO,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAwB,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE;IACnF,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC;IACpC,IAAI,YAAY,CAAC,QAAQ,IAAI,WAAW,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpE,MAAM,EAAC,KAAK,EAAC,GAAG,SAAS,CAAC;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAChC,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnB,IAAI,UAAU,CAAC,UAAU,KAAK,YAAY,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACtF,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,SAAS,KAAK,YAAY,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,OAAO,SAAS,CAAC,GAAG,CAAC;QACzB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAAoB,EAAE,GAAc,EAAE,EAAE;IAChF,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/C,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnB,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAChC,CAAC;IACL,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,KAAK,KAAK,MAAM,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAwB,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE;IACnF,MAAM,OAAO,GAAG,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC;IACnE,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,IAAI,GAAG,2BAA2B,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvD,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAEtB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhD,OAAO,2BAA2B,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF,MAAM,UAAU,2BAA2B,CACvC,IAAiB,EACjB,KAAa,EACb,GAAc;IAEd,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAEpC,MAAM,YAAY,GAAG,KAAK,KAAK,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,KAAK,KAAK,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;QAEpD,MAAM,cAAc,GAChB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC;QAE5E,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;QAE/D,IAAI,cAAc,IAAI,iBAAiB,EAAE,CAAC;YACtC,IAAI,GAAG,KAAK,QAAQ,IAAI,YAAY;gBAAE,SAAS;YAC/C,IAAI,GAAG,KAAK,OAAO,IAAI,WAAW;gBAAE,SAAS;YAC7C,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnB,IAAI,YAAY,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAChD,CAAC;QACL,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,KAAK,GACP,CAAC,GAAmB,EAAW,EAAE,CACjC,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;IACtB,MAAM,EAAC,SAAS,EAAC,GAAG,KAAK,CAAC;IAC1B,MAAM,SAAS,GAAc,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5D,IAAI,IAAI,GAAuB,IAAI,CAAC;IAEpC,IAAI,oBAAoB,CAAgB,SAAS,CAAC,EAAE,CAAC;QACjD,IAAI,SAAS,CAAC,IAAI,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,6CAA6C;QAC7C,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,CAAC,GAAG,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,GAAG,KAAK,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5E,IAAI,GAAG,wCAAwC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,GAAG,+BAA+B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,eAAe,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,IAAI,GAAG,+BAA+B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEN,MAAM,UAAU,mBAAmB,CAC/B,EAAe,EACf,IAAiB,EACjB,SAAoB;IAEpB,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,kBAAkB,CAAgB,IAAI,EAAE,EAAC,IAAI,EAAE,EAAC,SAAS,EAAC,EAAC,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;AAEzC,MAAM,CAAC,MAAM,SAAS,GAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;IAClD,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;IAC5B,IAAI,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACT,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import type {Node, ResolvedPos} from 'prosemirror-model';\nimport type {Command, NodeSelection, TextSelection, Transaction} from 'prosemirror-state';\nimport {Selection} from 'prosemirror-state';\n\nimport {isCodeBlock} from '../../../utils/nodes';\nimport {isNodeSelection, isTextSelection} from '../../../utils/selection';\nimport {GapCursorSelection, isGapCursorSelection} from '../Cursor/GapCursorSelection';\n\nexport type Direction = 'before' | 'after';\ntype ArrowDirection = 'up' | 'right' | 'down' | 'left';\n\ntype TextSelectionFinder = (selection: TextSelection, dir: Direction) => ResolvedPos | null;\ntype NodeSelectionFinder = (selection: NodeSelection, dir: Direction) => ResolvedPos | null;\ntype GapCursorSelectionFinder = (\n selection: GapCursorSelection,\n dir: Direction,\n) => ResolvedPos | null;\n\ntype GapCursorMeta = {direction: Direction};\n\nconst isUp = (dir: ArrowDirection) => dir === 'left' || dir === 'up';\n\nfunction isTextblock(node: Node): boolean {\n return node.isTextblock && !isCodeBlock(node);\n}\n\nfunction isEdgeTextblock($cursor: ResolvedPos, dir: Direction): boolean {\n const index = $cursor.index($cursor.depth - 1);\n if (dir === 'before') return index === 0;\n if (dir === 'after') return index === $cursor.node($cursor.depth - 1).childCount - 1;\n return false;\n}\n\nexport const findNextFakeParaPosForGapCursorSelection: GapCursorSelectionFinder = ({$pos}, dir) => {\n if ($pos.pos !== $pos.start() && $pos.pos !== $pos.end()) return null;\n return findFakeParaPosClosestToPos($pos, $pos.depth, dir);\n};\n\nexport const findFakeParaPosForNodeSelection: NodeSelectionFinder = (selection, dir) => {\n const selectedNode = selection.node;\n if (selectedNode.isInline || isTextblock(selectedNode)) return null;\n\n const {$from} = selection;\n const index = $from.index();\n const parentNode = $from.parent;\n if (dir === 'before') {\n if (parentNode.firstChild === selectedNode || !isTextblock(parentNode.child(index - 1))) {\n return $from;\n }\n } else if (dir === 'after') {\n if (parentNode.lastChild === selectedNode || !isTextblock(parentNode.child(index + 1))) {\n return selection.$to;\n }\n }\n\n return null;\n};\n\nexport const findFakeParaPosForCodeBlock = ($cursor: ResolvedPos, dir: Direction) => {\n if (!isCodeBlock($cursor.parent)) return null;\n\n let foundPos = -1;\n const index = $cursor.index($cursor.depth - 1);\n const parent = $cursor.node($cursor.depth - 1);\n if (dir === 'before') {\n if (index === 0 || !isTextblock(parent.child(index - 1))) {\n foundPos = $cursor.before();\n }\n } else if (dir === 'after') {\n if (index === parent.childCount - 1 || !isTextblock(parent.child(index + 1))) {\n foundPos = $cursor.after();\n }\n }\n\n return foundPos !== -1 ? $cursor.doc.resolve(foundPos) : null;\n};\n\nexport const findFakeParaPosForTextSelection: TextSelectionFinder = (selection, dir) => {\n const $cursor = dir === 'before' ? selection.$from : selection.$to;\n if ($cursor.parent.isInline) return null;\n\n const $pos = findFakeParaPosForCodeBlock($cursor, dir);\n if ($pos) return $pos;\n\n if (!isEdgeTextblock($cursor, dir)) return null;\n\n return findFakeParaPosClosestToPos($cursor, $cursor.depth - 1, dir);\n};\n\nexport function findFakeParaPosClosestToPos(\n $pos: ResolvedPos,\n depth: number,\n dir: Direction,\n): ResolvedPos | null {\n depth++;\n while (--depth > 0) {\n const node = $pos.node(depth);\n const index = $pos.index(depth - 1);\n const parent = $pos.node(depth - 1);\n\n const isFirstChild = index === 0;\n const isLastChild = index === parent.childCount - 1;\n\n const isComplexChild =\n node.type.spec.complex === 'inner' || node.type.spec.complex === 'leaf';\n\n const disabledGapCursor = parent.type.spec.gapcursor === false;\n\n if (isComplexChild || disabledGapCursor) {\n if (dir === 'before' && isFirstChild) continue;\n if (dir === 'after' && isLastChild) continue;\n return null;\n }\n\n if (dir === 'before') {\n if (isFirstChild || !isTextblock(parent.child(index - 1))) {\n return $pos.doc.resolve($pos.before(depth));\n }\n } else if (dir === 'after') {\n if (isLastChild || !isTextblock(parent.child(index + 1))) {\n return $pos.doc.resolve($pos.after(depth));\n }\n }\n\n return null;\n }\n return null;\n}\n\nconst arrow =\n (dir: ArrowDirection): Command =>\n (state, dispatch, view) => {\n const {selection} = state;\n const direction: Direction = isUp(dir) ? 'before' : 'after';\n let $pos: ResolvedPos | null = null;\n\n if (isGapCursorSelection<GapCursorMeta>(selection)) {\n if (selection.meta?.direction !== direction) {\n return false;\n }\n\n // if gap selection is at start or end of doc\n if (dir === 'up' && selection.pos === 0) return true;\n if (dir === 'down' && selection.pos === state.doc.nodeSize - 2) return true;\n\n $pos = findNextFakeParaPosForGapCursorSelection(selection, direction);\n }\n\n if (isNodeSelection(selection)) {\n $pos = findFakeParaPosForNodeSelection(selection, direction);\n }\n\n if (isTextSelection(selection) && view?.endOfTextblock(dir)) {\n $pos = findFakeParaPosForTextSelection(selection, direction);\n }\n\n if ($pos) {\n dispatch?.(createFakeParagraph(state.tr, $pos, direction).scrollIntoView());\n return true;\n }\n\n return false;\n };\n\nexport function createFakeParagraph(\n tr: Transaction,\n $pos: ResolvedPos,\n direction: Direction,\n): Transaction {\n return tr.setSelection(new GapCursorSelection<GapCursorMeta>($pos, {meta: {direction}}));\n}\n\nexport const arrowLeft = arrow('left');\nexport const arrowDown = arrow('down');\nexport const arrowUp = arrow('up');\nexport const arrowRight = arrow('right');\n\nexport const backspace: Command = (state, dispatch) => {\n const sel = state.selection;\n if (isGapCursorSelection(sel)) {\n const newSel = Selection.findFrom(sel.$pos, -1);\n if (newSel) {\n dispatch?.(state.tr.setSelection(newSel).scrollIntoView());\n return true;\n }\n }\n return false;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Selection/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Node, ResolvedPos} from 'prosemirror-model';\nimport {\n type Command,\n type NodeSelection,\n Selection,\n TextSelection as TextSel,\n TextSelection,\n type Transaction,\n} from 'prosemirror-state';\n\nimport {isCodeBlock, isNodeEmpty} from '../../../utils/nodes';\nimport {isNodeSelection, isTextSelection} from '../../../utils/selection';\nimport {GapCursorSelection, isGapCursorSelection} from '../Cursor/GapCursorSelection';\nimport {hideSelectionMenu} from '../SelectionContext';\n\nexport type Direction = 'before' | 'after';\ntype ArrowDirection = 'up' | 'right' | 'down' | 'left';\n\ntype TextSelectionFinder = (selection: TextSelection, dir: Direction) => ResolvedPos | null;\ntype NodeSelectionFinder = (selection: NodeSelection, dir: Direction) => ResolvedPos | null;\ntype GapCursorSelectionFinder = (\n selection: GapCursorSelection,\n dir: Direction,\n) => ResolvedPos | null;\n\ntype GapCursorMeta = {direction: Direction};\n\nconst isUp = (dir: ArrowDirection) => dir === 'left' || dir === 'up';\n\nfunction isTextblock(node: Node): boolean {\n return node.isTextblock && !isCodeBlock(node);\n}\n\nfunction isEdgeTextblock($cursor: ResolvedPos, dir: Direction): boolean {\n const index = $cursor.index($cursor.depth - 1);\n if (dir === 'before') return index === 0;\n if (dir === 'after') return index === $cursor.node($cursor.depth - 1).childCount - 1;\n return false;\n}\n\nexport const findNextFakeParaPosForGapCursorSelection: GapCursorSelectionFinder = ({$pos}, dir) => {\n if ($pos.pos !== $pos.start() && $pos.pos !== $pos.end()) return null;\n return findFakeParaPosClosestToPos($pos, $pos.depth, dir);\n};\n\nexport const findFakeParaPosForNodeSelection: NodeSelectionFinder = (selection, dir) => {\n const selectedNode = selection.node;\n if (selectedNode.isInline || isTextblock(selectedNode)) return null;\n\n const {$from} = selection;\n const index = $from.index();\n const parentNode = $from.parent;\n if (dir === 'before') {\n if (parentNode.firstChild === selectedNode || !isTextblock(parentNode.child(index - 1))) {\n return $from;\n }\n } else if (dir === 'after') {\n if (parentNode.lastChild === selectedNode || !isTextblock(parentNode.child(index + 1))) {\n return selection.$to;\n }\n }\n\n return null;\n};\n\nexport const findFakeParaPosForCodeBlock = ($cursor: ResolvedPos, dir: Direction) => {\n if (!isCodeBlock($cursor.parent)) return null;\n\n let foundPos = -1;\n const index = $cursor.index($cursor.depth - 1);\n const parent = $cursor.node($cursor.depth - 1);\n if (dir === 'before') {\n if (index === 0 || !isTextblock(parent.child(index - 1))) {\n foundPos = $cursor.before();\n }\n } else if (dir === 'after') {\n if (index === parent.childCount - 1 || !isTextblock(parent.child(index + 1))) {\n foundPos = $cursor.after();\n }\n }\n\n return foundPos !== -1 ? $cursor.doc.resolve(foundPos) : null;\n};\n\nexport const findFakeParaPosForTextSelection: TextSelectionFinder = (selection, dir) => {\n const $cursor = dir === 'before' ? selection.$from : selection.$to;\n if ($cursor.parent.isInline) return null;\n\n const $pos = findFakeParaPosForCodeBlock($cursor, dir);\n if ($pos) return $pos;\n\n if (!isEdgeTextblock($cursor, dir)) return null;\n\n return findFakeParaPosClosestToPos($cursor, $cursor.depth - 1, dir);\n};\n\nexport function findFakeParaPosClosestToPos(\n $pos: ResolvedPos,\n depth: number,\n dir: Direction,\n): ResolvedPos | null {\n depth++;\n while (--depth > 0) {\n const node = $pos.node(depth);\n const index = $pos.index(depth - 1);\n const parent = $pos.node(depth - 1);\n\n const isFirstChild = index === 0;\n const isLastChild = index === parent.childCount - 1;\n\n const isComplexChild =\n node.type.spec.complex === 'inner' || node.type.spec.complex === 'leaf';\n\n const disabledGapCursor = parent.type.spec.gapcursor === false;\n\n if (isComplexChild || disabledGapCursor) {\n if (dir === 'before' && isFirstChild) continue;\n if (dir === 'after' && isLastChild) continue;\n return null;\n }\n\n if (dir === 'before') {\n if (isFirstChild || !isTextblock(parent.child(index - 1))) {\n return $pos.doc.resolve($pos.before(depth));\n }\n } else if (dir === 'after') {\n if (isLastChild || !isTextblock(parent.child(index + 1))) {\n return $pos.doc.resolve($pos.after(depth));\n }\n }\n\n return null;\n }\n return null;\n}\n\nconst arrow =\n (dir: ArrowDirection): Command =>\n (state, dispatch, view) => {\n const {selection} = state;\n const direction: Direction = isUp(dir) ? 'before' : 'after';\n let $pos: ResolvedPos | null = null;\n\n if (isGapCursorSelection<GapCursorMeta>(selection)) {\n if (selection.meta?.direction !== direction) {\n return false;\n }\n\n // if gap selection is at start or end of doc\n if (dir === 'up' && selection.pos === 0) return true;\n if (dir === 'down' && selection.pos === state.doc.nodeSize - 2) return true;\n\n $pos = findNextFakeParaPosForGapCursorSelection(selection, direction);\n }\n\n if (isNodeSelection(selection)) {\n $pos = findFakeParaPosForNodeSelection(selection, direction);\n }\n\n if (isTextSelection(selection) && view?.endOfTextblock(dir)) {\n $pos = findFakeParaPosForTextSelection(selection, direction);\n }\n\n if ($pos) {\n dispatch?.(createFakeParagraph(state.tr, $pos, direction).scrollIntoView());\n return true;\n }\n\n return false;\n };\n\nexport function createFakeParagraph(\n tr: Transaction,\n $pos: ResolvedPos,\n direction: Direction,\n): Transaction {\n return tr.setSelection(new GapCursorSelection<GapCursorMeta>($pos, {meta: {direction}}));\n}\n\nexport const arrowLeft = arrow('left');\nexport const arrowDown = arrow('down');\nexport const arrowUp = arrow('up');\nexport const arrowRight = arrow('right');\n\nexport const backspace: Command = (state, dispatch) => {\n const sel = state.selection;\n if (isGapCursorSelection(sel)) {\n const newSel = Selection.findFrom(sel.$pos, -1);\n if (newSel) {\n dispatch?.(state.tr.setSelection(newSel).scrollIntoView());\n return true;\n }\n }\n return false;\n};\n\nfunction hasContentToSelect(node: Node): boolean {\n if (node.isTextblock) return node.content.size > 0;\n return !isNodeEmpty(node);\n}\n\nexport const selectAll: Command = (state, dispatch) => {\n const {selection} = state;\n const {$from, $to} = selection;\n const sharedDepth = $from.sharedDepth($to.pos);\n\n for (let depth = sharedDepth; depth > 0; depth--) {\n const node = $from.node(depth);\n const {spec} = node.type;\n\n if (spec.selectAll === false) continue;\n\n let mode: 'content' | 'node';\n if (spec.selectAll) mode = spec.selectAll;\n else if (node.isTextblock || spec.code) mode = 'content';\n else continue;\n\n if (!hasContentToSelect(node)) continue;\n\n if (mode === 'node') {\n const selAroundNode = TextSelection.create(\n state.doc,\n $from.before(depth),\n $from.after(depth),\n );\n\n if (selection.from <= selAroundNode.from && selection.to >= selAroundNode.to) continue;\n\n dispatch?.(hideSelectionMenu(state.tr.setSelection(selAroundNode)));\n return true;\n }\n\n const start = $from.start(depth);\n const end = start + node.content.size;\n\n const startCursor = Selection.findFrom(state.doc.resolve(start), 1);\n const endCursor = Selection.findFrom(state.doc.resolve(end), -1);\n\n if (\n startCursor &&\n endCursor &&\n selection.from <= startCursor.from &&\n selection.to >= endCursor.to\n )\n continue;\n\n dispatch?.(state.tr.setSelection(TextSel.create(state.doc, start, end)));\n return true;\n }\n\n return false;\n};\n"]}
|
|
@@ -3,6 +3,21 @@ import "./selection.css";
|
|
|
3
3
|
export declare const selection: () => Plugin<any>;
|
|
4
4
|
declare module 'prosemirror-model' {
|
|
5
5
|
interface NodeSpec {
|
|
6
|
+
/**
|
|
7
|
+
* Whether clicking directly on this node creates a NodeSelection for it.
|
|
8
|
+
* Typically `true` for root complex nodes (tables, cuts, notes)
|
|
9
|
+
* and `false` for their inner parts and leaf elements.
|
|
10
|
+
*/
|
|
6
11
|
allowSelection?: boolean | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Controls how this node participates in hierarchical select-all (Cmd+A / Ctrl+A).
|
|
14
|
+
* Each press of select-all walks up the node tree and selects the nearest matching ancestor.
|
|
15
|
+
*
|
|
16
|
+
* - `'content'` — select the node's content (TextSelection over inner content range)
|
|
17
|
+
* - `'node'` — select the node itself (NodeSelection)
|
|
18
|
+
* - `false` — skip this node during select-all traversal
|
|
19
|
+
* - `undefined` — default: textblocks and code nodes select their content, others are skipped
|
|
20
|
+
*/
|
|
21
|
+
selectAll?: false | 'node' | 'content' | undefined;
|
|
7
22
|
}
|
|
8
23
|
}
|
|
@@ -4,7 +4,7 @@ import { AllSelection, NodeSelection, Plugin, TextSelection, } from 'prosemirror
|
|
|
4
4
|
import { Decoration, DecorationSet } from 'prosemirror-view';
|
|
5
5
|
import { isSelectableNode } from "../../../utils/nodes.js";
|
|
6
6
|
import { isNodeSelection } from "../../../utils/selection.js";
|
|
7
|
-
import { arrowDown, arrowLeft, arrowRight, arrowUp, backspace } from "./commands.js";
|
|
7
|
+
import { arrowDown, arrowLeft, arrowRight, arrowUp, backspace, selectAll } from "./commands.js";
|
|
8
8
|
import "./selection.css";
|
|
9
9
|
export const selection = () => new Plugin({
|
|
10
10
|
props: {
|
|
@@ -14,6 +14,7 @@ export const selection = () => new Plugin({
|
|
|
14
14
|
ArrowUp: arrowUp,
|
|
15
15
|
ArrowDown: arrowDown,
|
|
16
16
|
Backspace: backspace,
|
|
17
|
+
'Mod-a': selectAll,
|
|
17
18
|
}),
|
|
18
19
|
decorations(state) {
|
|
19
20
|
return getDecorations(state.tr);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Selection/selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAElD,OAAO,EACH,YAAY,EAEZ,aAAa,EACb,MAAM,EAEN,aAAa,GAEhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,UAAU,EAAE,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAE5E,OAAO,EAAC,gBAAgB,EAAC,gCAA6B;AACtD,OAAO,EAAC,eAAe,EAAC,oCAAiC;AAEzD,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAC,sBAAmB;
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Selection/selection.ts"],"names":[],"mappings":"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","sourcesContent":["import {selectParentNode} from 'prosemirror-commands';\nimport {keydownHandler} from 'prosemirror-keymap';\nimport type {Node} from 'prosemirror-model';\nimport {\n AllSelection,\n type Command,\n NodeSelection,\n Plugin,\n type Selection,\n TextSelection,\n type Transaction,\n} from 'prosemirror-state';\nimport {Decoration, DecorationSet, type EditorView} from 'prosemirror-view';\n\nimport {isSelectableNode} from '../../../utils/nodes';\nimport {isNodeSelection} from '../../../utils/selection';\n\nimport {arrowDown, arrowLeft, arrowRight, arrowUp, backspace, selectAll} from './commands';\n\nimport './selection.scss';\n\nexport const selection = () =>\n new Plugin({\n props: {\n handleKeyDown: keydownHandler({\n ArrowLeft: arrowLeft,\n ArrowRight: arrowRight,\n ArrowUp: arrowUp,\n ArrowDown: arrowDown,\n Backspace: backspace,\n 'Mod-a': selectAll,\n }),\n decorations(state) {\n return getDecorations(state.tr);\n },\n handleClickOn(view, _pos, node, nodePos, _event, direct) {\n if (direct && node.type.spec.allowSelection) {\n return selectNode(nodePos)(view.state, view.dispatch);\n }\n\n return false;\n },\n },\n view(view) {\n reselect(view);\n return {\n update(view) {\n reselect(view);\n },\n };\n },\n });\n\ndeclare module 'prosemirror-model' {\n interface NodeSpec {\n /**\n * Whether clicking directly on this node creates a NodeSelection for it.\n * Typically `true` for root complex nodes (tables, cuts, notes)\n * and `false` for their inner parts and leaf elements.\n */\n allowSelection?: boolean | undefined;\n /**\n * Controls how this node participates in hierarchical select-all (Cmd+A / Ctrl+A).\n * Each press of select-all walks up the node tree and selects the nearest matching ancestor.\n *\n * - `'content'` — select the node's content (TextSelection over inner content range)\n * - `'node'` — select the node itself (NodeSelection)\n * - `false` — skip this node during select-all traversal\n * - `undefined` — default: textblocks and code nodes select their content, others are skipped\n */\n selectAll?: false | 'node' | 'content' | undefined;\n }\n}\n\nconst reselect = (view: EditorView) => {\n const {selection: sel} = view.state;\n if (!sel.empty && isNodeSelection(sel) && !isSelectableNode(sel.node)) {\n return selectParentNode(view.state, view.dispatch);\n }\n return false;\n};\n\nconst selectNode =\n (pos: number): Command =>\n (state, dispatch) => {\n if (dispatch) {\n dispatch(state.tr.setSelection(new NodeSelection(state.doc.resolve(pos))));\n }\n return true;\n };\n\nconst getDecorations = (tr: Transaction): DecorationSet => {\n if (tr.selection instanceof NodeSelection) {\n return DecorationSet.create(tr.doc, [\n Decoration.node(tr.selection.from, tr.selection.to, {\n class: 'pm-node-selected',\n }),\n ]);\n }\n\n if (tr.selection instanceof TextSelection || tr.selection instanceof AllSelection) {\n const decorations = getTopLevelNodesFromSelection(tr.selection, tr.doc).map(\n ({node, pos}) => {\n return Decoration.node(pos, pos + node.nodeSize, {\n class: 'pm-node-selected',\n });\n },\n );\n return DecorationSet.create(tr.doc, decorations);\n }\n return DecorationSet.empty;\n};\n\nconst getTopLevelNodesFromSelection = (selection: Selection, doc: Node) => {\n const nodes: {node: Node; pos: number}[] = [];\n if (selection.from !== selection.to) {\n const {from, to} = selection;\n\n doc.nodesBetween(from, to, (node, pos) => {\n const withinSelection = from <= pos && pos + node.nodeSize <= to;\n\n if (node && !node.isText && node.type.spec.selectable !== false && withinSelection) {\n nodes.push({node, pos});\n\n return false;\n }\n\n return true;\n });\n }\n return nodes;\n};\n"]}
|
|
@@ -43,6 +43,9 @@ export class TooltipView {
|
|
|
43
43
|
}
|
|
44
44
|
hide(view) {
|
|
45
45
|
this.view = view;
|
|
46
|
+
// do not rerender popup if it is already hidden
|
|
47
|
+
if (!this.#isTooltipOpen && !this.baseProps.show)
|
|
48
|
+
return;
|
|
46
49
|
this.#isTooltipOpen = false;
|
|
47
50
|
this.baseProps = { show: false, poppupProps: {} };
|
|
48
51
|
this.renderPopup();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {VirtualElement} from '@floating-ui/react';\nimport {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {EditorState} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {Toolbar} from '../../../toolbar';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarProps,\n ToolbarSingleItemData,\n} from '../../../toolbar';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\ntype SelectionTooltipBaseProps = {\n show?: boolean;\n poppupProps: PopupProps;\n};\ntype SelectionTooltipProps = SelectionTooltipBaseProps & ToolbarProps<ActionStorage>;\n\nconst SelectionTooltip: React.FC<SelectionTooltipProps> = ({\n show,\n poppupProps,\n ...toolbarProps\n}) => {\n if (!show) return null;\n return (\n <Popup open {...poppupProps} style={{padding: '4px 8px'}}>\n <Toolbar {...toolbarProps} />\n </Popup>\n );\n};\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n\nexport type TooltipViewParams = {\n /** @default 'bottom' */\n placement?: 'top' | 'bottom';\n /** @default false */\n flip?: boolean;\n};\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private readonly logger: Logger2.ILogger;\n private readonly actions: ActionStorage;\n private readonly menuConfig: ContextConfig;\n private readonly placement: PopupPlacement;\n\n private view!: EditorView;\n private baseProps: SelectionTooltipBaseProps = {show: false, poppupProps: {}};\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n params: TooltipViewParams,\n ) {\n this.logger = logger;\n this.actions = actions;\n this.menuConfig = menuConfig;\n\n const {flip, placement = 'bottom'} = params;\n this.placement = flip ? placement : [placement];\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView, popupProps?: PopupProps) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.baseProps = {\n show: true,\n poppupProps: {\n ...popupProps,\n ...this.calcPosition(view),\n },\n };\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n this.#isTooltipOpen = false;\n this.baseProps = {show: false, poppupProps: {}};\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private getSelectionTooltipProps(): SelectionTooltipProps {\n return {\n ...this.baseProps,\n qa: 'g-md-toolbar-selection',\n focus: () => this.view.focus(),\n data: this.getFilteredConfig(),\n editor: this.actions,\n onClick: (id) => {\n globalLogger.action({mode: 'wysiwyg', source: 'context-menu', action: id});\n this.logger.action({source: 'context-menu', action: id});\n },\n };\n }\n\n private getFilteredConfig(): ContextConfig {\n return this.baseProps.show\n ? this.menuConfig\n .map((groupData) =>\n groupData.filter((item) => {\n const {condition} = item;\n if (condition === 'enabled') {\n return item.isEnable(this.actions);\n }\n if (isFunction(condition)) {\n return condition(this.view.state);\n }\n return true;\n }),\n )\n .filter((groupData) => Boolean(groupData.length))\n : [];\n }\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltip {...this.getSelectionTooltipProps()} />\n </ErrorLoggerBoundary>\n ));\n }\n return this._tooltipRenderItem;\n }\n\n private calcPosition(view: EditorView): PopupProps {\n const virtualElem: VirtualElement = {\n getBoundingClientRect() {\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const yCenter = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const top = start.top;\n const left = yCenter - 1;\n const width = 2;\n const height = end.bottom - start.top;\n\n return {\n top,\n left,\n right: left + width,\n bottom: top + height,\n y: top,\n x: left,\n height,\n width,\n };\n },\n };\n\n return {\n placement: this.placement,\n anchorElement: virtualElem,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {VirtualElement} from '@floating-ui/react';\nimport {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {EditorState} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {Toolbar} from '../../../toolbar';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarProps,\n ToolbarSingleItemData,\n} from '../../../toolbar';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\ntype SelectionTooltipBaseProps = {\n show?: boolean;\n poppupProps: PopupProps;\n};\ntype SelectionTooltipProps = SelectionTooltipBaseProps & ToolbarProps<ActionStorage>;\n\nconst SelectionTooltip: React.FC<SelectionTooltipProps> = ({\n show,\n poppupProps,\n ...toolbarProps\n}) => {\n if (!show) return null;\n return (\n <Popup open {...poppupProps} style={{padding: '4px 8px'}}>\n <Toolbar {...toolbarProps} />\n </Popup>\n );\n};\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n\nexport type TooltipViewParams = {\n /** @default 'bottom' */\n placement?: 'top' | 'bottom';\n /** @default false */\n flip?: boolean;\n};\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private readonly logger: Logger2.ILogger;\n private readonly actions: ActionStorage;\n private readonly menuConfig: ContextConfig;\n private readonly placement: PopupPlacement;\n\n private view!: EditorView;\n private baseProps: SelectionTooltipBaseProps = {show: false, poppupProps: {}};\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n params: TooltipViewParams,\n ) {\n this.logger = logger;\n this.actions = actions;\n this.menuConfig = menuConfig;\n\n const {flip, placement = 'bottom'} = params;\n this.placement = flip ? placement : [placement];\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView, popupProps?: PopupProps) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.baseProps = {\n show: true,\n poppupProps: {\n ...popupProps,\n ...this.calcPosition(view),\n },\n };\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n\n // do not rerender popup if it is already hidden\n if (!this.#isTooltipOpen && !this.baseProps.show) return;\n\n this.#isTooltipOpen = false;\n this.baseProps = {show: false, poppupProps: {}};\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private getSelectionTooltipProps(): SelectionTooltipProps {\n return {\n ...this.baseProps,\n qa: 'g-md-toolbar-selection',\n focus: () => this.view.focus(),\n data: this.getFilteredConfig(),\n editor: this.actions,\n onClick: (id) => {\n globalLogger.action({mode: 'wysiwyg', source: 'context-menu', action: id});\n this.logger.action({source: 'context-menu', action: id});\n },\n };\n }\n\n private getFilteredConfig(): ContextConfig {\n return this.baseProps.show\n ? this.menuConfig\n .map((groupData) =>\n groupData.filter((item) => {\n const {condition} = item;\n if (condition === 'enabled') {\n return item.isEnable(this.actions);\n }\n if (isFunction(condition)) {\n return condition(this.view.state);\n }\n return true;\n }),\n )\n .filter((groupData) => Boolean(groupData.length))\n : [];\n }\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltip {...this.getSelectionTooltipProps()} />\n </ErrorLoggerBoundary>\n ));\n }\n return this._tooltipRenderItem;\n }\n\n private calcPosition(view: EditorView): PopupProps {\n const virtualElem: VirtualElement = {\n getBoundingClientRect() {\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const yCenter = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const top = start.top;\n const left = yCenter - 1;\n const width = 2;\n const height = end.bottom - start.top;\n\n return {\n top,\n left,\n right: left + width,\n bottom: top + height,\n y: top,\n x: left,\n height,\n width,\n };\n },\n };\n\n return {\n placement: this.placement,\n anchorElement: virtualElem,\n };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Blockquote/BlockquoteSpecs/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,eAAe,EAAC,oCAAiC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC;AAC/C,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC,kBAAkB,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,kBAAkB,CAAC;AAEtF,MAAM,CAAC,MAAM,eAAe,GAAkB,CAAC,OAAO,EAAE,EAAE;IACtD,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;QACvC,IAAI,EAAE;YACF,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,YAAY,EAAC,CAAC;YAC/B,KAAK;gBACD,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC;YACD,UAAU,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Blockquote/BlockquoteSpecs/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,eAAe,EAAC,oCAAiC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC;AAC/C,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC,kBAAkB,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,kBAAkB,CAAC;AAEtF,MAAM,CAAC,MAAM,eAAe,GAAkB,CAAC,OAAO,EAAE,EAAE;IACtD,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;QACvC,IAAI,EAAE;YACF,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,YAAY,EAAC,CAAC;YAC/B,KAAK;gBACD,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC;YACD,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,MAAM;SACpB;QACD,MAAM,EAAE,EAAC,SAAS,EAAE,EAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAC,EAAC;QAC9D,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,CAAC;KACJ,CAAC,CAAC,CAAC;AACR,CAAC,CAAC","sourcesContent":["import type {Node} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {nodeTypeFactory} from '../../../../utils/schema';\n\nexport const blockquoteNodeName = 'blockquote';\nexport const blockquoteType = nodeTypeFactory(blockquoteNodeName);\nexport const isBlockqouteNode = (node: Node) => node.type.name === blockquoteNodeName;\n\nexport const BlockquoteSpecs: ExtensionAuto = (builder) => {\n builder.addNode(blockquoteNodeName, () => ({\n spec: {\n content: 'block+',\n group: 'block',\n defining: true,\n parseDOM: [{tag: 'blockquote'}],\n toDOM() {\n return ['blockquote', 0];\n },\n selectable: true,\n selectAll: 'node',\n },\n fromMd: {tokenSpec: {name: blockquoteNodeName, type: 'block'}},\n toMd: (state, node) => {\n state.wrapBlock('> ', null, node, () => state.renderContent(node));\n },\n }));\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { toggleMark } from 'prosemirror-commands';
|
|
2
|
-
import {
|
|
2
|
+
import { createMarkdownInlineMarkAction } from "../../../utils/actions.js";
|
|
3
3
|
import { markInputRule } from "../../../utils/inputrules.js";
|
|
4
4
|
import { withLogAction } from "../../../utils/keymap.js";
|
|
5
5
|
import { BoldSpecs, boldType } from "./BoldSpecs/index.js";
|
|
@@ -7,7 +7,7 @@ export { boldMarkName, boldType } from "./BoldSpecs/index.js";
|
|
|
7
7
|
const bAction = 'bold';
|
|
8
8
|
export const Bold = (builder, opts) => {
|
|
9
9
|
builder.use(BoldSpecs);
|
|
10
|
-
builder.addAction(bAction, ({ schema }) =>
|
|
10
|
+
builder.addAction(bAction, ({ schema }) => createMarkdownInlineMarkAction(boldType(schema)));
|
|
11
11
|
if (opts?.boldKey) {
|
|
12
12
|
const { boldKey } = opts;
|
|
13
13
|
builder.addKeymap(({ schema }) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Bold/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Bold/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAC,8BAA8B,EAAC,kCAA+B;AACtE,OAAO,EAAC,aAAa,EAAC,qCAAkC;AACxD,OAAO,EAAC,aAAa,EAAC,iCAA8B;AAEpD,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,6BAAoB;AAEhD,OAAO,EAAC,YAAY,EAAE,QAAQ,EAAC,6BAAoB;AACnD,MAAM,OAAO,GAAG,MAAM,CAAC;AAMvB,MAAM,CAAC,MAAM,IAAI,GAA+B,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC9D,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,8BAA8B,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE3F,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAChB,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;YAC7B,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;SACjE,CAAC,CAAC,CAAC;IACR,CAAC;IAED,OAAO,CAAC,aAAa,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;QACjC,KAAK,EAAE;YACH,aAAa,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9E,aAAa,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;SACjF;KACJ,CAAC,CAAC,CAAC;AACR,CAAC,CAAC","sourcesContent":["import {toggleMark} from 'prosemirror-commands';\n\nimport type {Action, ExtensionAuto} from '../../../core';\nimport {createMarkdownInlineMarkAction} from '../../../utils/actions';\nimport {markInputRule} from '../../../utils/inputrules';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {BoldSpecs, boldType} from './BoldSpecs';\n\nexport {boldMarkName, boldType} from './BoldSpecs';\nconst bAction = 'bold';\n\nexport type BoldOptions = {\n boldKey?: string | null;\n};\n\nexport const Bold: ExtensionAuto<BoldOptions> = (builder, opts) => {\n builder.use(BoldSpecs);\n builder.addAction(bAction, ({schema}) => createMarkdownInlineMarkAction(boldType(schema)));\n\n if (opts?.boldKey) {\n const {boldKey} = opts;\n builder.addKeymap(({schema}) => ({\n [boldKey]: withLogAction('bold', toggleMark(boldType(schema))),\n }));\n }\n\n builder.addInputRules(({schema}) => ({\n rules: [\n markInputRule({open: '**', close: '**', ignoreBetween: '*'}, boldType(schema)),\n markInputRule({open: '__', close: '__', ignoreBetween: '_'}, boldType(schema)),\n ],\n }));\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [bAction]: Action;\n }\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import codemark from 'prosemirror-codemark';
|
|
2
2
|
import { toggleMark } from 'prosemirror-commands';
|
|
3
3
|
import { Plugin } from 'prosemirror-state';
|
|
4
|
-
import {
|
|
4
|
+
import { createMarkdownInlineMarkAction } from "../../../utils/actions.js";
|
|
5
5
|
import { withLogAction } from "../../../utils/keymap.js";
|
|
6
6
|
import { CodeSpecs, codeType } from "./CodeSpecs/index.js";
|
|
7
7
|
import "./code.css";
|
|
@@ -9,7 +9,7 @@ export { codeMarkName, codeType } from "./CodeSpecs/index.js";
|
|
|
9
9
|
const codeAction = 'code';
|
|
10
10
|
export const Code = (builder, opts) => {
|
|
11
11
|
builder.use(CodeSpecs);
|
|
12
|
-
builder.addAction(codeAction, ({ schema }) =>
|
|
12
|
+
builder.addAction(codeAction, ({ schema }) => createMarkdownInlineMarkAction(codeType(schema)));
|
|
13
13
|
if (opts?.codeKey) {
|
|
14
14
|
const { codeKey } = opts;
|
|
15
15
|
builder.addKeymap(({ schema }) => ({
|