dsh-vscode-mode 0.1.20 → 0.1.21
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/lib/client.js +741 -3
- package/lib/client.js.map +1 -1
- package/package.json +1 -1
- package/src/client/index.ts +8 -1
- package/src/client/outline/OutlinePanel.tsx +213 -0
- package/src/client/outline/index.ts +24 -0
- package/src/client/outline/parse.ts +271 -0
- package/src/client/outline/sources.ts +134 -0
- package/src/client/outline/types.ts +51 -0
- package/src/client/sidebar/types.ts +5 -0
- package/src/client/styles/editor.css +9 -0
- package/src/client/ui/EditorView.ts +2 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-vscode-mode client — 大纲契约(归一化符号模型 + 数据源接口)。
|
|
3
|
+
* 面板只消费 OutlineSymbol[],与 Monaco 解耦;未来语言插件(LSP/VSIX 风格,
|
|
4
|
+
* 如 EmmyLua/C#)注册高优先级 OutlineSource 即可接入,无需改动面板。
|
|
5
|
+
* kind 取 monaco SymbolKind 数值(0–25,与 LSP SymbolKind 一致)。
|
|
6
|
+
* 作者 ddj 2026-08-27
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** 归一化大纲符号(面板唯一渲染契约)。 */
|
|
10
|
+
export interface OutlineSymbol {
|
|
11
|
+
name: string
|
|
12
|
+
/** monaco SymbolKind 数值:File0/Module1/Namespace2/Package3/Class4/Method5/Property6/Field7/Constructor8/Enum9/Interface10/Function11/Variable12/Constant13/String14/Number15/Boolean16/Array17/Object18/Key19/Null20/EnumMember21/Struct22/Event23/Operator24/TypeParameter25。 */
|
|
13
|
+
kind: number
|
|
14
|
+
detail?: string
|
|
15
|
+
/** 符号整体起始行(1-based)。 */
|
|
16
|
+
startLine: number
|
|
17
|
+
/** 符号整体结束行(1-based)。 */
|
|
18
|
+
endLine: number
|
|
19
|
+
/** 跳转行(符号名所在行,1-based)。 */
|
|
20
|
+
selectLine: number
|
|
21
|
+
children?: OutlineSymbol[]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** 大纲数据源输入(面板解析时注入当前快照;字段均为弱类型,源自行 duck-typing)。 */
|
|
25
|
+
export interface OutlineSourceInput {
|
|
26
|
+
languageId: string
|
|
27
|
+
/** Monaco 文本模型(源可用 model.getValue() 自行解析)。 */
|
|
28
|
+
model?: unknown
|
|
29
|
+
/** 当前 Monaco 编辑器实例(供 _commandService 等内部调用)。 */
|
|
30
|
+
editor?: unknown
|
|
31
|
+
/** 全局 monaco 对象。 */
|
|
32
|
+
monaco?: unknown
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** 大纲数据源:按优先级降序解析,首个非空结果生效。 */
|
|
36
|
+
export interface OutlineSource {
|
|
37
|
+
id: string
|
|
38
|
+
/** 数值越大越优先(内置:monaco=50、fallback=30;第三方语言插件建议 60–90)。 */
|
|
39
|
+
priority: number
|
|
40
|
+
/** 是否可为该语言提供符号。 */
|
|
41
|
+
provides(languageId: string): boolean
|
|
42
|
+
get(input: OutlineSourceInput): Promise<OutlineSymbol[]>
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** 大纲源注册表(ctx.provide 为 edrvOutlineSources,供第三方注册)。 */
|
|
46
|
+
export interface OutlineSourceRegistry {
|
|
47
|
+
register(source: OutlineSource): () => void
|
|
48
|
+
list(): readonly OutlineSource[]
|
|
49
|
+
subscribe(listener: () => void): () => void
|
|
50
|
+
get(id: string): OutlineSource | undefined
|
|
51
|
+
}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* 面板 = 活动栏一项 + 面板区一处渲染;新增面板只需注册一条 SidebarPanelDef。
|
|
4
4
|
* 作者 ddj 2026-08-26
|
|
5
5
|
*/
|
|
6
|
+
import type { OutlineSourceRegistry } from '../outline/types.js'
|
|
6
7
|
|
|
7
8
|
/** 面板可用的共享上下文(由 SidebarView 从 EditorView 注入,面板不直碰其内部)。 */
|
|
8
9
|
export interface SidebarCtx {
|
|
@@ -15,6 +16,10 @@ export interface SidebarCtx {
|
|
|
15
16
|
sum: { totalFiles: number; files: Array<{ path: string; pending: number }> }
|
|
16
17
|
/** 触发差异记录刷新(保存/决策后由 EditorView 统一 emitRefresh)。 */
|
|
17
18
|
refreshRecords: () => void
|
|
19
|
+
/** 取当前 Monaco 编辑器实例(可能为 null;大纲面板读 model/跳转用)。 */
|
|
20
|
+
editor?: () => unknown | null
|
|
21
|
+
/** 大纲源注册表(公开 provide 为 edrvOutlineSources;大纲面板解析符号用)。 */
|
|
22
|
+
outlineSources?: OutlineSourceRegistry
|
|
18
23
|
}
|
|
19
24
|
|
|
20
25
|
/** 单个侧边栏面板定义。 */
|
|
@@ -217,6 +217,15 @@
|
|
|
217
217
|
[data-edrv-view] .edrv-tree-badge { min-width: 14px; height: 14px; padding: 0 4px; border-radius: 999px; background: var(--dsw-alias-state-warn-primary, #d97706); color: #fff; font-size: 9px; font-weight: 600; line-height: 14px; text-align: center; box-sizing: border-box; flex-shrink: 0; }
|
|
218
218
|
[data-edrv-view] .edrv-tree-loading { height: 22px; line-height: 22px; color: var(--dsw-alias-label-tertiary, #9aa5b1); font-size: 11px; }
|
|
219
219
|
[data-edrv-view] .edrv-tree-error { display: flex; align-items: center; gap: 8px; margin: 4px 2px 6px; padding: 6px 8px; border: 1px solid rgba(217,83,79,.4); border-radius: 6px; background: #fdeaea; color: var(--dsw-alias-state-error-primary, #d9534f); font-size: 11px; }
|
|
220
|
+
/* 大纲面板:kind 字形 / detail / 行号 */
|
|
221
|
+
[data-edrv-view] .edrv-outline-kind { display: inline-flex; align-items: center; justify-content: center; width: 14px; flex-shrink: 0; font-size: 12px; font-weight: 600; text-align: center; }
|
|
222
|
+
[data-edrv-view] .edrv-outline-kind.edrv-ol-func { color: var(--dsw-alias-brand-primary, #0f9d58); }
|
|
223
|
+
[data-edrv-view] .edrv-outline-kind.edrv-ol-type { color: var(--dsw-alias-label-primary, #1f2933); }
|
|
224
|
+
[data-edrv-view] .edrv-outline-kind.edrv-ol-data { color: var(--dsw-alias-state-warn-primary, #d97706); }
|
|
225
|
+
[data-edrv-view] .edrv-outline-kind.edrv-ol-ns { color: var(--dsw-alias-label-secondary, #52606d); }
|
|
226
|
+
[data-edrv-view] .edrv-outline-kind.edrv-ol-key { color: var(--dsw-alias-label-tertiary, #9aa5b1); }
|
|
227
|
+
[data-edrv-view] .edrv-outline-detail { flex-shrink: 0; max-width: 40%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--dsw-alias-label-tertiary, #9aa5b1); font-size: 11px; }
|
|
228
|
+
[data-edrv-view] .edrv-outline-ln { flex-shrink: 0; padding-right: 2px; color: var(--dsw-alias-label-tertiary, #9aa5b1); font-size: 10px; font-variant-numeric: tabular-nums; }
|
|
220
229
|
[data-edrv-view] .edrv-side-resize { width: 5px; flex-shrink: 0; cursor: col-resize; background: transparent; }
|
|
221
230
|
[data-edrv-view] .edrv-side-resize:hover { background: var(--dsw-alias-brand-primary, #0f9d58); opacity: .35; }
|
|
222
231
|
[data-edrv-view] .edrv-chip-btn.edrv-chip-on { background: var(--dsw-alias-interactive-bg-hover, rgba(15,157,88,.12)); color: var(--dsw-alias-label-primary, #1f2933); }
|
|
@@ -949,6 +949,8 @@ export function EditorView(props) {
|
|
|
949
949
|
pendingByPath,
|
|
950
950
|
sum: { totalFiles: sum.totalFiles, files: sum.files },
|
|
951
951
|
refreshRecords: () => refreshRecords(),
|
|
952
|
+
editor: () => editorRef.current,
|
|
953
|
+
outlineSources: props.outlineSources,
|
|
952
954
|
}
|
|
953
955
|
|
|
954
956
|
// 主编辑列(侧边栏右侧):pathBar + tabRow + 编辑/差异区(底部整条留给 DSH 对话输入栏)
|