cc98-cli 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +4 -2
- package/dist/api/client.d.ts +40 -15
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +179 -38
- package/dist/api/client.js.map +1 -1
- package/dist/api/endpoints.d.ts +14 -0
- package/dist/api/endpoints.d.ts.map +1 -1
- package/dist/api/endpoints.js +21 -1
- package/dist/api/endpoints.js.map +1 -1
- package/dist/api/types.d.ts +13 -0
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/webvpn.d.ts +68 -0
- package/dist/api/webvpn.d.ts.map +1 -0
- package/dist/api/webvpn.js +311 -0
- package/dist/api/webvpn.js.map +1 -0
- package/dist/cli/commands/board.d.ts.map +1 -1
- package/dist/cli/commands/board.js +16 -1
- package/dist/cli/commands/board.js.map +1 -1
- package/dist/cli/commands/forum.js +1 -1
- package/dist/cli/commands/forum.js.map +1 -1
- package/dist/cli/commands/login.js +1 -1
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logout.js +2 -2
- package/dist/cli/commands/logout.js.map +1 -1
- package/dist/cli/commands/me.d.ts.map +1 -1
- package/dist/cli/commands/me.js +18 -3
- package/dist/cli/commands/me.js.map +1 -1
- package/dist/cli/commands/message.d.ts.map +1 -1
- package/dist/cli/commands/message.js +11 -1
- package/dist/cli/commands/message.js.map +1 -1
- package/dist/cli/commands/notice.js +1 -1
- package/dist/cli/commands/notice.js.map +1 -1
- package/dist/cli/commands/post.d.ts.map +1 -1
- package/dist/cli/commands/post.js +13 -1
- package/dist/cli/commands/post.js.map +1 -1
- package/dist/cli/commands/search.js +1 -1
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/topic.d.ts.map +1 -1
- package/dist/cli/commands/topic.js +42 -6
- package/dist/cli/commands/topic.js.map +1 -1
- package/dist/cli/commands/user.d.ts.map +1 -1
- package/dist/cli/commands/user.js +13 -1
- package/dist/cli/commands/user.js.map +1 -1
- package/dist/cli/commands/vpn.d.ts +2 -0
- package/dist/cli/commands/vpn.d.ts.map +1 -0
- package/dist/cli/commands/vpn.js +200 -0
- package/dist/cli/commands/vpn.js.map +1 -0
- package/dist/cli/context.d.ts +2 -2
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +20 -2
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/router.d.ts.map +1 -1
- package/dist/cli/router.js +13 -2
- package/dist/cli/router.js.map +1 -1
- package/dist/main.js +0 -0
- package/dist/storage/image-cache.d.ts +32 -0
- package/dist/storage/image-cache.d.ts.map +1 -0
- package/dist/storage/image-cache.js +90 -0
- package/dist/storage/image-cache.js.map +1 -0
- package/dist/storage/vpn-store.d.ts +39 -0
- package/dist/storage/vpn-store.d.ts.map +1 -0
- package/dist/storage/vpn-store.js +94 -0
- package/dist/storage/vpn-store.js.map +1 -0
- package/dist/tui/app.d.ts.map +1 -1
- package/dist/tui/app.js +27 -1725
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/borders.d.ts +183 -0
- package/dist/tui/borders.d.ts.map +1 -0
- package/dist/tui/borders.js +143 -0
- package/dist/tui/borders.js.map +1 -0
- package/dist/tui/cached-client.d.ts +23 -0
- package/dist/tui/cached-client.d.ts.map +1 -1
- package/dist/tui/cached-client.js +88 -0
- package/dist/tui/cached-client.js.map +1 -1
- package/dist/tui/components/content.d.ts +11 -0
- package/dist/tui/components/content.d.ts.map +1 -0
- package/dist/tui/components/content.js +129 -0
- package/dist/tui/components/content.js.map +1 -0
- package/dist/tui/components/header.d.ts +7 -0
- package/dist/tui/components/header.d.ts.map +1 -0
- package/dist/tui/components/header.js +38 -0
- package/dist/tui/components/header.js.map +1 -0
- package/dist/tui/components/index.d.ts +8 -0
- package/dist/tui/components/index.d.ts.map +1 -0
- package/dist/tui/components/index.js +9 -0
- package/dist/tui/components/index.js.map +1 -0
- package/dist/tui/components/layout.d.ts +3 -0
- package/dist/tui/components/layout.d.ts.map +1 -0
- package/dist/tui/components/layout.js +453 -0
- package/dist/tui/components/layout.js.map +1 -0
- package/dist/tui/components/overview.d.ts +7 -0
- package/dist/tui/components/overview.d.ts.map +1 -0
- package/dist/tui/components/overview.js +30 -0
- package/dist/tui/components/overview.js.map +1 -0
- package/dist/tui/components/sidebar.d.ts +7 -0
- package/dist/tui/components/sidebar.d.ts.map +1 -0
- package/dist/tui/components/sidebar.js +57 -0
- package/dist/tui/components/sidebar.js.map +1 -0
- package/dist/tui/components/status.d.ts +8 -0
- package/dist/tui/components/status.d.ts.map +1 -0
- package/dist/tui/components/status.js +42 -0
- package/dist/tui/components/status.js.map +1 -0
- package/dist/tui/components/types.d.ts +17 -0
- package/dist/tui/components/types.d.ts.map +1 -0
- package/dist/tui/components/types.js +3 -0
- package/dist/tui/components/types.js.map +1 -0
- package/dist/tui/components/utils.d.ts +5 -0
- package/dist/tui/components/utils.d.ts.map +1 -0
- package/dist/tui/components/utils.js +68 -0
- package/dist/tui/components/utils.js.map +1 -0
- package/dist/tui/controller.d.ts +66 -0
- package/dist/tui/controller.d.ts.map +1 -0
- package/dist/tui/controller.js +1200 -0
- package/dist/tui/controller.js.map +1 -0
- package/dist/tui/helpers.d.ts +25 -0
- package/dist/tui/helpers.d.ts.map +1 -0
- package/dist/tui/helpers.js +249 -0
- package/dist/tui/helpers.js.map +1 -0
- package/dist/tui/navigation.d.ts +4 -0
- package/dist/tui/navigation.d.ts.map +1 -0
- package/dist/tui/navigation.js +19 -0
- package/dist/tui/navigation.js.map +1 -0
- package/dist/tui/renderer.d.ts +6 -0
- package/dist/tui/renderer.d.ts.map +1 -0
- package/dist/tui/renderer.js +305 -0
- package/dist/tui/renderer.js.map +1 -0
- package/dist/tui/state/index.d.ts +3 -0
- package/dist/tui/state/index.d.ts.map +1 -0
- package/dist/tui/state/index.js +4 -0
- package/dist/tui/state/index.js.map +1 -0
- package/dist/tui/state/store.d.ts +4 -0
- package/dist/tui/state/store.d.ts.map +1 -0
- package/dist/tui/state/store.js +62 -0
- package/dist/tui/state/store.js.map +1 -0
- package/dist/tui/state/types.d.ts +141 -0
- package/dist/tui/state/types.d.ts.map +1 -0
- package/dist/tui/state/types.js +3 -0
- package/dist/tui/state/types.js.map +1 -0
- package/dist/tui/topic-reader.d.ts +10 -0
- package/dist/tui/topic-reader.d.ts.map +1 -0
- package/dist/tui/topic-reader.js +178 -0
- package/dist/tui/topic-reader.js.map +1 -0
- package/dist/tui/ubb-renderer.d.ts.map +1 -1
- package/dist/tui/ubb-renderer.js +176 -12
- package/dist/tui/ubb-renderer.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- /package/{docs/images → images}/tui.jpg +0 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { ansi, bg, fg, stripAnsi } from "./ansi.js";
|
|
2
|
+
import { Header, Overview, Sidebar, Content, StatusBar, fit, blank } from "./components/index.js";
|
|
3
|
+
import { navItems } from "./navigation.js";
|
|
4
|
+
import { currentTopicLine, currentTopicPost, lineKindLabel } from "./topic-reader.js";
|
|
5
|
+
import { BOX_ROUNDED } from "./borders.js";
|
|
6
|
+
const cc98Blue = fg(0, 130, 202);
|
|
7
|
+
const cc98BlueSoft = fg(94, 180, 232);
|
|
8
|
+
const white = fg(245, 250, 255);
|
|
9
|
+
const muted = fg(139, 152, 166);
|
|
10
|
+
const line = fg(52, 84, 112);
|
|
11
|
+
const danger = fg(245, 101, 101);
|
|
12
|
+
const ok = fg(91, 207, 140);
|
|
13
|
+
const box = BOX_ROUNDED;
|
|
14
|
+
const header = new Header();
|
|
15
|
+
const overview = new Overview();
|
|
16
|
+
const sidebar = new Sidebar();
|
|
17
|
+
const content = new Content();
|
|
18
|
+
const statusBar = new StatusBar();
|
|
19
|
+
export function draw(state, size) {
|
|
20
|
+
const width = Math.max(60, size.columns);
|
|
21
|
+
const height = Math.max(20, size.rows);
|
|
22
|
+
const sidebarWidth = width < 90 ? 14 : 18;
|
|
23
|
+
const rightWidth = width < 78 ? 0 : Math.min(42, Math.max(34, Math.floor(width * 0.30)));
|
|
24
|
+
const mainWidth = width - sidebarWidth - rightWidth - (rightWidth > 0 ? 2 : 1);
|
|
25
|
+
const overviewHeight = 1; // overview 现在只返回一行数据
|
|
26
|
+
// 计算主体区域高度:总高度 - header - top border - overview - separator - bottom border - status bar
|
|
27
|
+
const bodyHeight = height - 5 - overviewHeight;
|
|
28
|
+
const lines = [];
|
|
29
|
+
lines.push(header.render(state, width));
|
|
30
|
+
// 顶部连接线
|
|
31
|
+
if (rightWidth > 0) {
|
|
32
|
+
lines.push(line +
|
|
33
|
+
box.topLeft +
|
|
34
|
+
box.horizontal.repeat(sidebarWidth - 2) +
|
|
35
|
+
box.teeDown +
|
|
36
|
+
box.horizontal.repeat(mainWidth - 2) +
|
|
37
|
+
box.teeDown +
|
|
38
|
+
box.horizontal.repeat(rightWidth - 2) +
|
|
39
|
+
box.topRight +
|
|
40
|
+
ansi.reset);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
lines.push(line +
|
|
44
|
+
box.topLeft +
|
|
45
|
+
box.horizontal.repeat(sidebarWidth - 2) +
|
|
46
|
+
box.teeDown +
|
|
47
|
+
box.horizontal.repeat(mainWidth - 2) +
|
|
48
|
+
box.topRight +
|
|
49
|
+
ansi.reset);
|
|
50
|
+
}
|
|
51
|
+
lines.push(...overview.render(state, width, overviewHeight));
|
|
52
|
+
// 分隔线
|
|
53
|
+
if (rightWidth > 0) {
|
|
54
|
+
lines.push(line +
|
|
55
|
+
box.teeRight +
|
|
56
|
+
box.horizontal.repeat(sidebarWidth - 2) +
|
|
57
|
+
box.cross +
|
|
58
|
+
box.horizontal.repeat(mainWidth - 2) +
|
|
59
|
+
box.cross +
|
|
60
|
+
box.horizontal.repeat(rightWidth - 2) +
|
|
61
|
+
box.teeLeft +
|
|
62
|
+
ansi.reset);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
lines.push(line +
|
|
66
|
+
box.teeRight +
|
|
67
|
+
box.horizontal.repeat(sidebarWidth - 2) +
|
|
68
|
+
box.cross +
|
|
69
|
+
box.horizontal.repeat(mainWidth - 2) +
|
|
70
|
+
box.teeLeft +
|
|
71
|
+
ansi.reset);
|
|
72
|
+
}
|
|
73
|
+
const sidebarLines = sidebar.render(state, sidebarWidth, bodyHeight);
|
|
74
|
+
const mainLines = content.render(state, mainWidth, bodyHeight);
|
|
75
|
+
const rightLines = rightWidth > 0 ? drawRight(state, rightWidth, bodyHeight) : [];
|
|
76
|
+
for (let row = 0; row < bodyHeight; row += 1) {
|
|
77
|
+
const parts = [
|
|
78
|
+
line + box.vertical + ansi.reset,
|
|
79
|
+
fit(sidebarLines[row] ?? "", sidebarWidth - 2),
|
|
80
|
+
line + box.vertical + ansi.reset,
|
|
81
|
+
fit(mainLines[row] ?? "", mainWidth - 2)
|
|
82
|
+
];
|
|
83
|
+
if (rightWidth > 0) {
|
|
84
|
+
parts.push(line + box.vertical + ansi.reset, fit(rightLines[row] ?? "", rightWidth - 2), line + box.vertical + ansi.reset);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
parts.push(line + box.vertical + ansi.reset);
|
|
88
|
+
}
|
|
89
|
+
lines.push(parts.join(""));
|
|
90
|
+
}
|
|
91
|
+
// 底部连接线
|
|
92
|
+
if (rightWidth > 0) {
|
|
93
|
+
lines.push(line +
|
|
94
|
+
box.bottomLeft +
|
|
95
|
+
box.horizontal.repeat(sidebarWidth - 2) +
|
|
96
|
+
box.teeUp +
|
|
97
|
+
box.horizontal.repeat(mainWidth - 2) +
|
|
98
|
+
box.teeUp +
|
|
99
|
+
box.horizontal.repeat(rightWidth - 2) +
|
|
100
|
+
box.bottomRight +
|
|
101
|
+
ansi.reset);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
lines.push(line +
|
|
105
|
+
box.bottomLeft +
|
|
106
|
+
box.horizontal.repeat(sidebarWidth - 2) +
|
|
107
|
+
box.teeUp +
|
|
108
|
+
box.horizontal.repeat(mainWidth - 2) +
|
|
109
|
+
box.bottomRight +
|
|
110
|
+
ansi.reset);
|
|
111
|
+
}
|
|
112
|
+
lines.push(statusBar.render(state, width));
|
|
113
|
+
let output = lines.slice(0, height).join("\n");
|
|
114
|
+
if (state.modal === "help")
|
|
115
|
+
output = drawHelpModal(lines, width, height);
|
|
116
|
+
if (state.modal === "menu")
|
|
117
|
+
output = drawMenuModal(lines, state, width, height);
|
|
118
|
+
if (state.modal === "info")
|
|
119
|
+
output = drawInfoModal(lines, state, width, height);
|
|
120
|
+
if (state.modal === "search")
|
|
121
|
+
output = drawSearchModal(lines, state, width, height);
|
|
122
|
+
if (state.modal === "user")
|
|
123
|
+
output = drawUserDetailModal(lines, state, width, height);
|
|
124
|
+
return output;
|
|
125
|
+
}
|
|
126
|
+
function drawRight(state, width, height) {
|
|
127
|
+
if (state.mode === "topic" && state.topic) {
|
|
128
|
+
return drawTopicRight(state.topic, state.scroll, width, height);
|
|
129
|
+
}
|
|
130
|
+
if (state.focus === "nav") {
|
|
131
|
+
return drawNavRight(state, width, height);
|
|
132
|
+
}
|
|
133
|
+
return drawItemRight(state, width, height);
|
|
134
|
+
}
|
|
135
|
+
function drawNavRight(state, width, height) {
|
|
136
|
+
const rows = [];
|
|
137
|
+
const nav = navItems[state.navIndex];
|
|
138
|
+
rows.push(`${cc98Blue}${ansi.bold} ${nav?.label ?? ""}${ansi.reset}`);
|
|
139
|
+
rows.push(`${muted} ${nav?.hint ?? ""}${ansi.reset}`);
|
|
140
|
+
rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
|
|
141
|
+
for (const stat of state.stats) {
|
|
142
|
+
if (rows.length >= height)
|
|
143
|
+
break;
|
|
144
|
+
rows.push(`${muted} ${stat.title}${ansi.reset}`);
|
|
145
|
+
if (stat.detail && rows.length < height) {
|
|
146
|
+
rows.push(`${cc98BlueSoft} ${stat.detail}${ansi.reset}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// 删除快捷键提示,只保留统计信息
|
|
150
|
+
return rows.concat(blank(height - rows.length, width)).slice(0, height);
|
|
151
|
+
}
|
|
152
|
+
function drawItemRight(state, width, height) {
|
|
153
|
+
const selected = state.items[state.itemIndex];
|
|
154
|
+
if (!selected) {
|
|
155
|
+
return blank(height, width);
|
|
156
|
+
}
|
|
157
|
+
const rows = [];
|
|
158
|
+
rows.push(`${cc98Blue}${ansi.bold} ${selected.title}${ansi.reset}`);
|
|
159
|
+
rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
|
|
160
|
+
if (selected.meta)
|
|
161
|
+
rows.push(`${muted} ${selected.meta}${ansi.reset}`);
|
|
162
|
+
if (selected.detail)
|
|
163
|
+
rows.push(`${cc98BlueSoft} ${selected.detail}${ansi.reset}`);
|
|
164
|
+
if (selected.topicId !== undefined)
|
|
165
|
+
rows.push(`${muted} 主题 #${selected.topicId}${ansi.reset}`);
|
|
166
|
+
if (selected.boardId !== undefined)
|
|
167
|
+
rows.push(`${muted} 版面 #${selected.boardId}${ansi.reset}`);
|
|
168
|
+
if (selected.userId !== undefined)
|
|
169
|
+
rows.push(`${muted} 用户 #${selected.userId}${ansi.reset}`);
|
|
170
|
+
// 添加帖子元信息(如果有)
|
|
171
|
+
if (selected.sortTime) {
|
|
172
|
+
const date = new Date(selected.sortTime);
|
|
173
|
+
const timeStr = date.toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' });
|
|
174
|
+
rows.push(`${muted} 时间: ${timeStr}${ansi.reset}`);
|
|
175
|
+
}
|
|
176
|
+
return rows.concat(blank(height - rows.length, width)).slice(0, height);
|
|
177
|
+
}
|
|
178
|
+
function drawTopicRight(topic, scroll, width, height) {
|
|
179
|
+
const rows = [];
|
|
180
|
+
const post = currentTopicPost(topic, scroll);
|
|
181
|
+
const topicLine = currentTopicLine(topic, scroll);
|
|
182
|
+
rows.push(`${cc98Blue}${ansi.bold} 帖子信息${ansi.reset}`);
|
|
183
|
+
rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
|
|
184
|
+
if (post) {
|
|
185
|
+
rows.push(`${muted} 楼层: #${post.floor ?? "?"}${ansi.reset}`);
|
|
186
|
+
rows.push(`${muted} 作者: ${post.author}${ansi.reset}`);
|
|
187
|
+
if (post.time)
|
|
188
|
+
rows.push(`${muted} 时间: ${post.time}${ansi.reset}`);
|
|
189
|
+
if (topicLine)
|
|
190
|
+
rows.push(`${muted} 当前位置: ${lineKindLabel(topicLine.kind)}${ansi.reset}`);
|
|
191
|
+
if (post.likeCount > 0)
|
|
192
|
+
rows.push(`${ok} 赞: ${post.likeCount}${ansi.reset}`);
|
|
193
|
+
if (post.dislikeCount > 0)
|
|
194
|
+
rows.push(`${danger} 踩: ${post.dislikeCount}${ansi.reset}`);
|
|
195
|
+
if (post.rating)
|
|
196
|
+
rows.push(`${muted} 评分: ${post.rating}${ansi.reset}`);
|
|
197
|
+
if (post.imageCount > 0)
|
|
198
|
+
rows.push(`${muted} 图片: ${post.imageCount}${ansi.reset}`);
|
|
199
|
+
if (post.linkCount > 0)
|
|
200
|
+
rows.push(`${muted} 链接: ${post.linkCount}${ansi.reset}`);
|
|
201
|
+
}
|
|
202
|
+
rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
|
|
203
|
+
rows.push(`${muted} 当前: ${scroll + 1}/${topic.lines.length}${ansi.reset}`);
|
|
204
|
+
rows.push(`${muted} 已加载: ${topic.loaded} 楼${ansi.reset}`);
|
|
205
|
+
return rows.concat(blank(height - rows.length, width)).slice(0, height);
|
|
206
|
+
}
|
|
207
|
+
function drawHelpModal(baseLines, width, height) {
|
|
208
|
+
return overlay(baseLines, width, height, Math.min(60, width - 4), [
|
|
209
|
+
`${cc98Blue}${ansi.bold}快捷键帮助${ansi.reset}`,
|
|
210
|
+
"",
|
|
211
|
+
"导航: j/k ↑↓ 移动 h ← 返回 Enter 打开",
|
|
212
|
+
"全局: / 搜索 r 刷新 o 菜单 ? 帮助 q 退出",
|
|
213
|
+
"帖子: j/k 滚动 n 下页 s 收藏 l 赞 d 踩",
|
|
214
|
+
"帖子: u 用户 [/] 楼层 数字+Enter 跳楼",
|
|
215
|
+
"搜索: j/k ↑↓ 移动 Enter 搜索/打开 Tab 切换",
|
|
216
|
+
"菜单: j/k ↑↓ 移动 Enter 执行 o 关闭",
|
|
217
|
+
"",
|
|
218
|
+
`${muted}任意键关闭${ansi.reset}`
|
|
219
|
+
]);
|
|
220
|
+
}
|
|
221
|
+
function drawMenuModal(baseLines, state, width, height) {
|
|
222
|
+
const rows = [`${cc98Blue}${ansi.bold}操作菜单${ansi.reset}`, ""];
|
|
223
|
+
rows.push(...state.menuItems.map((item, index) => {
|
|
224
|
+
const active = index === state.menuIndex;
|
|
225
|
+
return `${active ? `${ok}●${ansi.reset}` : `${muted}•${ansi.reset}`} ${item.label} ${muted}${item.key}${ansi.reset}`;
|
|
226
|
+
}));
|
|
227
|
+
if (state.menuItems.length === 0)
|
|
228
|
+
rows.push(`${muted}暂无可用操作${ansi.reset}`);
|
|
229
|
+
return overlay(baseLines, width, height, Math.min(34, width - 4), rows);
|
|
230
|
+
}
|
|
231
|
+
function drawInfoModal(baseLines, state, width, height) {
|
|
232
|
+
return overlay(baseLines, width, height, Math.min(68, width - 4), [
|
|
233
|
+
`${cc98Blue}${ansi.bold}${state.infoTitle ?? "信息"}${ansi.reset}`,
|
|
234
|
+
"",
|
|
235
|
+
...state.infoLines.slice(0, Math.max(1, height - 8)),
|
|
236
|
+
"",
|
|
237
|
+
`${muted}Esc / Enter 关闭${ansi.reset}`
|
|
238
|
+
]);
|
|
239
|
+
}
|
|
240
|
+
function drawSearchModal(baseLines, state, width, height) {
|
|
241
|
+
const scopeLabel = state.searchScope?.label ?? "全站";
|
|
242
|
+
const rows = [
|
|
243
|
+
`${cc98Blue}${ansi.bold}搜索${ansi.reset}`,
|
|
244
|
+
"",
|
|
245
|
+
`范围: ${scopeLabel}`,
|
|
246
|
+
`模式: ${state.searchMode === "topics" ? "● 帖子 ○ 用户" : "○ 帖子 ● 用户"} Tab 切换`,
|
|
247
|
+
`> ${state.searchQuery}${state.loading ? " ..." : "_"}`,
|
|
248
|
+
""
|
|
249
|
+
];
|
|
250
|
+
for (const item of state.searchResults.slice(0, Math.max(0, height - 14))) {
|
|
251
|
+
rows.push(`${item.title}`);
|
|
252
|
+
if (item.meta)
|
|
253
|
+
rows.push(`${muted}${item.meta}${ansi.reset}`);
|
|
254
|
+
}
|
|
255
|
+
if (state.searchResults.length === 0 && state.searchQuery && !state.loading)
|
|
256
|
+
rows.push(`${muted}无结果${ansi.reset}`);
|
|
257
|
+
rows.push("", `${muted}Enter 搜索/打开 Tab 切换 / 关闭${ansi.reset}`);
|
|
258
|
+
return overlay(baseLines, width, height, Math.min(62, width - 4), rows);
|
|
259
|
+
}
|
|
260
|
+
function drawUserDetailModal(baseLines, state, width, height) {
|
|
261
|
+
const user = state.userDetail;
|
|
262
|
+
if (!user) {
|
|
263
|
+
return baseLines.slice(0, height).join("\n");
|
|
264
|
+
}
|
|
265
|
+
const rows = [
|
|
266
|
+
`${cc98Blue}${ansi.bold}用户详情${ansi.reset}`,
|
|
267
|
+
"",
|
|
268
|
+
`昵称: ${user.name}`,
|
|
269
|
+
`ID: #${user.userId}`,
|
|
270
|
+
user.level ? `等级: ${user.level}` : undefined,
|
|
271
|
+
user.postCount !== undefined ? `帖子: ${user.postCount}` : undefined,
|
|
272
|
+
user.fanCount !== undefined ? `粉丝: ${user.fanCount} 关注: ${user.followCount ?? 0}` : undefined,
|
|
273
|
+
`状态: ${user.isFollowing ? "已关注" : "未关注"}`,
|
|
274
|
+
"",
|
|
275
|
+
`${muted}f 关注/取消关注 m 发私信 Esc 关闭${ansi.reset}`
|
|
276
|
+
].filter((value) => typeof value === "string");
|
|
277
|
+
if (user.recentTopics?.length) {
|
|
278
|
+
rows.push("", `${cc98Blue}最近帖子${ansi.reset}`);
|
|
279
|
+
rows.push(...user.recentTopics.slice(0, 3).map((topic) => topic.title));
|
|
280
|
+
}
|
|
281
|
+
return overlay(baseLines, width, height, Math.min(52, width - 4), rows);
|
|
282
|
+
}
|
|
283
|
+
function overlay(baseLines, width, height, modalWidth, content) {
|
|
284
|
+
const modalHeight = Math.min(height - 4, content.length + 2);
|
|
285
|
+
const startRow = Math.max(0, Math.floor((height - modalHeight) / 2));
|
|
286
|
+
const startCol = Math.max(0, Math.floor((width - modalWidth) / 2));
|
|
287
|
+
const result = [...baseLines];
|
|
288
|
+
for (let index = 0; index < modalHeight; index += 1) {
|
|
289
|
+
const row = startRow + index;
|
|
290
|
+
if (row >= result.length)
|
|
291
|
+
break;
|
|
292
|
+
const raw = index === 0 || index === modalHeight - 1 ? "" : content[index - 1] ?? "";
|
|
293
|
+
const padded = fit(raw, modalWidth);
|
|
294
|
+
const block = `${bg(5, 46, 74)}${padded}${ansi.reset}`;
|
|
295
|
+
result[row] = replaceCells(result[row] ?? "", startCol, modalWidth, block);
|
|
296
|
+
}
|
|
297
|
+
return result.slice(0, height).join("\n");
|
|
298
|
+
}
|
|
299
|
+
function replaceCells(value, start, width, replacement) {
|
|
300
|
+
const plain = stripAnsi(value);
|
|
301
|
+
const before = plain.slice(0, start);
|
|
302
|
+
const after = plain.slice(start + width);
|
|
303
|
+
return `${before}${replacement}${after}`;
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/tui/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tui/state/index.ts"],"names":[],"mappings":"AAEA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tui/state/index.ts"],"names":[],"mappings":"AAAA,SAAS;AAET,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/tui/state/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAgB,kBAAkB,IAAI,QAAQ,CA6B7C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAWjD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// 状态管理
|
|
2
|
+
export function createInitialState() {
|
|
3
|
+
return {
|
|
4
|
+
mode: "list",
|
|
5
|
+
focus: "nav",
|
|
6
|
+
navIndex: 0,
|
|
7
|
+
itemIndex: 0,
|
|
8
|
+
scroll: 0,
|
|
9
|
+
loading: true,
|
|
10
|
+
loadingMore: false,
|
|
11
|
+
status: "",
|
|
12
|
+
viewTitle: "十大",
|
|
13
|
+
items: [],
|
|
14
|
+
stats: [],
|
|
15
|
+
overview: [],
|
|
16
|
+
modal: null,
|
|
17
|
+
menuIndex: 0,
|
|
18
|
+
menuItems: [],
|
|
19
|
+
tabId: "default",
|
|
20
|
+
tabs: [],
|
|
21
|
+
searchMode: "topics",
|
|
22
|
+
searchQuery: "",
|
|
23
|
+
searchResults: [],
|
|
24
|
+
searchScope: { label: "全站" },
|
|
25
|
+
noticeType: "system",
|
|
26
|
+
inputMode: false,
|
|
27
|
+
inputPrompt: "",
|
|
28
|
+
inputValue: "",
|
|
29
|
+
infoLines: []
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function getStatus(state) {
|
|
33
|
+
if (state.loading) {
|
|
34
|
+
return "加载中...";
|
|
35
|
+
}
|
|
36
|
+
if (state.error) {
|
|
37
|
+
return `错误: ${state.error}`;
|
|
38
|
+
}
|
|
39
|
+
if (state.inputMode) {
|
|
40
|
+
return state.inputPrompt;
|
|
41
|
+
}
|
|
42
|
+
return state.status || getDefaultStatus(state);
|
|
43
|
+
}
|
|
44
|
+
function getDefaultStatus(state) {
|
|
45
|
+
switch (state.mode) {
|
|
46
|
+
case "topic":
|
|
47
|
+
return "帖子阅读";
|
|
48
|
+
case "settings":
|
|
49
|
+
return "设置";
|
|
50
|
+
case "user-detail":
|
|
51
|
+
return "用户详情";
|
|
52
|
+
default:
|
|
53
|
+
if (state.currentBoard) {
|
|
54
|
+
return `版面 #${state.currentBoard.boardId}`;
|
|
55
|
+
}
|
|
56
|
+
if (state.currentChat) {
|
|
57
|
+
return "私信";
|
|
58
|
+
}
|
|
59
|
+
return state.focus === "nav" ? "导航" : "列表";
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/tui/state/store.ts"],"names":[],"mappings":"AAAA,OAAO;AAIP,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,EAAE;QACf,aAAa,EAAE,EAAE;QACjB,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;QAC5B,UAAU,EAAE,QAAQ;QACpB,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAe;IACvC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC,WAAW,CAAC;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAe;IACvC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,MAAM,CAAC;QAChB,KAAK,UAAU;YACb,OAAO,IAAI,CAAC;QACd,KAAK,aAAa;YAChB,OAAO,MAAM,CAAC;QAChB;YACE,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACvB,OAAO,OAAO,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC7C,CAAC;YACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
export type ViewId = "hot" | "new" | "boards" | "following" | "favorite" | "messages" | "notices" | "me" | "settings";
|
|
2
|
+
export type FocusColumn = "nav" | "content";
|
|
3
|
+
export type ModalType = "menu" | "help" | "search" | "user" | "info" | null;
|
|
4
|
+
export type TabId = "default" | "posts" | "boards" | "chat" | "notices" | "history" | "followers" | "followees" | "favorites" | "signin" | "my-topics";
|
|
5
|
+
export type SearchMode = "topics" | "users";
|
|
6
|
+
export type NoticeType = "system" | "at" | "reply";
|
|
7
|
+
export interface NavItem {
|
|
8
|
+
id: ViewId;
|
|
9
|
+
label: string;
|
|
10
|
+
hint: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ContentItem {
|
|
13
|
+
title: string;
|
|
14
|
+
meta?: string;
|
|
15
|
+
detail?: string;
|
|
16
|
+
topicId?: number;
|
|
17
|
+
boardId?: number;
|
|
18
|
+
chatUserId?: number;
|
|
19
|
+
userId?: number;
|
|
20
|
+
action?: string;
|
|
21
|
+
sortTime?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface MenuItem {
|
|
24
|
+
label: string;
|
|
25
|
+
key: string;
|
|
26
|
+
action: string;
|
|
27
|
+
}
|
|
28
|
+
export interface UserDetailState {
|
|
29
|
+
userId: number;
|
|
30
|
+
name: string;
|
|
31
|
+
level?: string;
|
|
32
|
+
postCount?: number;
|
|
33
|
+
fanCount?: number;
|
|
34
|
+
followCount?: number;
|
|
35
|
+
isFollowing?: boolean;
|
|
36
|
+
recentTopics?: ContentItem[];
|
|
37
|
+
}
|
|
38
|
+
export interface ListSnapshot {
|
|
39
|
+
title: string;
|
|
40
|
+
items: ContentItem[];
|
|
41
|
+
stats: ContentItem[];
|
|
42
|
+
itemIndex: number;
|
|
43
|
+
status: string;
|
|
44
|
+
}
|
|
45
|
+
export interface BoardListState {
|
|
46
|
+
boardId: number;
|
|
47
|
+
title: string;
|
|
48
|
+
}
|
|
49
|
+
export interface ChatListState {
|
|
50
|
+
userId: number;
|
|
51
|
+
title: string;
|
|
52
|
+
loaded: number;
|
|
53
|
+
size: number;
|
|
54
|
+
hasMore: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface TopicReaderState {
|
|
57
|
+
topicId: number;
|
|
58
|
+
title: string;
|
|
59
|
+
meta: string;
|
|
60
|
+
lines: string[];
|
|
61
|
+
posts: TopicPostEntry[];
|
|
62
|
+
loaded: number;
|
|
63
|
+
size: number;
|
|
64
|
+
hasMore: boolean;
|
|
65
|
+
imageCount: number;
|
|
66
|
+
linkCount: number;
|
|
67
|
+
floorInput: string;
|
|
68
|
+
}
|
|
69
|
+
export interface TopicPostEntry {
|
|
70
|
+
id?: number;
|
|
71
|
+
userId?: number;
|
|
72
|
+
floor?: number;
|
|
73
|
+
author: string;
|
|
74
|
+
time: string;
|
|
75
|
+
likeCount: number;
|
|
76
|
+
dislikeCount: number;
|
|
77
|
+
rating?: string;
|
|
78
|
+
preview: string;
|
|
79
|
+
lineStart: number;
|
|
80
|
+
lineEnd: number;
|
|
81
|
+
imageCount: number;
|
|
82
|
+
linkCount: number;
|
|
83
|
+
images: string[];
|
|
84
|
+
links: string[];
|
|
85
|
+
lines: TopicLineEntry[];
|
|
86
|
+
}
|
|
87
|
+
export interface TopicLineEntry {
|
|
88
|
+
line: number;
|
|
89
|
+
row: number;
|
|
90
|
+
floor?: number;
|
|
91
|
+
kind: "header" | "divider" | "text" | "quote" | "image" | "link" | "blank";
|
|
92
|
+
text: string;
|
|
93
|
+
imageIndex?: number;
|
|
94
|
+
imageUrl?: string;
|
|
95
|
+
linkIndex?: number;
|
|
96
|
+
linkUrl?: string;
|
|
97
|
+
}
|
|
98
|
+
export interface TuiState {
|
|
99
|
+
mode: "list" | "topic" | "settings" | "user-detail";
|
|
100
|
+
focus: FocusColumn;
|
|
101
|
+
navIndex: number;
|
|
102
|
+
itemIndex: number;
|
|
103
|
+
scroll: number;
|
|
104
|
+
loading: boolean;
|
|
105
|
+
loadingMore: boolean;
|
|
106
|
+
status: string;
|
|
107
|
+
error?: string;
|
|
108
|
+
account?: string;
|
|
109
|
+
viewTitle: string;
|
|
110
|
+
items: ContentItem[];
|
|
111
|
+
stats: ContentItem[];
|
|
112
|
+
overview: ContentItem[];
|
|
113
|
+
parentList?: ListSnapshot;
|
|
114
|
+
currentBoard?: BoardListState;
|
|
115
|
+
currentChat?: ChatListState;
|
|
116
|
+
topic?: TopicReaderState;
|
|
117
|
+
modal: ModalType;
|
|
118
|
+
menuIndex: number;
|
|
119
|
+
menuItems: MenuItem[];
|
|
120
|
+
tabId: TabId;
|
|
121
|
+
tabs: {
|
|
122
|
+
id: TabId;
|
|
123
|
+
label: string;
|
|
124
|
+
}[];
|
|
125
|
+
searchMode: SearchMode;
|
|
126
|
+
searchQuery: string;
|
|
127
|
+
searchResults: ContentItem[];
|
|
128
|
+
searchScope: {
|
|
129
|
+
label: string;
|
|
130
|
+
boardId?: number;
|
|
131
|
+
};
|
|
132
|
+
userDetail?: UserDetailState;
|
|
133
|
+
noticeType: NoticeType;
|
|
134
|
+
inputMode: boolean;
|
|
135
|
+
inputPrompt: string;
|
|
136
|
+
inputValue: string;
|
|
137
|
+
inputCallback?: (value: string) => void;
|
|
138
|
+
infoTitle?: string;
|
|
139
|
+
infoLines: string[];
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tui/state/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tui/state/types.ts"],"names":[],"mappings":"AAAA,SAAS"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TopicLineEntry, TopicPostEntry, TopicReaderState } from "./state/types.js";
|
|
2
|
+
export declare function buildTopicReader(topicId: number, topic: Record<string, unknown>, posts: unknown[], size: number): TopicReaderState;
|
|
3
|
+
export declare function appendTopicPosts(topic: TopicReaderState, posts: unknown[]): void;
|
|
4
|
+
export declare function currentTopicPost(topic: TopicReaderState, scroll: number): TopicPostEntry | undefined;
|
|
5
|
+
export declare function currentTopicLine(topic: TopicReaderState, scroll: number): TopicLineEntry | undefined;
|
|
6
|
+
export declare function findTopicPostByFloor(topic: TopicReaderState, floor: number): TopicPostEntry | undefined;
|
|
7
|
+
export declare function jumpRelativeTopicFloor(topic: TopicReaderState, scroll: number, delta: number): number;
|
|
8
|
+
export declare function lineKindLabel(kind: TopicLineEntry["kind"]): string;
|
|
9
|
+
export declare function parseBracketIndex(value: string, label: "image" | "link"): number | undefined;
|
|
10
|
+
//# sourceMappingURL=topic-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topic-reader.d.ts","sourceRoot":"","sources":["../../src/tui/topic-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMzF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAyBlI;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAQhF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEpG;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAQpG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEvG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOrG;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,MAAM,CAiBlE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5F"}
|