@pierre/diffs 1.3.0-beta.5 → 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 +9 -9
- package/dist/components/CodeView.d.ts +10 -11
- package/dist/components/CodeView.d.ts.map +1 -1
- package/dist/components/CodeView.js +8 -8
- package/dist/components/CodeView.js.map +1 -1
- package/dist/components/File.d.ts +4 -5
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +32 -17
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +19 -19
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +84 -54
- 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 +4 -4
- 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 +0 -1
- package/dist/components/VirtualizedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.js +19 -18
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +2 -3
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +17 -18
- 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 +2 -1
- package/dist/editor/command.d.ts.map +1 -1
- package/dist/editor/command.js +7 -3
- 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 +26 -2
- package/dist/editor/editor.d.ts.map +1 -1
- package/dist/editor/editor.js +551 -252
- 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.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 +2 -1
- package/dist/editor/marker.d.ts.map +1 -1
- package/dist/editor/marker.js +28 -11
- package/dist/editor/marker.js.map +1 -1
- package/dist/editor/pieceTable.d.ts +4 -2
- package/dist/editor/pieceTable.d.ts.map +1 -1
- package/dist/editor/pieceTable.js +138 -128
- 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 +1 -0
- package/dist/editor/searchPanel.d.ts.map +1 -1
- package/dist/editor/searchPanel.js +75 -62
- 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 +7 -14
- 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 +36 -3
- package/dist/editor/textMeasure.d.ts.map +1 -1
- package/dist/editor/textMeasure.js +79 -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 +16 -13
- 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 +25 -3
- package/dist/managers/InteractionManager.js.map +1 -1
- package/dist/managers/ResizeManager.d.ts.map +1 -1
- package/dist/managers/ResizeManager.js +1 -1
- 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 +17 -16
- 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 +2 -3
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +30 -24
- 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 +14 -11
- 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 +5 -8
- 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 +11 -5
- 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.map +1 -1
- package/dist/utils/includesFileAnnotations.js +5 -5
- package/dist/utils/includesFileAnnotations.js.map +1 -1
- 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 +4 -5
- package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
- package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderFileWithHighlighter.js +1 -2
- 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 +2779 -6403
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +89 -123
- package/dist/worker/worker.js.map +1 -1
- package/package.json +13 -14
- package/dist/worker/wasm-qE0LgnY3.js +0 -10
- package/dist/worker/wasm-qE0LgnY3.js.map +0 -1
package/dist/editor/editor.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { queueRender } from "../managers/UniversalRenderingManager.js";
|
|
1
2
|
import { getFiletypeFromFileName } from "../utils/getFiletypeFromFileName.js";
|
|
2
3
|
import { isMoveCursorShortcut, isPrimaryModifier, isSafari } from "./platform.js";
|
|
3
|
-
import { resolveEditorCommandFromKeyboardEvent } from "./command.js";
|
|
4
|
+
import { resolveEditorCommandFromKeyboardEvent, resolveFindAgainShortcut } from "./command.js";
|
|
4
5
|
import { EditStack } from "./editStack.js";
|
|
5
6
|
import editor_default from "./editor2.js";
|
|
6
7
|
import { addEventListener, clampDomOffset, extend, getLineNumberAttr, h, round } from "./utils.js";
|
|
7
8
|
import { applyDocumentChangeToLineAnnotations, renderLineAnnotations } from "./lineAnnotations.js";
|
|
8
|
-
import {
|
|
9
|
+
import { 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, resolveIndentEdits, resolveSelectionCut, selectionIntersects } from "./selection.js";
|
|
9
10
|
import { MarkerRenderer, markerSeverityDatasetKey } from "./marker.js";
|
|
10
11
|
import { createSpriteElement } from "./sprite.js";
|
|
11
12
|
import { SearchPanelWidget } from "./searchPanel.js";
|
|
@@ -13,17 +14,17 @@ import { SelectionActionWidget } from "./selectionAction.js";
|
|
|
13
14
|
import { TextDocument } from "./textDocument.js";
|
|
14
15
|
import { Metrics, getExpandedAsciiTextColumns, getUnicodeMeasurementOffsets, snapTextOffsetToUnicodeBoundary } from "./textMeasure.js";
|
|
15
16
|
import { EditorTokenizer, renderLineTokens } from "./tokenzier.js";
|
|
16
|
-
|
|
17
17
|
//#region src/editor/editor.ts
|
|
18
|
+
const MAX_EDIT_WIDEN_WINDOW_MULTIPLE = 2;
|
|
18
19
|
var Editor = class {
|
|
19
20
|
#options;
|
|
20
|
-
#wrap = false;
|
|
21
21
|
#metrics = new Metrics();
|
|
22
22
|
#tokenizer;
|
|
23
23
|
#editorEventDisposes;
|
|
24
24
|
#globalEventDisposes;
|
|
25
25
|
#selectEventDisposes;
|
|
26
26
|
#detach;
|
|
27
|
+
#contentOffset;
|
|
27
28
|
#gutterWidthCache;
|
|
28
29
|
#contentWidthCache;
|
|
29
30
|
#lineYCache = /* @__PURE__ */ new Map();
|
|
@@ -42,18 +43,22 @@ var Editor = class {
|
|
|
42
43
|
#primaryCaretElement;
|
|
43
44
|
#resizeObserver;
|
|
44
45
|
#fileInstance;
|
|
45
|
-
#
|
|
46
|
+
#fileInfo;
|
|
46
47
|
#lineAnnotations;
|
|
47
48
|
#textDocument;
|
|
48
49
|
#renderRange;
|
|
50
|
+
#viewportWindowLines;
|
|
49
51
|
#markerRenderer;
|
|
50
52
|
#searchPanel;
|
|
51
53
|
#selectionAction;
|
|
52
54
|
#shouldIgnoreSelectionChange = false;
|
|
55
|
+
#contentHasFocus = false;
|
|
56
|
+
#isComposing = false;
|
|
53
57
|
#isGutterMouseDown = false;
|
|
54
58
|
#isContentMouseDown = false;
|
|
55
59
|
#shiftKeyPressed = false;
|
|
56
60
|
#selectionStart;
|
|
61
|
+
#deletedSelectionText = "";
|
|
57
62
|
#reservedSelections;
|
|
58
63
|
#initSelections;
|
|
59
64
|
#selections;
|
|
@@ -62,6 +67,7 @@ var Editor = class {
|
|
|
62
67
|
#scrollingToLineChar;
|
|
63
68
|
#scrollingToLineNoFocus = false;
|
|
64
69
|
#retainSearchPanelFocus = false;
|
|
70
|
+
#fontRemeasureScheduled = false;
|
|
65
71
|
#onDeferTokenize = (lines, themeType) => {
|
|
66
72
|
this.#fileInstance?.updateRenderCache(lines, themeType);
|
|
67
73
|
if (this.#renderRange !== void 0 && this.#renderRange.totalLines !== Infinity) {
|
|
@@ -77,17 +83,16 @@ var Editor = class {
|
|
|
77
83
|
this.#options = options;
|
|
78
84
|
}
|
|
79
85
|
edit(component) {
|
|
80
|
-
const { useTokenTransformer, enableGutterUtility, enableLineSelection, expandUnchanged,
|
|
86
|
+
const { useTokenTransformer, enableGutterUtility, enableLineSelection, expandUnchanged, lineHoverHighlight, ...rest } = component.options;
|
|
81
87
|
const isDiff = component.type === "file-diff";
|
|
82
|
-
if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true ||
|
|
88
|
+
if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true || expandUnchanged !== true && isDiff || lineHoverHighlight !== "disabled") {
|
|
83
89
|
component.setOptions({
|
|
84
90
|
...rest,
|
|
85
91
|
useTokenTransformer: true,
|
|
86
92
|
enableGutterUtility: false,
|
|
87
93
|
enableLineSelection: false,
|
|
88
|
-
lineHoverHighlight: "disabled",
|
|
89
94
|
expandUnchanged: true,
|
|
90
|
-
|
|
95
|
+
lineHoverHighlight: "disabled"
|
|
91
96
|
});
|
|
92
97
|
component.rerender();
|
|
93
98
|
}
|
|
@@ -102,8 +107,42 @@ var Editor = class {
|
|
|
102
107
|
applyEdits(edits, updateHistory = false) {
|
|
103
108
|
const textDocument = this.#textDocument;
|
|
104
109
|
if (textDocument == null) throw new Error("Editor is not attached");
|
|
105
|
-
const
|
|
106
|
-
|
|
110
|
+
const wasFocused = this.#contentHasFocus;
|
|
111
|
+
const selectionsBefore = this.#selections;
|
|
112
|
+
const selectionOffsetsBefore = selectionsBefore?.map((selection) => [textDocument.offsetAt(selection.start), textDocument.offsetAt(selection.end)]);
|
|
113
|
+
const resolvedEditOffsets = selectionsBefore === void 0 ? void 0 : edits.map((edit) => {
|
|
114
|
+
const a = textDocument.offsetAt(edit.range.start);
|
|
115
|
+
const b = textDocument.offsetAt(edit.range.end);
|
|
116
|
+
return {
|
|
117
|
+
start: Math.min(a, b),
|
|
118
|
+
end: Math.max(a, b),
|
|
119
|
+
text: edit.newText
|
|
120
|
+
};
|
|
121
|
+
}).sort((a, b) => a.start - b.start);
|
|
122
|
+
const change = textDocument.applyEdits(edits, updateHistory, selectionsBefore);
|
|
123
|
+
if (change === void 0) return;
|
|
124
|
+
let nextSelections;
|
|
125
|
+
if (selectionsBefore !== void 0 && selectionOffsetsBefore !== void 0 && resolvedEditOffsets !== void 0) {
|
|
126
|
+
nextSelections = remapSelectionsAfterEdits(textDocument, selectionsBefore, selectionOffsetsBefore, resolvedEditOffsets);
|
|
127
|
+
if (updateHistory) textDocument.setLastUndoSelectionsAfter(nextSelections);
|
|
128
|
+
}
|
|
129
|
+
this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change), { skipFocus: !wasFocused });
|
|
130
|
+
}
|
|
131
|
+
/** Whether there is an edit to undo. */
|
|
132
|
+
get canUndo() {
|
|
133
|
+
return this.#textDocument?.canUndo ?? false;
|
|
134
|
+
}
|
|
135
|
+
/** Whether there is an undone edit to redo. */
|
|
136
|
+
get canRedo() {
|
|
137
|
+
return this.#textDocument?.canRedo ?? false;
|
|
138
|
+
}
|
|
139
|
+
/** Undo the last edit. Does nothing when there is nothing to undo. */
|
|
140
|
+
undo() {
|
|
141
|
+
this.#runCommand("undo");
|
|
142
|
+
}
|
|
143
|
+
/** Redo the last undone edit. Does nothing when there is nothing to redo. */
|
|
144
|
+
redo() {
|
|
145
|
+
this.#runCommand("redo");
|
|
107
146
|
}
|
|
108
147
|
getState() {
|
|
109
148
|
const fileRef = this.#getFileRef();
|
|
@@ -138,7 +177,7 @@ var Editor = class {
|
|
|
138
177
|
const start = textDocument.normalizePosition(selection.start);
|
|
139
178
|
const end = textDocument.normalizePosition(selection.end);
|
|
140
179
|
return {
|
|
141
|
-
direction: selection.direction === "none" ?
|
|
180
|
+
direction: selection.direction === "none" ? 0 : selection.direction === "backward" ? -1 : 1,
|
|
142
181
|
start,
|
|
143
182
|
end
|
|
144
183
|
};
|
|
@@ -157,7 +196,8 @@ var Editor = class {
|
|
|
157
196
|
}
|
|
158
197
|
this.#markerRenderer ??= new MarkerRenderer({
|
|
159
198
|
getLineHeight: () => this.#metrics.lineHeight,
|
|
160
|
-
|
|
199
|
+
getOverlayElement: () => this.#overlayElement,
|
|
200
|
+
getGutterWidth: () => this.#getGutterWidth(),
|
|
161
201
|
getCharX: (line, character) => this.#getCharX(line, character),
|
|
162
202
|
getLineY: (line) => this.#getLineY(line),
|
|
163
203
|
isMouseDown: () => this.#isContentMouseDown || this.#isGutterMouseDown
|
|
@@ -170,7 +210,7 @@ var Editor = class {
|
|
|
170
210
|
const preventScroll = options?.preventScroll ?? false;
|
|
171
211
|
const primarySelection = this.#selections?.at(-1);
|
|
172
212
|
if (primarySelection !== void 0) {
|
|
173
|
-
const pos = primarySelection.direction ===
|
|
213
|
+
const pos = primarySelection.direction === -1 ? primarySelection.end : primarySelection.start;
|
|
174
214
|
this.#focus(pos, preventScroll);
|
|
175
215
|
} else this.#focus(void 0, preventScroll);
|
|
176
216
|
}
|
|
@@ -206,10 +246,12 @@ var Editor = class {
|
|
|
206
246
|
this.#gutterElement = void 0;
|
|
207
247
|
this.#contentElement?.removeAttribute("contentEditable");
|
|
208
248
|
this.#contentElement = void 0;
|
|
249
|
+
this.#contentHasFocus = false;
|
|
209
250
|
this.#overlayElement?.remove();
|
|
210
251
|
this.#overlayElement = void 0;
|
|
211
252
|
this.#resizeObserver?.disconnect();
|
|
212
253
|
this.#resizeObserver = void 0;
|
|
254
|
+
this.#fontRemeasureScheduled = false;
|
|
213
255
|
this.#resetState();
|
|
214
256
|
}
|
|
215
257
|
/** @internal */
|
|
@@ -223,7 +265,7 @@ var Editor = class {
|
|
|
223
265
|
}
|
|
224
266
|
}
|
|
225
267
|
/** @internal */
|
|
226
|
-
__syncRenderView = (highlighter, fileContainer,
|
|
268
|
+
__syncRenderView = (highlighter, fileContainer, fileOrDiff, lineAnnotations, renderRange) => {
|
|
227
269
|
const shadowRoot = fileContainer.shadowRoot;
|
|
228
270
|
if (shadowRoot == null) {
|
|
229
271
|
console.error("[editor] Could not find the shadow root.");
|
|
@@ -235,10 +277,10 @@ var Editor = class {
|
|
|
235
277
|
for (const el of shadowRoot.querySelectorAll("[data-code]")) if (el.dataset.deletions === void 0) {
|
|
236
278
|
codeElement = el;
|
|
237
279
|
for (const child of el.children) {
|
|
238
|
-
const el
|
|
239
|
-
const { gutter, content } = el
|
|
240
|
-
if (gutter !== void 0) gutterEl = el
|
|
241
|
-
else if (content !== void 0) contentEl = el
|
|
280
|
+
const el = child;
|
|
281
|
+
const { gutter, content } = el.dataset;
|
|
282
|
+
if (gutter !== void 0) gutterEl = el;
|
|
283
|
+
else if (content !== void 0) contentEl = el;
|
|
242
284
|
}
|
|
243
285
|
break;
|
|
244
286
|
}
|
|
@@ -250,10 +292,19 @@ var Editor = class {
|
|
|
250
292
|
if (this.#themeStyleElement !== void 0) shadowRoot.appendChild(this.#themeStyleElement);
|
|
251
293
|
if (this.#spriteElement !== void 0) shadowRoot.prepend(this.#spriteElement);
|
|
252
294
|
}
|
|
253
|
-
|
|
295
|
+
const documentReplaced = this.#textDocument === void 0 || this.#fileInfo === void 0 || this.#fileInfo.name !== fileOrDiff.name || this.#fileInfo.lang !== fileOrDiff.lang || this.#fileInfo.cacheKey !== fileOrDiff.cacheKey;
|
|
296
|
+
if (documentReplaced) {
|
|
297
|
+
let contents = "";
|
|
298
|
+
if ("contents" in fileOrDiff) contents = fileOrDiff.contents;
|
|
299
|
+
else contents = fileOrDiff.additionLines.join("");
|
|
254
300
|
const editStack = new EditStack({ maxEntries: this.#options.historyMaxEntries });
|
|
255
|
-
const textDocument = new TextDocument(
|
|
256
|
-
|
|
301
|
+
const textDocument = new TextDocument(fileOrDiff.name, contents, fileOrDiff.lang ?? getFiletypeFromFileName(fileOrDiff.name), 0, editStack);
|
|
302
|
+
const { name, lang, cacheKey } = fileOrDiff;
|
|
303
|
+
this.#fileInfo = {
|
|
304
|
+
name,
|
|
305
|
+
lang,
|
|
306
|
+
cacheKey
|
|
307
|
+
};
|
|
257
308
|
this.#textDocument = textDocument;
|
|
258
309
|
this.#tokenizer?.cleanUp();
|
|
259
310
|
this.#tokenizer = new EditorTokenizer({
|
|
@@ -268,10 +319,14 @@ var Editor = class {
|
|
|
268
319
|
});
|
|
269
320
|
this.#resetState();
|
|
270
321
|
this.#selections = this.#initSelections;
|
|
271
|
-
|
|
322
|
+
requestAnimationFrame(() => {
|
|
323
|
+
this.#options.onAttach?.(this, this.#fileInstance);
|
|
324
|
+
});
|
|
272
325
|
if (this.#textDocument !== void 0 && this.#options.__debug === true) console.log("[diffs/editor] text document changed !!!");
|
|
273
326
|
}
|
|
327
|
+
let fullRerender = false;
|
|
274
328
|
if (this.#contentElement !== contentEl) {
|
|
329
|
+
fullRerender = true;
|
|
275
330
|
this.#gutterElement = gutterEl;
|
|
276
331
|
this.#contentElement = extend(contentEl, {
|
|
277
332
|
contentEditable: "true",
|
|
@@ -285,14 +340,29 @@ var Editor = class {
|
|
|
285
340
|
});
|
|
286
341
|
if (this.#overlayElement !== void 0) contentEl.after(this.#overlayElement);
|
|
287
342
|
this.#metrics.init(contentEl);
|
|
343
|
+
this.#remeasureMetricsOnFontLoad();
|
|
288
344
|
this.#listenContentElement(contentEl, gutterEl);
|
|
289
345
|
if (this.#contentElement !== void 0 && this.#options.__debug === true) console.log("[diffs/editor] full re-render triggered !!!");
|
|
290
346
|
}
|
|
347
|
+
if (contentEl.ariaLabel !== fileOrDiff.name) contentEl.ariaLabel = fileOrDiff.name;
|
|
348
|
+
if (lineAnnotations !== void 0 && lineAnnotations.length > 0 || this.#isDiff && this.#diffSyle === "unified") for (const child of this.#contentElement.children) {
|
|
349
|
+
const el = child;
|
|
350
|
+
const { lineAnnotation, lineType } = el.dataset;
|
|
351
|
+
if (lineAnnotation !== void 0 || lineType === "change-deletion") el.setAttribute("contenteditable", "false");
|
|
352
|
+
}
|
|
291
353
|
this.#resetCache();
|
|
292
|
-
this.#
|
|
354
|
+
this.#tokenizer?.syncTheme(this.#fileInstance?.options ?? {});
|
|
293
355
|
this.#lineAnnotations = lineAnnotations;
|
|
294
356
|
this.#renderRange = renderRange;
|
|
357
|
+
this.#viewportWindowLines = renderRange?.totalLines;
|
|
295
358
|
this.#tokenizer?.prebuildStateStack(renderRange);
|
|
359
|
+
const fileInstance = this.#fileInstance;
|
|
360
|
+
const textDocument = this.#textDocument;
|
|
361
|
+
if (!documentReplaced && fullRerender && fileInstance?.rerenderFromDocument !== void 0 && textDocument !== void 0 && this.#shouldRenderDivergeFromDocument(textDocument)) {
|
|
362
|
+
fileInstance.rerenderFromDocument(textDocument);
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
this.#markerRenderer?.removePopup();
|
|
296
366
|
if (this.#selections !== void 0 || this.#matches !== void 0 || this.#markerRenderer !== void 0) this.#updateSelections(this.#selections ?? []);
|
|
297
367
|
if (this.#initSelections !== void 0 && this.#primaryCaretElement !== void 0) {
|
|
298
368
|
this.#initSelections = void 0;
|
|
@@ -300,12 +370,20 @@ var Editor = class {
|
|
|
300
370
|
} else if (this.#scrollingToLine !== void 0) this.#scrollToLine(this.#scrollingToLine, this.#scrollingToLineChar, this.#scrollingToLineNoFocus);
|
|
301
371
|
else if (this.#selections !== void 0 && this.#selections.length > 0 && !this.#retainSearchPanelFocus) this.focus({ preventScroll: true });
|
|
302
372
|
if (this.#retainSearchPanelFocus) this.#searchPanel?.focus();
|
|
303
|
-
if (this.#selectionAction !== void 0 && this.#isLineVisible(this.#selectionAction.line) && this.#contentElement !== void 0) this.#selectionAction.render(this.#contentElement);
|
|
304
373
|
if (this.#options.__debug === true && renderRange !== void 0) {
|
|
305
374
|
const { startingLine, totalLines } = renderRange;
|
|
306
|
-
console.log("[diffs/editor] render file:",
|
|
375
|
+
console.log("[diffs/editor] render file:", fileOrDiff.name, "RenderRange:", startingLine + "-" + (startingLine + totalLines), "of", this.#textDocument?.lineCount, "lines");
|
|
307
376
|
}
|
|
308
377
|
};
|
|
378
|
+
get #diffSyle() {
|
|
379
|
+
return this.#fileInstance?.options.diffStyle ?? "split";
|
|
380
|
+
}
|
|
381
|
+
get #isDiff() {
|
|
382
|
+
return this.#fileInstance?.type === "file-diff";
|
|
383
|
+
}
|
|
384
|
+
get #isWrap() {
|
|
385
|
+
return this.#fileInstance?.options.overflow === "wrap";
|
|
386
|
+
}
|
|
309
387
|
#resetCache() {
|
|
310
388
|
this.#lineYCache.clear();
|
|
311
389
|
this.#wrapLineOffsetsCache.clear();
|
|
@@ -313,9 +391,9 @@ var Editor = class {
|
|
|
313
391
|
this.#lastAccessedCharX = void 0;
|
|
314
392
|
}
|
|
315
393
|
#resetState() {
|
|
394
|
+
this.#setSelectedLinesSafe(null);
|
|
316
395
|
this.#gutterWidthCache = void 0;
|
|
317
396
|
this.#contentWidthCache = void 0;
|
|
318
|
-
this.#fileInstance?.setSelectedLines(null);
|
|
319
397
|
this.#shouldIgnoreSelectionChange = false;
|
|
320
398
|
this.#overlayElements?.forEach((el) => el.remove());
|
|
321
399
|
this.#overlayElements = void 0;
|
|
@@ -349,11 +427,13 @@ var Editor = class {
|
|
|
349
427
|
this.#globalEventDisposes = [
|
|
350
428
|
addEventListener(document, "selectionchange", () => {
|
|
351
429
|
const shadowRoot = this.#fileContainer?.shadowRoot;
|
|
352
|
-
if (this.#shouldIgnoreSelectionChange || shadowRoot == null) return;
|
|
430
|
+
if (this.#shouldIgnoreSelectionChange || shadowRoot == null || !this.#contentHasFocus) return;
|
|
353
431
|
if (this.#selections !== void 0 && this.#selections.length > 1 && !this.#isContentMouseDown) return;
|
|
354
|
-
const
|
|
432
|
+
const selectionRaw = document.getSelection();
|
|
433
|
+
if (selectionRaw == null || typeof selectionRaw.getComposedRanges !== "function") return;
|
|
434
|
+
const composedRange = selectionRaw.getComposedRanges({ shadowRoots: [shadowRoot] })?.[0];
|
|
355
435
|
if (composedRange === void 0 || !this.#rangeBelongsToEditor(composedRange)) return;
|
|
356
|
-
let selection = convertSelection(composedRange,
|
|
436
|
+
let selection = convertSelection(composedRange, 0);
|
|
357
437
|
if (selection === void 0) return;
|
|
358
438
|
if (this.#isContentMouseDown && this.#shiftKeyPressed && this.#selections !== void 0 && this.#selections.length > 0) {
|
|
359
439
|
const primarySelection = this.#selections.at(-1);
|
|
@@ -379,9 +459,7 @@ var Editor = class {
|
|
|
379
459
|
this.#shiftKeyPressed = false;
|
|
380
460
|
this.#selectionStart = void 0;
|
|
381
461
|
this.#reservedSelections = void 0;
|
|
382
|
-
this.#
|
|
383
|
-
if (key.startsWith("selectionActionIcon-")) el.dataset.visible = "true";
|
|
384
|
-
});
|
|
462
|
+
if (this.#options.enabledSelectionAction === true && this.#selections !== void 0 && this.#selections.length > 0 && !isCollapsedSelection(this.#selections.at(-1))) this.#updateSelections(this.#selections);
|
|
385
463
|
}, { passive: true }),
|
|
386
464
|
addEventListener(document, "keydown", (e) => {
|
|
387
465
|
if (e.key === "Shift") this.#selectionStart = this.#selections?.at(-1);
|
|
@@ -391,6 +469,10 @@ var Editor = class {
|
|
|
391
469
|
}, { passive: true })
|
|
392
470
|
];
|
|
393
471
|
}
|
|
472
|
+
#replaceSelectEventListeners(disposes) {
|
|
473
|
+
this.#selectEventDisposes?.forEach((dispose) => dispose());
|
|
474
|
+
this.#selectEventDisposes = disposes;
|
|
475
|
+
}
|
|
394
476
|
#listenContentElement(contentEl, gutterEl) {
|
|
395
477
|
const targetIsContentElement = (e) => {
|
|
396
478
|
const target = e.composedPath()[0];
|
|
@@ -398,25 +480,41 @@ var Editor = class {
|
|
|
398
480
|
};
|
|
399
481
|
this.#editorEventDisposes?.forEach((dispose) => dispose());
|
|
400
482
|
this.#editorEventDisposes = [
|
|
483
|
+
addEventListener(contentEl, "focus", () => {
|
|
484
|
+
this.#contentHasFocus = true;
|
|
485
|
+
if (!this.#isContentMouseDown && !this.#shouldIgnoreSelectionChange && this.#selections !== void 0 && this.#selections.length > 0) this.#setWindowSelection(this.#selections.at(-1));
|
|
486
|
+
}, { passive: true }),
|
|
487
|
+
addEventListener(contentEl, "blur", () => {
|
|
488
|
+
this.#contentHasFocus = false;
|
|
489
|
+
}, { passive: true }),
|
|
401
490
|
addEventListener(contentEl, "pointerdown", (e) => {
|
|
402
491
|
if (e.pointerType !== "mouse") return;
|
|
492
|
+
if (this.#isDeletedLineTarget(e)) {
|
|
493
|
+
this.#setDeletedTextSelectionActive(true);
|
|
494
|
+
if (this.#selections !== void 0) this.#updateSelections([]);
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
this.#setDeletedTextSelectionActive(false);
|
|
403
498
|
this.#markerRenderer?.removePopup();
|
|
404
|
-
if (isSafari() && this.#lineAnnotations !== void 0 && this.#lineAnnotations.length > 0)
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
499
|
+
if (isSafari() && this.#lineAnnotations !== void 0 && this.#lineAnnotations.length > 0) {
|
|
500
|
+
const annotationDisposes = [...contentEl.querySelectorAll("[data-line-annotation]")].map((el) => [addEventListener(el, "mouseenter", () => {
|
|
501
|
+
this.#shouldIgnoreSelectionChange = true;
|
|
502
|
+
}), addEventListener(el, "mouseleave", () => {
|
|
503
|
+
this.#shouldIgnoreSelectionChange = false;
|
|
504
|
+
})]).flat();
|
|
505
|
+
this.#replaceSelectEventListeners(annotationDisposes);
|
|
506
|
+
}
|
|
409
507
|
this.#isContentMouseDown = true;
|
|
410
508
|
this.#selectionStart = void 0;
|
|
411
509
|
if (e.button === 0 && isPrimaryModifier(e)) this.#reservedSelections = this.#selections?.map((selection) => ({ ...selection }));
|
|
412
510
|
if (e.shiftKey) {
|
|
413
511
|
const primarySelection = this.#selections?.at(-1);
|
|
414
512
|
if (primarySelection !== void 0) {
|
|
415
|
-
const pos = primarySelection.direction ===
|
|
513
|
+
const pos = primarySelection.direction === -1 ? primarySelection.end : primarySelection.start;
|
|
416
514
|
this.#setWindowSelection({
|
|
417
515
|
start: pos,
|
|
418
516
|
end: pos,
|
|
419
|
-
direction:
|
|
517
|
+
direction: 0
|
|
420
518
|
});
|
|
421
519
|
}
|
|
422
520
|
this.#shiftKeyPressed = true;
|
|
@@ -437,7 +535,7 @@ var Editor = class {
|
|
|
437
535
|
this.#updateSelections([{
|
|
438
536
|
start: pos,
|
|
439
537
|
end: pos,
|
|
440
|
-
direction:
|
|
538
|
+
direction: 0
|
|
441
539
|
}]);
|
|
442
540
|
this.#focus(pos);
|
|
443
541
|
}
|
|
@@ -454,6 +552,19 @@ var Editor = class {
|
|
|
454
552
|
e.preventDefault();
|
|
455
553
|
return;
|
|
456
554
|
}
|
|
555
|
+
if (e.key === "v" && isPrimaryModifier(e) && this.#options.clipboard !== void 0) {
|
|
556
|
+
e.preventDefault();
|
|
557
|
+
queueRender(this.#handleCustomPasteEvent);
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
if (this.#searchPanel !== void 0) {
|
|
561
|
+
const findAgain = resolveFindAgainShortcut(e);
|
|
562
|
+
if (findAgain !== void 0) {
|
|
563
|
+
e.preventDefault();
|
|
564
|
+
this.#searchPanel.navigate(findAgain === "previous");
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
457
568
|
const command = resolveEditorCommandFromKeyboardEvent(e);
|
|
458
569
|
if (command !== void 0) {
|
|
459
570
|
e.preventDefault();
|
|
@@ -463,22 +574,23 @@ var Editor = class {
|
|
|
463
574
|
addEventListener(contentEl, "copy", (e) => {
|
|
464
575
|
if (!targetIsContentElement(e)) return;
|
|
465
576
|
e.preventDefault();
|
|
466
|
-
e.clipboardData?.setData("text", this.#getSelectionText());
|
|
577
|
+
e.clipboardData?.setData("text", this.#isDeletedTextSelectionActive() ? this.#deletedTextForClipboard() : this.#getSelectionText());
|
|
467
578
|
}),
|
|
468
579
|
addEventListener(contentEl, "cut", (e) => {
|
|
469
580
|
if (!targetIsContentElement(e)) return;
|
|
470
581
|
e.preventDefault();
|
|
471
|
-
e.clipboardData?.setData("text", this.#
|
|
472
|
-
this.#replaceSelectionText("");
|
|
582
|
+
e.clipboardData?.setData("text", this.#isDeletedTextSelectionActive() ? this.#deletedTextForClipboard() : this.#cutSelectionText());
|
|
473
583
|
}),
|
|
474
584
|
addEventListener(contentEl, "paste", (e) => {
|
|
475
585
|
if (!targetIsContentElement(e)) return;
|
|
476
586
|
e.preventDefault();
|
|
477
587
|
const text = e.clipboardData?.getData("text");
|
|
478
|
-
|
|
588
|
+
const textDocument = this.#textDocument;
|
|
589
|
+
if (text !== void 0 && textDocument !== void 0) this.#replaceSelectionText(textDocument.normalizeEol(text), void 0, true);
|
|
479
590
|
}),
|
|
480
591
|
addEventListener(contentEl, "beforeinput", (e) => {
|
|
481
592
|
if (!targetIsContentElement(e)) return;
|
|
593
|
+
if (e.inputType === "insertCompositionText") return;
|
|
482
594
|
e.preventDefault();
|
|
483
595
|
this.#handleInput(e.inputType, e.data);
|
|
484
596
|
}),
|
|
@@ -488,14 +600,25 @@ var Editor = class {
|
|
|
488
600
|
}),
|
|
489
601
|
addEventListener(contentEl, "compositionstart", (e) => {
|
|
490
602
|
if (!targetIsContentElement(e)) return;
|
|
603
|
+
this.#isComposing = true;
|
|
491
604
|
this.#shouldIgnoreSelectionChange = true;
|
|
492
605
|
}, { passive: true }),
|
|
493
606
|
addEventListener(contentEl, "compositionend", (e) => {
|
|
494
607
|
if (!targetIsContentElement(e)) return;
|
|
495
608
|
this.#shouldIgnoreSelectionChange = false;
|
|
496
|
-
this.#
|
|
609
|
+
const wasComposing = this.#isComposing;
|
|
610
|
+
this.#isComposing = false;
|
|
611
|
+
if (e.data !== "" || !wasComposing) this.#handleInput("insertText", e.data);
|
|
497
612
|
}, { passive: true })
|
|
498
613
|
];
|
|
614
|
+
const deletionsCode = this.#fileContainer?.shadowRoot?.querySelector("[data-deletions]");
|
|
615
|
+
if (deletionsCode != null) this.#editorEventDisposes.push(addEventListener(deletionsCode, "pointerdown", (e) => {
|
|
616
|
+
const target = e.composedPath()[0];
|
|
617
|
+
const gutterRow = target instanceof HTMLElement ? target.closest("[data-column-number]") : null;
|
|
618
|
+
if (gutterRow instanceof HTMLElement && this.#beginDeletionGutterSelection(gutterRow, deletionsCode, e.pointerType === "mouse")) return;
|
|
619
|
+
this.#setDeletedTextSelectionActive(true);
|
|
620
|
+
if (this.#selections !== void 0) this.#updateSelections([]);
|
|
621
|
+
}, { passive: true }));
|
|
499
622
|
if (gutterEl !== void 0) {
|
|
500
623
|
const resolveGutterTarget = (eventTarget, includeContentLine = false) => {
|
|
501
624
|
let target = eventTarget;
|
|
@@ -511,55 +634,61 @@ var Editor = class {
|
|
|
511
634
|
return lineNumber - 1;
|
|
512
635
|
};
|
|
513
636
|
this.#editorEventDisposes.push(addEventListener(gutterEl, "pointerdown", (e) => {
|
|
637
|
+
const gutterRow = resolveGutterTarget(e.composedPath()[0]);
|
|
638
|
+
if (gutterRow?.dataset.lineType === "change-deletion") {
|
|
639
|
+
const code = gutterRow.closest("[data-code]");
|
|
640
|
+
if (code != null) this.#beginDeletionGutterSelection(gutterRow, code, e.pointerType === "mouse");
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
if (e.pointerType !== "mouse") return;
|
|
514
644
|
const textDocument = this.#textDocument;
|
|
515
|
-
const lineIndex = resolveEditableLine(
|
|
645
|
+
const lineIndex = resolveEditableLine(gutterRow);
|
|
516
646
|
if (lineIndex === void 0 || textDocument === void 0) return;
|
|
517
647
|
this.#markerRenderer?.removePopup();
|
|
518
|
-
const selection =
|
|
519
|
-
start: {
|
|
520
|
-
line: lineIndex,
|
|
521
|
-
character: 0
|
|
522
|
-
},
|
|
523
|
-
end: {
|
|
524
|
-
line: lineIndex,
|
|
525
|
-
character: textDocument.getLineText(lineIndex).length
|
|
526
|
-
},
|
|
527
|
-
direction: DirectionForward
|
|
528
|
-
};
|
|
648
|
+
const selection = this.#spanLineSelection(lineIndex, lineIndex, textDocument);
|
|
529
649
|
this.#isGutterMouseDown = true;
|
|
530
650
|
this.#selectionStart = selection;
|
|
531
651
|
this.#updateSelections([selection]);
|
|
532
|
-
this.#
|
|
533
|
-
this.#
|
|
652
|
+
this.#setWindowSelection(selection);
|
|
653
|
+
this.#focus();
|
|
654
|
+
this.#replaceSelectEventListeners([addEventListener(document, "mousemove", (e) => {
|
|
534
655
|
if (!this.#isGutterMouseDown) return;
|
|
535
|
-
const textDocument
|
|
536
|
-
const lineIndex
|
|
537
|
-
if (lineIndex
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
line: lineIndex$1,
|
|
545
|
-
character: textDocument$1.getLineText(lineIndex$1).length
|
|
546
|
-
},
|
|
547
|
-
direction: DirectionForward
|
|
548
|
-
};
|
|
549
|
-
if (this.#selectionStart !== void 0) selection$1 = createSelectionFrom(this.#selectionStart, selection$1);
|
|
550
|
-
else this.#selectionStart = selection$1;
|
|
551
|
-
this.#updateSelections([selection$1]);
|
|
552
|
-
this.#focus(selection$1.end);
|
|
553
|
-
}, { passive: true })];
|
|
656
|
+
const textDocument = this.#textDocument;
|
|
657
|
+
const lineIndex = resolveEditableLine(resolveGutterTarget(e.composedPath()[0], true));
|
|
658
|
+
if (lineIndex === void 0 || textDocument === void 0) return;
|
|
659
|
+
const anchorLine = this.#selectionStart?.start.line ?? lineIndex;
|
|
660
|
+
const selection = this.#spanLineSelection(anchorLine, lineIndex, textDocument);
|
|
661
|
+
this.#selectionStart ??= selection;
|
|
662
|
+
this.#updateSelections([selection]);
|
|
663
|
+
this.#focus(selection.direction === -1 ? selection.start : selection.end);
|
|
664
|
+
}, { passive: true })]);
|
|
554
665
|
}, { passive: true }));
|
|
555
666
|
}
|
|
556
667
|
this.#markerRenderer?.listenHover(contentEl);
|
|
557
668
|
this.#resizeObserver?.disconnect();
|
|
558
|
-
this.#resizeObserver = new ResizeObserver(
|
|
559
|
-
this.#handleLayoutResize();
|
|
560
|
-
});
|
|
669
|
+
this.#resizeObserver = new ResizeObserver(this.#handleLayoutResize);
|
|
561
670
|
this.#resizeObserver.observe(contentEl);
|
|
562
671
|
this.#resizeObserver.observe(contentEl.parentElement);
|
|
672
|
+
this.#computeContentOffset(contentEl);
|
|
673
|
+
}
|
|
674
|
+
#handleCustomPasteEvent = async () => {
|
|
675
|
+
const clipboard = this.#options.clipboard;
|
|
676
|
+
if (clipboard !== void 0) {
|
|
677
|
+
const text = await clipboard.readText();
|
|
678
|
+
this.#replaceSelectionText(text, void 0, true);
|
|
679
|
+
}
|
|
680
|
+
};
|
|
681
|
+
#computeContentOffset(contentEl) {
|
|
682
|
+
if (this.#isDiff && this.#diffSyle === "split" && this.#isWrap) {
|
|
683
|
+
this.#contentOffset = {
|
|
684
|
+
top: contentEl.offsetTop,
|
|
685
|
+
left: contentEl.offsetLeft - this.#getGutterWidth()
|
|
686
|
+
};
|
|
687
|
+
if (this.#options.__debug === true) console.log("[diffs/editor] content offset:", this.#contentOffset);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
get #activeContentOffset() {
|
|
691
|
+
if (this.#isDiff && this.#diffSyle === "split" && this.#isWrap) return this.#contentOffset;
|
|
563
692
|
}
|
|
564
693
|
#runCommand(command) {
|
|
565
694
|
const textDocument = this.#textDocument;
|
|
@@ -595,6 +724,7 @@ var Editor = class {
|
|
|
595
724
|
if (this.#selections !== void 0) {
|
|
596
725
|
const edits = [];
|
|
597
726
|
const nextSelections = [];
|
|
727
|
+
const sameLineIndents = [];
|
|
598
728
|
for (const selection of this.#selections) {
|
|
599
729
|
const startLine = selection.start.line;
|
|
600
730
|
const outdent = command === "outdent";
|
|
@@ -603,11 +733,45 @@ var Editor = class {
|
|
|
603
733
|
edits.push(...ret[0]);
|
|
604
734
|
nextSelections.push(ret[1]);
|
|
605
735
|
} else {
|
|
606
|
-
const
|
|
736
|
+
const text = textDocument.charAt({
|
|
607
737
|
line: startLine,
|
|
608
738
|
character: 0
|
|
739
|
+
}) === " " ? " " : " ".repeat(this.#metrics.tabSize);
|
|
740
|
+
edits.push({
|
|
741
|
+
range: selection,
|
|
742
|
+
newText: text
|
|
609
743
|
});
|
|
610
|
-
|
|
744
|
+
sameLineIndents.push({
|
|
745
|
+
line: startLine,
|
|
746
|
+
startCharacter: selection.start.character,
|
|
747
|
+
addedLength: text.length - (selection.end.character - selection.start.character),
|
|
748
|
+
selectionIndex: nextSelections.length
|
|
749
|
+
});
|
|
750
|
+
const nextPosition = {
|
|
751
|
+
line: selection.start.line,
|
|
752
|
+
character: selection.start.character + text.length
|
|
753
|
+
};
|
|
754
|
+
nextSelections.push({
|
|
755
|
+
start: nextPosition,
|
|
756
|
+
end: nextPosition,
|
|
757
|
+
direction: 0
|
|
758
|
+
});
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
for (const indent of sameLineIndents) {
|
|
762
|
+
let shift = 0;
|
|
763
|
+
for (const other of sameLineIndents) if (other.line === indent.line && other.startCharacter < indent.startCharacter) shift += other.addedLength;
|
|
764
|
+
if (shift !== 0) {
|
|
765
|
+
const current = nextSelections[indent.selectionIndex];
|
|
766
|
+
const position = {
|
|
767
|
+
line: indent.line,
|
|
768
|
+
character: current.start.character + shift
|
|
769
|
+
};
|
|
770
|
+
nextSelections[indent.selectionIndex] = {
|
|
771
|
+
start: position,
|
|
772
|
+
end: position,
|
|
773
|
+
direction: 0
|
|
774
|
+
};
|
|
611
775
|
}
|
|
612
776
|
}
|
|
613
777
|
const change = textDocument.applyEdits(edits, true, this.#selections, nextSelections);
|
|
@@ -651,7 +815,7 @@ var Editor = class {
|
|
|
651
815
|
break;
|
|
652
816
|
}
|
|
653
817
|
}
|
|
654
|
-
#handleLayoutResize() {
|
|
818
|
+
#handleLayoutResize = () => {
|
|
655
819
|
const lineAnnotations = this.#lineAnnotations?.length ?? 0;
|
|
656
820
|
const prevGutterWidth = this.#gutterWidthCache;
|
|
657
821
|
const prevContentWidth = this.#contentWidthCache;
|
|
@@ -662,7 +826,8 @@ var Editor = class {
|
|
|
662
826
|
if (!gutterWidthChanged && !contentWidthChanged) return;
|
|
663
827
|
this.#lastAccessedLineElement = void 0;
|
|
664
828
|
this.#lastAccessedCharX = void 0;
|
|
665
|
-
|
|
829
|
+
this.#metrics.clearTextWidthCache();
|
|
830
|
+
if (contentWidthChanged && (this.#isWrap || lineAnnotations > 0)) {
|
|
666
831
|
this.#lineYCache.clear();
|
|
667
832
|
this.#wrapLineOffsetsCache.clear();
|
|
668
833
|
}
|
|
@@ -671,15 +836,29 @@ var Editor = class {
|
|
|
671
836
|
if (this.#selections !== void 0) this.focus();
|
|
672
837
|
}
|
|
673
838
|
this.#markerRenderer?.removePopup();
|
|
839
|
+
this.#computeContentOffset(this.#contentElement);
|
|
840
|
+
};
|
|
841
|
+
#remeasureMetricsOnFontLoad() {
|
|
842
|
+
if (this.#fontRemeasureScheduled) return;
|
|
843
|
+
const fonts = document.fonts;
|
|
844
|
+
if (fonts === void 0) return;
|
|
845
|
+
this.#fontRemeasureScheduled = true;
|
|
846
|
+
fonts.ready.then(() => {
|
|
847
|
+
if (this.#contentElement === void 0 || !this.#metrics.remeasureCharacterWidth()) return;
|
|
848
|
+
this.#gutterWidthCache = void 0;
|
|
849
|
+
this.#contentWidthCache = void 0;
|
|
850
|
+
this.#resetCache();
|
|
851
|
+
if (this.#selections !== void 0 || this.#matches !== void 0 || this.#markerRenderer !== void 0) this.#updateSelections(this.#selections ?? []);
|
|
852
|
+
this.#markerRenderer?.removePopup();
|
|
853
|
+
});
|
|
674
854
|
}
|
|
675
855
|
#rerender(change, newLineAnnotations, renderRange = this.#renderRange, shouldUpdateBuffer) {
|
|
676
856
|
const tokenizer = this.#tokenizer;
|
|
677
857
|
const fileInstance = this.#fileInstance;
|
|
678
|
-
const fileContents = this.#fileContents;
|
|
679
858
|
const textDocument = this.#textDocument;
|
|
680
859
|
const gutterEl = this.#gutterElement;
|
|
681
860
|
const contentEl = this.#contentElement;
|
|
682
|
-
if (tokenizer === void 0 || fileInstance === void 0 ||
|
|
861
|
+
if (tokenizer === void 0 || fileInstance === void 0 || textDocument === void 0 || contentEl === void 0) return;
|
|
683
862
|
tokenizer.stopBackgroundTokenize();
|
|
684
863
|
const t = performance.now();
|
|
685
864
|
const dirtyLines = tokenizer.tokenize(change, renderRange);
|
|
@@ -692,14 +871,14 @@ var Editor = class {
|
|
|
692
871
|
const child = children[i];
|
|
693
872
|
if (child !== void 0) {
|
|
694
873
|
const lineNumber = getLineNumberAttr(child);
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
874
|
+
const lineType = child.dataset.lineType;
|
|
875
|
+
if (lineNumber === void 0 || lineType === "change-deletion") continue;
|
|
876
|
+
const lineIndex = lineNumber - 1;
|
|
877
|
+
if (dirtyLines.has(lineIndex)) {
|
|
878
|
+
const tokens = dirtyLines.get(lineIndex);
|
|
879
|
+
child.replaceChildren(...renderLineTokens(tokens, tokenizer.themeType));
|
|
880
|
+
dirtyLineIndexes.delete(lineIndex);
|
|
881
|
+
if (dirtyLineIndexes.size === 0) break;
|
|
703
882
|
}
|
|
704
883
|
}
|
|
705
884
|
}
|
|
@@ -730,11 +909,11 @@ var Editor = class {
|
|
|
730
909
|
if (change.lineDelta < 0) for (const children of [contentEl.children, gutterEl?.children ?? []]) for (let i = children.length - 1; i >= 0; i--) {
|
|
731
910
|
const child = children[i];
|
|
732
911
|
const lineNumber = getLineNumberAttr(child) ?? getLineNumberAttr(child, "columnNumber");
|
|
733
|
-
|
|
912
|
+
const lineType = child.dataset.lineType;
|
|
913
|
+
if (lineNumber === void 0 || lineType === "change-deletion") continue;
|
|
734
914
|
if (lineNumber - 1 < change.lineCount) break;
|
|
735
915
|
child.remove();
|
|
736
916
|
}
|
|
737
|
-
const isDiff = Object.hasOwn(fileInstance, "fileDiff");
|
|
738
917
|
const didLineCountChange = change.lineDelta !== 0;
|
|
739
918
|
if (didLineCountChange) {
|
|
740
919
|
let gridRow = contentEl.children.length;
|
|
@@ -745,7 +924,7 @@ var Editor = class {
|
|
|
745
924
|
contentEl.style.gridRow = "span " + gridRow;
|
|
746
925
|
if (gutterEl !== void 0) gutterEl.style.gridRow = "span " + gridRow;
|
|
747
926
|
}
|
|
748
|
-
fileInstance.updateRenderCache(dirtyLines, tokenizer.themeType, isDiff
|
|
927
|
+
fileInstance.updateRenderCache(dirtyLines, tokenizer.themeType, this.#isDiff && !didLineCountChange, didLineCountChange);
|
|
749
928
|
if (didLineCountChange) fileInstance.applyDocumentChange(textDocument, newLineAnnotations, shouldUpdateBuffer);
|
|
750
929
|
if (newLineAnnotations !== void 0) {
|
|
751
930
|
this.#lineAnnotations = newLineAnnotations;
|
|
@@ -753,11 +932,31 @@ var Editor = class {
|
|
|
753
932
|
}
|
|
754
933
|
if (this.#options.__debug === true) console.log(`[diffs/editor] re-render in: ${round(performance.now() - t2)}ms,`, `tokenize in: ${round(t2 - t)}ms (${dirtyLines.size} dirty lines)`);
|
|
755
934
|
}
|
|
935
|
+
#shouldRenderDivergeFromDocument(textDocument) {
|
|
936
|
+
const contentEl = this.#contentElement;
|
|
937
|
+
if (contentEl === void 0) return false;
|
|
938
|
+
for (const child of contentEl.children) {
|
|
939
|
+
const el = child;
|
|
940
|
+
const lineType = el.dataset.lineType;
|
|
941
|
+
const lineNumber = getLineNumberAttr(el);
|
|
942
|
+
if (lineNumber === void 0 || lineType === void 0 || !isLineEditable(lineType)) continue;
|
|
943
|
+
const lineIndex = lineNumber - 1;
|
|
944
|
+
if (lineIndex >= textDocument.lineCount || el.textContent !== textDocument.getLineText(lineIndex)) return true;
|
|
945
|
+
}
|
|
946
|
+
return false;
|
|
947
|
+
}
|
|
756
948
|
#handleInput(inputType, data) {
|
|
757
949
|
switch (inputType) {
|
|
758
|
-
case "insertText":
|
|
759
|
-
|
|
950
|
+
case "insertText": {
|
|
951
|
+
const text = data ?? "";
|
|
952
|
+
const textDocument = this.#textDocument;
|
|
953
|
+
const selections = this.#selections;
|
|
954
|
+
const autoSurroundTexts = textDocument !== void 0 && selections !== void 0 ? getAutoSurroundReplacementTexts(textDocument, selections, text, this.#options.autoSurround) : void 0;
|
|
955
|
+
this.#replaceSelectionText(autoSurroundTexts ?? text);
|
|
760
956
|
break;
|
|
957
|
+
}
|
|
958
|
+
case "insertCompositionText": break;
|
|
959
|
+
case "insertLineBreak":
|
|
761
960
|
case "insertParagraph":
|
|
762
961
|
this.#replaceSelectionText("\n");
|
|
763
962
|
break;
|
|
@@ -785,12 +984,13 @@ var Editor = class {
|
|
|
785
984
|
}
|
|
786
985
|
}
|
|
787
986
|
#focus(position, preventScroll = true) {
|
|
987
|
+
this.#contentHasFocus = true;
|
|
788
988
|
if (position !== void 0) {
|
|
789
989
|
this.#shouldIgnoreSelectionChange = true;
|
|
790
990
|
this.#setWindowSelection({
|
|
791
991
|
start: position,
|
|
792
992
|
end: position,
|
|
793
|
-
direction:
|
|
993
|
+
direction: 0
|
|
794
994
|
});
|
|
795
995
|
requestAnimationFrame(() => {
|
|
796
996
|
this.#contentElement?.focus({ preventScroll });
|
|
@@ -810,7 +1010,7 @@ var Editor = class {
|
|
|
810
1010
|
if (startLineElement === void 0 || endLineElement === void 0) return;
|
|
811
1011
|
let [anchorNode, anchorOffset] = getSelectionAnchor(startLineElement, start.character);
|
|
812
1012
|
let [focusNode, focusOffset] = getSelectionAnchor(endLineElement, end.character);
|
|
813
|
-
if (direction ===
|
|
1013
|
+
if (direction === -1) [anchorNode, anchorOffset, focusNode, focusOffset] = [
|
|
814
1014
|
focusNode,
|
|
815
1015
|
focusOffset,
|
|
816
1016
|
anchorNode,
|
|
@@ -831,7 +1031,7 @@ var Editor = class {
|
|
|
831
1031
|
block: scrollPosition,
|
|
832
1032
|
inline: "nearest"
|
|
833
1033
|
});
|
|
834
|
-
if (!noFocus) this.#focus(primarySelection.direction ===
|
|
1034
|
+
if (!noFocus) this.#focus(primarySelection.direction === -1 ? primarySelection.end : primarySelection.start);
|
|
835
1035
|
} else {
|
|
836
1036
|
const pos = getCaretPosition(primarySelection);
|
|
837
1037
|
this.#scrollToLine(pos.line, pos.character, noFocus);
|
|
@@ -900,15 +1100,109 @@ var Editor = class {
|
|
|
900
1100
|
}
|
|
901
1101
|
virtualCaret.remove();
|
|
902
1102
|
}
|
|
1103
|
+
#spanLineSelection(anchorLine, focusLine, textDocument) {
|
|
1104
|
+
const lineStart = (line) => ({
|
|
1105
|
+
line,
|
|
1106
|
+
character: 0
|
|
1107
|
+
});
|
|
1108
|
+
const lineEnd = (line) => ({
|
|
1109
|
+
line,
|
|
1110
|
+
character: textDocument.getLineText(line).length
|
|
1111
|
+
});
|
|
1112
|
+
if (focusLine < anchorLine) return {
|
|
1113
|
+
start: lineStart(focusLine),
|
|
1114
|
+
end: lineEnd(anchorLine),
|
|
1115
|
+
direction: -1
|
|
1116
|
+
};
|
|
1117
|
+
return {
|
|
1118
|
+
start: lineStart(anchorLine),
|
|
1119
|
+
end: lineEnd(focusLine),
|
|
1120
|
+
direction: 1
|
|
1121
|
+
};
|
|
1122
|
+
}
|
|
1123
|
+
#isDeletedLineTarget(event) {
|
|
1124
|
+
const target = event.composedPath()[0];
|
|
1125
|
+
return target instanceof HTMLElement && target.closest("[data-line]")?.getAttribute("data-line-type") === "change-deletion";
|
|
1126
|
+
}
|
|
1127
|
+
#selectDeletedLines(anchorContent, focusContent, deletionsCode) {
|
|
1128
|
+
const rows = [...deletionsCode.querySelectorAll("[data-content] > [data-line]")];
|
|
1129
|
+
const anchorIndex = rows.indexOf(anchorContent);
|
|
1130
|
+
const focusIndex = rows.indexOf(focusContent);
|
|
1131
|
+
const [topContent, bottomContent] = focusIndex < anchorIndex ? [focusContent, anchorContent] : [anchorContent, focusContent];
|
|
1132
|
+
const winSelection = window.getSelection();
|
|
1133
|
+
if (winSelection !== null) {
|
|
1134
|
+
const range = document.createRange();
|
|
1135
|
+
range.setStart(topContent, 0);
|
|
1136
|
+
range.setEnd(bottomContent, bottomContent.childNodes.length);
|
|
1137
|
+
winSelection.removeAllRanges();
|
|
1138
|
+
winSelection.addRange(range);
|
|
1139
|
+
}
|
|
1140
|
+
this.#setDeletedTextSelectionActive(true);
|
|
1141
|
+
this.#updateSelections([]);
|
|
1142
|
+
[...deletionsCode.querySelectorAll("[data-gutter] > [data-column-number]")][focusIndex]?.setAttribute("data-selected-line", "single");
|
|
1143
|
+
const lo = Math.min(anchorIndex, focusIndex);
|
|
1144
|
+
const hi = Math.max(anchorIndex, focusIndex);
|
|
1145
|
+
this.#deletedSelectionText = lo < 0 ? "" : rows.slice(lo, hi + 1).filter((row) => row.getAttribute("data-line-type") === "change-deletion").map((row) => row.textContent ?? "").join("\n");
|
|
1146
|
+
}
|
|
1147
|
+
#contentRowForGutterRow(gutterRow, contentColumn) {
|
|
1148
|
+
const gutterColumn = gutterRow.parentElement;
|
|
1149
|
+
if (gutterColumn == null || contentColumn == null) return;
|
|
1150
|
+
const index = [...gutterColumn.children].indexOf(gutterRow);
|
|
1151
|
+
const row = contentColumn.children[index];
|
|
1152
|
+
return row instanceof HTMLElement ? row : void 0;
|
|
1153
|
+
}
|
|
1154
|
+
#beginDeletionGutterSelection(gutterRow, code, isMouse) {
|
|
1155
|
+
const contentColumn = code.querySelector("[data-content]");
|
|
1156
|
+
const anchorContent = this.#contentRowForGutterRow(gutterRow, contentColumn);
|
|
1157
|
+
if (anchorContent === void 0) return false;
|
|
1158
|
+
this.#selectDeletedLines(anchorContent, anchorContent, code);
|
|
1159
|
+
if (isMouse) this.#replaceSelectEventListeners([addEventListener(document, "mousemove", (moveEvent) => {
|
|
1160
|
+
const moveTarget = moveEvent.composedPath()[0];
|
|
1161
|
+
const moveGutter = moveTarget instanceof HTMLElement ? moveTarget.closest("[data-column-number]") : null;
|
|
1162
|
+
if (moveGutter instanceof HTMLElement && code.contains(moveGutter)) {
|
|
1163
|
+
const focusContent = this.#contentRowForGutterRow(moveGutter, contentColumn);
|
|
1164
|
+
if (focusContent !== void 0) this.#selectDeletedLines(anchorContent, focusContent, code);
|
|
1165
|
+
}
|
|
1166
|
+
}, { passive: true })]);
|
|
1167
|
+
return true;
|
|
1168
|
+
}
|
|
1169
|
+
#isDeletedTextSelectionActive() {
|
|
1170
|
+
return this.#fileContainer?.shadowRoot?.querySelector("pre")?.hasAttribute("data-deleted-text-selection") ?? false;
|
|
1171
|
+
}
|
|
1172
|
+
#deletedTextForClipboard() {
|
|
1173
|
+
return this.#deletedSelectionText !== "" ? this.#deletedSelectionText : window.getSelection()?.toString() ?? "";
|
|
1174
|
+
}
|
|
1175
|
+
#setDeletedTextSelectionActive(active) {
|
|
1176
|
+
const pre = this.#fileContainer?.shadowRoot?.querySelector("pre");
|
|
1177
|
+
if (pre == null) return;
|
|
1178
|
+
if (active) {
|
|
1179
|
+
pre.setAttribute("data-deleted-text-selection", "");
|
|
1180
|
+
for (const highlighted of pre.querySelectorAll("[data-selected-line]")) highlighted.removeAttribute("data-selected-line");
|
|
1181
|
+
this.#deletedSelectionText = "";
|
|
1182
|
+
} else {
|
|
1183
|
+
pre.removeAttribute("data-deleted-text-selection");
|
|
1184
|
+
this.#deletedSelectionText = "";
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
#setSelectedLinesSafe(range, lineNumberOnly = false) {
|
|
1188
|
+
try {
|
|
1189
|
+
this.#fileInstance?.setSelectedLines(range, {
|
|
1190
|
+
notify: false,
|
|
1191
|
+
activeLineSide: "additions",
|
|
1192
|
+
lineNumberOnly
|
|
1193
|
+
});
|
|
1194
|
+
} catch {}
|
|
1195
|
+
}
|
|
903
1196
|
#updateSelections(selections) {
|
|
904
1197
|
this.__postponeBackgroundTokenizeToNextFrame();
|
|
905
1198
|
this.#primaryCaretElement = void 0;
|
|
906
|
-
this.#
|
|
907
|
-
this.#gutterElement?.querySelectorAll("[data-active]").forEach((el) => el.removeAttribute("data-active"));
|
|
1199
|
+
this.#setSelectedLinesSafe(null);
|
|
908
1200
|
if (selections.length === 0 && this.#matches === void 0 && this.#markerRenderer === void 0) {
|
|
909
1201
|
this.#selections = void 0;
|
|
910
1202
|
this.#overlayElements?.forEach((el) => el.remove());
|
|
911
1203
|
this.#overlayElements?.clear();
|
|
1204
|
+
this.#selectionAction?.cleanup();
|
|
1205
|
+
this.#selectionAction = void 0;
|
|
912
1206
|
return;
|
|
913
1207
|
}
|
|
914
1208
|
const fragment = document.createDocumentFragment();
|
|
@@ -920,21 +1214,16 @@ var Editor = class {
|
|
|
920
1214
|
const normalizedSelections = mergeOverlappingSelections(selections);
|
|
921
1215
|
const primarySelection = normalizedSelections.at(-1);
|
|
922
1216
|
this.#selections = normalizedSelections;
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
} else if (this.#gutterElement !== void 0) {
|
|
930
|
-
const pos = getCaretPosition(primarySelection);
|
|
931
|
-
this.#gutterElement.querySelector(`[data-column-number="${pos.line + 1}"]`)?.setAttribute("data-active", "");
|
|
932
|
-
}
|
|
1217
|
+
const hasNonEmptySelection = normalizedSelections.some((selection) => !isCollapsedSelection(selection));
|
|
1218
|
+
const caretLine = getCaretPosition(primarySelection).line + 1;
|
|
1219
|
+
this.#setSelectedLinesSafe({
|
|
1220
|
+
start: caretLine,
|
|
1221
|
+
end: caretLine
|
|
1222
|
+
}, hasNonEmptySelection);
|
|
933
1223
|
for (const selection of normalizedSelections) {
|
|
934
1224
|
if (!isCollapsedSelection(selection)) this.#renderSelection(renderCtx, "selection", selection);
|
|
935
1225
|
this.#renderCaret(renderCtx, selection, selection === primarySelection);
|
|
936
1226
|
}
|
|
937
|
-
if (this.#options.enabledSelectionAction === true && !isCollapsedSelection(primarySelection)) this.#renderSelectionActionIcon(renderCtx, primarySelection);
|
|
938
1227
|
}
|
|
939
1228
|
const textDocument = this.#textDocument;
|
|
940
1229
|
if (this.#matches !== void 0 && textDocument !== void 0) {
|
|
@@ -955,6 +1244,7 @@ var Editor = class {
|
|
|
955
1244
|
this.#overlayElements?.forEach((el) => el.remove());
|
|
956
1245
|
this.#overlayElements?.clear();
|
|
957
1246
|
this.#overlayElements = renderCtx.elements;
|
|
1247
|
+
this.#updateSelectionActionPopover();
|
|
958
1248
|
}
|
|
959
1249
|
#renderSelection(renderCtx, type, range, extraDataset) {
|
|
960
1250
|
if (this.#textDocument === void 0) return;
|
|
@@ -965,7 +1255,7 @@ var Editor = class {
|
|
|
965
1255
|
const lineText = this.#textDocument.getLineText(line);
|
|
966
1256
|
const startChar = line === start.line ? start.character : 0;
|
|
967
1257
|
const endChar = isLastLine ? end.character : lineText.length;
|
|
968
|
-
if (this.#
|
|
1258
|
+
if (this.#isWrap) {
|
|
969
1259
|
const contentWidth = this.#getContentWidth();
|
|
970
1260
|
if (2 * this.#metrics.ch + this.#metrics.measureTextWidth(lineText) > contentWidth) {
|
|
971
1261
|
this.#renderWrappedSelection(renderCtx, line, lineText, startChar, endChar, isLastLine, type, extraDataset);
|
|
@@ -975,7 +1265,7 @@ var Editor = class {
|
|
|
975
1265
|
let left = 0;
|
|
976
1266
|
let width = 0;
|
|
977
1267
|
let paddingEnd = 0;
|
|
978
|
-
if (startChar === 0) left = this.#getGutterWidth() + this.#metrics.ch;
|
|
1268
|
+
if (startChar === 0) left = this.#getGutterWidth() + this.#metrics.ch + (this.#activeContentOffset?.left ?? 0);
|
|
979
1269
|
else left = this.#getCharX(line, startChar)[0];
|
|
980
1270
|
if (!isLastLine && type === "selection") paddingEnd = this.#metrics.ch;
|
|
981
1271
|
if (startChar === endChar) width = paddingEnd;
|
|
@@ -986,71 +1276,64 @@ var Editor = class {
|
|
|
986
1276
|
#renderWrappedSelection(renderCtx, line, lineText, startChar, endChar, isLastLine, type, extraDataset) {
|
|
987
1277
|
const wrapOffsets = this.#wrapLineText(line);
|
|
988
1278
|
const segmentCount = wrapOffsets.length - 1;
|
|
989
|
-
const offsetLeft = this.#getGutterWidth() + this.#metrics.ch;
|
|
1279
|
+
const offsetLeft = this.#getGutterWidth() + this.#metrics.ch + (this.#activeContentOffset?.left ?? 0);
|
|
990
1280
|
for (let wrapLine = 0; wrapLine < segmentCount; wrapLine++) {
|
|
991
1281
|
const segmentStart = wrapOffsets[wrapLine];
|
|
992
1282
|
const segmentEnd = wrapOffsets[wrapLine + 1];
|
|
993
1283
|
const wrapStartChar = Math.max(startChar, segmentStart);
|
|
994
1284
|
const wrapEndChar = Math.min(endChar, segmentEnd);
|
|
995
1285
|
if (wrapStartChar > wrapEndChar) continue;
|
|
996
|
-
|
|
997
|
-
|
|
1286
|
+
const segmentStartWidth = this.#segmentTextWidth(lineText, segmentStart, wrapStartChar);
|
|
1287
|
+
const segmentLeft = offsetLeft + segmentStartWidth;
|
|
998
1288
|
let paddingEnd = 0;
|
|
999
|
-
if (wrapStartChar === 0) segmentLeft = offsetLeft;
|
|
1000
|
-
else {
|
|
1001
|
-
const prefixInSegment = lineText.slice(segmentStart, wrapStartChar);
|
|
1002
|
-
const prefixAsciiColumns = getExpandedAsciiTextColumns(prefixInSegment, this.#metrics.tabSize);
|
|
1003
|
-
segmentLeft = offsetLeft + (prefixAsciiColumns !== -1 ? prefixAsciiColumns * this.#metrics.ch : this.#metrics.measureTextWidth(prefixInSegment));
|
|
1004
|
-
}
|
|
1005
1289
|
if (!isLastLine && wrapLine === segmentCount - 1 && type === "selection") paddingEnd = this.#metrics.ch;
|
|
1006
|
-
|
|
1007
|
-
else {
|
|
1008
|
-
const selectionInSegment = lineText.slice(wrapStartChar, wrapEndChar);
|
|
1009
|
-
const selectionAsciiWidth = getExpandedAsciiTextColumns(selectionInSegment, this.#metrics.tabSize);
|
|
1010
|
-
segmentWidth = selectionAsciiWidth !== -1 ? selectionAsciiWidth * this.#metrics.ch : this.#metrics.measureTextWidth(selectionInSegment);
|
|
1011
|
-
segmentWidth += paddingEnd;
|
|
1012
|
-
}
|
|
1290
|
+
const segmentWidth = wrapStartChar === wrapEndChar ? paddingEnd : this.#segmentTextWidth(lineText, segmentStart, wrapEndChar) - segmentStartWidth + paddingEnd;
|
|
1013
1291
|
this.#renderSelectionBlock(renderCtx, type, line, wrapLine, segmentLeft, segmentWidth, extraDataset);
|
|
1014
1292
|
}
|
|
1015
1293
|
}
|
|
1294
|
+
#segmentTextWidth(lineText, segmentStart, character) {
|
|
1295
|
+
if (character <= segmentStart) return 0;
|
|
1296
|
+
const segmentText = lineText.slice(segmentStart, character);
|
|
1297
|
+
const asciiColumns = getExpandedAsciiTextColumns(segmentText, this.#metrics.tabSize);
|
|
1298
|
+
return asciiColumns !== -1 ? asciiColumns * this.#metrics.ch : this.#metrics.measureTextWidth(segmentText);
|
|
1299
|
+
}
|
|
1016
1300
|
#renderSelectionBlock(renderCtx, type, line, wrapLine, left, width, extraDataset) {
|
|
1017
1301
|
if (width === 0) return;
|
|
1018
1302
|
const { ch, lineHeight } = this.#metrics;
|
|
1019
1303
|
const y = this.#getLineY(line) + wrapLine * lineHeight;
|
|
1020
|
-
const
|
|
1021
|
-
const cacheKey = `${type}-${left}-${y}-${width}${extraDataset ?? ""}`;
|
|
1304
|
+
const cacheKey = `${type}-${line}/${wrapLine}-${left}-${width} ${extraDataset ?? ""}`;
|
|
1022
1305
|
const overlayEls = this.#overlayElements;
|
|
1023
1306
|
const rounded = (this.#options.roundedSelection ?? true) && type === "selection";
|
|
1024
|
-
const addRoundedCorner = (line
|
|
1025
|
-
const
|
|
1026
|
-
const css$1 = `width:${ch}px;transform:translateX(${left$1}px) translateY(${top}px);`;
|
|
1307
|
+
const addRoundedCorner = (line, wrapLine, left, radius) => {
|
|
1308
|
+
const css = `width:${ch}px;transform:translateX(${left}px) translateY(${this.#getLineY(line) + wrapLine * lineHeight}px);`;
|
|
1027
1309
|
const dataset = {
|
|
1028
1310
|
selectionCorner: "",
|
|
1029
1311
|
[radius]: ""
|
|
1030
1312
|
};
|
|
1031
|
-
const cacheKeyPrefix = `${type}-block-${
|
|
1032
|
-
let cacheKey
|
|
1313
|
+
const cacheKeyPrefix = `${type}-block-${line}/${wrapLine}-${left}-1ch`;
|
|
1314
|
+
let cacheKey = cacheKeyPrefix + "-" + radius;
|
|
1033
1315
|
if (radius === "rbl") {
|
|
1034
1316
|
const prevCornerKey = cacheKeyPrefix + "-rtl";
|
|
1035
1317
|
const prevCorner = renderCtx.elements.get(prevCornerKey);
|
|
1036
1318
|
if (prevCorner !== void 0) {
|
|
1037
1319
|
prevCorner.remove();
|
|
1038
1320
|
renderCtx.elements.delete(prevCornerKey);
|
|
1039
|
-
cacheKey
|
|
1321
|
+
cacheKey += "-rtl";
|
|
1040
1322
|
dataset.rtl = "";
|
|
1041
1323
|
}
|
|
1042
1324
|
}
|
|
1043
|
-
let cornerEl = renderCtx.elements.get(cacheKey
|
|
1325
|
+
let cornerEl = renderCtx.elements.get(cacheKey);
|
|
1044
1326
|
if (cornerEl !== void 0) return;
|
|
1045
|
-
if (overlayEls?.has(cacheKey
|
|
1046
|
-
cornerEl = overlayEls.get(cacheKey
|
|
1047
|
-
|
|
1327
|
+
if (overlayEls?.has(cacheKey) === true) {
|
|
1328
|
+
cornerEl = overlayEls.get(cacheKey);
|
|
1329
|
+
cornerEl.style.cssText = css;
|
|
1330
|
+
overlayEls.delete(cacheKey);
|
|
1048
1331
|
} else cornerEl = h("div", {
|
|
1049
1332
|
dataset: "selectionRange",
|
|
1050
|
-
style: { cssText: css
|
|
1333
|
+
style: { cssText: css },
|
|
1051
1334
|
children: [h("div", { dataset })]
|
|
1052
1335
|
}, renderCtx.fragment);
|
|
1053
|
-
renderCtx.elements.set(cacheKey
|
|
1336
|
+
renderCtx.elements.set(cacheKey, cornerEl);
|
|
1054
1337
|
};
|
|
1055
1338
|
const addRadiusStyle = (element) => {
|
|
1056
1339
|
const end = left + width;
|
|
@@ -1100,10 +1383,9 @@ var Editor = class {
|
|
|
1100
1383
|
if (overlayEls?.has(cacheKey) === true) {
|
|
1101
1384
|
rangeEl = overlayEls.get(cacheKey);
|
|
1102
1385
|
overlayEls.delete(cacheKey);
|
|
1103
|
-
} else rangeEl = h("div", {
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
}, renderCtx.fragment);
|
|
1386
|
+
} else rangeEl = h("div", { dataset: extraDataset ? [type + "Range", extraDataset] : type + "Range" }, renderCtx.fragment);
|
|
1387
|
+
rangeEl.style.width = `${width}px`;
|
|
1388
|
+
rangeEl.style.transform = `translateX(${left}px) translateY(${y}px)`;
|
|
1107
1389
|
if (rounded) addRadiusStyle(rangeEl);
|
|
1108
1390
|
renderCtx.elements.set(cacheKey, rangeEl);
|
|
1109
1391
|
}
|
|
@@ -1113,66 +1395,61 @@ var Editor = class {
|
|
|
1113
1395
|
const [left, wrapLine] = this.#getCharX(line, character);
|
|
1114
1396
|
const cacheKey = "caret-" + line + "/" + wrapLine + ":" + character;
|
|
1115
1397
|
if (renderCtx.elements.has(cacheKey)) return;
|
|
1116
|
-
const
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1398
|
+
const x = left - 1;
|
|
1399
|
+
const y = this.#getLineY(line) + wrapLine * this.#metrics.lineHeight;
|
|
1400
|
+
let caretEl;
|
|
1401
|
+
if (this.#overlayElements?.has(cacheKey) === true) {
|
|
1402
|
+
caretEl = this.#overlayElements.get(cacheKey);
|
|
1403
|
+
this.#overlayElements.delete(cacheKey);
|
|
1404
|
+
} else caretEl = h("div", { dataset: "caret" }, renderCtx.fragment);
|
|
1405
|
+
caretEl.style.transform = `translateX(${x}px) translateY(${y}px)`;
|
|
1120
1406
|
renderCtx.elements.set(cacheKey, caretEl);
|
|
1121
1407
|
if (isPrimary) {
|
|
1122
1408
|
caretEl.style.scrollMargin = this.#getScrollMargin();
|
|
1123
1409
|
this.#primaryCaretElement = caretEl;
|
|
1124
1410
|
}
|
|
1125
1411
|
}
|
|
1126
|
-
#
|
|
1127
|
-
const
|
|
1128
|
-
|
|
1129
|
-
const
|
|
1130
|
-
const
|
|
1131
|
-
if (
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
const
|
|
1144
|
-
const fileContainer = this.#fileContainer;
|
|
1145
|
-
if (textDocument === void 0 || renderSelectionAction === void 0 || fileContainer == null) return;
|
|
1146
|
-
const line$1 = selection.end.line;
|
|
1147
|
-
const lineText = textDocument.getLineText(line$1);
|
|
1412
|
+
#updateSelectionActionPopover() {
|
|
1413
|
+
const primarySelection = this.#selections?.at(-1);
|
|
1414
|
+
const overlayElement = this.#overlayElement;
|
|
1415
|
+
const textDocument = this.#textDocument;
|
|
1416
|
+
const renderSelectionAction = this.#options.renderSelectionAction;
|
|
1417
|
+
if (this.#options.enabledSelectionAction !== true || renderSelectionAction === void 0 || primarySelection === void 0 || isCollapsedSelection(primarySelection) || this.#isContentMouseDown || overlayElement === void 0 || textDocument === void 0) {
|
|
1418
|
+
this.#selectionAction?.cleanup();
|
|
1419
|
+
this.#selectionAction = void 0;
|
|
1420
|
+
return;
|
|
1421
|
+
}
|
|
1422
|
+
const head = getCaretPosition(primarySelection);
|
|
1423
|
+
if (!this.#isLineVisible(head.line)) {
|
|
1424
|
+
this.#selectionAction?.cleanup();
|
|
1425
|
+
this.#selectionAction = void 0;
|
|
1426
|
+
return;
|
|
1427
|
+
}
|
|
1428
|
+
if (this.#selectionAction === void 0) {
|
|
1429
|
+
const getActiveSelection = () => this.#selections?.at(-1) ?? primarySelection;
|
|
1148
1430
|
const selectionActionElement = renderSelectionAction({
|
|
1149
1431
|
textDocument,
|
|
1150
|
-
selection
|
|
1151
|
-
|
|
1152
|
-
getSelectionText: () => {
|
|
1153
|
-
return this.#textDocument?.getText(selection) ?? "";
|
|
1432
|
+
get selection() {
|
|
1433
|
+
return getActiveSelection();
|
|
1154
1434
|
},
|
|
1435
|
+
applyEdits: (edits) => this.applyEdits(edits, true),
|
|
1436
|
+
getSelectionText: () => this.#textDocument?.getText(getActiveSelection()) ?? "",
|
|
1155
1437
|
replaceSelectionText: (text) => {
|
|
1156
|
-
this.#replaceSelectionText(text, [
|
|
1438
|
+
this.#replaceSelectionText(text, [getActiveSelection()]);
|
|
1157
1439
|
},
|
|
1158
1440
|
close: () => {
|
|
1159
|
-
|
|
1160
|
-
|
|
1441
|
+
this.#selectionAction?.cleanup();
|
|
1442
|
+
this.#selectionAction = void 0;
|
|
1161
1443
|
this.#scrollToPrimaryCaret();
|
|
1162
1444
|
}
|
|
1163
1445
|
});
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
this.#selectionAction = new SelectionActionWidget(line$1, selectionActionElement, fileContainer, leadingWhitespaces, handleWidgetDomResize);
|
|
1172
|
-
this.#updateSelections([selection]);
|
|
1173
|
-
if (this.#isLineVisible(line$1) && this.#contentElement !== void 0) this.#selectionAction.render(this.#contentElement);
|
|
1174
|
-
});
|
|
1175
|
-
renderCtx.elements.set(cacheKey, selectionActionIcon);
|
|
1446
|
+
this.#selectionAction = new SelectionActionWidget(head.line, selectionActionElement, overlayElement);
|
|
1447
|
+
}
|
|
1448
|
+
const [left, wrapLine] = this.#getCharX(head.line, head.character);
|
|
1449
|
+
const lineHeight = this.#metrics.lineHeight;
|
|
1450
|
+
const top = this.#getLineY(head.line) + wrapLine * lineHeight + lineHeight;
|
|
1451
|
+
this.#selectionAction.line = head.line;
|
|
1452
|
+
this.#selectionAction.reposition(left, top, this.#getGutterWidth());
|
|
1176
1453
|
}
|
|
1177
1454
|
#openSearchPanel(mode) {
|
|
1178
1455
|
if (this.#searchPanel !== void 0) {
|
|
@@ -1207,7 +1484,7 @@ var Editor = class {
|
|
|
1207
1484
|
this.#scrollToPrimaryCaret(true);
|
|
1208
1485
|
this.#retainSearchPanelFocus = retainFocus;
|
|
1209
1486
|
};
|
|
1210
|
-
|
|
1487
|
+
const searchPanel = new SearchPanelWidget({
|
|
1211
1488
|
textDocument,
|
|
1212
1489
|
containerElement: preElement,
|
|
1213
1490
|
defaultQuery,
|
|
@@ -1234,10 +1511,10 @@ var Editor = class {
|
|
|
1234
1511
|
this.#matches = allMatches;
|
|
1235
1512
|
if (options?.syncSelection === false) {
|
|
1236
1513
|
this.#updateSelections(this.#selections ?? []);
|
|
1237
|
-
const primarySelection
|
|
1238
|
-
if (primarySelection
|
|
1239
|
-
const startOffset = textDocument.offsetAt(primarySelection
|
|
1240
|
-
const endOffset = textDocument.offsetAt(primarySelection
|
|
1514
|
+
const primarySelection = this.#selections?.at(-1);
|
|
1515
|
+
if (primarySelection !== void 0) {
|
|
1516
|
+
const startOffset = textDocument.offsetAt(primarySelection.start);
|
|
1517
|
+
const endOffset = textDocument.offsetAt(primarySelection.end);
|
|
1241
1518
|
for (const match of allMatches) if (match[0] === startOffset && match[1] === endOffset) return match;
|
|
1242
1519
|
}
|
|
1243
1520
|
return;
|
|
@@ -1261,6 +1538,7 @@ var Editor = class {
|
|
|
1261
1538
|
this.#updateSelections(this.#selections ?? []);
|
|
1262
1539
|
}
|
|
1263
1540
|
});
|
|
1541
|
+
this.#searchPanel = searchPanel;
|
|
1264
1542
|
this.#retainSearchPanelFocus = false;
|
|
1265
1543
|
}
|
|
1266
1544
|
#getSelectionText() {
|
|
@@ -1269,45 +1547,60 @@ var Editor = class {
|
|
|
1269
1547
|
if (textDocument === void 0 || selections === void 0) return "";
|
|
1270
1548
|
return getSelectionText(textDocument, selections);
|
|
1271
1549
|
}
|
|
1272
|
-
#
|
|
1550
|
+
#cutSelectionText() {
|
|
1551
|
+
const textDocument = this.#textDocument;
|
|
1552
|
+
const selections = this.#selections;
|
|
1553
|
+
if (textDocument === void 0 || selections === void 0 || selections.length === 0) return "";
|
|
1554
|
+
if (selections.some((selection) => isCollapsedSelection(selection))) {
|
|
1555
|
+
const cut = resolveSelectionCut(textDocument, selections);
|
|
1556
|
+
this.#applySelectionCutEdits(cut.edits, cut.nextSelectionOffsets);
|
|
1557
|
+
return cut.text;
|
|
1558
|
+
}
|
|
1559
|
+
const text = getSelectionText(textDocument, selections);
|
|
1560
|
+
this.#replaceSelectionText("", void 0, true);
|
|
1561
|
+
return text;
|
|
1562
|
+
}
|
|
1563
|
+
#applySelectionCutEdits(edits, nextSelectionOffsets) {
|
|
1564
|
+
const textDocument = this.#textDocument;
|
|
1565
|
+
const selections = this.#selections;
|
|
1566
|
+
if (textDocument === void 0 || selections === void 0 || edits.length === 0) return;
|
|
1567
|
+
const change = textDocument.applyResolvedEdits(edits, true, selections, void 0, true);
|
|
1568
|
+
if (change === void 0) return;
|
|
1569
|
+
const nextSelections = nextSelectionOffsets.map((offset) => {
|
|
1570
|
+
const caret = textDocument.positionAt(offset);
|
|
1571
|
+
return {
|
|
1572
|
+
start: caret,
|
|
1573
|
+
end: caret,
|
|
1574
|
+
direction: 0
|
|
1575
|
+
};
|
|
1576
|
+
});
|
|
1577
|
+
textDocument.setLastUndoSelectionsAfter(nextSelections);
|
|
1578
|
+
this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
|
|
1579
|
+
}
|
|
1580
|
+
#replaceSelectionText(text, selections = this.#selections, undoBoundary = false) {
|
|
1273
1581
|
if (selections === void 0) return;
|
|
1274
1582
|
const textDocument = this.#textDocument;
|
|
1275
1583
|
const primarySelection = selections.at(-1);
|
|
1276
1584
|
if (textDocument === void 0 || primarySelection === void 0) return;
|
|
1277
|
-
const { nextSelections, change } = Array.isArray(text) && text.length === selections.length ? applyTextReplaceToSelections(textDocument, selections, text, this.#lineAnnotations) : applyTextChangeToSelections(textDocument, selections, {
|
|
1585
|
+
const { nextSelections, change } = Array.isArray(text) && text.length === selections.length ? applyTextReplaceToSelections(textDocument, selections, text, this.#lineAnnotations, undoBoundary) : applyTextChangeToSelections(textDocument, selections, {
|
|
1278
1586
|
start: textDocument.offsetAt(primarySelection.start),
|
|
1279
1587
|
end: textDocument.offsetAt(primarySelection.end),
|
|
1280
1588
|
text: Array.isArray(text) ? text.join("\n") : text
|
|
1281
|
-
}, this.#lineAnnotations);
|
|
1589
|
+
}, this.#lineAnnotations, void 0, undoBoundary);
|
|
1282
1590
|
if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
|
|
1283
1591
|
}
|
|
1284
1592
|
#deleteSelectionText(forward = false) {
|
|
1285
1593
|
const selections = this.#selections;
|
|
1286
1594
|
const textDocument = this.#textDocument;
|
|
1287
1595
|
if (selections === void 0 || textDocument === void 0) return;
|
|
1288
|
-
const
|
|
1289
|
-
if (
|
|
1290
|
-
let edit;
|
|
1291
|
-
if (isCollapsedSelection(primarySelection)) {
|
|
1292
|
-
const offset = textDocument.offsetAt(primarySelection.start);
|
|
1293
|
-
const nextOffset = forward ? Math.min(textDocument.getText().length, offset + 1) : Math.max(0, offset - 1);
|
|
1294
|
-
edit = {
|
|
1295
|
-
start: Math.min(offset, nextOffset),
|
|
1296
|
-
end: Math.max(offset, nextOffset),
|
|
1297
|
-
text: ""
|
|
1298
|
-
};
|
|
1299
|
-
} else edit = {
|
|
1300
|
-
start: textDocument.offsetAt(primarySelection.start),
|
|
1301
|
-
end: textDocument.offsetAt(primarySelection.end),
|
|
1302
|
-
text: ""
|
|
1303
|
-
};
|
|
1304
|
-
this.#applyResolvedTextEdit(edit);
|
|
1596
|
+
const { nextSelections, change } = applyDeleteCharacterToSelections(textDocument, selections, forward, this.#lineAnnotations, this.#metrics.tabSize);
|
|
1597
|
+
if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
|
|
1305
1598
|
}
|
|
1306
1599
|
#deleteSoftLineBackward() {
|
|
1307
1600
|
const selections = this.#selections;
|
|
1308
1601
|
const textDocument = this.#textDocument;
|
|
1309
1602
|
if (selections === void 0 || textDocument === void 0) return;
|
|
1310
|
-
const { nextSelections, change } = applyDeleteSoftLineBackwardToSelections(textDocument, selections, this.#
|
|
1603
|
+
const { nextSelections, change } = applyDeleteSoftLineBackwardToSelections(textDocument, selections, this.#isWrap ? (line, character) => {
|
|
1311
1604
|
const wrapOffsets = this.#wrapLineText(line);
|
|
1312
1605
|
for (let w = 0; w + 1 < wrapOffsets.length; w++) {
|
|
1313
1606
|
const segmentStart = wrapOffsets[w];
|
|
@@ -1339,16 +1632,11 @@ var Editor = class {
|
|
|
1339
1632
|
const { nextSelections, change } = applyTransposeToSelections(textDocument, selections, this.#lineAnnotations);
|
|
1340
1633
|
if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
|
|
1341
1634
|
}
|
|
1342
|
-
#applyResolvedTextEdit(edit) {
|
|
1343
|
-
if (this.#selections === void 0 || this.#textDocument === void 0) return;
|
|
1344
|
-
const { nextSelections, change } = applyTextChangeToSelections(this.#textDocument, this.#selections, edit, this.#lineAnnotations, this.#metrics.tabSize);
|
|
1345
|
-
if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
|
|
1346
|
-
}
|
|
1347
1635
|
#getFileRef() {
|
|
1348
|
-
const
|
|
1636
|
+
const fileInfo = this.#fileInfo;
|
|
1349
1637
|
const textDocument = this.#textDocument;
|
|
1350
|
-
if (
|
|
1351
|
-
const {
|
|
1638
|
+
if (fileInfo === void 0 || textDocument === void 0) return;
|
|
1639
|
+
const file = { ...fileInfo };
|
|
1352
1640
|
Object.defineProperty(file, "contents", {
|
|
1353
1641
|
enumerable: true,
|
|
1354
1642
|
get: () => textDocument.getText()
|
|
@@ -1359,10 +1647,10 @@ var Editor = class {
|
|
|
1359
1647
|
const fileRef = this.#getFileRef();
|
|
1360
1648
|
const onChange = this.#options.onChange;
|
|
1361
1649
|
if (fileRef !== void 0 && onChange !== void 0) onChange(fileRef, newLineAnnotations ?? this.#lineAnnotations);
|
|
1362
|
-
if (change.lineDelta !== 0) {
|
|
1650
|
+
if (change.lineDelta !== 0 || this.#isWrap) {
|
|
1363
1651
|
for (const line of this.#lineYCache.keys()) if (line >= change.startLine) this.#lineYCache.delete(line);
|
|
1364
1652
|
}
|
|
1365
|
-
if (this.#
|
|
1653
|
+
if (this.#isWrap) {
|
|
1366
1654
|
for (const line of this.#wrapLineOffsetsCache.keys()) if (line >= change.startLine) this.#wrapLineOffsetsCache.delete(line);
|
|
1367
1655
|
}
|
|
1368
1656
|
this.#lastAccessedCharX = void 0;
|
|
@@ -1371,25 +1659,34 @@ var Editor = class {
|
|
|
1371
1659
|
if (renderRange !== void 0 && selections !== void 0 && selections.length > 0) {
|
|
1372
1660
|
const primarySelection = selections.at(-1);
|
|
1373
1661
|
const renderRangeEndLine = renderRange.startingLine + renderRange.totalLines;
|
|
1374
|
-
if (primarySelection.end.line
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1662
|
+
if (primarySelection.end.line >= renderRangeEndLine) {
|
|
1663
|
+
const widenedTotalLines = primarySelection.end.line - renderRange.startingLine + 1;
|
|
1664
|
+
const maxWidenLines = this.#viewportWindowLines === void 0 || this.#viewportWindowLines === Infinity ? Infinity : this.#viewportWindowLines * MAX_EDIT_WIDEN_WINDOW_MULTIPLE;
|
|
1665
|
+
if (change.startLine <= renderRangeEndLine && widenedTotalLines <= maxWidenLines) {
|
|
1666
|
+
if (primarySelection.end.line > renderRangeEndLine) shouldUpdateBuffer = true;
|
|
1667
|
+
renderRange = {
|
|
1668
|
+
...renderRange,
|
|
1669
|
+
totalLines: widenedTotalLines
|
|
1670
|
+
};
|
|
1671
|
+
this.#renderRange = renderRange;
|
|
1672
|
+
} else shouldUpdateBuffer = true;
|
|
1673
|
+
}
|
|
1379
1674
|
}
|
|
1380
1675
|
this.#rerender(change, newLineAnnotations, renderRange, shouldUpdateBuffer);
|
|
1381
1676
|
if (options?.skipSearchRefresh !== true && this.#searchPanel !== void 0 && this.#matches !== void 0) this.#searchPanel.updateMatches({ syncSelection: false });
|
|
1382
1677
|
if (selections !== void 0) {
|
|
1383
1678
|
this.#updateSelections(selections);
|
|
1384
|
-
if (
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1679
|
+
if (options?.skipFocus !== true) {
|
|
1680
|
+
if (this.#primaryCaretElement !== void 0) this.#primaryCaretElement.scrollIntoView({
|
|
1681
|
+
block: "nearest",
|
|
1682
|
+
inline: "nearest"
|
|
1683
|
+
});
|
|
1684
|
+
else if (selections.length > 0) {
|
|
1685
|
+
const pos = getCaretPosition(selections.at(-1));
|
|
1686
|
+
this.#scrollToLine(pos.line, pos.character);
|
|
1687
|
+
}
|
|
1688
|
+
this.focus({ preventScroll: true });
|
|
1391
1689
|
}
|
|
1392
|
-
this.focus({ preventScroll: true });
|
|
1393
1690
|
}
|
|
1394
1691
|
}
|
|
1395
1692
|
#applyChangeToLineAnnotations(change) {
|
|
@@ -1421,7 +1718,7 @@ var Editor = class {
|
|
|
1421
1718
|
}
|
|
1422
1719
|
}
|
|
1423
1720
|
}
|
|
1424
|
-
lineElement ??= contentElement.querySelector(`[data-line="${line + 1}"]`);
|
|
1721
|
+
lineElement ??= contentElement.querySelector(`[data-line="${line + 1}"]` + (this.#diffSyle === "unified" ? ":not([data-line-type=\"change-deletion\"])" : ""));
|
|
1425
1722
|
if (lineElement !== null) {
|
|
1426
1723
|
if (lastAccessed !== void 0) {
|
|
1427
1724
|
lastAccessed[0] = line;
|
|
@@ -1453,7 +1750,8 @@ var Editor = class {
|
|
|
1453
1750
|
if (cachedY !== void 0) return cachedY;
|
|
1454
1751
|
const lineElement = this.#getLineElement(line);
|
|
1455
1752
|
if (lineElement === void 0) return -1;
|
|
1456
|
-
|
|
1753
|
+
let y = lineElement.offsetTop + this.#metrics.paddingTop;
|
|
1754
|
+
y += this.#activeContentOffset?.top ?? 0;
|
|
1457
1755
|
this.#lineYCache.set(line, y);
|
|
1458
1756
|
return y;
|
|
1459
1757
|
}
|
|
@@ -1461,7 +1759,7 @@ var Editor = class {
|
|
|
1461
1759
|
if (this.#lastAccessedCharX !== void 0 && this.#lastAccessedCharX[0] === line && this.#lastAccessedCharX[1] === char) return [this.#lastAccessedCharX[2], this.#lastAccessedCharX[3]];
|
|
1462
1760
|
const lineText = this.#textDocument?.getLineText(line);
|
|
1463
1761
|
const offsetLeft = this.#getGutterWidth() + this.#metrics.ch;
|
|
1464
|
-
if (lineText === void 0 || lineText.length === 0 || char <= 0) return [offsetLeft, 0];
|
|
1762
|
+
if (lineText === void 0 || lineText.length === 0 || char <= 0) return [offsetLeft + (this.#activeContentOffset?.left ?? 0), 0];
|
|
1465
1763
|
const boundedCharacter = snapTextOffsetToUnicodeBoundary(lineText, Math.min(char, lineText.length));
|
|
1466
1764
|
const textBeforeCharacter = lineText.slice(0, boundedCharacter);
|
|
1467
1765
|
const asciiColumns = getExpandedAsciiTextColumns(textBeforeCharacter, this.#metrics.tabSize);
|
|
@@ -1469,7 +1767,7 @@ var Editor = class {
|
|
|
1469
1767
|
let wrapLine = 0;
|
|
1470
1768
|
if (asciiColumns !== -1) left = offsetLeft + asciiColumns * this.#metrics.ch;
|
|
1471
1769
|
else left = offsetLeft + this.#metrics.measureTextWidth(textBeforeCharacter);
|
|
1472
|
-
if (this.#
|
|
1770
|
+
if (this.#isWrap) {
|
|
1473
1771
|
const contentWidth = this.#getContentWidth();
|
|
1474
1772
|
if (2 * this.#metrics.ch + this.#metrics.measureTextWidth(lineText) > contentWidth) {
|
|
1475
1773
|
const wrapOffsets = this.#wrapLineText(line);
|
|
@@ -1485,6 +1783,7 @@ var Editor = class {
|
|
|
1485
1783
|
}
|
|
1486
1784
|
}
|
|
1487
1785
|
}
|
|
1786
|
+
left += this.#activeContentOffset?.left ?? 0;
|
|
1488
1787
|
}
|
|
1489
1788
|
if (this.#lastAccessedCharX !== void 0) {
|
|
1490
1789
|
this.#lastAccessedCharX[0] = line;
|
|
@@ -1571,7 +1870,7 @@ var Editor = class {
|
|
|
1571
1870
|
return line < startingLine + totalLines;
|
|
1572
1871
|
}
|
|
1573
1872
|
};
|
|
1574
|
-
|
|
1575
1873
|
//#endregion
|
|
1576
1874
|
export { Editor };
|
|
1875
|
+
|
|
1577
1876
|
//# sourceMappingURL=editor.js.map
|