YSU
构建与使用

本地文件与命令行

把写好的 HTML 丢进浏览器里看,不用先架一个服务器。三条路都能走。

把写好的 HTML 丢进浏览器里看,不用先架一个服务器。三条路都能走。

从地址栏输路径

内核认六种前缀,凑齐其中一种就会被当成文件路径:

file:///home/me/page.html
/home/me/page.html
./page.html
../shared/page.html
~/page.html
~/work/page.html

~ 展开成家目录,./../ 相对当前工作目录,绝对路径直接读。

裸文件名不算路径。page.html 会被当成主机名,补上 http:// 之后去取。这个判断是有意的:example.comindex.html 长得一模一样,没有可靠的依据把它们分开,所以定成按主机名处理。要打开当前目录下的文件,写 ./page.html

路径里的空格、#?% 以及非 ASCII 字符都会被正确编码,不用手动转义。

从文件对话框

Ctrl+O 或者工具栏上的「打开」按钮,弹系统原生文件对话框。过滤器默认只列网页(*.html*.htm*.xhtml),但保留「所有文件」这个选项——本地文件常常没有扩展名,或者叫别的名字,不让选就太死了。

选中的文件在当前标签页打开,走的是和地址栏输路径完全相同的加载路径。

用户取消时什么也不做,不弹错误提示。

拖放

把一个文件从文件管理器拖进窗口,松手就打开。拖动过程中会有一层提示盖在视口上,免得不知道松手会发生什么。

一次拖多个文件时只取第一个。

打开之后

页面里的相对地址引用也是按文件位置解析的,所以长这样的一对文件能正常工作:

<!-- /home/me/site/index.html -->
<link rel="stylesheet" href="style.css">

style.css 会从 /home/me/site/style.css 读。

读盘在后台线程进行,和网络加载共用同一套完成事件与错误处理。文件大的时候界面不会卡住。

字符集按同样的顺序嗅探:字节序标记、<meta charset>、最后退回 UTF-8。

会被拒绝的情况

打不开的时候会给一个说明页,写清楚是哪一类问题:

情况说明页说什么
文件不存在打不开这个文件
路径是个目录打不开这个文件
没有读权限打不开这个文件
二进制文件打不开这个文件
超出大小上限打不开这个文件

本地文件的失败页与网络地址的失败页文案不同,看得出一件事是「文件有问题」还是「网络有问题」。

命令行参数

当前的外壳不处理命令行参数。 ui/src/main.cpp 只把 argc / argv 转交给 QApplication,不做别的解析。所以:

./ui/build/vexo                # 正常启动,打开起始页
./ui/build/vexo page.html      # 参数被忽略,仍然打开起始页

早期那个 Rust 外壳支持 vexo 页面.html 并且能一次开多个标签页,那套代码还在 crates/vexo 里,但它已经不参与发布。要用命令行开文件的话,现在得走 Ctrl+O 或者拖放。

不支持的

本地目录列表(file:///home/me/ 这样的地址不会列出目录内容)、<base> 元素、权限与沙箱策略,这几样都没实现。

On this page