@plone/volto 18.0.0-alpha.2 → 18.0.0-alpha.4
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/.eslintrc +3 -3
- package/.prettierignore +8 -0
- package/.prettierrc +12 -0
- package/{packages/registry/.release-it.json → .release-it.json} +11 -6
- package/CHANGELOG.md +44 -4
- package/locales/ca/LC_MESSAGES/volto.po +1 -0
- package/locales/de/LC_MESSAGES/volto.po +1 -0
- package/locales/en/LC_MESSAGES/volto.po +1 -0
- package/locales/es/LC_MESSAGES/volto.po +1 -0
- package/locales/eu/LC_MESSAGES/volto.po +1 -0
- package/locales/fi/LC_MESSAGES/volto.po +1 -0
- package/locales/fr/LC_MESSAGES/volto.po +1 -0
- package/locales/it/LC_MESSAGES/volto.po +1 -0
- package/locales/ja/LC_MESSAGES/volto.po +1 -0
- package/locales/nl/LC_MESSAGES/volto.po +1 -0
- package/locales/pt/LC_MESSAGES/volto.po +1 -0
- package/locales/pt_BR/LC_MESSAGES/volto.po +1 -0
- package/locales/ro/LC_MESSAGES/volto.po +1 -0
- package/locales/volto.pot +2 -1
- package/locales/zh_CN/LC_MESSAGES/volto.po +1 -0
- package/package.json +57 -127
- package/razzle.config.js +4 -7
- package/src/components/manage/Blocks/Video/Body.jsx +52 -22
- package/src/components/manage/Blocks/Video/Body.test.jsx +167 -0
- package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +2 -2
- package/src/components/manage/Form/Form.jsx +5 -2
- package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +19 -2
- package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +46 -39
- package/src/config/index.js +0 -4
- package/src/icons/divide-horizontal.svg +0 -0
- package/src/icons/divide-vertical.svg +0 -0
- package/src/icons/hero.svg +0 -0
- package/src/icons/slider.svg +0 -0
- package/src/icons/summary.svg +0 -0
- package/src/middleware/api.js +1 -1
- package/theme/themes/default/elements/icon.overrides +0 -0
- package/theme/themes/default/globals/reset.overrides +0 -0
- package/theme/themes/default/globals/site.variables +0 -0
- package/theme/themes/default/modules/dropdown.overrides +0 -0
- package/theme/themes/default/modules/dropdown.variables +0 -0
- package/theme/themes/default/modules/modal.variables +0 -0
- package/theme/themes/default/modules/video.overrides +0 -0
- package/theme/themes/default/modules/video.variables +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.eot +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.svg +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.ttf +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.woff +0 -0
- package/theme/themes/pastanaga/globals/reset.overrides +0 -0
- package/theme/themes/pastanaga/globals/site.variables +0 -0
- package/theme/themes/pastanaga/modules/dropdown.variables +0 -0
- package/theme/themes/pastanaga/modules/modal.variables +0 -0
- package/theme/themes/pastanaga/modules/video.overrides +0 -0
- package/theme/themes/pastanaga/modules/video.variables +0 -0
- package/tsconfig.json +1 -4
- package/types/components/manage/Blocks/Video/Body.d.ts +5 -0
- package/types/config/RichTextEditor/index.d.ts +5 -8
- package/types/helpers/AsyncConnect/index.d.ts +2 -2
- package/types/helpers/Url/Url.d.ts +3 -3
- package/types/icons/load-icons.d.ts +1 -1
- package/webpack-plugins/webpack-less-plugin.js +1 -0
- package/CODE_OF_CONDUCT.md +0 -13
- package/CONTRIBUTING.md +0 -7
- package/README.md +0 -154
- package/RELEASING.md +0 -73
- package/ROADMAP.md +0 -30
- package/SECURITY.md +0 -14
- package/logos/Logo.png +0 -0
- package/logos/VoltoLogoEra2-dark-mode.png +0 -0
- package/logos/VoltoLogoEra2.png +0 -0
- package/logos/volto-colorful.png +0 -0
- package/logos/volto-colorful.svg +0 -35
- package/logos/volto-guide.png +0 -0
- package/logos/volto-h-transparent.svg +0 -6
- package/logos/volto-transparent.png +0 -0
- package/logos/volto-transparent.svg +0 -19
- package/logos/volto-transparent2.svg +0 -5
- package/logos/volto-yellow.svg +0 -29
- package/logos/volto.sketch +0 -0
- package/packages/README.md +0 -7
- package/packages/registry/.towncrier/towncrier_template.jinja +0 -10
- package/packages/registry/CHANGELOG.md +0 -16
- package/packages/registry/README.md +0 -207
- package/packages/registry/addon-registry.js +0 -603
- package/packages/registry/create-addons-loader.js +0 -116
- package/packages/registry/create-theme-addons-loader.js +0 -78
- package/packages/registry/news/.gitkeep +0 -0
- package/packages/registry/package.json +0 -76
- package/packages/registry/src/index.ts +0 -174
- package/packages/registry/src/registry.test.js +0 -111
- package/packages/registry/tsconfig.json +0 -32
- package/packages/scripts/CHANGELOG.md +0 -173
- package/packages/scripts/README.md +0 -128
- package/packages/scripts/addon/consolidate.js +0 -28
- package/packages/scripts/addon/generators.js +0 -213
- package/packages/scripts/addon/getAddonInfo.js +0 -65
- package/packages/scripts/addon/index.js +0 -88
- package/packages/scripts/addon/utils.js +0 -44
- package/packages/scripts/backportpr.js +0 -75
- package/packages/scripts/changelogupdater.cjs +0 -94
- package/packages/scripts/corepackagebump.js +0 -20
- package/packages/scripts/i18n.cjs +0 -310
- package/packages/scripts/package.json +0 -76
- package/packages/scripts/templates/towncrier_template.jinja +0 -10
- package/packages/types/Blocks/View.ts +0 -11
- package/packages/types/actions.ts +0 -15
- package/packages/types/breadcrumbs.ts +0 -10
- package/packages/types/config/Blocks.ts +0 -153
- package/packages/types/config/Content.ts +0 -62
- package/packages/types/config/Settings.ts +0 -86
- package/packages/types/config/Views.ts +0 -15
- package/packages/types/config/Widgets.ts +0 -7
- package/packages/types/config/index.ts +0 -21
- package/packages/types/content/common.ts +0 -60
- package/packages/types/content/get.ts +0 -66
- package/packages/types/index.ts +0 -0
- package/packages/types/navigation.ts +0 -12
- package/packages/types/package.json +0 -64
- package/packages/types/types.ts +0 -61
- package/packages/volto-slate/.i18n.babel.config.js +0 -1
- package/packages/volto-slate/README.md +0 -4
- package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +0 -90
- package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +0 -6
- package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +0 -6
- package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +0 -6
- package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +0 -10
- package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +0 -10
- package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +0 -30
- package/packages/volto-slate/build/messages/src/elementEditor/messages.json +0 -10
- package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +0 -6
- package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +0 -6
- package/packages/volto-slate/locales/de/LC_MESSAGES/volto.po +0 -148
- package/packages/volto-slate/locales/en/LC_MESSAGES/volto.po +0 -148
- package/packages/volto-slate/locales/volto.pot +0 -182
- package/packages/volto-slate/package.json +0 -43
- package/packages/volto-slate/src/actions/content.js +0 -30
- package/packages/volto-slate/src/actions/index.js +0 -3
- package/packages/volto-slate/src/actions/plugins.js +0 -9
- package/packages/volto-slate/src/actions/selection.js +0 -22
- package/packages/volto-slate/src/blocks/Table/Cell.jsx +0 -87
- package/packages/volto-slate/src/blocks/Table/Cell.test.js +0 -54
- package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +0 -694
- package/packages/volto-slate/src/blocks/Table/TableBlockEdit.test.js +0 -40
- package/packages/volto-slate/src/blocks/Table/TableBlockView.jsx +0 -150
- package/packages/volto-slate/src/blocks/Table/TableBlockView.test.js +0 -49
- package/packages/volto-slate/src/blocks/Table/deconstruct.js +0 -113
- package/packages/volto-slate/src/blocks/Table/extensions/normalizeTable.js +0 -5
- package/packages/volto-slate/src/blocks/Table/index.js +0 -60
- package/packages/volto-slate/src/blocks/Table/schema.js +0 -122
- package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +0 -304
- package/packages/volto-slate/src/blocks/Text/DetachedTextBlockEditor.jsx +0 -77
- package/packages/volto-slate/src/blocks/Text/MarkdownIntroduction.jsx +0 -59
- package/packages/volto-slate/src/blocks/Text/PluginSidebar.jsx +0 -18
- package/packages/volto-slate/src/blocks/Text/ShortcutListing.jsx +0 -28
- package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +0 -203
- package/packages/volto-slate/src/blocks/Text/TextBlockEdit.jsx +0 -38
- package/packages/volto-slate/src/blocks/Text/TextBlockEdit.test.js +0 -107
- package/packages/volto-slate/src/blocks/Text/TextBlockSchema.js +0 -54
- package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +0 -31
- package/packages/volto-slate/src/blocks/Text/css/editor.css +0 -18
- package/packages/volto-slate/src/blocks/Text/extensions/Readme.md +0 -49
- package/packages/volto-slate/src/blocks/Text/extensions/breakList.js +0 -100
- package/packages/volto-slate/src/blocks/Text/extensions/index.js +0 -6
- package/packages/volto-slate/src/blocks/Text/extensions/insertBreak.js +0 -57
- package/packages/volto-slate/src/blocks/Text/extensions/isSelected.js +0 -7
- package/packages/volto-slate/src/blocks/Text/extensions/normalizeExternalData.js +0 -7
- package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +0 -87
- package/packages/volto-slate/src/blocks/Text/extensions/withLists.js +0 -5
- package/packages/volto-slate/src/blocks/Text/index.js +0 -171
- package/packages/volto-slate/src/blocks/Text/keyboard/backspaceInList.js +0 -58
- package/packages/volto-slate/src/blocks/Text/keyboard/breakBlocks.js +0 -3
- package/packages/volto-slate/src/blocks/Text/keyboard/cancelEsc.js +0 -7
- package/packages/volto-slate/src/blocks/Text/keyboard/indentListItems.js +0 -240
- package/packages/volto-slate/src/blocks/Text/keyboard/index.js +0 -52
- package/packages/volto-slate/src/blocks/Text/keyboard/joinBlocks.js +0 -180
- package/packages/volto-slate/src/blocks/Text/keyboard/moveListItems.js +0 -124
- package/packages/volto-slate/src/blocks/Text/keyboard/slashMenu.js +0 -19
- package/packages/volto-slate/src/blocks/Text/keyboard/softBreak.js +0 -7
- package/packages/volto-slate/src/blocks/Text/keyboard/traverseBlocks.js +0 -81
- package/packages/volto-slate/src/blocks/Text/keyboard/unwrapEmptyString.js +0 -26
- package/packages/volto-slate/src/blocks/Text/schema.js +0 -39
- package/packages/volto-slate/src/constants.js +0 -123
- package/packages/volto-slate/src/editor/EditorContext.jsx +0 -5
- package/packages/volto-slate/src/editor/EditorReference.jsx +0 -22
- package/packages/volto-slate/src/editor/SlateEditor.jsx +0 -375
- package/packages/volto-slate/src/editor/config.jsx +0 -344
- package/packages/volto-slate/src/editor/decorate.js +0 -68
- package/packages/volto-slate/src/editor/deserialize.js +0 -185
- package/packages/volto-slate/src/editor/extensions/index.js +0 -6
- package/packages/volto-slate/src/editor/extensions/insertBreak.js +0 -15
- package/packages/volto-slate/src/editor/extensions/insertData.js +0 -159
- package/packages/volto-slate/src/editor/extensions/isInline.js +0 -14
- package/packages/volto-slate/src/editor/extensions/normalizeExternalData.js +0 -8
- package/packages/volto-slate/src/editor/extensions/normalizeNode.js +0 -48
- package/packages/volto-slate/src/editor/extensions/withDeserializers.js +0 -15
- package/packages/volto-slate/src/editor/extensions/withTestingFeatures.jsx +0 -84
- package/packages/volto-slate/src/editor/index.js +0 -14
- package/packages/volto-slate/src/editor/less/editor.less +0 -173
- package/packages/volto-slate/src/editor/less/globals.less +0 -18
- package/packages/volto-slate/src/editor/less/slate.less +0 -28
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/deserialize.js +0 -90
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/extensions.js +0 -32
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/index.js +0 -50
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/render.jsx +0 -37
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/schema.js +0 -114
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/styles.less +0 -8
- package/packages/volto-slate/src/editor/plugins/Blockquote/index.js +0 -30
- package/packages/volto-slate/src/editor/plugins/Callout/index.js +0 -34
- package/packages/volto-slate/src/editor/plugins/Image/deconstruct.js +0 -30
- package/packages/volto-slate/src/editor/plugins/Image/extensions.js +0 -51
- package/packages/volto-slate/src/editor/plugins/Image/index.js +0 -11
- package/packages/volto-slate/src/editor/plugins/Image/render.jsx +0 -22
- package/packages/volto-slate/src/editor/plugins/Link/extensions.js +0 -58
- package/packages/volto-slate/src/editor/plugins/Link/index.js +0 -164
- package/packages/volto-slate/src/editor/plugins/Link/render.jsx +0 -54
- package/packages/volto-slate/src/editor/plugins/Markdown/constants.js +0 -81
- package/packages/volto-slate/src/editor/plugins/Markdown/extensions.js +0 -334
- package/packages/volto-slate/src/editor/plugins/Markdown/index.js +0 -28
- package/packages/volto-slate/src/editor/plugins/Markdown/utils.js +0 -198
- package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +0 -153
- package/packages/volto-slate/src/editor/plugins/StyleMenu/index.js +0 -19
- package/packages/volto-slate/src/editor/plugins/StyleMenu/style.less +0 -29
- package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +0 -168
- package/packages/volto-slate/src/editor/plugins/Table/TableButton.jsx +0 -142
- package/packages/volto-slate/src/editor/plugins/Table/TableCell.jsx +0 -44
- package/packages/volto-slate/src/editor/plugins/Table/TableContainer.jsx +0 -37
- package/packages/volto-slate/src/editor/plugins/Table/TableSizePicker.jsx +0 -83
- package/packages/volto-slate/src/editor/plugins/Table/extensions.js +0 -87
- package/packages/volto-slate/src/editor/plugins/Table/index.js +0 -390
- package/packages/volto-slate/src/editor/plugins/Table/less/public.less +0 -29
- package/packages/volto-slate/src/editor/plugins/Table/less/table.less +0 -28
- package/packages/volto-slate/src/editor/plugins/Table/render.jsx +0 -30
- package/packages/volto-slate/src/editor/plugins/index.js +0 -19
- package/packages/volto-slate/src/editor/render.jsx +0 -224
- package/packages/volto-slate/src/editor/ui/BasicToolbar.jsx +0 -11
- package/packages/volto-slate/src/editor/ui/BlockButton.jsx +0 -31
- package/packages/volto-slate/src/editor/ui/ClearFormattingButton.jsx +0 -21
- package/packages/volto-slate/src/editor/ui/ExpandedToolbar.jsx +0 -18
- package/packages/volto-slate/src/editor/ui/Expando.jsx +0 -5
- package/packages/volto-slate/src/editor/ui/InlineToolbar.jsx +0 -73
- package/packages/volto-slate/src/editor/ui/MarkButton.jsx +0 -23
- package/packages/volto-slate/src/editor/ui/MarkElementButton.jsx +0 -30
- package/packages/volto-slate/src/editor/ui/Menu.jsx +0 -13
- package/packages/volto-slate/src/editor/ui/PositionedToolbar.jsx +0 -32
- package/packages/volto-slate/src/editor/ui/Separator.jsx +0 -7
- package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +0 -13
- package/packages/volto-slate/src/editor/ui/SlateToolbar.jsx +0 -96
- package/packages/volto-slate/src/editor/ui/Toolbar.jsx +0 -103
- package/packages/volto-slate/src/editor/ui/ToolbarButton.jsx +0 -33
- package/packages/volto-slate/src/editor/ui/ToolbarButton.test.js +0 -25
- package/packages/volto-slate/src/editor/ui/index.js +0 -15
- package/packages/volto-slate/src/editor/utils.js +0 -248
- package/packages/volto-slate/src/elementEditor/ContextButtons.jsx +0 -56
- package/packages/volto-slate/src/elementEditor/PluginEditor.jsx +0 -124
- package/packages/volto-slate/src/elementEditor/Readme.md +0 -6
- package/packages/volto-slate/src/elementEditor/SchemaProvider.jsx +0 -3
- package/packages/volto-slate/src/elementEditor/SidebarEditor.jsx +0 -46
- package/packages/volto-slate/src/elementEditor/ToolbarButton.jsx +0 -44
- package/packages/volto-slate/src/elementEditor/index.js +0 -5
- package/packages/volto-slate/src/elementEditor/makeInlineElementPlugin.js +0 -100
- package/packages/volto-slate/src/elementEditor/messages.js +0 -14
- package/packages/volto-slate/src/elementEditor/utils.js +0 -226
- package/packages/volto-slate/src/hooks/index.js +0 -3
- package/packages/volto-slate/src/hooks/useEditorContext.js +0 -6
- package/packages/volto-slate/src/hooks/useIsomorphicLayoutEffect.js +0 -7
- package/packages/volto-slate/src/hooks/useSelectionPosition.js +0 -25
- package/packages/volto-slate/src/i18n.js +0 -180
- package/packages/volto-slate/src/icons/hashlink.svg +0 -57
- package/packages/volto-slate/src/index.js +0 -61
- package/packages/volto-slate/src/reducers/content.js +0 -74
- package/packages/volto-slate/src/reducers/index.js +0 -3
- package/packages/volto-slate/src/reducers/plugins.js +0 -17
- package/packages/volto-slate/src/reducers/selection.js +0 -16
- package/packages/volto-slate/src/utils/blocks.js +0 -375
- package/packages/volto-slate/src/utils/blocks.test.js +0 -138
- package/packages/volto-slate/src/utils/editor.js +0 -31
- package/packages/volto-slate/src/utils/image.js +0 -25
- package/packages/volto-slate/src/utils/index.js +0 -11
- package/packages/volto-slate/src/utils/internals.js +0 -46
- package/packages/volto-slate/src/utils/lists.js +0 -92
- package/packages/volto-slate/src/utils/marks.js +0 -104
- package/packages/volto-slate/src/utils/mime-types.js +0 -24
- package/packages/volto-slate/src/utils/nodes.js +0 -4
- package/packages/volto-slate/src/utils/ops.js +0 -20
- package/packages/volto-slate/src/utils/random.js +0 -17
- package/packages/volto-slate/src/utils/selection.js +0 -236
- package/packages/volto-slate/src/utils/slate-string-utils.js +0 -408
- package/packages/volto-slate/src/utils/volto-blocks.js +0 -314
- package/packages/volto-slate/src/widgets/ErrorBoundary.jsx +0 -27
- package/packages/volto-slate/src/widgets/HtmlSlateWidget.jsx +0 -139
- package/packages/volto-slate/src/widgets/ObjectByTypeWidget.jsx +0 -49
- package/packages/volto-slate/src/widgets/RichTextWidget.jsx +0 -72
- package/packages/volto-slate/src/widgets/RichTextWidgetView.jsx +0 -37
- package/packages/volto-slate/src/widgets/style.css +0 -21
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { Transforms, createEditor } from 'slate'; // , Transforms
|
|
2
|
-
import { withReact, ReactEditor } from 'slate-react';
|
|
3
|
-
|
|
4
|
-
import config from '@plone/volto/registry';
|
|
5
|
-
|
|
6
|
-
export function setEditorContent(editor, block) {
|
|
7
|
-
Transforms.removeNodes(editor, { at: [0] }); // TODO: at: [] needs rethinking
|
|
8
|
-
Transforms.insertNodes(editor, block);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function makeEditor(options = {}) {
|
|
12
|
-
const { extensions = [] } = options;
|
|
13
|
-
const { slate } = config.settings;
|
|
14
|
-
const defaultExtensions = slate.extensions;
|
|
15
|
-
|
|
16
|
-
const editor = withReact(createEditor());
|
|
17
|
-
|
|
18
|
-
// TODO: also look for MIME Types in the files case
|
|
19
|
-
editor.dataTransferFormatsOrder = [
|
|
20
|
-
'application/x-slate-fragment',
|
|
21
|
-
'text/html',
|
|
22
|
-
'files',
|
|
23
|
-
'text/plain',
|
|
24
|
-
];
|
|
25
|
-
editor.dataTransferHandlers = {};
|
|
26
|
-
|
|
27
|
-
const plugins = [...defaultExtensions, ...extensions];
|
|
28
|
-
editor.isSelected = () => ReactEditor.isFocused(editor);
|
|
29
|
-
|
|
30
|
-
return plugins.reduce((acc, extender) => extender(acc), editor);
|
|
31
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export function srcToDataUri(url, callback) {
|
|
2
|
-
// Based on https://github.com/ianstormtaylor/slate-plugins
|
|
3
|
-
const canvas = window.document.createElement('canvas');
|
|
4
|
-
const img = window.document.createElement('img');
|
|
5
|
-
|
|
6
|
-
if (!canvas.getContext) {
|
|
7
|
-
return setTimeout(callback, 0, new Error('Canvas is not supported.'));
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
img.onload = () => {
|
|
11
|
-
const ctx = canvas.getContext('2d');
|
|
12
|
-
canvas.width = img.width;
|
|
13
|
-
canvas.height = img.height;
|
|
14
|
-
ctx.drawImage(img, 0, 0);
|
|
15
|
-
const dataUri = canvas.toDataURL('image/png');
|
|
16
|
-
callback(null, dataUri);
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
img.ononerror = () => {
|
|
20
|
-
callback(new Error('Failed to load image.'));
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
img.setAttribute('crossOrigin', 'anonymous');
|
|
24
|
-
img.src = url;
|
|
25
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export * from './blocks';
|
|
2
|
-
export * from './editor';
|
|
3
|
-
export * from './internals';
|
|
4
|
-
export * from './lists';
|
|
5
|
-
export * from './marks';
|
|
6
|
-
export * from './nodes';
|
|
7
|
-
export * from './ops';
|
|
8
|
-
export * from './random';
|
|
9
|
-
export * from './selection';
|
|
10
|
-
export * from './volto-blocks';
|
|
11
|
-
export * from './mime-types';
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { Editor } from 'slate';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @param {Point} point The point to verify.
|
|
5
|
-
* @returns {boolean} Whether it refers to a (leaf) Text node in the closest-to-root level it can be.
|
|
6
|
-
*/
|
|
7
|
-
export const isPointAtRoot = (point) => point.path.length === 2;
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* @summary Returns true if the specified range has any of its edges at the
|
|
11
|
-
* closest-to-root level a Point can be (a Point can only reffer to Text
|
|
12
|
-
* nodes).
|
|
13
|
-
* @description It does not assure the caller about whether the contents of the
|
|
14
|
-
* range are at block level, but it does assure that one of the edges of the
|
|
15
|
-
* given range is at closest-to-root level it can be. A range can cover inner
|
|
16
|
-
* node children though. If through "inner node child" we also understand the
|
|
17
|
-
* closest-to-root level Leaf nodes can be (taking into account this: Editor
|
|
18
|
-
* - level 0, blocks - level 1, blocks and leaves - level 2, it is level 2)
|
|
19
|
-
* then the cursor specified by the given range can include inner node
|
|
20
|
-
* childs and the return value can be true at the same time. Practically the
|
|
21
|
-
* cursor is always at block level since nothing exists outside blocks in
|
|
22
|
-
* Slate and is always in Text nodes since a Point can only reffer to an
|
|
23
|
-
* offset in a Text node.
|
|
24
|
-
* @param {Range} range Must be a valid `Range`, not `null` or `undefined`.
|
|
25
|
-
* @returns {boolean}
|
|
26
|
-
*/
|
|
27
|
-
export const isRangeAtRoot = (range) => {
|
|
28
|
-
return isPointAtRoot(range.anchor) || isPointAtRoot(range.focus);
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* The block in a valid Slate document according to our schema can be here
|
|
33
|
-
* either a Slate block that touches the root or a Slate inline (the other
|
|
34
|
-
* possibility, a leaf Text node is excluded because we are taking the
|
|
35
|
-
* parent of the selection).
|
|
36
|
-
*
|
|
37
|
-
* @param {Editor} editor
|
|
38
|
-
* @param {Range} range
|
|
39
|
-
*
|
|
40
|
-
* @returns {boolean} true if the range (usually the selection) can be split
|
|
41
|
-
* into two editors (usually Volto Slate Text blocks)
|
|
42
|
-
*/
|
|
43
|
-
export const rangeIsInSplittableNode = (editor, range) => {
|
|
44
|
-
const [block] = Editor.parent(editor, range);
|
|
45
|
-
return range && (isRangeAtRoot(range) || editor.isInline(block));
|
|
46
|
-
};
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { Editor, Range, Transforms, Path } from 'slate';
|
|
2
|
-
import config from '@plone/volto/registry';
|
|
3
|
-
|
|
4
|
-
export function isCursorInList(editor) {
|
|
5
|
-
const { slate } = config.settings;
|
|
6
|
-
|
|
7
|
-
const result = Editor.above(editor, {
|
|
8
|
-
match: (n) => n.type === slate.listItemType,
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
if (!result) {
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const [listItemWithSelection] = result;
|
|
16
|
-
|
|
17
|
-
// whether the selection is inside a list item
|
|
18
|
-
const listItemCase =
|
|
19
|
-
Range.isCollapsed(editor.selection) && listItemWithSelection;
|
|
20
|
-
|
|
21
|
-
return listItemCase;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function isCursorAtListBlockStart(editor) {
|
|
25
|
-
if (editor.selection && Range.isCollapsed(editor.selection)) {
|
|
26
|
-
const { anchor } = editor.selection;
|
|
27
|
-
return anchor.offset > 0
|
|
28
|
-
? false
|
|
29
|
-
: anchor.path.length === 3 &&
|
|
30
|
-
anchor.path.reduce((acc, x) => acc + x, 0) === 0;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const getPreviousSiblingPath = function (path) {
|
|
35
|
-
// Doesn't raise an error if no previous sibling exists
|
|
36
|
-
const last = path[path.length - 1];
|
|
37
|
-
|
|
38
|
-
if (last <= 0) {
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return path.slice(0, -1).concat(last - 1);
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export function mergeWithPreviousList(editor, listPath) {
|
|
46
|
-
const { slate } = config.settings;
|
|
47
|
-
const prevSiblingPath = getPreviousSiblingPath(listPath);
|
|
48
|
-
const [currentList] = Editor.node(editor, listPath);
|
|
49
|
-
if (prevSiblingPath) {
|
|
50
|
-
const [prevSibling] = Editor.node(editor, prevSiblingPath);
|
|
51
|
-
|
|
52
|
-
if (slate.listTypes.includes(prevSibling.type)) {
|
|
53
|
-
Transforms.mergeNodes(editor, {
|
|
54
|
-
// match: (node) => slate.listTypes.includes(node.type),
|
|
55
|
-
match: (node) => node === prevSibling || node === currentList,
|
|
56
|
-
mode: 'highest',
|
|
57
|
-
at: listPath,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function mergeWithNextList(editor, listPath) {
|
|
64
|
-
const { slate } = config.settings;
|
|
65
|
-
const [currentList] = Editor.node(editor, listPath);
|
|
66
|
-
const [parent] = Editor.parent(editor, listPath);
|
|
67
|
-
|
|
68
|
-
if (parent.children.length - 1 > listPath[listPath.length - 1]) {
|
|
69
|
-
const nextSiblingPath = Path.next(listPath);
|
|
70
|
-
const [nextSibling] = Editor.node(editor, nextSiblingPath);
|
|
71
|
-
|
|
72
|
-
if (slate.listTypes.includes(nextSibling.type)) {
|
|
73
|
-
Transforms.mergeNodes(editor, {
|
|
74
|
-
match: (node) => {
|
|
75
|
-
return node === currentList || node === nextSibling;
|
|
76
|
-
},
|
|
77
|
-
at: nextSiblingPath,
|
|
78
|
-
mode: 'highest',
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export function getCurrentListItem(editor) {
|
|
85
|
-
const { slate } = config.settings;
|
|
86
|
-
const [match] = Editor.nodes(editor, {
|
|
87
|
-
at: editor.selection.anchor.path,
|
|
88
|
-
match: (n) => n.type === slate.listItemType,
|
|
89
|
-
mode: 'lowest',
|
|
90
|
-
});
|
|
91
|
-
return match || []; // empty entry if nothing is found
|
|
92
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Editor, Transforms, Range, Text } from 'slate';
|
|
3
|
-
|
|
4
|
-
export function isMarkActive(editor, format) {
|
|
5
|
-
// TODO: this implementation is not ok. LibreOffice Writer only shows
|
|
6
|
-
// mark button as active if the mark is applied to the entire selected range
|
|
7
|
-
// Here, it seems, the mark doesn't need to cover the entire selection,
|
|
8
|
-
// which is wrong
|
|
9
|
-
let marks;
|
|
10
|
-
try {
|
|
11
|
-
marks = Editor.marks(editor);
|
|
12
|
-
} catch (ex) {
|
|
13
|
-
// bug in Slate, recently appears only in Cypress context, more exactly when I press Enter inside a numbered list first item to produce a split (resulting two list items) (not sure if manually inside the Cypress browser but automatically it surely appears)
|
|
14
|
-
// if (
|
|
15
|
-
// ex.message ===
|
|
16
|
-
// 'Cannot get the leaf node at path [0,0] because it refers to a non-leaf node: [object Object]' // also with [0,1]
|
|
17
|
-
// ) {
|
|
18
|
-
marks = null;
|
|
19
|
-
// } else {
|
|
20
|
-
// throw ex;
|
|
21
|
-
// }
|
|
22
|
-
}
|
|
23
|
-
return marks ? marks[format] === true : false;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function addMark(editor, key, value) {
|
|
27
|
-
const { selection } = editor;
|
|
28
|
-
|
|
29
|
-
if (selection) {
|
|
30
|
-
if (Range.isExpanded(selection)) {
|
|
31
|
-
Transforms.setNodes(
|
|
32
|
-
editor,
|
|
33
|
-
{ [key]: value },
|
|
34
|
-
{
|
|
35
|
-
match: (node) => {
|
|
36
|
-
// console.log('node', node);
|
|
37
|
-
return Text.isText(node) || editor.isVoid(node);
|
|
38
|
-
},
|
|
39
|
-
split: true,
|
|
40
|
-
},
|
|
41
|
-
);
|
|
42
|
-
} else {
|
|
43
|
-
const marks = {
|
|
44
|
-
...(Editor.marks(editor) || {}),
|
|
45
|
-
[key]: value,
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
editor.marks = marks;
|
|
49
|
-
editor.onChange();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function toggleMark(editor, format) {
|
|
55
|
-
const isActive = isMarkActive(editor, format);
|
|
56
|
-
|
|
57
|
-
if (isActive) {
|
|
58
|
-
Editor.removeMark(editor, format);
|
|
59
|
-
} else {
|
|
60
|
-
// don't apply marks inside inlines (such as footnote) because
|
|
61
|
-
// that splits the footnote into multiple footnotes
|
|
62
|
-
addMark(editor, format, true);
|
|
63
|
-
// if (isSelectionInline(editor)) {
|
|
64
|
-
// addMark(editor, format, true);
|
|
65
|
-
// }
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/*
|
|
70
|
-
* Replaces inline text elements with a wrapper result:
|
|
71
|
-
*
|
|
72
|
-
* Leaves are wrapped and non-leaves are cloned. Empty leaves are removed.
|
|
73
|
-
*/
|
|
74
|
-
export function wrapInlineMarkupText(children, wrapper) {
|
|
75
|
-
if (typeof children === 'string') {
|
|
76
|
-
return children ? wrapper(children) : null;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// TODO: find the deepest child that needs to be replaced.
|
|
80
|
-
// TODO: note: this might trigger warnings about keys
|
|
81
|
-
if (Array.isArray(children)) {
|
|
82
|
-
return children
|
|
83
|
-
.map((child) => {
|
|
84
|
-
if (typeof child === 'string' && child.length >= 1) {
|
|
85
|
-
return wrapper(children);
|
|
86
|
-
}
|
|
87
|
-
if (typeof child === 'string' && child.length === 0) {
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
return React.cloneElement(
|
|
91
|
-
child,
|
|
92
|
-
child.props,
|
|
93
|
-
wrapInlineMarkupText(child.props.children, wrapper),
|
|
94
|
-
);
|
|
95
|
-
})
|
|
96
|
-
.filter((child) => !!child);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return React.cloneElement(
|
|
100
|
-
children,
|
|
101
|
-
children.props,
|
|
102
|
-
wrapInlineMarkupText(children.props.children, wrapper),
|
|
103
|
-
);
|
|
104
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export class MIMETypeName {
|
|
2
|
-
constructor(name) {
|
|
3
|
-
if (name.includes('/')) {
|
|
4
|
-
this.name = name;
|
|
5
|
-
this.firstName = name.split('/')[0];
|
|
6
|
-
this.secondName = name.split('/')[1];
|
|
7
|
-
} else {
|
|
8
|
-
this.firstName = name;
|
|
9
|
-
this.secondName = null;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @param {MIMETypeName} mt
|
|
15
|
-
*/
|
|
16
|
-
matches(mt) {
|
|
17
|
-
return (
|
|
18
|
-
this.firstName === mt.firstName &&
|
|
19
|
-
(this.secondName && mt.secondName
|
|
20
|
-
? this.secondName === mt.secondName
|
|
21
|
-
: true)
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getFragmentFromBeginningOfEditorToStartOfSelection,
|
|
3
|
-
getFragmentFromStartOfSelectionToEndOfEditor,
|
|
4
|
-
} from './selection';
|
|
5
|
-
|
|
6
|
-
/*
|
|
7
|
-
* Gets two fragments: left, right: before selection, after selection
|
|
8
|
-
*/
|
|
9
|
-
export function splitEditorInTwoFragments(editor, initialSelection) {
|
|
10
|
-
initialSelection = initialSelection || editor.selection;
|
|
11
|
-
let left = getFragmentFromBeginningOfEditorToStartOfSelection(
|
|
12
|
-
editor,
|
|
13
|
-
initialSelection,
|
|
14
|
-
);
|
|
15
|
-
let right = getFragmentFromStartOfSelectionToEndOfEditor(
|
|
16
|
-
editor,
|
|
17
|
-
initialSelection,
|
|
18
|
-
);
|
|
19
|
-
return [left, right];
|
|
20
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
// Based on https://github.com/ai/nanoid/blob/master/non-secure/index.js
|
|
2
|
-
|
|
3
|
-
// This alphabet uses `A-Za-z0-9_-` symbols. The genetic algorithm helped
|
|
4
|
-
// optimize the gzip compression for this alphabet.
|
|
5
|
-
const urlAlphabet =
|
|
6
|
-
'ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW';
|
|
7
|
-
|
|
8
|
-
export const nanoid = (size = 21) => {
|
|
9
|
-
let id = '';
|
|
10
|
-
// A compact alternative for `for (var i = 0; i < step; i++)`.
|
|
11
|
-
let i = size;
|
|
12
|
-
while (i--) {
|
|
13
|
-
// `| 0` is more compact and faster than `Math.floor()`.
|
|
14
|
-
id += urlAlphabet[(Math.random() * 64) | 0];
|
|
15
|
-
}
|
|
16
|
-
return id;
|
|
17
|
-
};
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { castArray, cloneDeep } from 'lodash';
|
|
2
|
-
import { Editor, Transforms, Range, Node } from 'slate';
|
|
3
|
-
import { ReactEditor } from 'slate-react';
|
|
4
|
-
import { isCursorInList, makeEditor } from '@plone/volto-slate/utils';
|
|
5
|
-
import { LI } from '@plone/volto-slate/constants';
|
|
6
|
-
import config from '@plone/volto/registry';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Get the nodes with a type included in `types` in the selection (from root to leaf).
|
|
10
|
-
*
|
|
11
|
-
* @param {} editor
|
|
12
|
-
* @param {} types
|
|
13
|
-
* @param {} options
|
|
14
|
-
*/
|
|
15
|
-
export function getSelectionNodesByType(editor, types, options = {}) {
|
|
16
|
-
types = castArray(types);
|
|
17
|
-
|
|
18
|
-
return Editor.nodes(editor, {
|
|
19
|
-
match: (n) => {
|
|
20
|
-
return types.includes(n.type);
|
|
21
|
-
},
|
|
22
|
-
...options,
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Is there a node with a type included in `types` in the selection (from root to leaf).
|
|
28
|
-
*/
|
|
29
|
-
export function isNodeInSelection(editor, types, options = {}) {
|
|
30
|
-
const [match] = getSelectionNodesByType(editor, types, options);
|
|
31
|
-
return !!match;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* getSelectionNodesArrayByType.
|
|
36
|
-
*
|
|
37
|
-
* @param {} editor
|
|
38
|
-
* @param {} types
|
|
39
|
-
* @param {} options
|
|
40
|
-
*/
|
|
41
|
-
export function getSelectionNodesArrayByType(editor, types, options = {}) {
|
|
42
|
-
return Array.from(getSelectionNodesByType(editor, types, options));
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* getMaxRange.
|
|
47
|
-
*
|
|
48
|
-
* @param {} editor
|
|
49
|
-
*
|
|
50
|
-
* TODO: is [0] ok as a path?
|
|
51
|
-
*/
|
|
52
|
-
export function getMaxRange(editor) {
|
|
53
|
-
const maxRange = {
|
|
54
|
-
anchor: Editor.start(editor, [0]),
|
|
55
|
-
focus: Editor.end(editor, [0]),
|
|
56
|
-
};
|
|
57
|
-
return maxRange;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* selectAll.
|
|
62
|
-
*
|
|
63
|
-
* @param {} editor
|
|
64
|
-
*/
|
|
65
|
-
export function selectAll(editor) {
|
|
66
|
-
Transforms.select(editor, getMaxRange(editor));
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// In the isCursorAtBlockStart/End functions maybe use a part of these pieces of code:
|
|
70
|
-
// Range.isCollapsed(editor.selection) &&
|
|
71
|
-
// Point.equals(editor.selection.anchor, Editor.start(editor, []))
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* isCursorAtBlockStart.
|
|
75
|
-
*
|
|
76
|
-
* @param {} editor
|
|
77
|
-
*/
|
|
78
|
-
export function isCursorAtBlockStart(editor) {
|
|
79
|
-
// It does not work properly with lists
|
|
80
|
-
|
|
81
|
-
if (editor.selection && Range.isCollapsed(editor.selection)) {
|
|
82
|
-
const { anchor } = editor.selection;
|
|
83
|
-
return anchor.offset > 0
|
|
84
|
-
? false
|
|
85
|
-
: anchor.path.reduce((acc, x) => acc + x, 0) === 0;
|
|
86
|
-
// anchor.path.length === 2 &&
|
|
87
|
-
}
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* isCursorAtBlockEnd.
|
|
93
|
-
*
|
|
94
|
-
* @param {} editor
|
|
95
|
-
*/
|
|
96
|
-
export function isCursorAtBlockEnd(editor) {
|
|
97
|
-
// fixSelection(editor);
|
|
98
|
-
|
|
99
|
-
// if the selection is collapsed
|
|
100
|
-
if (editor.selection && Range.isCollapsed(editor.selection)) {
|
|
101
|
-
const anchor = editor.selection?.anchor || {};
|
|
102
|
-
|
|
103
|
-
// the last block node in the editor
|
|
104
|
-
const [node] = Node.last(editor, []);
|
|
105
|
-
|
|
106
|
-
if (
|
|
107
|
-
// if the node with the selection is the last block node
|
|
108
|
-
Node.get(editor, anchor.path) === node &&
|
|
109
|
-
// if the collapsed selection is at the end of the last block node
|
|
110
|
-
anchor.offset === node.text.length
|
|
111
|
-
) {
|
|
112
|
-
return true;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const defaultListItemValue = () => {
|
|
119
|
-
const { slate } = config.settings;
|
|
120
|
-
const dv = slate.defaultValue();
|
|
121
|
-
dv[0].type = LI;
|
|
122
|
-
return dv;
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* getFragmentFromStartOfSelectionToEndOfEditor.
|
|
127
|
-
*
|
|
128
|
-
* @param {} editor
|
|
129
|
-
*/
|
|
130
|
-
export function getFragmentFromStartOfSelectionToEndOfEditor(
|
|
131
|
-
editor,
|
|
132
|
-
initialSelection,
|
|
133
|
-
) {
|
|
134
|
-
if (typeof initialSelection === 'undefined') {
|
|
135
|
-
initialSelection = editor.selection;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const { slate } = config.settings;
|
|
139
|
-
const range = Editor.range(
|
|
140
|
-
editor,
|
|
141
|
-
Range.isBackward(initialSelection)
|
|
142
|
-
? initialSelection.focus
|
|
143
|
-
: initialSelection.anchor,
|
|
144
|
-
Editor.end(editor, []),
|
|
145
|
-
);
|
|
146
|
-
|
|
147
|
-
// this is the case when the fragment is empty, and we must return
|
|
148
|
-
// empty fragment but without formatting
|
|
149
|
-
if (Range.isCollapsed(range)) {
|
|
150
|
-
if (isCursorInList(editor)) {
|
|
151
|
-
return defaultListItemValue();
|
|
152
|
-
} else {
|
|
153
|
-
return slate.defaultValue();
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// immer doesn't like editor.savedSelection
|
|
158
|
-
const newEditor = makeEditor();
|
|
159
|
-
newEditor.children = cloneDeep(editor.children);
|
|
160
|
-
return Editor.fragment(newEditor, range);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* getFragmentFromBeginningOfEditorToStartOfSelection.
|
|
165
|
-
*
|
|
166
|
-
* @param {} editor
|
|
167
|
-
*/
|
|
168
|
-
export function getFragmentFromBeginningOfEditorToStartOfSelection(
|
|
169
|
-
editor,
|
|
170
|
-
initialSelection,
|
|
171
|
-
) {
|
|
172
|
-
if (typeof initialSelection === 'undefined') {
|
|
173
|
-
initialSelection = editor.selection;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// immer doesn't like editor.savedSelection
|
|
177
|
-
// TODO: there's a bug here related to splitting lists
|
|
178
|
-
const newEditor = makeEditor();
|
|
179
|
-
newEditor.children = cloneDeep(editor.children);
|
|
180
|
-
|
|
181
|
-
return Editor.fragment(
|
|
182
|
-
newEditor,
|
|
183
|
-
Editor.range(
|
|
184
|
-
newEditor,
|
|
185
|
-
[],
|
|
186
|
-
Range.isBackward(initialSelection)
|
|
187
|
-
? initialSelection.focus
|
|
188
|
-
: initialSelection.anchor,
|
|
189
|
-
),
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* @returns {boolean} true if editor contains a range selection (active
|
|
195
|
-
* selection or at least a saved selection)
|
|
196
|
-
* @param {Editor} editor
|
|
197
|
-
*/
|
|
198
|
-
export function hasRangeSelection(editor, useSavedSelection = true) {
|
|
199
|
-
const { selection } = editor;
|
|
200
|
-
const savedSelection = editor.getSavedSelection();
|
|
201
|
-
|
|
202
|
-
const range = ReactEditor.isFocused(editor)
|
|
203
|
-
? selection || (useSavedSelection ? savedSelection : null)
|
|
204
|
-
: savedSelection;
|
|
205
|
-
|
|
206
|
-
if (!range) {
|
|
207
|
-
// console.log('no range', editor);
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
const res = Range.isExpanded(range);
|
|
212
|
-
// console.log('call hasRange', res);
|
|
213
|
-
return res;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
export function parseDefaultSelection(editor, defaultSelection) {
|
|
217
|
-
if (defaultSelection) {
|
|
218
|
-
if (defaultSelection === 'start') {
|
|
219
|
-
const [, path] = Node.first(editor, []);
|
|
220
|
-
const newSel = {
|
|
221
|
-
anchor: { path, offset: 0 },
|
|
222
|
-
focus: { path, offset: 0 },
|
|
223
|
-
};
|
|
224
|
-
return newSel;
|
|
225
|
-
}
|
|
226
|
-
if (defaultSelection === 'end') {
|
|
227
|
-
const [leaf, path] = Node.last(editor, []);
|
|
228
|
-
const newSel = {
|
|
229
|
-
anchor: { path, offset: (leaf.text || '').length },
|
|
230
|
-
focus: { path, offset: (leaf.text || '').length },
|
|
231
|
-
};
|
|
232
|
-
return newSel;
|
|
233
|
-
}
|
|
234
|
-
return defaultSelection;
|
|
235
|
-
}
|
|
236
|
-
}
|