修改Hexo自动生成的HTML文件名
导读
我们在使用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文件名的更多相关文章
- VS模板文件修改,自动生成注释
VS的模板文件存放在IDE下的ItemTemplatesCache文件夹下 1.不同VS版本IDE文件夹路径个有不同,下面以VS2012为例,IDE文件夹路径如图:
- 修改idea自动生成在C盘的文件路径,以免电脑越用越卡
1.看图一步一步来 2.将原来该位置的文件剪切到你指定的路径下 3.启动idea ,选择以前的配置即可
- springboot和mybatis集成,自动生成model、mapper,增加mybatis分页功能
整体思路和http://www.cnblogs.com/mahuan2/p/5859921.html相同. 主要讲maven的pom.xml和一些配置变化,详细说明. 软件简介 Spring是一个流行 ...
- spring和mybatis集成,自动生成model、mapper,增加mybatis分页功能
软件简介 Spring是一个流行的控制反转(IoC)和面向切面(AOP)的容器框架,在java webapp开发中使用广泛.http://projects.spring.io/spring-frame ...
- mybatis怎样自动生成java类,配置文件?
其实没有什么东西是可以自动生成的,只不过是别人已经写好了,你调用罢了. 所以想要mybatis自动生成java类,配置文件等,就必须要一些配置和一些jar包.当然这些配置也很简单. 为了有个初步的认识 ...
- 修改AssemblyInfo.cs自动生成版本号
一. 版本号自动生成方法 1.把 AssemblyInfo.cs文件中的[assembly:AssemblyVersion("1.0.0.0")]改成[assembly:Assem ...
- [转]轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
本文转自:http://blog.csdn.net/zapzqc/article/details/42237935 由于Ionic更新了命令行工具,以后修改应用图标和添加启动画面就简单了,最新方法见最 ...
- 轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
由于Ionic更新了命令行工具,以后修改应用图标和添加启动画面就简单了,最新方法见最下方: 应用图标: 1.在整个项目所在文件夹下创建res文件夹,里边再分别创建两个文件夹android和io ...
- 单档——PK单号新增、修改时不允许编辑,PK单号自动生成
由系统自动生成单号(日期+流水),用户新增.修改时不允许编辑单号: 范例(cxmt631): 1)在#单头栏位开启设定#中,即 cxmt631_set_entry(p_cmd)下: #add-poin ...
随机推荐
- 一个有用的排序函数,array_multisort(),下面的一个用法是根据二维数组里的一个字段值的大小,对该二维数组进行重新排序
从二维数组$cashes中取出一列 'store_id'(二维数组中的每个一维数组都有的字段),按照这个的大小排序,对二维数组$caches里面的一维数组进行重新排序 实际应用如下 想让相同部门的排在 ...
- Spring框架的相关介绍
Spring是一个开源轻量级的框架,它的核心是控制反转(IOC)和面向切面编程(AOP). 作为业务层框架的spring能够很好地整合表现层跟持久层. IOC:将类的创建和依赖关系写到配置文件里,可以 ...
- SpringBoot中数据加密存储和获取后解密展示AttributeConverter的实现
1. 需求: 数据库存入数据的时候要加密处理,不同的字段加密方式不同. 界面上展示的时候要解密处理,解密方式相同. 2. 实现方案一: 定义公共的加密解密方法,然后在对应的字段上重写他的getset方 ...
- 记一次hosts配置内容过多引起的故障
问题环境 系统环境 CentOS release 6.9 (Final) 2.6.32-696.16.1.el6.x86_64 Java 环境 1.8.0_151 Apollo 1.4.0 代码框架 ...
- Python爬取酷狗飙升榜前十首(100)首,写入CSV文件
酷狗飙升榜,写入CSV文件 爬取酷狗音乐飙升榜的前十首歌名.歌手.时间,是一个很好的爬取网页内容的例子,对爬虫不熟悉的读者可以根据这个例子熟悉爬虫是如何爬取网页内容的. 需要用到的库:requests ...
- Java开发桌面程序学习(六)——拖动文件获得文件路径
拖动获得文件路径 在windows软件中,很多软件都提供了拖动文件的打开文件的功能,JavaFx中也是有这功能,是通过监听器来实现的 监听器 setOnDragDetected(new EventHa ...
- 死磕 java同步系列之ReentrantReadWriteLock源码解析
问题 (1)读写锁是什么? (2)读写锁具有哪些特性? (3)ReentrantReadWriteLock是怎么实现读写锁的? (4)如何使用ReentrantReadWriteLock实现高效安全的 ...
- go-GUI-代码
直接看网址吧,所有的GO-GUI代码!~~~~ 网址
- Java的23种设计模式,详细讲解(一)
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
- Java web实现原理
说明 最近在看一本java web和tomcat技术介绍的书籍.故此,希望通过文字总结的方式总结自己学习所获,本篇主要介绍java实现web基本的信息浏览的方法原理. web的本质 由于技术能力有限, ...