XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
Readme.md

XFESystem.Documents

可复用的 .NET 10 文档组件。它不引用 WPF、WebView2、ASP.NET,也不直接读取宿主文件系统。

Markdown 使用指定的 XFEStudioWebSite 实现:Markdig 0.44.0 的 AdvancedExtensions / AutoIdentifiers 管线,随后使用 HtmlSanitizer 9.1.968-beta 清理 HTML。原站 MarkdownService、共享 Razor 资源引用和语言映射位于 Snapshots;静态资源及字体位于 Assets/Website。SourceManifest.json 记录原站 commit、每份源文件与本地快照的 SHA256,以及仅为离线资源路径进行的变换。

文件编辑

IDocumentStorage storage = /* XFESystem 文件系统适配器 */;
var documents = new DocumentService(storage);
var session = await documents.OpenAsync(new(@"X:\Users\Default\Documents\Notes.md"));
session.Text = "# XFESystem\n\nHello";
await documents.SaveAsync(session);

文件系统适配器必须执行权限检查,提供受大小限制的读取,并在 ReplaceAsync 内原子比较 revision 后替换文件。服务拒绝宿主路径、目录穿越、二进制和非法 UTF-8;保存冲突不会覆盖另一编辑器的内容。保存过程中出现的新编辑仍保持“已修改”状态。

Markdown 和代码预览

自研 Web 渲染入口使用 MarkdownWeb(text, title, language, dark) / CodeWeb(text, path, language, dark)。 它们生成网站 Docs/View.cshtml 的文章组件(docs-article / markdown-body docs-article-body),复用网站原样的 Bootstrap、主题变量、Markdown、代码、文档布局 CSS,以及原顺序的 Highlight.js、自定义 C# 等语法、KaTeX、DocUtils、CodeBlockTools 和 DocsReader 脚本。不插入修改颜色、工具栏标签或字体的替代 CSS/JS。

Assets/Website/Exact/SourceManifest.json 保存每个源文件、源 SHA256、嵌入 SHA256、许可证引用与网站提交号;所有嵌入字节和网站文件相等。WebsiteAssets.WebResources / TryOpenWebPath 将原网站 URL(例如 /js/docs/doc-utils.js)映射到 PascalCase 的内置文件,因而 Mermaid 的脚本地址及 KaTeX 的相对字体地址无需改写。

调用方必须只把经过本组件清理的 HTML 注册到专用的本地资源源,并对脚本、样式和字体应用 PreviewDocument.ContentSecurityPolicy 中的本地资源策略。此入口没有输出 CSP meta:当前自研浏览器把声明但尚不支持的 CSP 保守地当成阻止所有作者脚本,不能把缺少 meta 视作已经实现 CSP。URL 映射本身不会读取任何宿主路径。

此快照仅包含网站文章内容组件;整站导航、用户认证和管理操作不属于文档预览。原站缺失的 KaTeX 备用字体及 Bootstrap Icons 字体不会被替换或伪造;资源字节一致不代表渲染引擎已经支持所有 CSS、字体和浏览器 API,实际视觉一致性由系统浏览器及 QEMU 截图验收单独报告。

以下 Markdown / Code 是原有隔离宿主预览入口,保留其派生路径与文字工具标签以兼容已有使用者;系统原生入口使用上述 *Web 方法。

DocumentPreviewBuilder.Markdown 返回经过清理的 Markdown 页面;Code 返回经过 HTML 转义的代码页,并按原站扩展名映射选取 Highlight.js 语言。实际代码着色使用原站的 Highlight.js 11.11.1,以及原站 C#/XAML 等语法扩展;数学和图表使用原站 KaTeX / Mermaid / DocUtils。

浏览器适配器需将 https://xfe-resources.invalid/Documents/{Name} 请求交给 WebsiteAssets.Open(Name),返回正确的 CSS、JavaScript、字体 MIME 类型,仅允许本地捆绑资源。字体资源需要跨源访问响应头(捆绑资源为公开静态内容,可以使用 Access-Control-Allow-Origin: *),以支持隔离预览源。预览内禁止网络请求、外部图片、表单、嵌套 frame 和宿主对象;页面导航必须由适配器显式处理。PreviewDocument 只是页面内容,组件本身不包含浏览器引擎。

原站图片灯箱依赖 Bootstrap,本组件不引入 Bootstrap:关闭整站自动初始化,直接调用原站代码工具、数学和 Mermaid 初始化。代码和图表按钮提供文字回退,不依赖 Bootstrap 图标。原站字体 CSS 指向了部分缺失的备用格式,本地派生 CSS 只保留实际存在的格式,所有保留路径都经过测试。

JavaScript 执行预览

DocumentPreviewBuilder.JavaScript 生成 JavaScriptPreviewPlan,将源码编码到 data URL,避免 </script> 逃逸;页面不允许网络、worker、嵌套 frame 或宿主桥。计划要求 独立渲染进程、超时终止、内存上限,iframe 只能使用 sandbox="allow-scripts",不能加 allow-same-origin。

只有实际渲染器履行这些要求后才能执行预览。创建 plan、语法着色和组件单元测试均不代表已经运行 JavaScript,也不证明 .NET 已移植到 XFESystem 内核。

验证

dotnet test Tests/XFESystem.Documents.Tests/XFESystem.Documents.Tests.csproj -c Release
node --test scripts/TestDocumentHighlight.mjs
node scripts/TestDocumentBrowser.mjs

这些测试在 Windows 宿主 .NET / Node 上运行。浏览器检查使用独立 Edge headless 进程和新 profile,真实渲染 Markdown、代码、数学、Mermaid 与窄屏页面,并在隔离 iframe 内执行受控 JS 示例。所有页面资源由本地 CDP 拦截器直接供给;结果、源码/程序集哈希和截图保存在新的 build/CSharpDocuments/Browser-* 目录。不会操控用户正在使用的浏览器或 QEMU。裸机、QEMU 内的 .NET、真实桌面与浏览器集成仍需要系统层验收。

重新从指定网站导入资源:

powershell -NoProfile -ExecutionPolicy Bypass -File scripts/ImportWebsiteDocuments.ps1

导入脚本只读取网站目录,写入本组件目录。原站内容与第三方资源的许可证见 ThirdPartyNotices.md。