@pierre/diffs 1.3.0-beta.4 → 1.3.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -15
- package/dist/components/CodeView.d.ts +10 -11
- package/dist/components/CodeView.d.ts.map +1 -1
- package/dist/components/CodeView.js +14 -14
- package/dist/components/CodeView.js.map +1 -1
- package/dist/components/File.d.ts +4 -4
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +53 -24
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +19 -18
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +89 -58
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/FileStream.d.ts +0 -1
- package/dist/components/FileStream.d.ts.map +1 -1
- package/dist/components/FileStream.js +8 -6
- package/dist/components/FileStream.js.map +1 -1
- package/dist/components/UnresolvedFile.d.ts +1 -2
- package/dist/components/UnresolvedFile.d.ts.map +1 -1
- package/dist/components/UnresolvedFile.js +3 -3
- package/dist/components/UnresolvedFile.js.map +1 -1
- package/dist/components/VirtualizedFile.d.ts +5 -2
- package/dist/components/VirtualizedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.js +97 -35
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +8 -4
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +91 -30
- package/dist/components/VirtualizedFileDiff.js.map +1 -1
- package/dist/components/Virtualizer.d.ts +1 -1
- package/dist/components/Virtualizer.d.ts.map +1 -1
- package/dist/components/Virtualizer.js +23 -24
- package/dist/components/Virtualizer.js.map +1 -1
- package/dist/components/VirtulizerDevelopment.d.ts.map +1 -1
- package/dist/components/web-components.d.ts.map +1 -1
- package/dist/components/web-components.js +2 -3
- package/dist/components/web-components.js.map +1 -1
- package/dist/constants.d.ts +3 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -2
- package/dist/constants.js.map +1 -1
- package/dist/editor/command.d.ts +3 -2
- package/dist/editor/command.d.ts.map +1 -1
- package/dist/editor/command.js +10 -6
- package/dist/editor/command.js.map +1 -1
- package/dist/editor/editStack.d.ts +7 -1
- package/dist/editor/editStack.d.ts.map +1 -1
- package/dist/editor/editStack.js +3 -3
- package/dist/editor/editStack.js.map +1 -1
- package/dist/editor/editor.d.ts +56 -6
- package/dist/editor/editor.d.ts.map +1 -1
- package/dist/editor/editor.js +758 -397
- package/dist/editor/editor.js.map +1 -1
- package/dist/editor/editor2.js +3 -3
- package/dist/editor/editor2.js.map +1 -1
- package/dist/editor/index.d.ts +2 -2
- package/dist/editor/index.js +1 -2
- package/dist/editor/lineAnnotations.d.ts.map +1 -1
- package/dist/editor/lineAnnotations.js +2 -3
- package/dist/editor/lineAnnotations.js.map +1 -1
- package/dist/editor/marker.d.ts +4 -3
- package/dist/editor/marker.d.ts.map +1 -1
- package/dist/editor/marker.js +30 -13
- package/dist/editor/marker.js.map +1 -1
- package/dist/editor/pieceTable.d.ts +10 -3
- package/dist/editor/pieceTable.d.ts.map +1 -1
- package/dist/editor/pieceTable.js +170 -129
- package/dist/editor/pieceTable.js.map +1 -1
- package/dist/editor/platform.d.ts +8 -1
- package/dist/editor/platform.d.ts.map +1 -1
- package/dist/editor/platform.js +16 -5
- package/dist/editor/platform.js.map +1 -1
- package/dist/editor/searchPanel.d.ts +13 -3
- package/dist/editor/searchPanel.d.ts.map +1 -1
- package/dist/editor/searchPanel.js +194 -67
- package/dist/editor/searchPanel.js.map +1 -1
- package/dist/editor/selection.d.ts +41 -4
- package/dist/editor/selection.d.ts.map +1 -1
- package/dist/editor/selection.js +423 -83
- package/dist/editor/selection.js.map +1 -1
- package/dist/editor/selectionAction.d.ts +4 -5
- package/dist/editor/selectionAction.d.ts.map +1 -1
- package/dist/editor/selectionAction.js +14 -64
- package/dist/editor/selectionAction.js.map +1 -1
- package/dist/editor/sprite.d.ts +2 -2
- package/dist/editor/sprite.d.ts.map +1 -1
- package/dist/editor/sprite.js +8 -8
- package/dist/editor/sprite.js.map +1 -1
- package/dist/editor/textDocument.d.ts +5 -4
- package/dist/editor/textDocument.d.ts.map +1 -1
- package/dist/editor/textDocument.js +26 -15
- package/dist/editor/textDocument.js.map +1 -1
- package/dist/editor/textMeasure.d.ts +37 -3
- package/dist/editor/textMeasure.d.ts.map +1 -1
- package/dist/editor/textMeasure.js +85 -10
- package/dist/editor/textMeasure.js.map +1 -1
- package/dist/editor/tokenzier.d.ts +1 -0
- package/dist/editor/tokenzier.d.ts.map +1 -1
- package/dist/editor/tokenzier.js +25 -19
- package/dist/editor/tokenzier.js.map +1 -1
- package/dist/editor/utils.d.ts +2 -1
- package/dist/editor/utils.d.ts.map +1 -1
- package/dist/editor/utils.js +6 -3
- package/dist/editor/utils.js.map +1 -1
- package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
- package/dist/highlighter/languages/areLanguagesAttached.js +1 -2
- package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts +0 -2
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/cleanUpResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/cleanUpResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/constants.d.ts +0 -1
- package/dist/highlighter/languages/constants.d.ts.map +1 -1
- package/dist/highlighter/languages/constants.js +1 -1
- package/dist/highlighter/languages/constants.js.map +1 -1
- package/dist/highlighter/languages/getResolvedLanguages.d.ts +0 -2
- package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/getResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/getResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +0 -2
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.js +1 -2
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -1
- package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/hasResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/hasResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/registerCustomLanguage.d.ts +0 -1
- package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/registerCustomLanguage.js +1 -2
- package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.d.ts +0 -2
- package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.js +4 -5
- package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguages.d.ts +0 -2
- package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/resolveLanguages.js +1 -2
- package/dist/highlighter/languages/resolveLanguages.js.map +1 -1
- package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
- package/dist/highlighter/shared_highlighter.js +3 -4
- package/dist/highlighter/shared_highlighter.js.map +1 -1
- package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
- package/dist/highlighter/themes/areThemesAttached.js +1 -2
- package/dist/highlighter/themes/areThemesAttached.js.map +1 -1
- package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/attachResolvedThemes.js +1 -2
- package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.js +1 -2
- package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/constants.d.ts.map +1 -1
- package/dist/highlighter/themes/constants.js +1 -1
- package/dist/highlighter/themes/constants.js.map +1 -1
- package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedOrResolveTheme.js +1 -2
- package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
- package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedThemes.js +1 -2
- package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/hasResolvedThemes.js +1 -2
- package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -2
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
- package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomTheme.js +1 -2
- package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
- package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveTheme.js +1 -2
- package/dist/highlighter/themes/resolveTheme.js.map +1 -1
- package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveThemes.js +1 -2
- package/dist/highlighter/themes/resolveThemes.js.map +1 -1
- package/dist/highlighter/themes/themeResolution.d.ts.map +1 -1
- package/dist/highlighter/themes/themeResolution.js +1 -2
- package/dist/highlighter/themes/themeResolution.js.map +1 -1
- package/dist/highlighter/themes/themeResolver.d.ts +2 -2
- package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
- package/dist/highlighter/themes/themeResolver.js +1 -2
- package/dist/highlighter/themes/themeResolver.js.map +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.js +2 -3
- package/dist/managers/InteractionManager.d.ts +7 -0
- package/dist/managers/InteractionManager.d.ts.map +1 -1
- package/dist/managers/InteractionManager.js +26 -4
- package/dist/managers/InteractionManager.js.map +1 -1
- package/dist/managers/ResizeManager.d.ts.map +1 -1
- package/dist/managers/ResizeManager.js +2 -2
- package/dist/managers/ResizeManager.js.map +1 -1
- package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
- package/dist/managers/ScrollSyncManager.js +1 -1
- package/dist/managers/ScrollSyncManager.js.map +1 -1
- package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
- package/dist/managers/UniversalRenderingManager.js +2 -2
- package/dist/managers/UniversalRenderingManager.js.map +1 -1
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +228 -0
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -0
- package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts +84 -0
- package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts.map +1 -0
- package/dist/react/CodeView.d.ts +1 -1
- package/dist/react/CodeView.d.ts.map +1 -1
- package/dist/react/CodeView.js +16 -15
- package/dist/react/CodeView.js.map +1 -1
- package/dist/react/EditorContext.d.ts +0 -1
- package/dist/react/EditorContext.d.ts.map +1 -1
- package/dist/react/EditorContext.js +2 -5
- package/dist/react/EditorContext.js.map +1 -1
- package/dist/react/File.d.ts +1 -0
- package/dist/react/File.d.ts.map +1 -1
- package/dist/react/File.js +4 -6
- package/dist/react/File.js.map +1 -1
- package/dist/react/FileDiff.d.ts +1 -0
- package/dist/react/FileDiff.d.ts.map +1 -1
- package/dist/react/FileDiff.js +4 -6
- package/dist/react/FileDiff.js.map +1 -1
- package/dist/react/MultiFileDiff.d.ts +1 -0
- package/dist/react/MultiFileDiff.d.ts.map +1 -1
- package/dist/react/MultiFileDiff.js +4 -6
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/PatchDiff.d.ts +1 -0
- package/dist/react/PatchDiff.d.ts.map +1 -1
- package/dist/react/PatchDiff.js +4 -6
- package/dist/react/PatchDiff.js.map +1 -1
- package/dist/react/UnresolvedFile.d.ts +2 -1
- package/dist/react/UnresolvedFile.d.ts.map +1 -1
- package/dist/react/UnresolvedFile.js +4 -6
- package/dist/react/UnresolvedFile.js.map +1 -1
- package/dist/react/Virtualizer.d.ts.map +1 -1
- package/dist/react/Virtualizer.js +2 -5
- package/dist/react/Virtualizer.js.map +1 -1
- package/dist/react/WorkerPoolContext.d.ts +0 -1
- package/dist/react/WorkerPoolContext.d.ts.map +1 -1
- package/dist/react/WorkerPoolContext.js +2 -5
- package/dist/react/WorkerPoolContext.js.map +1 -1
- package/dist/react/constants.d.ts.map +1 -1
- package/dist/react/constants.js +1 -1
- package/dist/react/constants.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +1 -2
- package/dist/react/jsx.d.ts +0 -2
- package/dist/react/jsx.d.ts.map +1 -1
- package/dist/react/types.d.ts +2 -0
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.d.ts +2 -0
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +18 -11
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/renderFileChildren.d.ts +2 -0
- package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
- package/dist/react/utils/renderFileChildren.js +18 -11
- package/dist/react/utils/renderFileChildren.js.map +1 -1
- package/dist/react/utils/templateRender.d.ts.map +1 -1
- package/dist/react/utils/templateRender.js +1 -2
- package/dist/react/utils/templateRender.js.map +1 -1
- package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js +1 -3
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/react/utils/useFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileInstance.js +1 -2
- package/dist/react/utils/useFileInstance.js.map +1 -1
- package/dist/react/utils/useStableCallback.d.ts.map +1 -1
- package/dist/react/utils/useStableCallback.js +1 -2
- package/dist/react/utils/useStableCallback.js.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.js +10 -11
- package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
- package/dist/renderers/DiffHunksRenderer.d.ts +5 -5
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +73 -20
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.d.ts +1 -3
- package/dist/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/renderers/FileRenderer.js +23 -8
- package/dist/renderers/FileRenderer.js.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +1 -2
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.js +1 -2
- package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -1
- package/dist/shiki-stream/index.js +1 -2
- package/dist/shiki-stream/stream.d.ts +0 -1
- package/dist/shiki-stream/stream.d.ts.map +1 -1
- package/dist/shiki-stream/stream.js +1 -2
- package/dist/shiki-stream/stream.js.map +1 -1
- package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
- package/dist/shiki-stream/tokenizer.js +1 -1
- package/dist/shiki-stream/tokenizer.js.map +1 -1
- package/dist/shiki-stream/types.d.ts +0 -1
- package/dist/shiki-stream/types.d.ts.map +1 -1
- package/dist/sprite.d.ts.map +1 -1
- package/dist/sprite.js +1 -1
- package/dist/ssr/FileDiffReact.d.ts.map +1 -1
- package/dist/ssr/FileDiffReact.js +4 -7
- package/dist/ssr/FileDiffReact.js.map +1 -1
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/index.js +1 -2
- package/dist/ssr/preloadDiffs.d.ts +1 -1
- package/dist/ssr/preloadDiffs.d.ts.map +1 -1
- package/dist/ssr/preloadDiffs.js +1 -2
- package/dist/ssr/preloadDiffs.js.map +1 -1
- package/dist/ssr/preloadFile.d.ts.map +1 -1
- package/dist/ssr/preloadFile.js +1 -2
- package/dist/ssr/preloadFile.js.map +1 -1
- package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
- package/dist/ssr/preloadPatchFile.js +2 -3
- package/dist/ssr/preloadPatchFile.js.map +1 -1
- package/dist/ssr/renderHTML.d.ts +1 -1
- package/dist/ssr/renderHTML.d.ts.map +1 -1
- package/dist/ssr/renderHTML.js +1 -2
- package/dist/ssr/renderHTML.js.map +1 -1
- package/dist/string-import.d.ts +4 -0
- package/dist/string-import.d.ts.map +1 -1
- package/dist/style.js +3 -3
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +27 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.js +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
- package/dist/utils/areDiffRenderOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffRenderOptionsEqual.js +1 -2
- package/dist/utils/areDiffRenderOptionsEqual.js.map +1 -1
- package/dist/utils/areDiffTargetsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffTargetsEqual.js +1 -1
- package/dist/utils/areDiffTargetsEqual.js.map +1 -1
- package/dist/utils/areFileRenderOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areFileRenderOptionsEqual.js +1 -2
- package/dist/utils/areFileRenderOptionsEqual.js.map +1 -1
- package/dist/utils/areFilesEqual.d.ts.map +1 -1
- package/dist/utils/areFilesEqual.js +1 -1
- package/dist/utils/areFilesEqual.js.map +1 -1
- package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
- package/dist/utils/areHunkDataEqual.js +1 -1
- package/dist/utils/areHunkDataEqual.js.map +1 -1
- package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
- package/dist/utils/areLineAnnotationsEqual.js +1 -1
- package/dist/utils/areLineAnnotationsEqual.js.map +1 -1
- package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
- package/dist/utils/areManagedSnapshotsEqual.js +1 -1
- package/dist/utils/areManagedSnapshotsEqual.js.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.js +1 -1
- package/dist/utils/areMergeConflictActionsEqual.js.map +1 -1
- package/dist/utils/areObjectsEqual.d.ts.map +1 -1
- package/dist/utils/areObjectsEqual.js +1 -1
- package/dist/utils/areObjectsEqual.js.map +1 -1
- package/dist/utils/areOptionsEqual.d.ts +0 -2
- package/dist/utils/areOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areOptionsEqual.js +1 -2
- package/dist/utils/areOptionsEqual.js.map +1 -1
- package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
- package/dist/utils/arePrePropertiesEqual.js +1 -1
- package/dist/utils/arePrePropertiesEqual.js.map +1 -1
- package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
- package/dist/utils/areRenderRangesEqual.js +1 -1
- package/dist/utils/areRenderRangesEqual.js.map +1 -1
- package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionPointsEqual.js +1 -1
- package/dist/utils/areSelectionPointsEqual.js.map +1 -1
- package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionsEqual.js +1 -1
- package/dist/utils/areSelectionsEqual.js.map +1 -1
- package/dist/utils/areThemesEqual.d.ts.map +1 -1
- package/dist/utils/areThemesEqual.js +1 -1
- package/dist/utils/areThemesEqual.js.map +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.js +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -1
- package/dist/utils/areWorkerStatsEqual.d.ts +0 -2
- package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
- package/dist/utils/areWorkerStatsEqual.js +1 -1
- package/dist/utils/areWorkerStatsEqual.js.map +1 -1
- package/dist/utils/cleanLastNewline.d.ts.map +1 -1
- package/dist/utils/cleanLastNewline.js +1 -1
- package/dist/utils/cleanLastNewline.js.map +1 -1
- package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
- package/dist/utils/computeEstimatedDiffHeights.js +1 -2
- package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
- package/dist/utils/computeFileOffsets.d.ts +9 -1
- package/dist/utils/computeFileOffsets.d.ts.map +1 -1
- package/dist/utils/computeFileOffsets.js +20 -2
- package/dist/utils/computeFileOffsets.js.map +1 -1
- package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
- package/dist/utils/computeVirtualFileMetrics.js +1 -2
- package/dist/utils/computeVirtualFileMetrics.js.map +1 -1
- package/dist/utils/createAnnotationElement.d.ts +1 -1
- package/dist/utils/createAnnotationElement.d.ts.map +1 -1
- package/dist/utils/createAnnotationElement.js +1 -2
- package/dist/utils/createAnnotationElement.js.map +1 -1
- package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
- package/dist/utils/createAnnotationWrapperNode.js +1 -1
- package/dist/utils/createAnnotationWrapperNode.js.map +1 -1
- package/dist/utils/createContentColumn.d.ts +1 -1
- package/dist/utils/createContentColumn.d.ts.map +1 -1
- package/dist/utils/createContentColumn.js +1 -2
- package/dist/utils/createContentColumn.js.map +1 -1
- package/dist/utils/createEmptyRowBuffer.d.ts +1 -1
- package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
- package/dist/utils/createEmptyRowBuffer.js +1 -2
- package/dist/utils/createEmptyRowBuffer.js.map +1 -1
- package/dist/utils/createFileHeaderElement.d.ts +1 -1
- package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
- package/dist/utils/createFileHeaderElement.js +6 -3
- package/dist/utils/createFileHeaderElement.js.map +1 -1
- package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -1
- package/dist/utils/createGutterUtilityContentNode.js +1 -1
- package/dist/utils/createGutterUtilityContentNode.js.map +1 -1
- package/dist/utils/createGutterUtilityElement.d.ts +1 -1
- package/dist/utils/createGutterUtilityElement.d.ts.map +1 -1
- package/dist/utils/createGutterUtilityElement.js +1 -2
- package/dist/utils/createGutterUtilityElement.js.map +1 -1
- package/dist/utils/createNoNewlineElement.d.ts +1 -1
- package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
- package/dist/utils/createNoNewlineElement.js +1 -2
- package/dist/utils/createNoNewlineElement.js.map +1 -1
- package/dist/utils/createPreElement.d.ts +1 -1
- package/dist/utils/createPreElement.d.ts.map +1 -1
- package/dist/utils/createPreElement.js +1 -2
- package/dist/utils/createPreElement.js.map +1 -1
- package/dist/utils/createRowNodes.d.ts.map +1 -1
- package/dist/utils/createRowNodes.js +1 -1
- package/dist/utils/createRowNodes.js.map +1 -1
- package/dist/utils/createSeparator.d.ts +1 -1
- package/dist/utils/createSeparator.d.ts.map +1 -1
- package/dist/utils/createSeparator.js +1 -2
- package/dist/utils/createSeparator.js.map +1 -1
- package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
- package/dist/utils/createSpanNodeFromToken.js +1 -2
- package/dist/utils/createSpanNodeFromToken.js.map +1 -1
- package/dist/utils/createStyleElement.d.ts +1 -1
- package/dist/utils/createStyleElement.d.ts.map +1 -1
- package/dist/utils/createStyleElement.js +1 -2
- package/dist/utils/createStyleElement.js.map +1 -1
- package/dist/utils/createTransformerWithState.d.ts.map +1 -1
- package/dist/utils/createTransformerWithState.js +1 -2
- package/dist/utils/createTransformerWithState.js.map +1 -1
- package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
- package/dist/utils/createUnsafeCSSStyleNode.js +1 -2
- package/dist/utils/createUnsafeCSSStyleNode.js.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.js +5 -5
- package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
- package/dist/utils/cssWrappers.d.ts.map +1 -1
- package/dist/utils/cssWrappers.js +2 -3
- package/dist/utils/cssWrappers.js.map +1 -1
- package/dist/utils/detachString.d.ts.map +1 -1
- package/dist/utils/detachString.js +1 -1
- package/dist/utils/detachString.js.map +1 -1
- package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
- package/dist/utils/diffAcceptRejectHunk.js +1 -2
- package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
- package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
- package/dist/utils/formatCSSVariablePrefix.js +1 -1
- package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
- package/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -1
- package/dist/utils/getDiffHunksRendererOptions.js +1 -1
- package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
- package/dist/utils/getFileRendererOptions.d.ts.map +1 -1
- package/dist/utils/getFileRendererOptions.js +1 -1
- package/dist/utils/getFileRendererOptions.js.map +1 -1
- package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
- package/dist/utils/getFiletypeFromFileName.js +1 -1
- package/dist/utils/getFiletypeFromFileName.js.map +1 -1
- package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
- package/dist/utils/getHighlighterOptions.js +1 -2
- package/dist/utils/getHighlighterOptions.js.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.js +1 -2
- package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
- package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
- package/dist/utils/getHunkSeparatorSlotName.js +1 -1
- package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
- package/dist/utils/getIconForType.d.ts.map +1 -1
- package/dist/utils/getIconForType.js +1 -1
- package/dist/utils/getIconForType.js.map +1 -1
- package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
- package/dist/utils/getLineAnnotationName.js +1 -1
- package/dist/utils/getLineAnnotationName.js.map +1 -1
- package/dist/utils/getLineEndingType.d.ts.map +1 -1
- package/dist/utils/getLineEndingType.js +1 -1
- package/dist/utils/getLineEndingType.js.map +1 -1
- package/dist/utils/getLineNodes.d.ts +1 -1
- package/dist/utils/getLineNodes.d.ts.map +1 -1
- package/dist/utils/getLineNodes.js +1 -1
- package/dist/utils/getLineNodes.js.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.js +1 -1
- package/dist/utils/getMergeConflictActionSlotName.js.map +1 -1
- package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -1
- package/dist/utils/getMergeConflictLineTypes.js +1 -2
- package/dist/utils/getMergeConflictLineTypes.js.map +1 -1
- package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
- package/dist/utils/getOrCreateCodeNode.js +1 -1
- package/dist/utils/getOrCreateCodeNode.js.map +1 -1
- package/dist/utils/getSingularPatch.d.ts.map +1 -1
- package/dist/utils/getSingularPatch.js +1 -2
- package/dist/utils/getSingularPatch.js.map +1 -1
- package/dist/utils/getThemes.d.ts.map +1 -1
- package/dist/utils/getThemes.js +1 -2
- package/dist/utils/getThemes.js.map +1 -1
- package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
- package/dist/utils/getTotalLineCountFromHunks.js +1 -1
- package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
- package/dist/utils/hast_utils.d.ts +1 -1
- package/dist/utils/hast_utils.d.ts.map +1 -1
- package/dist/utils/hast_utils.js +1 -1
- package/dist/utils/hast_utils.js.map +1 -1
- package/dist/utils/hostTheme.d.ts.map +1 -1
- package/dist/utils/hostTheme.js +1 -2
- package/dist/utils/hostTheme.js.map +1 -1
- package/dist/utils/includesFileAnnotations.d.ts +17 -0
- package/dist/utils/includesFileAnnotations.d.ts.map +1 -0
- package/dist/utils/includesFileAnnotations.js +19 -0
- package/dist/utils/includesFileAnnotations.js.map +1 -0
- package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
- package/dist/utils/isDefaultRenderRange.js +1 -1
- package/dist/utils/isDefaultRenderRange.js.map +1 -1
- package/dist/utils/isDiffPlainText.d.ts.map +1 -1
- package/dist/utils/isDiffPlainText.js +1 -2
- package/dist/utils/isDiffPlainText.js.map +1 -1
- package/dist/utils/isFilePlainText.d.ts.map +1 -1
- package/dist/utils/isFilePlainText.js +1 -2
- package/dist/utils/isFilePlainText.js.map +1 -1
- package/dist/utils/isStyleNode.d.ts.map +1 -1
- package/dist/utils/isStyleNode.js +1 -1
- package/dist/utils/isStyleNode.js.map +1 -1
- package/dist/utils/isWorkerContext.d.ts.map +1 -1
- package/dist/utils/isWorkerContext.js +1 -1
- package/dist/utils/isWorkerContext.js.map +1 -1
- package/dist/utils/iterateOverDiff.d.ts.map +1 -1
- package/dist/utils/iterateOverDiff.js +44 -45
- package/dist/utils/iterateOverDiff.js.map +1 -1
- package/dist/utils/normalizeDiffResolution.d.ts.map +1 -1
- package/dist/utils/normalizeDiffResolution.js +1 -1
- package/dist/utils/normalizeDiffResolution.js.map +1 -1
- package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
- package/dist/utils/parseDiffDecorations.js +1 -2
- package/dist/utils/parseDiffDecorations.js.map +1 -1
- package/dist/utils/parseDiffFromFile.d.ts +0 -1
- package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseDiffFromFile.js +1 -2
- package/dist/utils/parseDiffFromFile.js.map +1 -1
- package/dist/utils/parseLineType.d.ts.map +1 -1
- package/dist/utils/parseLineType.js +1 -1
- package/dist/utils/parseLineType.js.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.js +5 -5
- package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
- package/dist/utils/parsePatchFiles.d.ts.map +1 -1
- package/dist/utils/parsePatchFiles.js +6 -7
- package/dist/utils/parsePatchFiles.js.map +1 -1
- package/dist/utils/prefersReducedMotion.d.ts.map +1 -1
- package/dist/utils/prefersReducedMotion.js +1 -1
- package/dist/utils/prefersReducedMotion.js.map +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.js +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.js.map +1 -1
- package/dist/utils/processLine.d.ts +1 -1
- package/dist/utils/processLine.d.ts.map +1 -1
- package/dist/utils/processLine.js +1 -2
- package/dist/utils/processLine.js.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.js +8 -7
- package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
- package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderFileWithHighlighter.js +5 -4
- package/dist/utils/renderFileWithHighlighter.js.map +1 -1
- package/dist/utils/resolveConflict.d.ts.map +1 -1
- package/dist/utils/resolveConflict.js +1 -2
- package/dist/utils/resolveConflict.js.map +1 -1
- package/dist/utils/resolveRegion.d.ts.map +1 -1
- package/dist/utils/resolveRegion.js +1 -1
- package/dist/utils/resolveRegion.js.map +1 -1
- package/dist/utils/roundToDevicePixel.d.ts.map +1 -1
- package/dist/utils/roundToDevicePixel.js +1 -1
- package/dist/utils/roundToDevicePixel.js.map +1 -1
- package/dist/utils/scrollbarGutter.d.ts.map +1 -1
- package/dist/utils/scrollbarGutter.js +1 -2
- package/dist/utils/scrollbarGutter.js.map +1 -1
- package/dist/utils/setLanguageOverride.d.ts.map +1 -1
- package/dist/utils/setLanguageOverride.js +1 -1
- package/dist/utils/setLanguageOverride.js.map +1 -1
- package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
- package/dist/utils/setWrapperNodeProps.js +1 -1
- package/dist/utils/setWrapperNodeProps.js.map +1 -1
- package/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -1
- package/dist/utils/shouldUseTokenTransformer.js +1 -1
- package/dist/utils/shouldUseTokenTransformer.js.map +1 -1
- package/dist/utils/splitFileContents.d.ts.map +1 -1
- package/dist/utils/splitFileContents.js +1 -2
- package/dist/utils/splitFileContents.js.map +1 -1
- package/dist/utils/trimPatchContext.d.ts.map +1 -1
- package/dist/utils/trimPatchContext.js +1 -2
- package/dist/utils/trimPatchContext.js.map +1 -1
- package/dist/utils/updateDiffHunks.d.ts +2 -1
- package/dist/utils/updateDiffHunks.d.ts.map +1 -1
- package/dist/utils/updateDiffHunks.js +22 -3
- package/dist/utils/updateDiffHunks.js.map +1 -1
- package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
- package/dist/utils/virtualDiffLayout.js +1 -2
- package/dist/utils/virtualDiffLayout.js.map +1 -1
- package/dist/utils/wrapTokenFragments.d.ts +1 -1
- package/dist/utils/wrapTokenFragments.d.ts.map +1 -1
- package/dist/utils/wrapTokenFragments.js +1 -2
- package/dist/utils/wrapTokenFragments.js.map +1 -1
- package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.js +5 -5
- package/dist/worker/WorkerPoolManager.js.map +1 -1
- package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
- package/dist/worker/getOrCreateWorkerPoolSingleton.js +1 -2
- package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
- package/dist/worker/index.js +1 -2
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/wasm-B9ZqxnKj.js +8 -0
- package/dist/worker/wasm-B9ZqxnKj.js.map +1 -0
- package/dist/worker/worker-portable.js +2989 -6577
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +97 -127
- package/dist/worker/worker.js.map +1 -1
- package/package.json +14 -21
- package/dist/worker/wasm-BaDzIkIn.js +0 -10
- package/dist/worker/wasm-BaDzIkIn.js.map +0 -1
package/dist/editor/selection.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { endsWithLineBreak } from "./utils.js";
|
|
1
2
|
import { applyDocumentChangeToLineAnnotations } from "./lineAnnotations.js";
|
|
2
|
-
|
|
3
3
|
//#region src/editor/selection.ts
|
|
4
4
|
const DirectionBackward = -1;
|
|
5
5
|
const DirectionNone = 0;
|
|
@@ -7,7 +7,7 @@ const DirectionForward = 1;
|
|
|
7
7
|
/**
|
|
8
8
|
* Converts a selection from a web selection to an editor selection.
|
|
9
9
|
*/
|
|
10
|
-
function convertSelection(range, direction =
|
|
10
|
+
function convertSelection(range, direction = 0) {
|
|
11
11
|
const start = boundaryToPosition(range.startContainer, range.startOffset);
|
|
12
12
|
const end = boundaryToPosition(range.endContainer, range.endOffset);
|
|
13
13
|
if (start === null || end === null) return;
|
|
@@ -85,7 +85,7 @@ function mapCursorMove(textDocument, selections, shortcut) {
|
|
|
85
85
|
const indent = getLeadingSpaces(textDocument.getLineText(line));
|
|
86
86
|
character = character === indent ? 0 : indent;
|
|
87
87
|
} else character = shortcut === "start" ? 0 : textDocument.getLineLength(line);
|
|
88
|
-
if (selection.direction ===
|
|
88
|
+
if (selection.direction === -1) line = selection.start.line;
|
|
89
89
|
else line = selection.end.line;
|
|
90
90
|
} else if (shortcut === "up") line = Math.max(0, line - 1);
|
|
91
91
|
else if (shortcut === "down") line = Math.min(Math.max(lineCount - 1, 0), line + 1);
|
|
@@ -93,19 +93,15 @@ function mapCursorMove(textDocument, selections, shortcut) {
|
|
|
93
93
|
const lineLength = textDocument.getLineLength(line);
|
|
94
94
|
character = Math.min(character, lineLength);
|
|
95
95
|
if (shortcut === "left") {
|
|
96
|
-
character
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
line = Math.max(0, line - 1);
|
|
96
|
+
if (character > 0) character = stepCharacterByGrapheme(textDocument, line, character, false);
|
|
97
|
+
else if (line > 0) {
|
|
98
|
+
line = line - 1;
|
|
100
99
|
character = textDocument.getLineLength(line);
|
|
101
100
|
}
|
|
102
|
-
} else
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
line = Math.min(Math.max(lineCount - 1, 0), line + 1);
|
|
107
|
-
character = 0;
|
|
108
|
-
}
|
|
101
|
+
} else if (character < lineLength) character = stepCharacterByGrapheme(textDocument, line, character, true);
|
|
102
|
+
else if (line < lineCount - 1) {
|
|
103
|
+
line = line + 1;
|
|
104
|
+
character = 0;
|
|
109
105
|
}
|
|
110
106
|
}
|
|
111
107
|
const pos = {
|
|
@@ -115,7 +111,7 @@ function mapCursorMove(textDocument, selections, shortcut) {
|
|
|
115
111
|
return {
|
|
116
112
|
start: pos,
|
|
117
113
|
end: pos,
|
|
118
|
-
direction:
|
|
114
|
+
direction: 0
|
|
119
115
|
};
|
|
120
116
|
});
|
|
121
117
|
}
|
|
@@ -124,20 +120,19 @@ function mapCursorMove(textDocument, selections, shortcut) {
|
|
|
124
120
|
*/
|
|
125
121
|
function mapSelectionShift(textDocument, selections, shortcut) {
|
|
126
122
|
return selections.map((selection) => {
|
|
127
|
-
const
|
|
128
|
-
const focusPosition = textDocument.positionAt(focusOffset);
|
|
123
|
+
const focusPosition = selection.direction === -1 ? selection.start : selection.end;
|
|
129
124
|
const [movedFocusSelection] = mapCursorMove(textDocument, [{
|
|
130
125
|
start: focusPosition,
|
|
131
126
|
end: focusPosition,
|
|
132
|
-
direction:
|
|
127
|
+
direction: 0
|
|
133
128
|
}], shortcut);
|
|
134
|
-
return
|
|
129
|
+
return createSelectionFrom(selection, movedFocusSelection);
|
|
135
130
|
});
|
|
136
131
|
}
|
|
137
132
|
/**
|
|
138
133
|
* Applies a text change to the given text document
|
|
139
134
|
*/
|
|
140
|
-
function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotations, tabSize = 2) {
|
|
135
|
+
function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotations, tabSize = 2, undoBoundary = false) {
|
|
141
136
|
if (selections[selections.length - 1] === void 0) return { nextSelections: [] };
|
|
142
137
|
const selectionPositions = [];
|
|
143
138
|
for (const selection of selections) selectionPositions.push(selection.start, selection.end);
|
|
@@ -202,7 +197,7 @@ function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotat
|
|
|
202
197
|
};
|
|
203
198
|
}
|
|
204
199
|
finalizeMergedGroup();
|
|
205
|
-
const change = textDocument.applyResolvedEdits(edits, true, selections);
|
|
200
|
+
const change = textDocument.applyResolvedEdits(edits, true, selections, void 0, undoBoundary);
|
|
206
201
|
const nextSelections = createSelectionsFromOffsetPairs(textDocument, nextSelectionOffsets.map((offsets) => {
|
|
207
202
|
if (offsets === void 0) throw new Error("Missing next selection offsets");
|
|
208
203
|
return offsets;
|
|
@@ -218,9 +213,27 @@ function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotat
|
|
|
218
213
|
};
|
|
219
214
|
}
|
|
220
215
|
/**
|
|
216
|
+
* Returns the next anchor/focus offsets after replacing a selection range.
|
|
217
|
+
* When the inserted text still contains the original selection (auto-surround),
|
|
218
|
+
* the inner range is reselected to match VS Code/CodeMirror behavior.
|
|
219
|
+
*/
|
|
220
|
+
function getNextSelectionOffsetPairAfterReplace(textDocument, entry, offsetDelta, newText) {
|
|
221
|
+
const insertStart = entry.start + offsetDelta;
|
|
222
|
+
const insertEnd = insertStart + newText.length;
|
|
223
|
+
if (entry.end - entry.start > 0) {
|
|
224
|
+
const originalText = textDocument.getText().slice(entry.start, entry.end);
|
|
225
|
+
const preservedOffset = newText.indexOf(originalText);
|
|
226
|
+
if (preservedOffset !== -1 && preservedOffset + originalText.length <= newText.length) {
|
|
227
|
+
const rangeStart = insertStart + preservedOffset;
|
|
228
|
+
return [rangeStart, rangeStart + originalText.length];
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return [insertEnd, insertEnd];
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
221
234
|
* Applies a text replace to multiple selections.
|
|
222
235
|
*/
|
|
223
|
-
function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnotations) {
|
|
236
|
+
function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnotations, undoBoundary = false) {
|
|
224
237
|
if (selections.length !== texts.length) throw new Error("Selection text replacements must match the selection count");
|
|
225
238
|
const selectionPositions = [];
|
|
226
239
|
for (const selection of selections) selectionPositions.push(selection.start, selection.end);
|
|
@@ -247,12 +260,12 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
|
|
|
247
260
|
});
|
|
248
261
|
const allDeletes = texts.every((text) => text === "");
|
|
249
262
|
let edits;
|
|
250
|
-
const
|
|
263
|
+
const nextSelectionOffsetPairs = Array.from({ length: selections.length });
|
|
251
264
|
if (allDeletes) {
|
|
252
265
|
edits = [];
|
|
253
266
|
let hasEffect = false;
|
|
254
267
|
for (const entry of ordered) {
|
|
255
|
-
|
|
268
|
+
nextSelectionOffsetPairs[entry.index] = [entry.end, entry.end];
|
|
256
269
|
if (entry.start >= entry.end) continue;
|
|
257
270
|
hasEffect = true;
|
|
258
271
|
const last = edits[edits.length - 1];
|
|
@@ -282,7 +295,7 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
|
|
|
282
295
|
break;
|
|
283
296
|
}
|
|
284
297
|
if (next === caret) next += delta;
|
|
285
|
-
|
|
298
|
+
nextSelectionOffsetPairs[entry.index] = [next, next];
|
|
286
299
|
}
|
|
287
300
|
} else {
|
|
288
301
|
edits = [];
|
|
@@ -297,12 +310,15 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
|
|
|
297
310
|
end: entry.end,
|
|
298
311
|
text: newText
|
|
299
312
|
});
|
|
300
|
-
|
|
313
|
+
nextSelectionOffsetPairs[entry.index] = getNextSelectionOffsetPairAfterReplace(textDocument, entry, offsetDelta, newText);
|
|
301
314
|
offsetDelta += newText.length - (entry.end - entry.start);
|
|
302
315
|
}
|
|
303
316
|
}
|
|
304
|
-
const change = textDocument.applyResolvedEdits(edits, true, selections);
|
|
305
|
-
const nextSelections = createSelectionsFromOffsetPairs(textDocument,
|
|
317
|
+
const change = textDocument.applyResolvedEdits(edits, true, selections, void 0, undoBoundary);
|
|
318
|
+
const nextSelections = createSelectionsFromOffsetPairs(textDocument, nextSelectionOffsetPairs.map((offsets) => {
|
|
319
|
+
if (offsets === void 0) throw new Error("Missing next selection offsets");
|
|
320
|
+
return offsets;
|
|
321
|
+
}));
|
|
306
322
|
textDocument.setLastUndoSelectionsAfter(nextSelections);
|
|
307
323
|
if (change !== void 0 && lineAnnotations !== void 0) {
|
|
308
324
|
const nextLineAnnotations = applyDocumentChangeToLineAnnotations(change, lineAnnotations);
|
|
@@ -313,6 +329,47 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
|
|
|
313
329
|
change
|
|
314
330
|
};
|
|
315
331
|
}
|
|
332
|
+
const AUTO_SURROUND_CLOSE_CHARS = /* @__PURE__ */ new Map([
|
|
333
|
+
["'", "'"],
|
|
334
|
+
["\"", "\""],
|
|
335
|
+
["`", "`"],
|
|
336
|
+
["{", "}"],
|
|
337
|
+
["[", "]"],
|
|
338
|
+
["<", ">"],
|
|
339
|
+
["(", ")"]
|
|
340
|
+
]);
|
|
341
|
+
const AUTO_SURROUND_QUOTE_CHARS = /* @__PURE__ */ new Set([
|
|
342
|
+
"'",
|
|
343
|
+
"\"",
|
|
344
|
+
"`"
|
|
345
|
+
]);
|
|
346
|
+
const AUTO_SURROUND_BRACKET_CHARS = /* @__PURE__ */ new Set([
|
|
347
|
+
"{",
|
|
348
|
+
"[",
|
|
349
|
+
"(",
|
|
350
|
+
"<"
|
|
351
|
+
]);
|
|
352
|
+
function shouldAutoSurroundChar(autoSurround, char) {
|
|
353
|
+
if (autoSurround === "never") return false;
|
|
354
|
+
if (autoSurround === "brackets") return AUTO_SURROUND_BRACKET_CHARS.has(char);
|
|
355
|
+
if (autoSurround === "quotes") return AUTO_SURROUND_QUOTE_CHARS.has(char);
|
|
356
|
+
return true;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Returns per-selection replacement text when typing a surround character over
|
|
360
|
+
* non-collapsed selections, matching VS Code auto-surround behavior.
|
|
361
|
+
*/
|
|
362
|
+
function getAutoSurroundReplacementTexts(textDocument, selections, char, autoSurround) {
|
|
363
|
+
if (char.length !== 1 || selections.length === 0) return;
|
|
364
|
+
const closeChar = AUTO_SURROUND_CLOSE_CHARS.get(char);
|
|
365
|
+
if (closeChar === void 0 || !shouldAutoSurroundChar(autoSurround, char)) return;
|
|
366
|
+
const replacements = [];
|
|
367
|
+
for (const selection of selections) {
|
|
368
|
+
if (isCollapsedSelection(selection)) return;
|
|
369
|
+
replacements.push(char + textDocument.getText(selection) + closeChar);
|
|
370
|
+
}
|
|
371
|
+
return replacements;
|
|
372
|
+
}
|
|
316
373
|
/**
|
|
317
374
|
* Swaps the two characters adjacent to a collapsed selection, matching browser
|
|
318
375
|
* insertTranspose (Ctrl+T) behavior.
|
|
@@ -329,36 +386,48 @@ function applyTransposeToSelections(textDocument, selections, lineAnnotations) {
|
|
|
329
386
|
}
|
|
330
387
|
const { line, character } = selection.start;
|
|
331
388
|
const offset = anchor;
|
|
332
|
-
const
|
|
389
|
+
const lineText = textDocument.getLineText(line);
|
|
390
|
+
const lineLength = lineText.length;
|
|
391
|
+
const lineStart = offset - character;
|
|
392
|
+
const graphemeStarts = getLineGraphemeStarts(lineText);
|
|
333
393
|
let edit;
|
|
334
394
|
if (character > 0 && character < lineLength) {
|
|
395
|
+
const before = findClusterBreak(lineText, character, false, graphemeStarts);
|
|
396
|
+
const after = findClusterBreak(lineText, character, true, graphemeStarts);
|
|
335
397
|
edit = {
|
|
336
|
-
start:
|
|
337
|
-
end:
|
|
338
|
-
text:
|
|
398
|
+
start: lineStart + before,
|
|
399
|
+
end: lineStart + after,
|
|
400
|
+
text: lineText.slice(character, after) + lineText.slice(before, character)
|
|
339
401
|
};
|
|
340
|
-
nextOffsetPairs.push([
|
|
341
|
-
} else if (character === lineLength &&
|
|
402
|
+
nextOffsetPairs.push([lineStart + after, lineStart + after]);
|
|
403
|
+
} else if (character === lineLength && graphemeStarts.length >= 2) {
|
|
404
|
+
const lastStart = graphemeStarts[graphemeStarts.length - 1];
|
|
405
|
+
const secondLastStart = graphemeStarts[graphemeStarts.length - 2];
|
|
342
406
|
edit = {
|
|
343
|
-
start:
|
|
407
|
+
start: lineStart + secondLastStart,
|
|
344
408
|
end: offset,
|
|
345
|
-
text:
|
|
409
|
+
text: lineText.slice(lastStart, lineLength) + lineText.slice(secondLastStart, lastStart)
|
|
346
410
|
};
|
|
347
411
|
nextOffsetPairs.push([offset, offset]);
|
|
348
412
|
} else if (character === 0 && line > 0 && lineLength > 0) {
|
|
349
413
|
const prevLine = line - 1;
|
|
350
|
-
const
|
|
414
|
+
const prevLineText = textDocument.getLineText(prevLine);
|
|
415
|
+
const prevLength = prevLineText.length;
|
|
351
416
|
const prevEnd = textDocument.offsetAt({
|
|
352
417
|
line: prevLine,
|
|
353
418
|
character: prevLength
|
|
354
419
|
});
|
|
355
|
-
const
|
|
420
|
+
const prevGraphemeStart = prevLength > 0 ? findClusterBreak(prevLineText, prevLength, false, getLineGraphemeStarts(prevLineText)) : prevLength;
|
|
421
|
+
const firstEnd = findClusterBreak(lineText, 0, true, graphemeStarts);
|
|
422
|
+
const prevStart = prevEnd - (prevLength - prevGraphemeStart);
|
|
423
|
+
const newText = lineText.slice(0, firstEnd) + text.slice(prevEnd, offset) + prevLineText.slice(prevGraphemeStart, prevLength);
|
|
356
424
|
edit = {
|
|
357
425
|
start: prevStart,
|
|
358
|
-
end: offset +
|
|
359
|
-
text:
|
|
426
|
+
end: offset + firstEnd,
|
|
427
|
+
text: newText
|
|
360
428
|
};
|
|
361
|
-
|
|
429
|
+
const caret = prevStart + newText.length;
|
|
430
|
+
nextOffsetPairs.push([caret, caret]);
|
|
362
431
|
} else {
|
|
363
432
|
nextOffsetPairs.push([anchor, focus]);
|
|
364
433
|
continue;
|
|
@@ -391,7 +460,7 @@ function applyDeleteHardLineForwardToSelections(textDocument, selections, lineAn
|
|
|
391
460
|
return {
|
|
392
461
|
start: range.start,
|
|
393
462
|
end: range.end,
|
|
394
|
-
direction:
|
|
463
|
+
direction: 0
|
|
395
464
|
};
|
|
396
465
|
});
|
|
397
466
|
return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
|
|
@@ -405,7 +474,7 @@ function applyDeleteSoftLineBackwardToSelections(textDocument, selections, getSo
|
|
|
405
474
|
if (!isCollapsedSelection(selection)) return {
|
|
406
475
|
start: selection.start,
|
|
407
476
|
end: selection.end,
|
|
408
|
-
direction:
|
|
477
|
+
direction: 0
|
|
409
478
|
};
|
|
410
479
|
const caret = getCaretPosition(selection);
|
|
411
480
|
const { line, character } = caret;
|
|
@@ -419,12 +488,12 @@ function applyDeleteSoftLineBackwardToSelections(textDocument, selections, getSo
|
|
|
419
488
|
line,
|
|
420
489
|
character
|
|
421
490
|
},
|
|
422
|
-
direction:
|
|
491
|
+
direction: 0
|
|
423
492
|
};
|
|
424
493
|
if (line === 0) return {
|
|
425
494
|
start: caret,
|
|
426
495
|
end: caret,
|
|
427
|
-
direction:
|
|
496
|
+
direction: 0
|
|
428
497
|
};
|
|
429
498
|
const prevLineLength = textDocument.getLineLength(line - 1);
|
|
430
499
|
return {
|
|
@@ -436,7 +505,7 @@ function applyDeleteSoftLineBackwardToSelections(textDocument, selections, getSo
|
|
|
436
505
|
line,
|
|
437
506
|
character: 0
|
|
438
507
|
},
|
|
439
|
-
direction:
|
|
508
|
+
direction: 0
|
|
440
509
|
};
|
|
441
510
|
});
|
|
442
511
|
return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
|
|
@@ -451,7 +520,77 @@ function applyDeleteWordBackwardToSelections(textDocument, selections, lineAnnot
|
|
|
451
520
|
return {
|
|
452
521
|
start,
|
|
453
522
|
end,
|
|
454
|
-
direction:
|
|
523
|
+
direction: 0
|
|
524
|
+
};
|
|
525
|
+
});
|
|
526
|
+
return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Resolves the document range deleted by Backspace or Delete at a collapsed
|
|
530
|
+
* caret. Non-collapsed selections delete their selected text instead.
|
|
531
|
+
*/
|
|
532
|
+
function resolveDeleteCharacterRange(textDocument, selection, forward) {
|
|
533
|
+
if (!isCollapsedSelection(selection)) return [selection.start, selection.end];
|
|
534
|
+
const caret = getCaretPosition(selection);
|
|
535
|
+
let { line, character } = caret;
|
|
536
|
+
const lineLength = textDocument.getLineLength(line);
|
|
537
|
+
const lineCount = textDocument.lineCount;
|
|
538
|
+
character = Math.min(character, lineLength);
|
|
539
|
+
if (forward) {
|
|
540
|
+
if (character < lineLength) return [{
|
|
541
|
+
line,
|
|
542
|
+
character
|
|
543
|
+
}, {
|
|
544
|
+
line,
|
|
545
|
+
character: stepCharacterByGrapheme(textDocument, line, character, true)
|
|
546
|
+
}];
|
|
547
|
+
if (line < lineCount - 1) return [{
|
|
548
|
+
line,
|
|
549
|
+
character: lineLength
|
|
550
|
+
}, {
|
|
551
|
+
line: line + 1,
|
|
552
|
+
character: 0
|
|
553
|
+
}];
|
|
554
|
+
return [caret, caret];
|
|
555
|
+
}
|
|
556
|
+
if (character > 0) return [{
|
|
557
|
+
line,
|
|
558
|
+
character: stepCharacterByGrapheme(textDocument, line, character, false)
|
|
559
|
+
}, {
|
|
560
|
+
line,
|
|
561
|
+
character
|
|
562
|
+
}];
|
|
563
|
+
if (line > 0) {
|
|
564
|
+
const prevLineLength = textDocument.getLineLength(line - 1);
|
|
565
|
+
return [{
|
|
566
|
+
line: line - 1,
|
|
567
|
+
character: prevLineLength
|
|
568
|
+
}, {
|
|
569
|
+
line,
|
|
570
|
+
character: 0
|
|
571
|
+
}];
|
|
572
|
+
}
|
|
573
|
+
return [caret, caret];
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Deletes one grapheme (or selected text) at each selection.
|
|
577
|
+
*/
|
|
578
|
+
function applyDeleteCharacterToSelections(textDocument, selections, forward, lineAnnotations, tabSize = 2) {
|
|
579
|
+
const deleteSelections = selections.map((selection) => {
|
|
580
|
+
let [start, end] = resolveDeleteCharacterRange(textDocument, selection, forward);
|
|
581
|
+
if (!forward && isCollapsedSelection(selection)) {
|
|
582
|
+
const normalized = normalizeLeadingIndentForChange(textDocument, {
|
|
583
|
+
start: textDocument.offsetAt(start),
|
|
584
|
+
end: textDocument.offsetAt(end),
|
|
585
|
+
text: ""
|
|
586
|
+
}, tabSize);
|
|
587
|
+
start = textDocument.positionAt(normalized.start);
|
|
588
|
+
end = textDocument.positionAt(normalized.end);
|
|
589
|
+
}
|
|
590
|
+
return {
|
|
591
|
+
start,
|
|
592
|
+
end,
|
|
593
|
+
direction: 0
|
|
455
594
|
};
|
|
456
595
|
});
|
|
457
596
|
return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
|
|
@@ -467,7 +606,7 @@ function isCollapsedSelection(selection) {
|
|
|
467
606
|
*/
|
|
468
607
|
function getCaretPosition(selection) {
|
|
469
608
|
const { start, end, direction } = selection;
|
|
470
|
-
return direction ===
|
|
609
|
+
return direction === -1 ? start : end;
|
|
471
610
|
}
|
|
472
611
|
/**
|
|
473
612
|
* Checks if a line is editable.
|
|
@@ -497,7 +636,7 @@ function comparePosition(a, b) {
|
|
|
497
636
|
* Creates a selection from anchor and focus offsets.
|
|
498
637
|
*/
|
|
499
638
|
function createSelectionFromAnchorAndFocusOffsets(textDocument, anchorOffset, focusOffset) {
|
|
500
|
-
const direction = anchorOffset === focusOffset ?
|
|
639
|
+
const direction = anchorOffset === focusOffset ? 0 : anchorOffset < focusOffset ? 1 : -1;
|
|
501
640
|
const start = Math.min(anchorOffset, focusOffset);
|
|
502
641
|
const end = Math.max(anchorOffset, focusOffset);
|
|
503
642
|
return {
|
|
@@ -507,10 +646,44 @@ function createSelectionFromAnchorAndFocusOffsets(textDocument, anchorOffset, fo
|
|
|
507
646
|
};
|
|
508
647
|
}
|
|
509
648
|
/**
|
|
649
|
+
* Maps a single offset from the pre-edit document into the post-edit document.
|
|
650
|
+
* `edits` are resolved edits in pre-edit offsets, sorted ascending and
|
|
651
|
+
* non-overlapping. An offset at or after an edit's start shifts to the end of
|
|
652
|
+
* that edit's replacement (right gravity), so text inserted at the caret pushes
|
|
653
|
+
* the caret past it; an offset strictly before an edit is only shifted by the
|
|
654
|
+
* net length change of the edits that precede it.
|
|
655
|
+
*/
|
|
656
|
+
function remapOffsetThroughEdits(offset, edits) {
|
|
657
|
+
let delta = 0;
|
|
658
|
+
for (const edit of edits) {
|
|
659
|
+
if (offset < edit.start) break;
|
|
660
|
+
if (offset >= edit.end) delta += edit.text.length - (edit.end - edit.start);
|
|
661
|
+
else return edit.start + delta + edit.text.length;
|
|
662
|
+
}
|
|
663
|
+
return offset + delta;
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Re-anchors selections after a batch of text edits has been applied, so the
|
|
667
|
+
* caret keeps pointing at the same logical location in the changed buffer.
|
|
668
|
+
*
|
|
669
|
+
* `selectionOffsets` (one `[start, end]` pair per selection) and `edits` are
|
|
670
|
+
* measured in the PRE-edit document; the returned selections are built from
|
|
671
|
+
* `textDocument`, which must already reflect the applied edits. Selection
|
|
672
|
+
* direction is preserved by remapping each edge and re-deriving anchor/focus.
|
|
673
|
+
*/
|
|
674
|
+
function remapSelectionsAfterEdits(textDocument, selections, selectionOffsets, edits) {
|
|
675
|
+
return selections.map((selection, index) => {
|
|
676
|
+
const [startOffset, endOffset] = selectionOffsets[index];
|
|
677
|
+
const nextStart = remapOffsetThroughEdits(startOffset, edits);
|
|
678
|
+
const nextEnd = remapOffsetThroughEdits(endOffset, edits);
|
|
679
|
+
return createSelectionFromAnchorAndFocusOffsets(textDocument, selection.direction === -1 ? nextEnd : nextStart, selection.direction === -1 ? nextStart : nextEnd);
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
/**
|
|
510
683
|
* Creates a selection from a anchor and focus selection.
|
|
511
684
|
*/
|
|
512
685
|
function createSelectionFrom(anchorSelection, focusSelection) {
|
|
513
|
-
const anchor = anchorSelection.direction ===
|
|
686
|
+
const anchor = anchorSelection.direction === -1 ? anchorSelection.end : anchorSelection.start;
|
|
514
687
|
const currentStartOrder = comparePosition(anchor, focusSelection.start);
|
|
515
688
|
const currentEndOrder = comparePosition(anchor, focusSelection.end);
|
|
516
689
|
let focus = focusSelection.end;
|
|
@@ -521,7 +694,7 @@ function createSelectionFrom(anchorSelection, focusSelection) {
|
|
|
521
694
|
return {
|
|
522
695
|
start: anchorVsFocus <= 0 ? anchor : focus,
|
|
523
696
|
end: anchorVsFocus <= 0 ? focus : anchor,
|
|
524
|
-
direction: anchorVsFocus === 0 ?
|
|
697
|
+
direction: anchorVsFocus === 0 ? 0 : anchorVsFocus < 0 ? 1 : -1
|
|
525
698
|
};
|
|
526
699
|
}
|
|
527
700
|
/**
|
|
@@ -534,22 +707,22 @@ function extendSelection(original, target) {
|
|
|
534
707
|
if (leftExtended && !rightExtended) return {
|
|
535
708
|
start: target.start,
|
|
536
709
|
end: original.end,
|
|
537
|
-
direction:
|
|
710
|
+
direction: -1
|
|
538
711
|
};
|
|
539
712
|
if (rightExtended && !leftExtended) return {
|
|
540
713
|
start: original.start,
|
|
541
714
|
end: target.end,
|
|
542
|
-
direction:
|
|
715
|
+
direction: 1
|
|
543
716
|
};
|
|
544
|
-
if (original.direction ===
|
|
717
|
+
if (original.direction === -1) return {
|
|
545
718
|
start: target.start,
|
|
546
719
|
end: original.end,
|
|
547
|
-
direction: comparePosition(target.start, original.end) === 0 ?
|
|
720
|
+
direction: comparePosition(target.start, original.end) === 0 ? 0 : -1
|
|
548
721
|
};
|
|
549
722
|
return {
|
|
550
723
|
start: original.start,
|
|
551
724
|
end: target.end,
|
|
552
|
-
direction: comparePosition(original.start, target.end) === 0 ?
|
|
725
|
+
direction: comparePosition(original.start, target.end) === 0 ? 0 : 1
|
|
553
726
|
};
|
|
554
727
|
}
|
|
555
728
|
/**
|
|
@@ -622,7 +795,7 @@ function getDocumentFullSelection(textDocument) {
|
|
|
622
795
|
line: lastLine,
|
|
623
796
|
character: textDocument.getLineLength(lastLine)
|
|
624
797
|
},
|
|
625
|
-
direction:
|
|
798
|
+
direction: 1
|
|
626
799
|
};
|
|
627
800
|
}
|
|
628
801
|
/**
|
|
@@ -637,21 +810,162 @@ function getDocumentBoundarySelection(textDocument, atEnd) {
|
|
|
637
810
|
return {
|
|
638
811
|
start,
|
|
639
812
|
end: start,
|
|
640
|
-
direction:
|
|
813
|
+
direction: 1
|
|
641
814
|
};
|
|
642
815
|
}
|
|
643
816
|
/**
|
|
644
|
-
*
|
|
817
|
+
* Resolves the document offset range each selection contributes to the
|
|
818
|
+
* clipboard, ordered by position. A collapsed selection contributes its whole
|
|
819
|
+
* logical line including the trailing line break; the final line has no
|
|
820
|
+
* trailing break to include. A ranged selection contributes the selected text.
|
|
821
|
+
*/
|
|
822
|
+
function resolveClipboardRegions(textDocument, selections) {
|
|
823
|
+
return selections.map((selection) => {
|
|
824
|
+
if (isCollapsedSelection(selection)) {
|
|
825
|
+
const line = selection.start.line;
|
|
826
|
+
return {
|
|
827
|
+
start: textDocument.offsetAt({
|
|
828
|
+
line,
|
|
829
|
+
character: 0
|
|
830
|
+
}),
|
|
831
|
+
end: line < textDocument.lineCount - 1 ? textDocument.offsetAt({
|
|
832
|
+
line: line + 1,
|
|
833
|
+
character: 0
|
|
834
|
+
}) : textDocument.offsetAt({
|
|
835
|
+
line,
|
|
836
|
+
character: textDocument.getLineLength(line)
|
|
837
|
+
})
|
|
838
|
+
};
|
|
839
|
+
}
|
|
840
|
+
const start = textDocument.offsetAt(selection.start);
|
|
841
|
+
const end = textDocument.offsetAt(selection.end);
|
|
842
|
+
return start <= end ? {
|
|
843
|
+
start,
|
|
844
|
+
end
|
|
845
|
+
} : {
|
|
846
|
+
start: end,
|
|
847
|
+
end: start
|
|
848
|
+
};
|
|
849
|
+
}).sort((a, b) => {
|
|
850
|
+
const startOrder = a.start - b.start;
|
|
851
|
+
return startOrder !== 0 ? startOrder : a.end - b.end;
|
|
852
|
+
});
|
|
853
|
+
}
|
|
854
|
+
/**
|
|
855
|
+
* Get the clipboard text of the selections for the given text document. Used by
|
|
856
|
+
* both copy and cut so the two stay in sync. Overlapping regions (e.g. several
|
|
857
|
+
* carets on one line) are merged so the same text is never emitted twice, and a
|
|
858
|
+
* line-ending separator is inserted only between regions that aren't already
|
|
859
|
+
* contiguous in the document.
|
|
645
860
|
*/
|
|
646
861
|
function getSelectionText(textDocument, selections) {
|
|
647
|
-
|
|
648
|
-
|
|
862
|
+
const regions = resolveClipboardRegions(textDocument, selections);
|
|
863
|
+
const eol = textDocument.eol;
|
|
864
|
+
let result = "";
|
|
865
|
+
let prevEnd = -1;
|
|
866
|
+
for (const region of regions) {
|
|
867
|
+
if (region.end <= region.start) continue;
|
|
868
|
+
if (region.start <= prevEnd) {
|
|
869
|
+
if (region.end > prevEnd) {
|
|
870
|
+
result += textDocument.getTextSlice(prevEnd, region.end);
|
|
871
|
+
prevEnd = region.end;
|
|
872
|
+
}
|
|
873
|
+
continue;
|
|
874
|
+
}
|
|
875
|
+
if (result.length > 0 && !endsWithLineBreak(result)) result += eol;
|
|
876
|
+
result += textDocument.getTextSlice(region.start, region.end);
|
|
877
|
+
prevEnd = region.end;
|
|
878
|
+
}
|
|
879
|
+
return result;
|
|
880
|
+
}
|
|
881
|
+
function resolveSelectionCutEdit(textDocument, selection) {
|
|
882
|
+
if (isCollapsedSelection(selection)) return resolveCollapsedSelectionCutEdit(textDocument, selection);
|
|
883
|
+
const [start, end] = comparePosition(selection.start, selection.end) <= 0 ? [selection.start, selection.end] : [selection.end, selection.start];
|
|
884
|
+
return {
|
|
885
|
+
start: textDocument.offsetAt(start),
|
|
886
|
+
end: textDocument.offsetAt(end),
|
|
887
|
+
text: ""
|
|
888
|
+
};
|
|
889
|
+
}
|
|
890
|
+
function resolveCollapsedSelectionCutEdit(textDocument, selection) {
|
|
891
|
+
const line = selection.start.line;
|
|
892
|
+
const lineStart = textDocument.offsetAt({
|
|
893
|
+
line,
|
|
894
|
+
character: 0
|
|
895
|
+
});
|
|
896
|
+
const lineEnd = textDocument.offsetAt({
|
|
897
|
+
line,
|
|
898
|
+
character: textDocument.getLineLength(line)
|
|
899
|
+
});
|
|
900
|
+
if (line < textDocument.lineCount - 1) return {
|
|
901
|
+
start: lineStart,
|
|
902
|
+
end: textDocument.offsetAt({
|
|
903
|
+
line: line + 1,
|
|
904
|
+
character: 0
|
|
905
|
+
}),
|
|
906
|
+
text: ""
|
|
907
|
+
};
|
|
908
|
+
if (line > 0) return {
|
|
909
|
+
start: textDocument.offsetAt({
|
|
910
|
+
line: line - 1,
|
|
911
|
+
character: textDocument.getLineLength(line - 1)
|
|
912
|
+
}),
|
|
913
|
+
end: lineEnd,
|
|
914
|
+
text: ""
|
|
915
|
+
};
|
|
916
|
+
return {
|
|
917
|
+
start: lineStart,
|
|
918
|
+
end: lineEnd,
|
|
919
|
+
text: ""
|
|
920
|
+
};
|
|
921
|
+
}
|
|
922
|
+
function mergeCutEdits(orderedCuts) {
|
|
923
|
+
const edits = [];
|
|
924
|
+
for (const { edit } of orderedCuts) {
|
|
925
|
+
if (edit.start >= edit.end) continue;
|
|
926
|
+
const last = edits.at(-1);
|
|
927
|
+
if (last !== void 0 && edit.start <= last.end) edits[edits.length - 1] = {
|
|
928
|
+
start: last.start,
|
|
929
|
+
end: Math.max(last.end, edit.end),
|
|
930
|
+
text: ""
|
|
931
|
+
};
|
|
932
|
+
else edits.push(edit);
|
|
933
|
+
}
|
|
934
|
+
return edits;
|
|
935
|
+
}
|
|
936
|
+
function mapCutSelectionOffsets(orderedCuts, edits) {
|
|
937
|
+
const nextOffsets = Array.from({ length: orderedCuts.length });
|
|
938
|
+
let editIndex = 0;
|
|
939
|
+
let offsetDelta = 0;
|
|
940
|
+
for (const cut of orderedCuts) {
|
|
941
|
+
while (editIndex < edits.length && cut.edit.start > edits[editIndex].end) {
|
|
942
|
+
const edit = edits[editIndex];
|
|
943
|
+
offsetDelta -= edit.end - edit.start;
|
|
944
|
+
editIndex++;
|
|
945
|
+
}
|
|
946
|
+
const edit = edits[editIndex];
|
|
947
|
+
if (edit !== void 0 && cut.edit.start >= edit.start && cut.edit.start <= edit.end) nextOffsets[cut.index] = edit.start + offsetDelta;
|
|
948
|
+
else nextOffsets[cut.index] = cut.edit.start + offsetDelta;
|
|
949
|
+
}
|
|
950
|
+
return nextOffsets;
|
|
951
|
+
}
|
|
952
|
+
function resolveSelectionCut(textDocument, selections) {
|
|
953
|
+
const orderedCuts = [...selections.map((selection, index) => ({
|
|
954
|
+
index,
|
|
955
|
+
edit: resolveSelectionCutEdit(textDocument, selection)
|
|
956
|
+
}))].sort((a, b) => {
|
|
957
|
+
const startOrder = a.edit.start - b.edit.start;
|
|
649
958
|
if (startOrder !== 0) return startOrder;
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
959
|
+
const endOrder = a.edit.end - b.edit.end;
|
|
960
|
+
if (endOrder !== 0) return endOrder;
|
|
961
|
+
return a.index - b.index;
|
|
962
|
+
});
|
|
963
|
+
const edits = mergeCutEdits(orderedCuts);
|
|
964
|
+
return {
|
|
965
|
+
text: getSelectionText(textDocument, selections),
|
|
966
|
+
edits,
|
|
967
|
+
nextSelectionOffsets: mapCutSelectionOffsets(orderedCuts, edits)
|
|
968
|
+
};
|
|
655
969
|
}
|
|
656
970
|
/**
|
|
657
971
|
* Get the anchor node and offset for a selection.
|
|
@@ -703,7 +1017,7 @@ function expandCollapsedSelectionToWord(textDocument, selection) {
|
|
|
703
1017
|
line,
|
|
704
1018
|
character: span.end
|
|
705
1019
|
},
|
|
706
|
-
direction:
|
|
1020
|
+
direction: 1
|
|
707
1021
|
};
|
|
708
1022
|
}
|
|
709
1023
|
function expandCollapsedLineWord(lineText, character) {
|
|
@@ -734,9 +1048,7 @@ function resolveDeleteWordBackwardRange(textDocument, selection) {
|
|
|
734
1048
|
}];
|
|
735
1049
|
}
|
|
736
1050
|
const lineText = textDocument.getLineText(line);
|
|
737
|
-
const graphemeStarts =
|
|
738
|
-
const segmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
|
|
739
|
-
for (const segment of segmenter.segment(lineText)) if (segment.index > 0) graphemeStarts.push(segment.index);
|
|
1051
|
+
const graphemeStarts = getLineGraphemeStarts(lineText);
|
|
740
1052
|
let pos = head;
|
|
741
1053
|
let match;
|
|
742
1054
|
while (pos > 0) {
|
|
@@ -766,8 +1078,36 @@ function findClusterBreak(text, pos, forward, graphemeStarts) {
|
|
|
766
1078
|
}
|
|
767
1079
|
return 0;
|
|
768
1080
|
}
|
|
1081
|
+
const graphemeSegmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
|
|
1082
|
+
function getLineGraphemeStarts(lineText) {
|
|
1083
|
+
const graphemeStarts = [0];
|
|
1084
|
+
for (const segment of graphemeSegmenter.segment(lineText)) if (segment.index > 0) graphemeStarts.push(segment.index);
|
|
1085
|
+
return graphemeStarts;
|
|
1086
|
+
}
|
|
1087
|
+
function stepCharacterByGrapheme(textDocument, line, character, forward) {
|
|
1088
|
+
const lineLength = textDocument.getLineLength(line);
|
|
1089
|
+
if (forward) {
|
|
1090
|
+
if (character >= lineLength) return lineLength;
|
|
1091
|
+
const lineStart = textDocument.offsetAt({
|
|
1092
|
+
line,
|
|
1093
|
+
character: 0
|
|
1094
|
+
});
|
|
1095
|
+
const suffix = textDocument.getTextSlice(lineStart + character, lineStart + lineLength);
|
|
1096
|
+
for (const segment of graphemeSegmenter.segment(suffix)) return character + segment.segment.length;
|
|
1097
|
+
return lineLength;
|
|
1098
|
+
}
|
|
1099
|
+
if (character <= 0) return 0;
|
|
1100
|
+
const lineStart = textDocument.offsetAt({
|
|
1101
|
+
line,
|
|
1102
|
+
character: 0
|
|
1103
|
+
});
|
|
1104
|
+
const prefix = textDocument.getTextSlice(lineStart, lineStart + character);
|
|
1105
|
+
let prevStart = 0;
|
|
1106
|
+
for (const segment of graphemeSegmenter.segment(prefix)) prevStart = segment.index;
|
|
1107
|
+
return prevStart;
|
|
1108
|
+
}
|
|
769
1109
|
function getSelectionAnchorAndFocusOffsets(textDocument, selection) {
|
|
770
|
-
const isBackward = selection.direction ===
|
|
1110
|
+
const isBackward = selection.direction === -1;
|
|
771
1111
|
return [textDocument.offsetAt(isBackward ? selection.end : selection.start), textDocument.offsetAt(getCaretPosition(selection))];
|
|
772
1112
|
}
|
|
773
1113
|
function resolveDeleteHardLineForwardRange(textDocument, selection) {
|
|
@@ -809,7 +1149,7 @@ function resolveDeleteHardLineForwardRange(textDocument, selection) {
|
|
|
809
1149
|
};
|
|
810
1150
|
}
|
|
811
1151
|
function expandSingleNewlineInsert(textDocument, insertText, insertStartOffset) {
|
|
812
|
-
if (insertText !== "\n" && insertText !== "\r\n") return insertText;
|
|
1152
|
+
if (insertText !== "\n" && insertText !== "\r" && insertText !== "\r\n") return insertText;
|
|
813
1153
|
const line = textDocument.positionAt(insertStartOffset).line;
|
|
814
1154
|
const lineText = textDocument.getLineText(line);
|
|
815
1155
|
const indentLen = getLeadingSpaces(lineText);
|
|
@@ -829,7 +1169,7 @@ function createSelectionsFromOffsetPairs(textDocument, offsetPairs) {
|
|
|
829
1169
|
for (const [anchorOffset, focusOffset] of offsetPairs) normalizedOffsets.push(Math.min(anchorOffset, focusOffset), Math.max(anchorOffset, focusOffset));
|
|
830
1170
|
const positions = textDocument.positionsAt(normalizedOffsets);
|
|
831
1171
|
return offsetPairs.map(([anchorOffset, focusOffset], index) => {
|
|
832
|
-
const direction = anchorOffset === focusOffset ?
|
|
1172
|
+
const direction = anchorOffset === focusOffset ? 0 : anchorOffset < focusOffset ? 1 : -1;
|
|
833
1173
|
return {
|
|
834
1174
|
start: positions[index * 2],
|
|
835
1175
|
end: positions[index * 2 + 1],
|
|
@@ -985,10 +1325,10 @@ function isInside(token, node) {
|
|
|
985
1325
|
}
|
|
986
1326
|
function offsetBefore(line, node) {
|
|
987
1327
|
if (node.parentElement === line) {
|
|
988
|
-
let offset
|
|
1328
|
+
let offset = 0;
|
|
989
1329
|
const index = Array.prototype.indexOf.call(line.childNodes, node);
|
|
990
|
-
for (let i = 0; i < index; i++) offset
|
|
991
|
-
return offset
|
|
1330
|
+
for (let i = 0; i < index; i++) offset = getLineChildEnd(line.childNodes[i]);
|
|
1331
|
+
return offset;
|
|
992
1332
|
}
|
|
993
1333
|
for (const token of collectTokens(line)) if (isInside(token, node)) return getCharacterIndex(token) + (node.nodeType === 3 ? textLengthBefore(token, node) : 0);
|
|
994
1334
|
let offset = 0;
|
|
@@ -1018,10 +1358,10 @@ function getLineChildEnd(child, textOffsetInChild) {
|
|
|
1018
1358
|
if (parent === null) return 0;
|
|
1019
1359
|
const token = findTokenSpan(parent);
|
|
1020
1360
|
if (token === null) return 0;
|
|
1021
|
-
const base
|
|
1022
|
-
if (base
|
|
1361
|
+
const base = getCharacterIndex(token);
|
|
1362
|
+
if (base === void 0) return 0;
|
|
1023
1363
|
const length = textOffsetInChild === void 0 ? getTextOffset(child.textContent, child.textContent?.length ?? 0) : getTextOffset(child.textContent, textOffsetInChild);
|
|
1024
|
-
return base
|
|
1364
|
+
return base + textLengthBefore(token, child) + length;
|
|
1025
1365
|
}
|
|
1026
1366
|
if (child.nodeType !== 1) return 0;
|
|
1027
1367
|
const el = child;
|
|
@@ -1033,8 +1373,8 @@ function getLineChildEnd(child, textOffsetInChild) {
|
|
|
1033
1373
|
return end;
|
|
1034
1374
|
}
|
|
1035
1375
|
function getLineIndex(el) {
|
|
1036
|
-
const { line } = el.dataset;
|
|
1037
|
-
if (line !== void 0) {
|
|
1376
|
+
const { line, lineType } = el.dataset;
|
|
1377
|
+
if (line !== void 0 && lineType !== "change-deletion") {
|
|
1038
1378
|
const lineNumber = parseInt(line, 10);
|
|
1039
1379
|
if (!Number.isNaN(lineNumber)) return lineNumber - 1;
|
|
1040
1380
|
}
|
|
@@ -1051,7 +1391,7 @@ function getTextOffset(text, offset) {
|
|
|
1051
1391
|
const lineBreakIndex = value.search(/[\r\n]/);
|
|
1052
1392
|
return Math.min(offset, lineBreakIndex === -1 ? value.length : lineBreakIndex);
|
|
1053
1393
|
}
|
|
1054
|
-
|
|
1055
1394
|
//#endregion
|
|
1056
|
-
export { DirectionBackward, DirectionForward, DirectionNone, applyDeleteHardLineForwardToSelections, applyDeleteSoftLineBackwardToSelections, applyDeleteWordBackwardToSelections, applyTextChangeToSelections, applyTextReplaceToSelections, applyTransposeToSelections, comparePosition, convertSelection, createSelectionFrom, createSelectionFromAnchorAndFocusOffsets, expandCollapsedSelectionToWord, extendSelection, extendSelections, findNexMatch, getCaretPosition, getDocumentBoundarySelection, getDocumentFullSelection, getSelectionAnchor, getSelectionText, isCollapsedSelection, isLineEditable, mapCursorMove, mapSelectionShift, mergeOverlappingSelections, resolveIndentEdits, selectionIntersects };
|
|
1395
|
+
export { DirectionBackward, DirectionForward, DirectionNone, applyDeleteCharacterToSelections, applyDeleteHardLineForwardToSelections, applyDeleteSoftLineBackwardToSelections, applyDeleteWordBackwardToSelections, applyTextChangeToSelections, applyTextReplaceToSelections, applyTransposeToSelections, comparePosition, convertSelection, createSelectionFrom, createSelectionFromAnchorAndFocusOffsets, expandCollapsedSelectionToWord, extendSelection, extendSelections, findNexMatch, getAutoSurroundReplacementTexts, getCaretPosition, getDocumentBoundarySelection, getDocumentFullSelection, getSelectionAnchor, getSelectionText, isCollapsedSelection, isLineEditable, mapCursorMove, mapSelectionShift, mergeOverlappingSelections, remapSelectionsAfterEdits, resolveDeleteCharacterRange, resolveIndentEdits, resolveSelectionCut, selectionIntersects };
|
|
1396
|
+
|
|
1057
1397
|
//# sourceMappingURL=selection.js.map
|