导读

我们在使用Hexo框架生成静态博客时,其实是将你写好的.md文件输出成HTML文件进行渲染,其中HTML的文件名称就是.md的文件名称。

而我们为了编辑文章方便,为了通过文件名就知道这是哪篇文章,通常是把.md文件命名成中文的甚至是文章的标题,那么生成HTML文件时也就是中文的文件名了。

例如:钢铁是怎么炼成的.md经过hexo g命令会生成钢铁是怎么炼成的.html;执行hexo d命令会将文件推送到你的仓库,那么你访问这篇章时,对应的地址栏就是http://xxxx/.../钢铁是怎么炼成的.html,这样看起来很别扭,对搜索引擎也不友好。

那么我们如何修改为以数字加字母命名的HTML呢?今天我们就来探究一下。查看效果

(1)修改生成HTML时的命名策略

我们从Hexo是基于Node.js的,Hexo生成HTML文件这句话的到启发,Hexo肯定会获取文件夹下的所有.md文件生成HTML文件,命名格式xxx.md-->xxx.html,然后肯定会创建目录存放HTML文件。

这时候我们会想,我们是不是可以在Hexo生成HTML文件时,修改HTML的命名策略,即将原始的命名方式改为我们自定义的命名方式?

有了思路说干就干。于是去Hexo的各个文件里去找,它是在哪转换文件的。当我找了好几个文件后,我放弃了,文件太多了,太难找了,无异于大海捞针。在hexo模块里找了很久也没找到。。。

(2)修改HTML文件名

既然刚才那种方法行不通,那么我们就另辟蹊径,在Hexo生成HTML文件后,再去修改文件名。

JS怎么获取目录下的所有文件呢?搜了一下说Node.js可以,刚好Hexo是基于Node.js的。

于是任意目录下(除hexo目录)创建rename.js文件如下,其中新的文件名生成策略可以自己定义。

//引入fs操作文件
var fs = require('fs');
//引入jquery
var join = require('path').join;
var jsdom = require('jsdom');
const {JSDOM} = jsdom;
const {document} = (new JSDOM('<!doctype html><html><body></body></html>')).window;
global.document = document;
global.window = document.defaultView;
global.jQuery = require('jquery')(window);
const $ = require('jquery')(window); var eng = ['a','b','c','d','e','f','g','h','i','j'];
//生成随机6位数字字母 全路径新文件名
function getNewNameRandom(_file){
var fiveInt = Math.floor(Math.random()*89999+10000);//无五位随机数
var eng_index = Math.floor(Math.random()*10+1);//一位字母
return _file.substr(0,_file.lastIndexOf('\\')+1) + eng[eng_index-1] + fiveInt + ".html";//新文件名,全路径
}
function getAllFiles(jsonPath){
let jsonFiles = [];
function findJsonFile(path){
let files = fs.readdirSync(path);
files.forEach(function (item, index) {
let fPath = join(path,item);
let stat = fs.statSync(fPath);
if(stat.isDirectory() === true) {
findJsonFile(fPath);
}
if (stat.isFile() === true) {
jsonFiles.push(fPath);
}
});
}
findJsonFile(jsonPath);
console.log(jsonFiles);//指定目录下的文件,包括子目录
return jsonFiles;
}
function doFileRename(){
var jsonFiles = getAllFiles("F:/static/page");//生成的HTML文件
for(var i=0;i<jsonFiles.length;i++){
var _file = jsonFiles[i];
var newName = getNewNameRandom(_file);//新文件名,全路径
console.log(newName)
fs.rename(_file,newName,function(err){//重命名
if(err){
console.log("重命名失败");
}else{
console.log("重命名成功");
}
})
}
}
doFileRename();

然后在这个JS所在目录打开命令行,执行node rename.js

看日志,是全部成功了,找到对应目录,真的成功了。

存在的问题

hexo g时,又会生成原来的那样中文命名的HTML,我们重命名的还在(执行hexo clean就不在了),这不是我们想要的,或许你会说,再执行一次node rename.js,这不是我想要的,因为,这样每次执行,原来的Html的名字都会变,我不知道这会不会影响SEO,即使不会也不想这样,因为假如别人收藏了你的文章链接,但你的文章HTML名字变了,那别人收藏的就无效了啊。

所以这种方式会存在这个最严重的问题。

(3)Base64生成文件名

修改JS代码

//引入fs操作文件
var fs = require('fs');
//引入jquery
var join = require('path').join;
var jsdom = require('jsdom');
const {JSDOM} = jsdom;
const {document} = (new JSDOM('<!doctype html><html><body></body></html>')).window;
global.document = document;
global.window = document.defaultView;
global.jQuery = require('jquery')(window);
const $ = require('jquery')(window); var eng = ['a','b','c','d','e','f','g','h','i','j'];
//文件名Base64后 根据算法从编码中取6位作为新文件名
function getNewNameBase64(_file){
var fileName = _file.substr(_file.lastIndexOf('\\')+1,_file.length);//文件名
var fi_bs64 = Buffer.from(fileName.substr(0,fileName.lastIndexOf('.'))).toString('base64')//转成base64编码
var arr = fi_bs64.split("");
var len = arr.length;
var fis = "";
for(var i=1;i<=6;i++){
var s1 = arr[Math.floor(len/(2*i))];
if(s1=='/'||s1=='+'){
var eng_index = Math.floor(Math.random()*10+1);
s1 = eng[eng_index-1];
}
fis = fis + s1;
}
console.log(fis)
return _file.substr(0,_file.lastIndexOf('\\')+1) + fis + ".html";
}
function getAllFiles(jsonPath){
let jsonFiles = [];
function findJsonFile(path){
let files = fs.readdirSync(path);
files.forEach(function (item, index) {
let fPath = join(path,item);
let stat = fs.statSync(fPath);
if(stat.isDirectory() === true) {
findJsonFile(fPath);
}
if (stat.isFile() === true) {
jsonFiles.push(fPath);
}
});
}
findJsonFile(jsonPath);
console.log(jsonFiles);//指定目录下的文件,包括子目录
return jsonFiles;
}
function doFileRename(){
var jsonFiles = getAllFiles("F:/static/page");//生成的HTML文件
for(var i=0;i<jsonFiles.length;i++){
var _file = jsonFiles[i];
var newName = getNewNameBase64(_file);//新文件名,全路径
console.log(newName)
fs.rename(_file,newName,function(err){//重命名
if(err){
console.log("重命名失败");
}else{
console.log("重命名成功");
}
})
}
}
doFileRename();

效果

看日志,是全部成功了。找到对应目录,看下真的成功了。

存在的问题

这种方法解决了上面那个方法存在的问题,即每次执行node rename.js只要原文件名不变,生成的新文件名不变。但是需要限制文件名不能变,否则新文件名还是会变。还有一点是不能重复执行node rename.js,因为会根据新的再次生成新的。

小结

第2、3种方式都需要注意的是,

1、新名字的生成规则,要保证唯一性,不能重复

2、每次hexo g之后hexo d之前,要执行node rename.js

3、不要重复执行

4、第2种不太可行,推荐第3种

(4)修改文件生成规则

以上两种方式都需要我们来写代码,而且要手动执行node rename.js

对于这么懒的我来说很不方便,有没有更好的办法?答案是肯定的。

我们可以找到Hexo的根配置文件_config.yml,打开它,找到下图这个

我把他改成这样了,page是目录,执行hexo g会在public下生成,我让生成的HTML文件都放在page下,:fileName.html是HTML的命名格式,其中fileName是个变量。这个变量从哪来?

从你的.md文件里,如下图,在你的文章头部增加这个变量并指定一个值,这就是生成HTML时的文件名,注意也是不要和其他文件重复

也就是说,你的每篇文章只要头部加了这个属性,并赋值且确保唯一就OK了,不用像上面那两种方式那样麻烦了。

这样在执行hexo g后就变成这样了

执行hexo d后访问我的网站就是这样了

为了避免忘记在写文章时写fileName属性,我们可以修改模板,在scaffolds目录下有三个模板

在模板添加fileName属性

存在的问题

需要手动写文件的名字,且要保证唯一,但是比较方便

总结

推荐使用第3和第4种,第3种主要就是解决每次执行hexo g后生成的HTML文件名不变(前提是.md文件名不变),但不要忘了执行node rename.js;第4种只要自己有一个自己的命名规范就好了,比如:今天是五月m,日期29,周三w,时间是17点,文件名就可以就是m29w17。

如果大家知道在Hexo生成HTML的时候就可以改文件名或者有别的好办法,可以留言告诉我,谢谢。


本文以及本文提供的方法均为作者原创,自己摸索出来的,转载请注明出处,感谢!!!

修改Hexo自动生成的HTML文件名的更多相关文章

  1. VS模板文件修改,自动生成注释

    VS的模板文件存放在IDE下的ItemTemplatesCache文件夹下 1.不同VS版本IDE文件夹路径个有不同,下面以VS2012为例,IDE文件夹路径如图:

  2. 修改idea自动生成在C盘的文件路径,以免电脑越用越卡

    1.看图一步一步来 2.将原来该位置的文件剪切到你指定的路径下 3.启动idea ,选择以前的配置即可

  3. springboot和mybatis集成,自动生成model、mapper,增加mybatis分页功能

    整体思路和http://www.cnblogs.com/mahuan2/p/5859921.html相同. 主要讲maven的pom.xml和一些配置变化,详细说明. 软件简介 Spring是一个流行 ...

  4. spring和mybatis集成,自动生成model、mapper,增加mybatis分页功能

    软件简介 Spring是一个流行的控制反转(IoC)和面向切面(AOP)的容器框架,在java webapp开发中使用广泛.http://projects.spring.io/spring-frame ...

  5. mybatis怎样自动生成java类,配置文件?

    其实没有什么东西是可以自动生成的,只不过是别人已经写好了,你调用罢了. 所以想要mybatis自动生成java类,配置文件等,就必须要一些配置和一些jar包.当然这些配置也很简单. 为了有个初步的认识 ...

  6. 修改AssemblyInfo.cs自动生成版本号

    一. 版本号自动生成方法 1.把 AssemblyInfo.cs文件中的[assembly:AssemblyVersion("1.0.0.0")]改成[assembly:Assem ...

  7. [转]轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)

    本文转自:http://blog.csdn.net/zapzqc/article/details/42237935 由于Ionic更新了命令行工具,以后修改应用图标和添加启动画面就简单了,最新方法见最 ...

  8. 轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)

    由于Ionic更新了命令行工具,以后修改应用图标和添加启动画面就简单了,最新方法见最下方:   应用图标:   1.在整个项目所在文件夹下创建res文件夹,里边再分别创建两个文件夹android和io ...

  9. 单档——PK单号新增、修改时不允许编辑,PK单号自动生成

    由系统自动生成单号(日期+流水),用户新增.修改时不允许编辑单号: 范例(cxmt631): 1)在#单头栏位开启设定#中,即 cxmt631_set_entry(p_cmd)下: #add-poin ...

随机推荐

  1. js移动端自适应动态设置html的fontsize

    JS设计移动端页面时会遇到自适应问题,大多数都知道用rem来设置页面的比例大小,下面就来说几种常见的html中的fontsize设置方法: 1.使用flexible.js插件库.  淘宝就是利用这个来 ...

  2. 用python读写和处理csv文件

    import requestsfrom bs4 import BeautifulSoupimport csv date = open('test.csv', 'w')writer = csv.writ ...

  3. C#上手练习5(GOTO语句)

    C# goto 语句用于直接在一个程序中转到程序中的标签指定的位置,标签实际上由标识符加上冒号构成 语法形式如下. goto Labell;    语句块 1;Labell    语句块 2; 如果要 ...

  4. wpf file embeded resource is readonly,Copy always will copy the file and its folder to the bin folder

    Wpf file embeded resource will compile the file into the assembly and it will be readonly and can no ...

  5. 零零总总遇到过的CSS 样式

    1:添加弹出框阴影 2:禁止文本域缩放 3:直接使用CSS 完成文本内容大小写(针对英文) 4: 文本框中的占位符 5:让table每列一样高 6:不使用js 让内容换行 word-break 7:曾 ...

  6. hibernate关联关系(一对多)

    什么是关联(association) 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性. 案例:如何建立客户和订单一对多双向关联 先不建立客户和订单的关联关系,定义 ...

  7. export default和export的使用

    export default和export都是用来向外暴露成员 export default 向外暴露的成员可以使用任意的变量来接收,在一个模块中,export default只允许向外暴露一次,可以 ...

  8. MD5哈希算法及其原理

    - MD5功能 MD5算法对任意长度的消息输入,产生一个128位(16字节)的哈希结构输出.在处理过程中,以512位输入数据块为单位. - MD5用途及特征 MD5通常应用在以下场景: 1.防篡改,保 ...

  9. Word模板注入攻击

    Word模板注入攻击 0x00 工具准备 phishery:https://github.com/ryhanson/phishery/releases office版本:office 2010 0x0 ...

  10. 海思Hi3519A MPP从入门到精通(二 系统控制)

    系统控制根据 Hi35xx 芯片特性,完成硬件各个部件的复位.基本初始化工作,同时负责完成 MPP(Media Process Platform 媒体处理平台)系统各个业务模块的初始化.去初始化以及管 ...