由于 Hexo 作为静态博客,会将所有 source/ 目录下的的 Markdown 文件渲染为 HTML 页面。有时我会喜欢在某个目录下放一个 readme 文档,比如 asset/ 目录,作为该目录存放资源的说明。但是我不想被搜索到,那么这时只需要将该目录写到 skip_render 下面,避免被渲染成 HTML 页面,如:
1 | skip_render: |
还有一种方法是在文档的 front-matter 里面加上 indexing: false 避免该文档被索引到,但这也只限于 Markdown 类型文件。同样的,还有一种方法是在 _config.stellar.yml 中设置 search.local_search.field :
1 | search: |
field 字段有三种值可以设置,分别为:post, page, all.
通过测试发现,field 设置为 page,就会搜索除了 post 以外的所有内容,所以实际情况如下:
post : 只有 layout 为 post 的内容
page: page + all others (除了 layout 为 post,还有 page ,wiki)
all: page + post + all others
这里的 all others 就是除了 layout 为 post, page, wiki 以外的 Markdown 文件,加上其它类型文件,如 css 文件,js 文件。
综合来看,并不是仅仅通过 search.local_search.field 限制,或者 indexing 开关,或者 skip_render 就能避免某些文件被搜索到。它们需要配合使用才能达到预期效果,但这增加了使用负担。所以我想到的是改现有的代码。
通过读目前的代码,注意到三点:
- 产生搜索数据时,会先对文本 layout 做两种判断,一种是 post,一种是 page。这里的 page 的范围就是除了 post 之外的所有类型为 Markdown 的文档,包括 wiki, about 页面,friends 页面,more 页面等等。
- 其它非 Markdown 文件的 layout 也有值,其为 “false”。
field只支持单值,不支持如field:["post","page"]这样的设置。
所以我的代码更改逻辑有两点:
根据 layout 来判断是否需要进行搜索。如果不是 post,page,wiki 这三种之一,则不搜索。
第一点并不能满足所有的情况,只能排查非 Markdown 文件(非 Markdown 文件的 layout 都为 false)。而还有些 Markdown 文件,虽然可以通过
skip_render设置不被渲染从而在网页上搜索不到。但是,大部分情况是需要渲染的,也就是会有相应的 HTML 页面。如果还是不想被搜索到呢?在 front-matter 里面加上indexing: false,是个方法。但是还有没有别的方法呢?你可能不会每次都想到要在文档前面加上一句indexing: false。更好的方法是来源于skip_render,于是类似的就有skip_search。可以设置某个目录,或多个目录。这样不管这些目录下有多少个文件,都可以跳过搜索啦。而不用在里面的每个文档前面添加indexing设置项。
所以代码更改如下:
1 | diff --git a/scripts/generators/search.js b/scripts/generators/search.js |
配置文件可以这样写:
1 | search: |
实际测试来看,符合我的预期。
