- 新增可复用的 markdown-echarts 工作区,支持安全的 YAML 围栏、默认值、语义校验、错误占位和 SVG 渲染 - 将 ECharts 接入统一 Markdown、快速预览、精确预览与 PDF 链路,并复用 Mermaid 的不可跨页和超高图单页适配策略 - 默认示例加入 ECharts,增加源文本折叠、顶部文档状态、页码输入跳转与滚动同步 - 快速预览改用外层容器滚动,使滚动条与精确预览统一贴在预览区域右侧,并兼容显示缩放 - 完善 Docker 工作区复制、可配置 Compose 镜像、测试覆盖和进度文档
78 lines
1.6 KiB
TypeScript
78 lines
1.6 KiB
TypeScript
export interface PageVerticalRange {
|
|
top: number;
|
|
bottom: number;
|
|
}
|
|
|
|
export function getPreviewPageScrollTop(
|
|
currentScrollTop: number,
|
|
pageViewportTop: number,
|
|
scrollerViewportTop: number
|
|
) {
|
|
if (
|
|
!Number.isFinite(currentScrollTop) ||
|
|
!Number.isFinite(pageViewportTop) ||
|
|
!Number.isFinite(scrollerViewportTop)
|
|
) {
|
|
return 0;
|
|
}
|
|
|
|
return Math.max(
|
|
0,
|
|
currentScrollTop + pageViewportTop - scrollerViewportTop
|
|
);
|
|
}
|
|
|
|
export function normalizePreviewPageNumber(
|
|
value: string,
|
|
current: number,
|
|
total: number
|
|
) {
|
|
if (!Number.isInteger(total) || total < 1) {
|
|
return 0;
|
|
}
|
|
|
|
const normalizedValue = value.trim();
|
|
const fallback = Number.isInteger(current)
|
|
? Math.min(Math.max(current, 1), total)
|
|
: 1;
|
|
|
|
if (normalizedValue.length === 0) {
|
|
return fallback;
|
|
}
|
|
|
|
const parsed = Number(normalizedValue);
|
|
if (!Number.isInteger(parsed)) {
|
|
return fallback;
|
|
}
|
|
|
|
return Math.min(Math.max(parsed, 1), total);
|
|
}
|
|
|
|
export function getNearestPageNumber(
|
|
viewportCenter: number,
|
|
pages: readonly PageVerticalRange[]
|
|
) {
|
|
if (pages.length === 0 || !Number.isFinite(viewportCenter)) {
|
|
return 0;
|
|
}
|
|
|
|
let nearestPage = 1;
|
|
let nearestDistance = Number.POSITIVE_INFINITY;
|
|
|
|
for (const [index, page] of pages.entries()) {
|
|
const distance =
|
|
viewportCenter < page.top
|
|
? page.top - viewportCenter
|
|
: viewportCenter > page.bottom
|
|
? viewportCenter - page.bottom
|
|
: 0;
|
|
|
|
if (distance < nearestDistance) {
|
|
nearestPage = index + 1;
|
|
nearestDistance = distance;
|
|
}
|
|
}
|
|
|
|
return nearestPage;
|
|
}
|