@gravity-ui/markdown-editor 15.2.2 → 15.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/extensions/additional/YfmHtmlBlock/utils.d.ts +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/utils.js +13 -2
- package/build/cjs/extensions/additional/YfmHtmlBlock/utils.js.map +1 -1
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -12
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
- package/build/cjs/extensions/behavior/Clipboard/clipboard.js +8 -0
- package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
- package/build/cjs/extensions/behavior/Clipboard/utils.d.ts +3 -0
- package/build/cjs/extensions/behavior/Clipboard/utils.js +45 -0
- package/build/cjs/extensions/behavior/Clipboard/utils.js.map +1 -1
- package/build/cjs/extensions/markdown/Lists/index.js +2 -0
- package/build/cjs/extensions/markdown/Lists/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.d.ts +4 -0
- package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.js +76 -0
- package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.js.map +1 -0
- package/build/cjs/utils/nodes.d.ts +1 -0
- package/build/cjs/utils/nodes.js +13 -1
- package/build/cjs/utils/nodes.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/utils.d.ts +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/utils.js +12 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/utils.js.map +1 -1
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +1 -11
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
- package/build/esm/extensions/behavior/Clipboard/clipboard.js +9 -1
- package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
- package/build/esm/extensions/behavior/Clipboard/utils.d.ts +3 -0
- package/build/esm/extensions/behavior/Clipboard/utils.js +43 -0
- package/build/esm/extensions/behavior/Clipboard/utils.js.map +1 -1
- package/build/esm/extensions/markdown/Lists/index.js +2 -0
- package/build/esm/extensions/markdown/Lists/index.js.map +1 -1
- package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.d.ts +4 -0
- package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.js +71 -0
- package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.js.map +1 -0
- package/build/esm/utils/nodes.d.ts +1 -0
- package/build/esm/utils/nodes.js +11 -0
- package/build/esm/utils/nodes.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/package.json +1 -1
package/build/cjs/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.3.0' !== 'undefined' ? '15.3.0' : 'unknown';\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { SanitizeOptions } from '@diplodoc/transform/lib/sanitize.js';
|
|
2
2
|
export declare const getYfmHtmlBlockOptions: (defaultOptions: SanitizeOptions) => SanitizeOptions;
|
|
3
3
|
export interface GetSanitizeYfmHtmlBlockArgs {
|
|
4
4
|
options: SanitizeOptions;
|
|
@@ -1,4 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as sanitizeModule from '@diplodoc/transform/lib/sanitize.js';
|
|
2
|
+
const sanitizeAll = () => {
|
|
3
|
+
console.warn('[YfmHtmlBlock]: sanitize function not found');
|
|
4
|
+
return '';
|
|
5
|
+
};
|
|
6
|
+
const getSanitizeFunction = () => {
|
|
7
|
+
const module = sanitizeModule;
|
|
8
|
+
const sanitize = 'sanitize' in module && module.sanitize ? module.sanitize : module.default;
|
|
9
|
+
return sanitize instanceof Function ? sanitize : sanitizeAll;
|
|
10
|
+
};
|
|
11
|
+
// MAJOR: use `import {sanitize} from '@diplodoc/transform/lib/sanitize.js'`
|
|
12
|
+
const diplodocSanitize = getSanitizeFunction();
|
|
2
13
|
// yfmHtmlBlock additional css properties white list
|
|
3
14
|
const getYfmHtmlBlockWhiteList = () => {
|
|
4
15
|
const whiteList = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import diplodocSanitize, {type SanitizeOptions} from '@diplodoc/transform/lib/sanitize.js';\n\n// yfmHtmlBlock additional css properties white list\nconst getYfmHtmlBlockWhiteList = () => {\n const whiteList: Record<string, boolean> = {};\n\n // flex, grid, column\n whiteList['align-content'] = true; // default: auto\n whiteList['align-items'] = true; // default: auto\n whiteList['align-self'] = true; // default: auto\n whiteList.columns = true; // default: depending on individual properties\n whiteList['column-count'] = true; // default: auto\n whiteList['column-fill'] = true; // default: balance\n whiteList['column-gap'] = true; // default: normal\n whiteList['column-rule'] = true; // default: depending on individual properties\n whiteList['column-rule-color'] = true; // default: current color\n whiteList['column-rule-style'] = true; // default: medium\n whiteList['column-rule-width'] = true; // default: medium\n whiteList['column-span'] = true; // default: none\n whiteList['column-width'] = true; // default: auto\n whiteList.flex = true; // default: depending on individual properties\n whiteList['flex-basis'] = true; // default: auto\n whiteList['flex-direction'] = true; // default: row\n whiteList['flex-flow'] = true; // default: depending on individual properties\n whiteList['flex-grow'] = true; // default: 0\n whiteList['flex-shrink'] = true; // default: 1\n whiteList['flex-wrap'] = true; // default: nowrap\n whiteList.gap = true; // default: normal normal\n whiteList.grid = true; // default: depending on individual properties\n whiteList['grid-area'] = true; // default: depending on individual properties\n whiteList['grid-auto-columns'] = true; // default: auto\n whiteList['grid-auto-flow'] = true; // default: none\n whiteList['grid-auto-rows'] = true; // default: auto\n whiteList['grid-column'] = true; // default: depending on individual properties\n whiteList['grid-column-end'] = true; // default: auto\n whiteList['grid-column-start'] = true; // default: auto\n whiteList['grid-row'] = true; // default: depending on individual properties\n whiteList['grid-row-end'] = true; // default: auto\n whiteList['grid-row-start'] = true; // default: auto\n whiteList['grid-template'] = true; // default: depending on individual properties\n whiteList['grid-template-areas'] = true; // default: none\n whiteList['grid-template-columns'] = true; // default: none\n whiteList['grid-template-rows'] = true; // default: none\n whiteList['justify-content'] = true; // default: auto\n whiteList['justify-items'] = true; // default: auto\n whiteList['justify-self'] = true; // default: auto\n whiteList['line-height'] = true; // default: normal\n whiteList['object-fit'] = true; // default: fill\n whiteList['object-position'] = true; // default: 50% 50%\n whiteList.order = true; // default: 0\n whiteList.orphans = true; // default: 2\n whiteList['row-gap'] = true;\n\n // position, opacity, overflow\n whiteList['all'] = true; // default: depending on individual properties\n whiteList['bottom'] = true; // default: auto\n whiteList['content'] = true; // default: normal\n whiteList['cursor'] = true; // default: auto\n whiteList['direction'] = true; // default: ltr\n whiteList['left'] = true; // default: auto\n whiteList['line-break'] = true; // default: auto\n whiteList['opacity'] = true; // default: 1\n whiteList['overflow'] = true; // default: depending on individual properties\n whiteList['overflow-wrap'] = true; // default: normal\n whiteList['overflow-x'] = true; // default: visible\n whiteList['overflow-y'] = true; // default: visible\n whiteList['position'] = true; // default: static\n whiteList['right'] = true; // default: auto\n whiteList['top'] = true; // default: auto\n whiteList['white-space'] = true; // default: normal\n whiteList['z-index'] = true; // default: auto\n\n return whiteList;\n};\n\n// yfmHtmlBlock additional allowedTags\nconst yfmHtmlBlockAllowedTags = ['link', 'base', 'style'];\n\n// yfmHtmlBlock additional allowedTags\nconst yfmHtmlBlockAllowedAttributes = {\n link: ['rel', 'href'],\n base: ['target'],\n style: [],\n};\n\nexport const getYfmHtmlBlockOptions = (defaultOptions: SanitizeOptions): SanitizeOptions => {\n type AllowedAttributesType = Record<\n string,\n (string | {name: string; multiple?: boolean | undefined; values: string[]})[]\n >;\n const defaultAllowedAttributes = defaultOptions.allowedAttributes as AllowedAttributesType;\n\n return {\n ...defaultOptions,\n allowedAttributes: {\n ...defaultAllowedAttributes,\n ...yfmHtmlBlockAllowedAttributes,\n },\n allowedTags:\n typeof defaultOptions.allowedTags === 'boolean'\n ? defaultOptions.allowedTags\n : [...(defaultOptions.allowedTags ?? []), ...yfmHtmlBlockAllowedTags],\n cssWhiteList: {\n ...defaultOptions.cssWhiteList,\n ...getYfmHtmlBlockWhiteList(),\n },\n };\n};\n\nexport interface GetSanitizeYfmHtmlBlockArgs {\n options: SanitizeOptions;\n sanitize?: (html: string, options?: SanitizeOptions) => string;\n}\nexport const getSanitizeYfmHtmlBlock =\n ({options, sanitize = diplodocSanitize}: GetSanitizeYfmHtmlBlockArgs) =>\n (content: string) =>\n sanitize(content, getYfmHtmlBlockOptions(options));\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,cAAc,MAAM,qCAAqC,CAAC;AAatE,MAAM,WAAW,GAAG,GAAG,EAAE;IACrB,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AACF,MAAM,mBAAmB,GAAG,GAAe,EAAE;IACzC,MAAM,MAAM,GAAG,cAAgC,CAAC;IAChD,MAAM,QAAQ,GAAG,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IAC5F,OAAO,QAAQ,YAAY,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;AACjE,CAAC,CAAC;AAEF,4EAA4E;AAC5E,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;AAE/C,oDAAoD;AACpD,MAAM,wBAAwB,GAAG,GAAG,EAAE;IAClC,MAAM,SAAS,GAA4B,EAAE,CAAC;IAE9C,qBAAqB;IACrB,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACnD,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACjD,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAChD,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,8CAA8C;IACxE,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAClD,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,mBAAmB;IACpD,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,kBAAkB;IAClD,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,8CAA8C;IAC/E,SAAS,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAC,yBAAyB;IAChE,SAAS,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAC,kBAAkB;IACzD,SAAS,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAC,kBAAkB;IACzD,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACjD,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAClD,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,8CAA8C;IACrE,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAChD,SAAS,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC,eAAe;IACnD,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,8CAA8C;IAC7E,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,aAAa;IAC5C,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,aAAa;IAC9C,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,kBAAkB;IACjD,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,yBAAyB;IAC/C,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,8CAA8C;IACrE,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,8CAA8C;IAC7E,SAAS,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACvD,SAAS,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACpD,SAAS,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACpD,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,8CAA8C;IAC/E,SAAS,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACrD,SAAS,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACvD,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC,8CAA8C;IAC5E,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAClD,SAAS,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACpD,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,8CAA8C;IACjF,SAAS,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACzD,SAAS,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAC3D,SAAS,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACxD,SAAS,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACrD,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACnD,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAClD,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,kBAAkB;IACnD,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAChD,SAAS,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAAC,mBAAmB;IACxD,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,aAAa;IACrC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,aAAa;IACvC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IAE5B,8BAA8B;IAC9B,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,8CAA8C;IACvE,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAC5C,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,kBAAkB;IAC/C,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAC5C,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,eAAe;IAC9C,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAC1C,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAChD,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,aAAa;IAC1C,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC,8CAA8C;IAC5E,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,kBAAkB;IACrD,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,mBAAmB;IACnD,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,mBAAmB;IACnD,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC,kBAAkB;IAChD,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAC3C,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IACzC,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,kBAAkB;IACnD,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,gBAAgB;IAE7C,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAEF,sCAAsC;AACtC,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1D,sCAAsC;AACtC,MAAM,6BAA6B,GAAG;IAClC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,KAAK,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,cAA+B,EAAmB,EAAE;IAKvF,MAAM,wBAAwB,GAAG,cAAc,CAAC,iBAA0C,CAAC;IAE3F,OAAO;QACH,GAAG,cAAc;QACjB,iBAAiB,EAAE;YACf,GAAG,wBAAwB;YAC3B,GAAG,6BAA6B;SACnC;QACD,WAAW,EACP,OAAO,cAAc,CAAC,WAAW,KAAK,SAAS;YAC3C,CAAC,CAAC,cAAc,CAAC,WAAW;YAC5B,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,GAAG,uBAAuB,CAAC;QAC7E,YAAY,EAAE;YACV,GAAG,cAAc,CAAC,YAAY;YAC9B,GAAG,wBAAwB,EAAE;SAChC;KACJ,CAAC;AACN,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,uBAAuB,GAChC,CAAC,EAAC,OAAO,EAAE,QAAQ,GAAG,gBAAgB,EAA8B,EAAE,EAAE,CACxE,CAAC,OAAe,EAAE,EAAE,CAChB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC","sourcesContent":["import type {SanitizeOptions} from '@diplodoc/transform/lib/sanitize.js';\nimport * as sanitizeModule from '@diplodoc/transform/lib/sanitize.js';\n\ntype SanitizeFn = (\n html: string,\n options?: SanitizeOptions,\n additionalOptions?: SanitizeOptions,\n) => string;\n\ninterface SanitizeModule {\n sanitize?: SanitizeFn;\n default?: SanitizeFn;\n}\n\nconst sanitizeAll = () => {\n console.warn('[YfmHtmlBlock]: sanitize function not found');\n return '';\n};\nconst getSanitizeFunction = (): SanitizeFn => {\n const module = sanitizeModule as SanitizeModule;\n const sanitize = 'sanitize' in module && module.sanitize ? module.sanitize : module.default;\n return sanitize instanceof Function ? sanitize : sanitizeAll;\n};\n\n// MAJOR: use `import {sanitize} from '@diplodoc/transform/lib/sanitize.js'`\nconst diplodocSanitize = getSanitizeFunction();\n\n// yfmHtmlBlock additional css properties white list\nconst getYfmHtmlBlockWhiteList = () => {\n const whiteList: Record<string, boolean> = {};\n\n // flex, grid, column\n whiteList['align-content'] = true; // default: auto\n whiteList['align-items'] = true; // default: auto\n whiteList['align-self'] = true; // default: auto\n whiteList.columns = true; // default: depending on individual properties\n whiteList['column-count'] = true; // default: auto\n whiteList['column-fill'] = true; // default: balance\n whiteList['column-gap'] = true; // default: normal\n whiteList['column-rule'] = true; // default: depending on individual properties\n whiteList['column-rule-color'] = true; // default: current color\n whiteList['column-rule-style'] = true; // default: medium\n whiteList['column-rule-width'] = true; // default: medium\n whiteList['column-span'] = true; // default: none\n whiteList['column-width'] = true; // default: auto\n whiteList.flex = true; // default: depending on individual properties\n whiteList['flex-basis'] = true; // default: auto\n whiteList['flex-direction'] = true; // default: row\n whiteList['flex-flow'] = true; // default: depending on individual properties\n whiteList['flex-grow'] = true; // default: 0\n whiteList['flex-shrink'] = true; // default: 1\n whiteList['flex-wrap'] = true; // default: nowrap\n whiteList.gap = true; // default: normal normal\n whiteList.grid = true; // default: depending on individual properties\n whiteList['grid-area'] = true; // default: depending on individual properties\n whiteList['grid-auto-columns'] = true; // default: auto\n whiteList['grid-auto-flow'] = true; // default: none\n whiteList['grid-auto-rows'] = true; // default: auto\n whiteList['grid-column'] = true; // default: depending on individual properties\n whiteList['grid-column-end'] = true; // default: auto\n whiteList['grid-column-start'] = true; // default: auto\n whiteList['grid-row'] = true; // default: depending on individual properties\n whiteList['grid-row-end'] = true; // default: auto\n whiteList['grid-row-start'] = true; // default: auto\n whiteList['grid-template'] = true; // default: depending on individual properties\n whiteList['grid-template-areas'] = true; // default: none\n whiteList['grid-template-columns'] = true; // default: none\n whiteList['grid-template-rows'] = true; // default: none\n whiteList['justify-content'] = true; // default: auto\n whiteList['justify-items'] = true; // default: auto\n whiteList['justify-self'] = true; // default: auto\n whiteList['line-height'] = true; // default: normal\n whiteList['object-fit'] = true; // default: fill\n whiteList['object-position'] = true; // default: 50% 50%\n whiteList.order = true; // default: 0\n whiteList.orphans = true; // default: 2\n whiteList['row-gap'] = true;\n\n // position, opacity, overflow\n whiteList['all'] = true; // default: depending on individual properties\n whiteList['bottom'] = true; // default: auto\n whiteList['content'] = true; // default: normal\n whiteList['cursor'] = true; // default: auto\n whiteList['direction'] = true; // default: ltr\n whiteList['left'] = true; // default: auto\n whiteList['line-break'] = true; // default: auto\n whiteList['opacity'] = true; // default: 1\n whiteList['overflow'] = true; // default: depending on individual properties\n whiteList['overflow-wrap'] = true; // default: normal\n whiteList['overflow-x'] = true; // default: visible\n whiteList['overflow-y'] = true; // default: visible\n whiteList['position'] = true; // default: static\n whiteList['right'] = true; // default: auto\n whiteList['top'] = true; // default: auto\n whiteList['white-space'] = true; // default: normal\n whiteList['z-index'] = true; // default: auto\n\n return whiteList;\n};\n\n// yfmHtmlBlock additional allowedTags\nconst yfmHtmlBlockAllowedTags = ['link', 'base', 'style'];\n\n// yfmHtmlBlock additional allowedTags\nconst yfmHtmlBlockAllowedAttributes = {\n link: ['rel', 'href'],\n base: ['target'],\n style: [],\n};\n\nexport const getYfmHtmlBlockOptions = (defaultOptions: SanitizeOptions): SanitizeOptions => {\n type AllowedAttributesType = Record<\n string,\n (string | {name: string; multiple?: boolean | undefined; values: string[]})[]\n >;\n const defaultAllowedAttributes = defaultOptions.allowedAttributes as AllowedAttributesType;\n\n return {\n ...defaultOptions,\n allowedAttributes: {\n ...defaultAllowedAttributes,\n ...yfmHtmlBlockAllowedAttributes,\n },\n allowedTags:\n typeof defaultOptions.allowedTags === 'boolean'\n ? defaultOptions.allowedTags\n : [...(defaultOptions.allowedTags ?? []), ...yfmHtmlBlockAllowedTags],\n cssWhiteList: {\n ...defaultOptions.cssWhiteList,\n ...getYfmHtmlBlockWhiteList(),\n },\n };\n};\n\nexport interface GetSanitizeYfmHtmlBlockArgs {\n options: SanitizeOptions;\n sanitize?: (html: string, options?: SanitizeOptions) => string;\n}\nexport const getSanitizeYfmHtmlBlock =\n ({options, sanitize = diplodocSanitize}: GetSanitizeYfmHtmlBlockArgs) =>\n (content: string) =>\n sanitize(content, getYfmHtmlBlockOptions(options));\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isEmptyString } from "../../../../utils/index.js";
|
|
1
2
|
import { nodeTypeFactory } from "../../../../utils/schema.js";
|
|
2
3
|
export var BaseNode;
|
|
3
4
|
(function (BaseNode) {
|
|
@@ -76,15 +77,4 @@ export const BaseSchemaSpecs = (builder, opts) => {
|
|
|
76
77
|
},
|
|
77
78
|
}));
|
|
78
79
|
};
|
|
79
|
-
const isEmptyString = (node) => {
|
|
80
|
-
if (!node.content.size) {
|
|
81
|
-
return true;
|
|
82
|
-
}
|
|
83
|
-
if (node.childCount === 1 &&
|
|
84
|
-
node.child(0).type.name === 'text' &&
|
|
85
|
-
node.child(0).text?.trim() === '') {
|
|
86
|
-
return true;
|
|
87
|
-
}
|
|
88
|
-
return false;
|
|
89
|
-
};
|
|
90
80
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/base/BaseSchema/BaseSchemaSpecs/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/base/BaseSchema/BaseSchemaSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {NodeSpec} from 'prosemirror-model';\n\nimport {isEmptyString} from 'src/utils';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {nodeTypeFactory} from '../../../../utils/schema';\n\nexport enum BaseNode {\n Doc = 'doc',\n Text = 'text',\n Paragraph = 'paragraph',\n}\n\nconst paragraphLineNumberAttr = 'data-line';\n\nexport const pType = nodeTypeFactory(BaseNode.Paragraph);\n\nexport type BaseSchemaSpecsOptions = {\n // This cannot be passed through placeholder option of BehaviorPreset because BasePreset initializes first\n paragraphPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n preserveEmptyRows?: boolean;\n};\n\nexport const BaseSchemaSpecs: ExtensionAuto<BaseSchemaSpecsOptions> = (builder, opts) => {\n builder\n .addNode(BaseNode.Doc, () => ({\n spec: {\n content: 'block+',\n },\n fromMd: {tokenSpec: {name: BaseNode.Doc, type: 'block', ignore: true}},\n toMd: () => {\n throw new Error('Unexpected toMd() call on doc node');\n },\n }))\n .addNode(BaseNode.Text, () => ({\n spec: {\n group: 'inline',\n },\n fromMd: {tokenSpec: {name: BaseNode.Text, type: 'node', ignore: true}},\n toMd: (state, node, parent) => {\n const {escapeText} = parent.type.spec;\n state.text(node.text ?? '', escapeText ?? !state.isAutolink);\n },\n }))\n .addNode(BaseNode.Paragraph, () => ({\n spec: {\n attrs: {[paragraphLineNumberAttr]: {default: null}},\n content: 'inline*',\n group: 'block',\n parseDOM: [{tag: 'p'}],\n toDOM(node) {\n const lineNumber = node.attrs[paragraphLineNumberAttr];\n\n return [\n 'p',\n lineNumber === null ? {} : {[paragraphLineNumberAttr]: lineNumber},\n 0,\n ];\n },\n selectable: true,\n placeholder: opts.paragraphPlaceholder\n ? {\n content: opts.paragraphPlaceholder,\n alwaysVisible: false,\n }\n : undefined,\n },\n fromMd: {tokenSpec: {name: BaseNode.Paragraph, type: 'block'}},\n toMd: (state, node, parent) => {\n /*\n An empty line is added only if there is some content in the parent element.\n This is necessary in order to prevent an empty document with empty lines\n */\n if (opts.preserveEmptyRows && isEmptyString(node)) {\n let isParentEmpty = true;\n\n for (let index = 0; index < parent.content.childCount; index++) {\n const parentChild = parent.content.child(index);\n if (\n parentChild.content.size !== 0 ||\n parentChild.type.name !== 'paragraph'\n ) {\n isParentEmpty = false;\n }\n }\n\n if (!isParentEmpty) {\n state.write(' \\n\\n');\n }\n } else {\n state.renderInline(node);\n state.closeBlock(node);\n }\n },\n }));\n};\n"]}
|
|
@@ -8,7 +8,7 @@ import { isNodeSelection, isTextSelection, isWholeSelection } from "../../../uti
|
|
|
8
8
|
import { serializeForClipboard } from "../../../utils/serialize-for-clipboard.js";
|
|
9
9
|
import { BaseNode, pType } from "../../base/BaseSchema/index.js";
|
|
10
10
|
import { isInsideCode } from "./code.js";
|
|
11
|
-
import { DataTransferType, extractTextContentFromHtml, isIosSafariShare } from "./utils.js";
|
|
11
|
+
import { DataTransferType, extractTextContentFromHtml, isIosSafariShare, trimContent } from "./utils.js";
|
|
12
12
|
export const clipboard = ({ logger, textParser, mdParser, serializer, pasteFileHandler, }) => {
|
|
13
13
|
return new Plugin({
|
|
14
14
|
props: {
|
|
@@ -230,6 +230,14 @@ function getCopyContent(state) {
|
|
|
230
230
|
slice = new Slice(slice.content.replaceChild(0, state.schema.node(BaseNode.Paragraph, {}, firstChild.content)), slice.openStart, slice.openStart);
|
|
231
231
|
}
|
|
232
232
|
}
|
|
233
|
+
else {
|
|
234
|
+
// trim empty list items
|
|
235
|
+
const createEmptyParagraph = () => Fragment.from(pType(state.schema).createAndFill());
|
|
236
|
+
const trimmedContent = trimContent(slice.content, createEmptyParagraph);
|
|
237
|
+
if (trimmedContent !== slice.content) {
|
|
238
|
+
slice = new Slice(trimmedContent, 1, 1);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
233
241
|
return slice;
|
|
234
242
|
}
|
|
235
243
|
function isTextSelectionWithinSameTextBlock(sel) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipboard.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node, type ResolvedPos, type Schema, Slice} from 'prosemirror-model';\nimport {type EditorState, Plugin, type Selection} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {type Parser, type Serializer, trackTransactionMetrics} from '../../../core';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport '../../../types/spec';\nimport {tryCatch} from '../../../utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from '../../../utils/selection';\nimport {serializeForClipboard} from '../../../utils/serialize-for-clipboard';\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\nimport {DataTransferType, extractTextContentFromHtml, isIosSafariShare} 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 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} = serializeForClipboard(view, 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 const sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state), 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 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 }\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) {\n const sel = state.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 {Fragment, type Node, type ResolvedPos, type Schema, Slice} from 'prosemirror-model';\nimport {type EditorState, Plugin, type Selection} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {type Parser, type Serializer, trackTransactionMetrics} from '../../../core';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport '../../../types/spec';\nimport {tryCatch} from '../../../utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from '../../../utils/selection';\nimport {serializeForClipboard} from '../../../utils/serialize-for-clipboard';\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\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 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} = serializeForClipboard(view, 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 const sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state), 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 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) {\n const sel = state.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,3 +1,4 @@
|
|
|
1
|
+
import { Fragment } from 'prosemirror-model';
|
|
1
2
|
/** Сontains all data formats known to us */
|
|
2
3
|
export declare enum DataTransferType {
|
|
3
4
|
Text = "text/plain",
|
|
@@ -13,3 +14,5 @@ export declare function isFilesOnly({ types }: DataTransfer): boolean;
|
|
|
13
14
|
export declare function isFilesFromHtml({ types }: DataTransfer): boolean;
|
|
14
15
|
export declare function isImageFile(file: File): boolean;
|
|
15
16
|
export declare function extractTextContentFromHtml(html: string): string | null;
|
|
17
|
+
export declare function findNotEmptyContentPosses(fragment: Fragment): [number, number, number, number];
|
|
18
|
+
export declare function trimContent(fragment: Fragment, creatEmptyFragment?: () => Fragment): Fragment;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { Fragment } from 'prosemirror-model';
|
|
2
|
+
import { isListItemNode, isListNode } from "../../markdown/Lists/utils.js";
|
|
3
|
+
import { isEmptyString } from "../../../utils/index.js";
|
|
1
4
|
/** Сontains all data formats known to us */
|
|
2
5
|
export var DataTransferType;
|
|
3
6
|
(function (DataTransferType) {
|
|
@@ -42,4 +45,44 @@ export function extractTextContentFromHtml(html) {
|
|
|
42
45
|
}
|
|
43
46
|
return null;
|
|
44
47
|
}
|
|
48
|
+
export function findNotEmptyContentPosses(fragment) {
|
|
49
|
+
let firstNodePos = -1;
|
|
50
|
+
let lastNodePos = -1;
|
|
51
|
+
let firstNotEmptyNodePos = -1;
|
|
52
|
+
let lastNotEmptyNodePos = -1;
|
|
53
|
+
fragment.forEach((contentNode, offset) => {
|
|
54
|
+
if (firstNodePos === -1) {
|
|
55
|
+
firstNodePos = offset;
|
|
56
|
+
}
|
|
57
|
+
lastNodePos = offset + contentNode.nodeSize;
|
|
58
|
+
if (!isEmptyString(contentNode)) {
|
|
59
|
+
if (isListNode(contentNode) || isListItemNode(contentNode)) {
|
|
60
|
+
const [start, end] = findNotEmptyContentPosses(contentNode.content);
|
|
61
|
+
if (firstNotEmptyNodePos === -1 && start !== -1) {
|
|
62
|
+
firstNotEmptyNodePos = offset + start;
|
|
63
|
+
}
|
|
64
|
+
if (end !== -1) {
|
|
65
|
+
lastNotEmptyNodePos = offset + end;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
if (firstNotEmptyNodePos === -1) {
|
|
70
|
+
firstNotEmptyNodePos = offset;
|
|
71
|
+
}
|
|
72
|
+
lastNotEmptyNodePos = offset + contentNode.nodeSize;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
return [firstNotEmptyNodePos, lastNotEmptyNodePos, firstNodePos, lastNodePos];
|
|
77
|
+
}
|
|
78
|
+
export function trimContent(fragment, creatEmptyFragment) {
|
|
79
|
+
const [notEmptyStart, notEmptyEnd, start, end] = findNotEmptyContentPosses(fragment);
|
|
80
|
+
if (notEmptyStart === start && notEmptyEnd === end) {
|
|
81
|
+
return fragment;
|
|
82
|
+
}
|
|
83
|
+
else if (notEmptyStart === -1 && notEmptyEnd === -1) {
|
|
84
|
+
return creatEmptyFragment ? creatEmptyFragment() : Fragment.empty;
|
|
85
|
+
}
|
|
86
|
+
return fragment.cut(notEmptyStart + 1, notEmptyEnd + 1);
|
|
87
|
+
}
|
|
45
88
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/utils.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,MAAM,CAAN,IAAY,gBAQX;AARD,WAAY,gBAAgB;IACxB,uCAAmB,CAAA;IACnB,sCAAkB,CAAA;IAClB,oCAAgB,CAAA;IAChB,oCAAgB,CAAA;IAChB,6CAAyB,CAAA;IACzB,qDAAiC,CAAA;IACjC,mCAAe,CAAA;AACnB,CAAC,EARW,gBAAgB,KAAhB,gBAAgB,QAQ3B;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAC,KAAK,EAAe;IAClD,kDAAkD;IAClD,uDAAuD;IACvD,OAAO,CACH,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC;QACxC,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC;QACtC,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CACzC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAC,KAAK,EAAe;IAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,KAAK,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAC,KAAK,EAAe;IACjD,OAAO,CACH,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CACxC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC;IAE9F,kGAAkG;IAClG,IACI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAC,EAAE,EAAE;QACrE,OAAO,CACH,CAAC,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,CAAC;YAC3C,CAAC,SAAS,CAAC,MAAM;YACjB,UAAU,CAAC,MAAM,KAAK,CAAC;YACvB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAC1E,CAAC;IACN,CAAC,CAAC,EACJ,CAAC;QACC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["/** Сontains all data formats known to us */\nexport enum DataTransferType {\n Text = 'text/plain',\n Html = 'text/html',\n Yfm = 'text/yfm', // self\n Rtf = 'text/rtf', // Safari, WebStorm/Intelij\n UriList = 'text/uri-list',\n VSCodeData = 'vscode-editor-data',\n Files = 'Files',\n}\n\nexport function isIosSafariShare({types}: DataTransfer): boolean {\n // if link is copied from ios safari share button,\n // then data transfer only have text/uri-list data type\n return (\n types.includes(DataTransferType.UriList) &&\n !types.includes(DataTransferType.Text) &&\n !types.includes(DataTransferType.Html)\n );\n}\n\nexport function isFilesOnly({types}: DataTransfer): boolean {\n return types.length === 1 && types[0] === DataTransferType.Files;\n}\n\nexport function isFilesFromHtml({types}: DataTransfer): boolean {\n return (\n types.length === 2 &&\n types.includes(DataTransferType.Files) &&\n types.includes(DataTransferType.Html)\n );\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n}\n\nexport function extractTextContentFromHtml(html: string) {\n const element = document.createElement('div');\n element.innerHTML = html;\n element.replaceChildren(...Array.from(element.children).filter((v) => v.nodeName !== 'META'));\n\n // Look if all nodes are div or span. That they don't have any classname and have only text child.\n if (\n Array.from(element.children).every(({nodeName, classList, childNodes}) => {\n return (\n (nodeName === 'DIV' || nodeName === 'SPAN') &&\n !classList.length &&\n childNodes.length === 1 &&\n (childNodes[0].nodeName === '#text' || childNodes[0].nodeName === 'BR')\n );\n })\n ) {\n return Array.from(element.children).reduce((a, v) => a + v.textContent + '\\n', '');\n }\n\n return null;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment} from 'prosemirror-model';\n\nimport {isListItemNode, isListNode} from 'src/extensions/markdown/Lists/utils';\nimport {isEmptyString} from 'src/utils';\n\n/** Сontains all data formats known to us */\nexport enum DataTransferType {\n Text = 'text/plain',\n Html = 'text/html',\n Yfm = 'text/yfm', // self\n Rtf = 'text/rtf', // Safari, WebStorm/Intelij\n UriList = 'text/uri-list',\n VSCodeData = 'vscode-editor-data',\n Files = 'Files',\n}\n\nexport function isIosSafariShare({types}: DataTransfer): boolean {\n // if link is copied from ios safari share button,\n // then data transfer only have text/uri-list data type\n return (\n types.includes(DataTransferType.UriList) &&\n !types.includes(DataTransferType.Text) &&\n !types.includes(DataTransferType.Html)\n );\n}\n\nexport function isFilesOnly({types}: DataTransfer): boolean {\n return types.length === 1 && types[0] === DataTransferType.Files;\n}\n\nexport function isFilesFromHtml({types}: DataTransfer): boolean {\n return (\n types.length === 2 &&\n types.includes(DataTransferType.Files) &&\n types.includes(DataTransferType.Html)\n );\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n}\n\nexport function extractTextContentFromHtml(html: string) {\n const element = document.createElement('div');\n element.innerHTML = html;\n element.replaceChildren(...Array.from(element.children).filter((v) => v.nodeName !== 'META'));\n\n // Look if all nodes are div or span. That they don't have any classname and have only text child.\n if (\n Array.from(element.children).every(({nodeName, classList, childNodes}) => {\n return (\n (nodeName === 'DIV' || nodeName === 'SPAN') &&\n !classList.length &&\n childNodes.length === 1 &&\n (childNodes[0].nodeName === '#text' || childNodes[0].nodeName === 'BR')\n );\n })\n ) {\n return Array.from(element.children).reduce((a, v) => a + v.textContent + '\\n', '');\n }\n\n return null;\n}\n\nexport function findNotEmptyContentPosses(fragment: Fragment): [number, number, number, number] {\n let firstNodePos = -1;\n let lastNodePos = -1;\n let firstNotEmptyNodePos = -1;\n let lastNotEmptyNodePos = -1;\n\n fragment.forEach((contentNode, offset) => {\n if (firstNodePos === -1) {\n firstNodePos = offset;\n }\n lastNodePos = offset + contentNode.nodeSize;\n\n if (!isEmptyString(contentNode)) {\n if (isListNode(contentNode) || isListItemNode(contentNode)) {\n const [start, end] = findNotEmptyContentPosses(contentNode.content);\n if (firstNotEmptyNodePos === -1 && start !== -1) {\n firstNotEmptyNodePos = offset + start;\n }\n if (end !== -1) {\n lastNotEmptyNodePos = offset + end;\n }\n } else {\n if (firstNotEmptyNodePos === -1) {\n firstNotEmptyNodePos = offset;\n }\n lastNotEmptyNodePos = offset + contentNode.nodeSize;\n }\n }\n });\n\n return [firstNotEmptyNodePos, lastNotEmptyNodePos, firstNodePos, lastNodePos];\n}\n\nexport function trimContent(fragment: Fragment, creatEmptyFragment?: () => Fragment): Fragment {\n const [notEmptyStart, notEmptyEnd, start, end] = findNotEmptyContentPosses(fragment);\n\n if (notEmptyStart === start && notEmptyEnd === end) {\n return fragment;\n } else if (notEmptyStart === -1 && notEmptyEnd === -1) {\n return creatEmptyFragment ? creatEmptyFragment() : Fragment.empty;\n }\n\n return fragment.cut(notEmptyStart + 1, notEmptyEnd + 1);\n}\n"]}
|
|
@@ -5,6 +5,7 @@ import { actions } from "./actions.js";
|
|
|
5
5
|
import { joinPrevList, toList } from "./commands.js";
|
|
6
6
|
import { ListAction } from "./const.js";
|
|
7
7
|
import { ListsInputRulesExtension } from "./inputrules.js";
|
|
8
|
+
import { collapseListsPlugin } from "./plugins/CollapseListsPlugin.js";
|
|
8
9
|
import { mergeListsPlugin } from "./plugins/MergeListsPlugin.js";
|
|
9
10
|
export { ListNode, ListsAttr, blType, liType, olType } from "./ListsSpecs/index.js";
|
|
10
11
|
export const Lists = (builder, opts) => {
|
|
@@ -30,6 +31,7 @@ export const Lists = (builder, opts) => {
|
|
|
30
31
|
}), builder.Priority.Low);
|
|
31
32
|
builder.use(ListsInputRulesExtension, { bulletListInputRule: opts?.ulInputRules });
|
|
32
33
|
builder.addPlugin(mergeListsPlugin);
|
|
34
|
+
builder.addPlugin(collapseListsPlugin);
|
|
33
35
|
builder
|
|
34
36
|
.addAction(ListAction.ToBulletList, actions.toBulletList)
|
|
35
37
|
.addAction(ListAction.ToOrderedList, actions.toOrderedList)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Lists/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAC,MAAM,yBAAyB,CAAC;AAGlF,OAAO,EAAC,aAAa,EAAC,iCAA8B;AAEpD,OAAO,EAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC,8BAAqB;AAChE,OAAO,EAAC,OAAO,EAAC,qBAAkB;AAClC,OAAO,EAAC,YAAY,EAAE,MAAM,EAAC,sBAAmB;AAChD,OAAO,EAAC,UAAU,EAAC,mBAAgB;AACnC,OAAO,EAAC,wBAAwB,EAA8B,wBAAqB;AACnF,OAAO,EAAC,gBAAgB,EAAC,sCAAmC;AAE5D,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC,8BAAqB;AAQzE,MAAM,CAAC,MAAM,KAAK,GAAgC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAChE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAExB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE;QAC3B,MAAM,EAAC,KAAK,EAAE,KAAK,EAAC,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAElF,OAAO;YACH,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAEzC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAErC,GAAG,QAAQ;SACd,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE1B,OAAO,CAAC,SAAS,CACb,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;QACX,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,SAAS,EAAE,YAAY;KAC1B,CAAC,EACF,OAAO,CAAC,QAAQ,CAAC,GAAG,CACvB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,EAAC,mBAAmB,EAAE,IAAI,EAAE,YAAY,EAAC,CAAC,CAAC;IAEjF,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAEpC,OAAO;SACF,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC;SACxD,SAAS,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC;SAC1D,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC;SACxD,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;AAClE,CAAC,CAAC","sourcesContent":["import {liftListItem, sinkListItem, splitListItem} from 'prosemirror-schema-list';\n\nimport type {Action, ExtensionAuto, Keymap} from '../../../core';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {ListsSpecs, blType, liType, olType} from './ListsSpecs';\nimport {actions} from './actions';\nimport {joinPrevList, toList} from './commands';\nimport {ListAction} from './const';\nimport {ListsInputRulesExtension, type ListsInputRulesOptions} from './inputrules';\nimport {mergeListsPlugin} from './plugins/MergeListsPlugin';\n\nexport {ListNode, ListsAttr, blType, liType, olType} from './ListsSpecs';\n\nexport type ListsOptions = {\n ulKey?: string | null;\n olKey?: string | null;\n ulInputRules?: ListsInputRulesOptions['bulletListInputRule'];\n};\n\nexport const Lists: ExtensionAuto<ListsOptions> = (builder, opts) => {\n builder.use(ListsSpecs);\n\n builder.addKeymap(({schema}) => {\n const {ulKey, olKey} = opts ?? {};\n const bindings: Keymap = {};\n if (ulKey) bindings[ulKey] = withLogAction('bulletList', toList(blType(schema)));\n if (olKey) bindings[olKey] = withLogAction('orderedList', toList(olType(schema)));\n\n return {\n Tab: sinkListItem(liType(schema)),\n 'Shift-Tab': liftListItem(liType(schema)),\n\n 'Mod-[': liftListItem(liType(schema)),\n 'Mod-]': sinkListItem(liType(schema)),\n\n ...bindings,\n };\n }, builder.Priority.High);\n\n builder.addKeymap(\n ({schema}) => ({\n Enter: splitListItem(liType(schema)),\n Backspace: joinPrevList,\n }),\n builder.Priority.Low,\n );\n\n builder.use(ListsInputRulesExtension, {bulletListInputRule: opts?.ulInputRules});\n\n builder.addPlugin(mergeListsPlugin);\n\n builder\n .addAction(ListAction.ToBulletList, actions.toBulletList)\n .addAction(ListAction.ToOrderedList, actions.toOrderedList)\n .addAction(ListAction.SinkListItem, actions.sinkListItem)\n .addAction(ListAction.LiftListItem, actions.liftListItem);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [ListAction.ToBulletList]: Action;\n [ListAction.ToOrderedList]: Action;\n [ListAction.SinkListItem]: Action;\n [ListAction.LiftListItem]: Action;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Lists/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAC,MAAM,yBAAyB,CAAC;AAGlF,OAAO,EAAC,aAAa,EAAC,iCAA8B;AAEpD,OAAO,EAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC,8BAAqB;AAChE,OAAO,EAAC,OAAO,EAAC,qBAAkB;AAClC,OAAO,EAAC,YAAY,EAAE,MAAM,EAAC,sBAAmB;AAChD,OAAO,EAAC,UAAU,EAAC,mBAAgB;AACnC,OAAO,EAAC,wBAAwB,EAA8B,wBAAqB;AACnF,OAAO,EAAC,mBAAmB,EAAC,yCAAsC;AAClE,OAAO,EAAC,gBAAgB,EAAC,sCAAmC;AAE5D,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC,8BAAqB;AAQzE,MAAM,CAAC,MAAM,KAAK,GAAgC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAChE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAExB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE;QAC3B,MAAM,EAAC,KAAK,EAAE,KAAK,EAAC,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAElF,OAAO;YACH,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAEzC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAErC,GAAG,QAAQ;SACd,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE1B,OAAO,CAAC,SAAS,CACb,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;QACX,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,SAAS,EAAE,YAAY;KAC1B,CAAC,EACF,OAAO,CAAC,QAAQ,CAAC,GAAG,CACvB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,EAAC,mBAAmB,EAAE,IAAI,EAAE,YAAY,EAAC,CAAC,CAAC;IAEjF,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAEpC,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAEvC,OAAO;SACF,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC;SACxD,SAAS,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC;SAC1D,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC;SACxD,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;AAClE,CAAC,CAAC","sourcesContent":["import {liftListItem, sinkListItem, splitListItem} from 'prosemirror-schema-list';\n\nimport type {Action, ExtensionAuto, Keymap} from '../../../core';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {ListsSpecs, blType, liType, olType} from './ListsSpecs';\nimport {actions} from './actions';\nimport {joinPrevList, toList} from './commands';\nimport {ListAction} from './const';\nimport {ListsInputRulesExtension, type ListsInputRulesOptions} from './inputrules';\nimport {collapseListsPlugin} from './plugins/CollapseListsPlugin';\nimport {mergeListsPlugin} from './plugins/MergeListsPlugin';\n\nexport {ListNode, ListsAttr, blType, liType, olType} from './ListsSpecs';\n\nexport type ListsOptions = {\n ulKey?: string | null;\n olKey?: string | null;\n ulInputRules?: ListsInputRulesOptions['bulletListInputRule'];\n};\n\nexport const Lists: ExtensionAuto<ListsOptions> = (builder, opts) => {\n builder.use(ListsSpecs);\n\n builder.addKeymap(({schema}) => {\n const {ulKey, olKey} = opts ?? {};\n const bindings: Keymap = {};\n if (ulKey) bindings[ulKey] = withLogAction('bulletList', toList(blType(schema)));\n if (olKey) bindings[olKey] = withLogAction('orderedList', toList(olType(schema)));\n\n return {\n Tab: sinkListItem(liType(schema)),\n 'Shift-Tab': liftListItem(liType(schema)),\n\n 'Mod-[': liftListItem(liType(schema)),\n 'Mod-]': sinkListItem(liType(schema)),\n\n ...bindings,\n };\n }, builder.Priority.High);\n\n builder.addKeymap(\n ({schema}) => ({\n Enter: splitListItem(liType(schema)),\n Backspace: joinPrevList,\n }),\n builder.Priority.Low,\n );\n\n builder.use(ListsInputRulesExtension, {bulletListInputRule: opts?.ulInputRules});\n\n builder.addPlugin(mergeListsPlugin);\n\n builder.addPlugin(collapseListsPlugin);\n\n builder\n .addAction(ListAction.ToBulletList, actions.toBulletList)\n .addAction(ListAction.ToOrderedList, actions.toOrderedList)\n .addAction(ListAction.SinkListItem, actions.sinkListItem)\n .addAction(ListAction.LiftListItem, actions.liftListItem);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [ListAction.ToBulletList]: Action;\n [ListAction.ToOrderedList]: Action;\n [ListAction.SinkListItem]: Action;\n [ListAction.LiftListItem]: Action;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Plugin, type Transaction } from 'prosemirror-state';
|
|
2
|
+
import { findChildren } from 'prosemirror-utils';
|
|
3
|
+
export declare const collapseListsPlugin: () => Plugin<any>;
|
|
4
|
+
export declare function collapseEmptyListItems(tr: Transaction, nodes: ReturnType<typeof findChildren>): number;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Fragment } from 'prosemirror-model';
|
|
2
|
+
import { Plugin, TextSelection } from 'prosemirror-state';
|
|
3
|
+
// @ts-ignore // TODO: fix cjs build
|
|
4
|
+
import { findChildren, hasParentNode } from 'prosemirror-utils';
|
|
5
|
+
import { getChildrenOfNode } from "../../../../utils/index.js";
|
|
6
|
+
import { isListItemNode, isListNode, liType } from "../utils.js";
|
|
7
|
+
export const collapseListsPlugin = () => new Plugin({
|
|
8
|
+
appendTransaction(trs, oldState, newState) {
|
|
9
|
+
const docChanged = trs.some((tr) => tr.docChanged);
|
|
10
|
+
if (!docChanged)
|
|
11
|
+
return null;
|
|
12
|
+
const hasParentList = hasParentNode(isListNode)(newState.selection) ||
|
|
13
|
+
hasParentNode(isListNode)(oldState.selection);
|
|
14
|
+
if (!hasParentList)
|
|
15
|
+
return null;
|
|
16
|
+
const { tr } = newState;
|
|
17
|
+
let prevStepsCount = -1;
|
|
18
|
+
let currentStepsCount = 0;
|
|
19
|
+
// execute until there are no nested lists.
|
|
20
|
+
while (prevStepsCount !== currentStepsCount) {
|
|
21
|
+
const listNodes = findChildren(tr.doc, isListNode, true);
|
|
22
|
+
prevStepsCount = currentStepsCount;
|
|
23
|
+
currentStepsCount = collapseEmptyListItems(tr, listNodes);
|
|
24
|
+
}
|
|
25
|
+
return tr.docChanged ? tr : null;
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
export function collapseEmptyListItems(tr, nodes) {
|
|
29
|
+
const stepsCountBefore = tr.steps.length;
|
|
30
|
+
// TODO: fix cjs build
|
|
31
|
+
nodes.reverse().forEach((list) => {
|
|
32
|
+
const listNode = list.node;
|
|
33
|
+
const listPos = list.pos;
|
|
34
|
+
const childrenOfList = getChildrenOfNode(listNode).reverse();
|
|
35
|
+
childrenOfList.forEach(({ node: itemNode, offset }) => {
|
|
36
|
+
if (isListItemNode(itemNode)) {
|
|
37
|
+
const { firstChild } = itemNode;
|
|
38
|
+
const listItemNodePos = listPos + 1 + offset;
|
|
39
|
+
// if the first child of a list element is a list,
|
|
40
|
+
// then collapse is required
|
|
41
|
+
if (firstChild && isListNode(firstChild)) {
|
|
42
|
+
const nestedList = firstChild.content;
|
|
43
|
+
// nodes at the same level as the list
|
|
44
|
+
const remainingNodes = itemNode.content.content.slice(1);
|
|
45
|
+
const listItems = remainingNodes.length
|
|
46
|
+
? nestedList.append(Fragment.from(liType(tr.doc.type.schema).create(null, remainingNodes)))
|
|
47
|
+
: nestedList;
|
|
48
|
+
const mappedStart = tr.mapping.map(listItemNodePos);
|
|
49
|
+
const mappedEnd = tr.mapping.map(listItemNodePos + itemNode.nodeSize);
|
|
50
|
+
tr.replaceWith(mappedStart, mappedEnd, listItems);
|
|
51
|
+
const closestTextNodePos = findClosestTextNodePos(tr.doc, mappedStart + nestedList.size);
|
|
52
|
+
if (closestTextNodePos) {
|
|
53
|
+
tr.setSelection(TextSelection.create(tr.doc, closestTextNodePos));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
return tr.steps.length - stepsCountBefore;
|
|
60
|
+
}
|
|
61
|
+
function findClosestTextNodePos(doc, pos) {
|
|
62
|
+
while (pos < doc.content.size) {
|
|
63
|
+
const node = doc.nodeAt(pos);
|
|
64
|
+
if (node && node.isText) {
|
|
65
|
+
return pos;
|
|
66
|
+
}
|
|
67
|
+
pos++;
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=CollapseListsPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollapseListsPlugin.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/Lists/plugins/CollapseListsPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node} from 'prosemirror-model';\nimport {Plugin, TextSelection, type Transaction} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildren, hasParentNode} from 'prosemirror-utils';\n\nimport {getChildrenOfNode} from '../../../../utils';\nimport {isListItemNode, isListNode, liType} from '../utils';\n\nexport const collapseListsPlugin = () =>\n new Plugin({\n appendTransaction(trs, oldState, newState) {\n const docChanged = trs.some((tr) => tr.docChanged);\n if (!docChanged) return null;\n\n const hasParentList =\n hasParentNode(isListNode)(newState.selection) ||\n hasParentNode(isListNode)(oldState.selection);\n if (!hasParentList) return null;\n\n const {tr} = newState;\n let prevStepsCount = -1;\n let currentStepsCount = 0;\n\n // execute until there are no nested lists.\n while (prevStepsCount !== currentStepsCount) {\n const listNodes = findChildren(tr.doc, isListNode, true);\n prevStepsCount = currentStepsCount;\n currentStepsCount = collapseEmptyListItems(tr, listNodes);\n }\n\n return tr.docChanged ? tr : null;\n },\n });\n\nexport function collapseEmptyListItems(\n tr: Transaction,\n nodes: ReturnType<typeof findChildren>,\n): number {\n const stepsCountBefore = tr.steps.length;\n // TODO: fix cjs build\n nodes.reverse().forEach((list: {node: Node; pos: number}) => {\n const listNode = list.node;\n const listPos = list.pos;\n const childrenOfList = getChildrenOfNode(listNode).reverse();\n\n childrenOfList.forEach(({node: itemNode, offset}) => {\n if (isListItemNode(itemNode)) {\n const {firstChild} = itemNode;\n const listItemNodePos = listPos + 1 + offset;\n\n // if the first child of a list element is a list,\n // then collapse is required\n if (firstChild && isListNode(firstChild)) {\n const nestedList = firstChild.content;\n\n // nodes at the same level as the list\n const remainingNodes = itemNode.content.content.slice(1);\n\n const listItems = remainingNodes.length\n ? nestedList.append(\n Fragment.from(\n liType(tr.doc.type.schema).create(null, remainingNodes),\n ),\n )\n : nestedList;\n\n const mappedStart = tr.mapping.map(listItemNodePos);\n const mappedEnd = tr.mapping.map(listItemNodePos + itemNode.nodeSize);\n\n tr.replaceWith(mappedStart, mappedEnd, listItems);\n\n const closestTextNodePos = findClosestTextNodePos(\n tr.doc,\n mappedStart + nestedList.size,\n );\n if (closestTextNodePos) {\n tr.setSelection(TextSelection.create(tr.doc, closestTextNodePos));\n }\n }\n }\n });\n });\n\n return tr.steps.length - stepsCountBefore;\n}\n\nfunction findClosestTextNodePos(doc: Node, pos: number): number | null {\n while (pos < doc.content.size) {\n const node = doc.nodeAt(pos);\n if (node && node.isText) {\n return pos;\n }\n pos++;\n }\n return null;\n}\n"]}
|
package/build/esm/utils/nodes.js
CHANGED
|
@@ -45,4 +45,15 @@ export function getLastChildOfNode(node) {
|
|
|
45
45
|
const children = getChildrenOfNode(node);
|
|
46
46
|
return children[children.length - 1];
|
|
47
47
|
}
|
|
48
|
+
export const isEmptyString = (node) => {
|
|
49
|
+
if (node.type.name === 'paragraph' && !node.content.size) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
if (node.childCount === 1 &&
|
|
53
|
+
node.child(0).type.name === 'text' &&
|
|
54
|
+
node.child(0).text?.trim() === '') {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
};
|
|
48
59
|
//# sourceMappingURL=nodes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.js","sourceRoot":"../../../src","sources":["utils/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAC,MAAM,mBAAmB,CAAC;AACtD,oCAAoC;AACpC,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAE/C,MAAM,UAAU,uBAAuB,CACnC,MAAuB;IAEvB,IAAI,MAAM,YAAY,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9E,KAAK,MAAM,KAAK,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QACzC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,oBAAoB,EAAE,CAAC;YACvB,OAAO;gBACH,IAAI,EAAE,oBAAoB,CAAC,IAAI;gBAC/B,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,oBAAoB,CAAC,MAAM;aACrD,CAAC;QACN,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAU,EAAE,EAAE;IACtC,MAAM,aAAa,GAAG,YAAY,CAC9B,IAAI,EACJ,CAAC,CAAO,EAAE,EAAE,CACR,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;QAC/E,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,EAChC,IAAI,CACP,CAAC;IAEF,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;QAClB,gBAAgB,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO,aAAa,CAAC,MAAM,KAAK,gBAAgB,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,EAAE;IAC3C,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACtD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACzE,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5D,CAAC;AAGD,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACnD,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAqB;IACpD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC","sourcesContent":["import {type Fragment, Node} from 'prosemirror-model';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildren} from 'prosemirror-utils';\n\nexport function findFirstTextblockChild(\n parent: Node | Fragment,\n): {node: Node; offset: number} | null {\n if (parent instanceof Node && (!parent.isBlock || parent.isAtom)) return null;\n\n for (const child of getChildrenOfNode(parent)) {\n if (child.node.isTextblock) return child;\n const nestedTextBlockChild = findFirstTextblockChild(child.node);\n if (nestedTextBlockChild) {\n return {\n node: nestedTextBlockChild.node,\n offset: child.offset + nestedTextBlockChild.offset,\n };\n }\n }\n\n return null;\n}\n\nexport const isNodeEmpty = (node: Node) => {\n const emptyChildren = findChildren(\n node,\n (n: Node) =>\n (!n.isText && !n.isAtom && n.content.size === 0 && n.type.name === 'paragraph') ||\n (n.isText && !n.textContent),\n true,\n );\n\n let descendantsCount = 0;\n\n node.descendants(() => {\n descendantsCount++;\n });\n\n return emptyChildren.length === descendantsCount;\n};\n\nexport const isSelectableNode = (node: Node) => {\n if (node.type.spec.selectable === false) return false;\n if (node.type.isText && node.type.spec.selectable !== true) return false;\n return true;\n};\n\nexport function isCodeBlock(node: Node): boolean {\n return node.isTextblock && Boolean(node.type.spec.code);\n}\n\nexport type NodeChild = {node: Node; offset: number; index: number};\nexport function getChildrenOfNode(node: Node | Fragment): NodeChild[] {\n const children: NodeChild[] = [];\n node.forEach((node, offset, index) => children.push({node, offset, index}));\n return children;\n}\n\nexport function getLastChildOfNode(node: Node | Fragment): NodeChild {\n const children = getChildrenOfNode(node);\n return children[children.length - 1];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"nodes.js","sourceRoot":"../../../src","sources":["utils/nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import {type Fragment, Node} from 'prosemirror-model';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildren} from 'prosemirror-utils';\n\nexport function findFirstTextblockChild(\n parent: Node | Fragment,\n): {node: Node; offset: number} | null {\n if (parent instanceof Node && (!parent.isBlock || parent.isAtom)) return null;\n\n for (const child of getChildrenOfNode(parent)) {\n if (child.node.isTextblock) return child;\n const nestedTextBlockChild = findFirstTextblockChild(child.node);\n if (nestedTextBlockChild) {\n return {\n node: nestedTextBlockChild.node,\n offset: child.offset + nestedTextBlockChild.offset,\n };\n }\n }\n\n return null;\n}\n\nexport const isNodeEmpty = (node: Node) => {\n const emptyChildren = findChildren(\n node,\n (n: Node) =>\n (!n.isText && !n.isAtom && n.content.size === 0 && n.type.name === 'paragraph') ||\n (n.isText && !n.textContent),\n true,\n );\n\n let descendantsCount = 0;\n\n node.descendants(() => {\n descendantsCount++;\n });\n\n return emptyChildren.length === descendantsCount;\n};\n\nexport const isSelectableNode = (node: Node) => {\n if (node.type.spec.selectable === false) return false;\n if (node.type.isText && node.type.spec.selectable !== true) return false;\n return true;\n};\n\nexport function isCodeBlock(node: Node): boolean {\n return node.isTextblock && Boolean(node.type.spec.code);\n}\n\nexport type NodeChild = {node: Node; offset: number; index: number};\nexport function getChildrenOfNode(node: Node | Fragment): NodeChild[] {\n const children: NodeChild[] = [];\n node.forEach((node, offset, index) => children.push({node, offset, index}));\n return children;\n}\n\nexport function getLastChildOfNode(node: Node | Fragment): NodeChild {\n const children = getChildrenOfNode(node);\n return children[children.length - 1];\n}\n\nexport const isEmptyString = (node: Node) => {\n if (node.type.name === 'paragraph' && !node.content.size) {\n return true;\n }\n\n if (\n node.childCount === 1 &&\n node.child(0).type.name === 'text' &&\n node.child(0).text?.trim() === ''\n ) {\n return true;\n }\n\n return false;\n};\n"]}
|
package/build/esm/version.js
CHANGED
package/build/esm/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.3.0' !== 'undefined' ? '15.3.0' : 'unknown';\n"]}
|