Rendering Markdown...
// Package static —— 虚拟主机 Web Hosting 模式下针对 Markdown 的服务端预览渲染。 // // 设计原则: // 1. 不引入任何新的第三方依赖。Markdown 渲染交给浏览器端 marked.js(CDN)。 // 2. 渲染有 size 上限(默认 5MB),防止从云端读取超大文件造成 OOM。 // 3. Markdown 原文嵌入到 ,也会因 type 非 JS 而不被执行;同时对 0 && size > maxBytes { return nil, fmt.Errorf("file too large for render: size=%d max=%d", size, maxBytes) } rr, err := stream.GetRangeReaderFromLink(size, link) if err != nil { return nil, fmt.Errorf("get range reader: %w", err) } // 当 size 未知时使用全量范围(Length=-1 由底层处理) rng := http_range.Range{Start: 0, Length: -1} if size > 0 { rng = http_range.Range{Start: 0, Length: size} } rc, err := rr.RangeRead(ctx, rng) if err != nil { return nil, fmt.Errorf("range read: %w", err) } defer rc.Close() // 用 LimitReader 兜底防止 size 申报为 0 但内容超大 limited := io.LimitReader(rc, maxBytes+1) buf, err := io.ReadAll(limited) if err != nil { return nil, fmt.Errorf("read all: %w", err) } if int64(len(buf)) > maxBytes { return nil, fmt.Errorf("file exceeds max bytes during read: max=%d", maxBytes) } return buf, nil } // markdownPreviewTpl 是 Markdown 全屏预览的 HTML 模板。 // 使用 marked.js + highlight.js + DOMPurify 在浏览器端渲染,样式参考 GitHub Markdown CSS。 // 占位符: // // {{TITLE}}
Rendering Markdown...