@gravity-ui/markdown-editor 15.36.0 → 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/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/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
- package/build/cjs/extensions/markdown/Blockquote/BlockquoteSpecs/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 +17 -75
- 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/Deflist/DeflistSpecs/schema.js +2 -0
- package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/schema.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/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/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- 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/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
- package/build/esm/extensions/markdown/Blockquote/BlockquoteSpecs/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 +17 -75
- 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/Deflist/DeflistSpecs/schema.js +2 -0
- package/build/esm/extensions/markdown/Deflist/DeflistSpecs/schema.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/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/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
package/README.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+

|
|
2
|
+
|
|
3
|
+
# @gravity-ui/markdown-editor · [](https://www.npmjs.com/package/@gravity-ui/markdown-editor) [](https://github.com/gravity-ui/markdown-editor/actions/workflows/ci.yml?query=branch:main) [](https://github.com/gravity-ui/markdown-editor/actions/workflows/release.yml?query=branch:main) [](https://preview.gravity-ui.com/md-editor/)
|
|
4
|
+
|
|
5
|
+
## Markdown wysiwyg and markup editor
|
|
6
|
+
|
|
7
|
+
MarkdownEditor is a powerful tool for working with Markdown, which combines WYSIWYG and Markup modes. This means that you can create and edit content in a convenient visual mode, as well as have full control over the markup.
|
|
8
|
+
|
|
9
|
+
### 🔧 Main features
|
|
10
|
+
|
|
11
|
+
- Support for the basic Markdown and [YFM](https://ydocs.tech) syntax.
|
|
12
|
+
- Extensibility through the use of ProseMirror and CodeMirror engines.
|
|
13
|
+
- The ability to work in WYSIWYG and Markup modes for maximum flexibility.
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```shell
|
|
18
|
+
npm install @gravity-ui/markdown-editor
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Required dependencies
|
|
22
|
+
|
|
23
|
+
Please note that to start using the package, your project must also have the following installed: `@diplodoc/transform`, `react`, `react-dom`, `@gravity-ui/uikit`, `@gravity-ui/components` and some others. Check out the `peerDependencies` section of `package.json` for accurate information.
|
|
24
|
+
|
|
25
|
+
## Getting started
|
|
26
|
+
|
|
27
|
+
The markdown editor is supplied as a React hook to create an instance of editor and a component for rendering the view.\
|
|
28
|
+
To set up styling and theme see [UIKit docs](https://github.com/gravity-ui/uikit?tab=readme-ov-file#styles).
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
import React from 'react';
|
|
32
|
+
import {useMarkdownEditor, MarkdownEditorView} from '@gravity-ui/markdown-editor';
|
|
33
|
+
|
|
34
|
+
function Editor({onSubmit}) {
|
|
35
|
+
const editor = useMarkdownEditor({allowHTML: false});
|
|
36
|
+
|
|
37
|
+
React.useEffect(() => {
|
|
38
|
+
function submitHandler() {
|
|
39
|
+
// Serialize current content to markdown markup
|
|
40
|
+
const value = editor.getValue();
|
|
41
|
+
onSubmit(value);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
editor.on('submit', submitHandler);
|
|
45
|
+
return () => {
|
|
46
|
+
editor.off('submit', submitHandler);
|
|
47
|
+
};
|
|
48
|
+
}, [onSubmit]);
|
|
49
|
+
|
|
50
|
+
return <MarkdownEditorView stickyToolbar autofocus editor={editor} />;
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
Read more:
|
|
54
|
+
- [How to connect the editor in the Create React App](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-getting-started-create-react-app--docs)
|
|
55
|
+
- [How to add preview for markup mode](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-getting-started-preview--docs)
|
|
56
|
+
- [How to add HTML extension](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-extensions-html-block--docs)
|
|
57
|
+
- [How to add Latex extension](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-extensions-latex-extension--docs)
|
|
58
|
+
- [How to add Mermaid extension](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-extensions-mermaid-extension--docs)
|
|
59
|
+
- [How to write extension](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-develop-extension-creation--docs)
|
|
60
|
+
- [How to add GPT extension](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-extensions-gpt--docs)
|
|
61
|
+
- [How to add text binding extension in markdown](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-develop-extension-with-popup--docs)
|
|
62
|
+
|
|
63
|
+
### Development
|
|
64
|
+
|
|
65
|
+
1. Install Nodejs environment, version is specified in `.nvmrc` file. We recommend using [NVM](https://github.com/nvm-sh/nvm) or a similar tool.
|
|
66
|
+
2. Install [pnpm](https://pnpm.io/installation), version is specified in `package.json` in "packageManager" property.
|
|
67
|
+
3. Install dependencies: `pnpm i`
|
|
68
|
+
4. Run storybook dev-server: `pnpm start`
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
### i18n
|
|
72
|
+
|
|
73
|
+
To set up internationalization, you just need to use the `configure`:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
import {configure} from '@gravity-ui/markdown-editor';
|
|
77
|
+
|
|
78
|
+
configure({
|
|
79
|
+
lang: 'ru',
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Don't forget to call `configure()` from [UIKit](https://github.com/gravity-ui/uikit?tab=readme-ov-file#i18n) and other UI libraries.
|
|
84
|
+
|
|
85
|
+
### Contributing
|
|
86
|
+
|
|
87
|
+
- [Contributor Guidelines](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-contributing--docs)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/QuoteLink/QuoteLinkSpecs/index.ts"],"names":[],"mappings":";;;AAAA,yEAAsE;AAItE,sDAA0C;AAE1C,iFAAyE;AAE5D,QAAA,iBAAiB,GAAG,gBAAgB,CAAC;AACrC,QAAA,aAAa,GAAG,IAAA,uBAAe,EAAC,yBAAiB,CAAC,CAAC;AACzD,MAAM,eAAe,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,yBAAiB,CAAC;AAAvE,QAAA,eAAe,mBAAwD;AAEpF,IAAY,aAGX;AAHD,WAAY,aAAa;IACrB,8BAAa,CAAA;IACb,6CAA4B,CAAA;AAChC,CAAC,EAHW,aAAa,6BAAb,aAAa,QAGxB;AAEM,MAAM,cAAc,GAAkB,CAAC,OAAO,EAAE,EAAE;IACrD,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,EAAE;SACG,GAAG,CACA,IAAA,gCAAS,EAAC;QACN,MAAM,EAAE,KAAK;KAChB,CAAC,CACL;SACA,GAAG,CAAC,qDAAyB,CAAC,CACtC;SACA,OAAO,CAAC,yBAAiB,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"]}
|
|
@@ -10,6 +10,7 @@ const helpers_1 = require("../../../utils/helpers.js");
|
|
|
10
10
|
const selection_1 = require("../../../utils/selection.js");
|
|
11
11
|
const BaseSchema_1 = require("../../base/BaseSchema/index.js");
|
|
12
12
|
const code_1 = require("./code.js");
|
|
13
|
+
const selection_content_1 = require("./selection-content.js");
|
|
13
14
|
const trim_selection_1 = require("./trim-selection.js");
|
|
14
15
|
const utils_1 = require("./utils.js");
|
|
15
16
|
const clipboard = ({ logger, textParser, mdParser, serializer, pasteFileHandler, }) => {
|
|
@@ -224,7 +225,7 @@ function getCopyContent(state) {
|
|
|
224
225
|
if (isTextSelectionWithinSameTextBlock(sel)) {
|
|
225
226
|
return new model_1.Slice(createFragmentFromInlineSelection(state, sel), 0, 0);
|
|
226
227
|
}
|
|
227
|
-
let slice = getSelectionContent(sel);
|
|
228
|
+
let slice = (0, selection_content_1.getSelectionContent)(sel);
|
|
228
229
|
// replace first node with paragraph if needed
|
|
229
230
|
if (slice.content.firstChild?.isTextblock &&
|
|
230
231
|
slice.content.firstChild.type.name !== BaseSchema_1.BaseNode.Paragraph) {
|
|
@@ -262,18 +263,6 @@ function createFragmentFromInlineSelection(state, sel) {
|
|
|
262
263
|
}
|
|
263
264
|
return model_1.Fragment.from(sel.$from.parent.copy(inlineSlice.content));
|
|
264
265
|
}
|
|
265
|
-
/**
|
|
266
|
-
* Like `selection.content()`, but smarter.
|
|
267
|
-
* Copy a structure of complex nodes,
|
|
268
|
-
* e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text
|
|
269
|
-
* it works well with simple nodes, but to handle cases as described above, custom logic needed
|
|
270
|
-
*/
|
|
271
|
-
function getSelectionContent(sel) {
|
|
272
|
-
const sharedNodeType = getSharedDepthNode(sel).type;
|
|
273
|
-
const sharedNodeComplex = sharedNodeType.spec.complex;
|
|
274
|
-
const includeParents = sharedNodeComplex && sharedNodeComplex !== 'leaf';
|
|
275
|
-
return sel.$from.doc.slice(sel.$from.pos, sel.to, includeParents);
|
|
276
|
-
}
|
|
277
266
|
function getSharedDepthNode({ $from, $to }) {
|
|
278
267
|
return $from.node($from.sharedDepth($to.pos));
|
|
279
268
|
}
|
|
@@ -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,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSelectionContent = getSelectionContent;
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
*
|
|
7
|
+
* Like `selection.content()`, but smarter.
|
|
8
|
+
* Copy a structure of complex nodes,
|
|
9
|
+
* e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text
|
|
10
|
+
* it works well with simple nodes, but to handle cases as described above, custom logic needed
|
|
11
|
+
*/
|
|
12
|
+
function getSelectionContent(sel) {
|
|
13
|
+
const sharedDepth = sel.$from.sharedDepth(sel.$to.pos);
|
|
14
|
+
const sharedNode = sel.$from.node(sharedDepth);
|
|
15
|
+
const sharedNodeComplex = sharedNode.type.spec.complex;
|
|
16
|
+
if (sharedNodeComplex && sharedNodeComplex !== 'leaf') {
|
|
17
|
+
// Find the nearest ancestor with complex='root' to avoid
|
|
18
|
+
// wrapping copied content in outer containers (blockquote, table cell, etc.)
|
|
19
|
+
let rootDepth = sharedDepth;
|
|
20
|
+
for (let d = sharedDepth; d >= 0; d--) {
|
|
21
|
+
if (sel.$from.node(d).type.spec.complex === 'root') {
|
|
22
|
+
rootDepth = d;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Slice from the parent of the root node so that the root node itself
|
|
27
|
+
// (e.g. bullet_list) is included in the slice, but its outer containers are not.
|
|
28
|
+
const parentDepth = Math.max(0, rootDepth - 1);
|
|
29
|
+
const parentNode = sel.$from.node(parentDepth);
|
|
30
|
+
const parentStart = sel.$from.start(parentDepth);
|
|
31
|
+
return parentNode.slice(sel.$from.pos - parentStart, sel.$to.pos - parentStart, true);
|
|
32
|
+
}
|
|
33
|
+
return sel.$from.doc.slice(sel.$from.pos, sel.to, false);
|
|
34
|
+
}
|
|
35
|
+
//# 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":";;AAUA,kDAyBC;AAjCD;;;;;;;GAOG;AACH,SAAgB,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,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.backspace = exports.arrowRight = exports.arrowUp = exports.arrowDown = exports.arrowLeft = exports.findFakeParaPosForTextSelection = exports.findFakeParaPosForCodeBlock = exports.findFakeParaPosForNodeSelection = exports.findNextFakeParaPosForGapCursorSelection = void 0;
|
|
3
|
+
exports.selectAll = exports.backspace = exports.arrowRight = exports.arrowUp = exports.arrowDown = exports.arrowLeft = exports.findFakeParaPosForTextSelection = exports.findFakeParaPosForCodeBlock = exports.findFakeParaPosForNodeSelection = exports.findNextFakeParaPosForGapCursorSelection = void 0;
|
|
4
4
|
exports.findFakeParaPosClosestToPos = findFakeParaPosClosestToPos;
|
|
5
5
|
exports.createFakeParagraph = createFakeParagraph;
|
|
6
6
|
const prosemirror_state_1 = require("prosemirror-state");
|
|
7
7
|
const nodes_1 = require("../../../utils/nodes.js");
|
|
8
8
|
const selection_1 = require("../../../utils/selection.js");
|
|
9
9
|
const GapCursorSelection_1 = require("../Cursor/GapCursorSelection.js");
|
|
10
|
+
const SelectionContext_1 = require("../SelectionContext/index.js");
|
|
10
11
|
const isUp = (dir) => dir === 'left' || dir === 'up';
|
|
11
12
|
function isTextblock(node) {
|
|
12
13
|
return node.isTextblock && !(0, nodes_1.isCodeBlock)(node);
|
|
@@ -153,4 +154,49 @@ const backspace = (state, dispatch) => {
|
|
|
153
154
|
return false;
|
|
154
155
|
};
|
|
155
156
|
exports.backspace = backspace;
|
|
157
|
+
function hasContentToSelect(node) {
|
|
158
|
+
if (node.isTextblock)
|
|
159
|
+
return node.content.size > 0;
|
|
160
|
+
return !(0, nodes_1.isNodeEmpty)(node);
|
|
161
|
+
}
|
|
162
|
+
const selectAll = (state, dispatch) => {
|
|
163
|
+
const { selection } = state;
|
|
164
|
+
const { $from, $to } = selection;
|
|
165
|
+
const sharedDepth = $from.sharedDepth($to.pos);
|
|
166
|
+
for (let depth = sharedDepth; depth > 0; depth--) {
|
|
167
|
+
const node = $from.node(depth);
|
|
168
|
+
const { spec } = node.type;
|
|
169
|
+
if (spec.selectAll === false)
|
|
170
|
+
continue;
|
|
171
|
+
let mode;
|
|
172
|
+
if (spec.selectAll)
|
|
173
|
+
mode = spec.selectAll;
|
|
174
|
+
else if (node.isTextblock || spec.code)
|
|
175
|
+
mode = 'content';
|
|
176
|
+
else
|
|
177
|
+
continue;
|
|
178
|
+
if (!hasContentToSelect(node))
|
|
179
|
+
continue;
|
|
180
|
+
if (mode === 'node') {
|
|
181
|
+
const selAroundNode = prosemirror_state_1.TextSelection.create(state.doc, $from.before(depth), $from.after(depth));
|
|
182
|
+
if (selection.from <= selAroundNode.from && selection.to >= selAroundNode.to)
|
|
183
|
+
continue;
|
|
184
|
+
dispatch?.((0, SelectionContext_1.hideSelectionMenu)(state.tr.setSelection(selAroundNode)));
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
const start = $from.start(depth);
|
|
188
|
+
const end = start + node.content.size;
|
|
189
|
+
const startCursor = prosemirror_state_1.Selection.findFrom(state.doc.resolve(start), 1);
|
|
190
|
+
const endCursor = prosemirror_state_1.Selection.findFrom(state.doc.resolve(end), -1);
|
|
191
|
+
if (startCursor &&
|
|
192
|
+
endCursor &&
|
|
193
|
+
selection.from <= startCursor.from &&
|
|
194
|
+
selection.to >= endCursor.to)
|
|
195
|
+
continue;
|
|
196
|
+
dispatch?.(state.tr.setSelection(prosemirror_state_1.TextSelection.create(state.doc, start, end)));
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
return false;
|
|
200
|
+
};
|
|
201
|
+
exports.selectAll = selectAll;
|
|
156
202
|
//# sourceMappingURL=commands.js.map
|
|
@@ -1 +1 @@
|
|
|
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 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
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Selection/selection.ts"],"names":[],"mappings":";;;AAAA,+DAAsD;AACtD,2DAAkD;AAElD,yDAQ2B;AAC3B,uDAA4E;AAE5E,mDAAsD;AACtD,2DAAyD;AAEzD,
|
|
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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Blockquote/BlockquoteSpecs/index.ts"],"names":[],"mappings":";;;AAGA,wDAAyD;AAE5C,QAAA,kBAAkB,GAAG,YAAY,CAAC;AAClC,QAAA,cAAc,GAAG,IAAA,wBAAe,EAAC,0BAAkB,CAAC,CAAC;AAC3D,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,0BAAkB,CAAC;AAAzE,QAAA,gBAAgB,oBAAyD;AAE/E,MAAM,eAAe,GAAkB,CAAC,OAAO,EAAE,EAAE;IACtD,OAAO,CAAC,OAAO,CAAC,0BAAkB,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,wDAAyD;AAE5C,QAAA,kBAAkB,GAAG,YAAY,CAAC;AAClC,QAAA,cAAc,GAAG,IAAA,wBAAe,EAAC,0BAAkB,CAAC,CAAC;AAC3D,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,0BAAkB,CAAC;AAAzE,QAAA,gBAAgB,oBAAyD;AAE/E,MAAM,eAAe,GAAkB,CAAC,OAAO,EAAE,EAAE;IACtD,OAAO,CAAC,OAAO,CAAC,0BAAkB,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,0BAAkB,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;AAlBW,QAAA,eAAe,mBAkB1B","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,8 +1,8 @@
|
|
|
1
|
-
import type { Options } from '@diplodoc/transform';
|
|
2
1
|
import type { ExtensionAuto } from "../../../../core/index.js";
|
|
3
2
|
import { type LineNumbersOptions } from "../CodeBlockSpecs/index.js";
|
|
3
|
+
import { type HighlightLangMap } from "./plugins/codeBlockLangsPlugin.js";
|
|
4
4
|
import "./CodeBlockHighlight.css";
|
|
5
|
-
export type HighlightLangMap
|
|
5
|
+
export type { HighlightLangMap };
|
|
6
6
|
export type CodeBlockHighlightOptions = {
|
|
7
7
|
lineWrapping?: {
|
|
8
8
|
enabled?: boolean;
|