最近在GitHub Pages中搭建了hexo博客,并且使用了next主题,当使用文字博客或者外链图片时没有什么问题,但是使用内置图片却出现了问题,在此记录下来。
当发布新文章时,我使用了hexo-asset-image
这个插件,这个插件需要在_config.yml中设置post_asset_folder
为true才能开启,并且需要安装插件,安装方法为:
npm install hexo-asset-image --save
使用该插件后新建文章hexo new "测试文章"
,就会在post文件夹生成同名的文件夹,该文件夹为存放图片的文件夹,然后再在文章里使用markdown的引用图片的方式进行引用,在使用hexo generate
后,生成的html文件会自动的加上图片的绝对路径。
但是这中方法在hexo3.0之后貌似无法使用,目前我用的hexo版本为4.2,也是无法使用的,生成的链接类似:
/.ml//logo.jpg
导致在网页上无法显示
第一种修改方法为通过hexo自带的图片标签,如
{% asset_path slug %}
{% asset_img slug [title] %}
{% asset_link slug [title] %}
详见hexo官方对资源文件夹的说明,官方也明确提到了,如果使用markdown的语法,图片可能不会正常显示。
第二种修改方法时是通过修改hexo-asset-image
这个插件的源代码来实现的,找到路径node_modules\hexo-asset-image\index.js
,替换其中的内容为:
'use strict';
var cheerio = require('cheerio');
// http://stackoverflow.com/questions/14480345/how-to-get-the-nth-occurrence-in-a-string
function getPosition(str, m, i) {
return str.split(m, i).join(m).length;
}
var version = String(hexo.version).split('.');
hexo.extend.filter.register('after_post_render', function(data){
var config = hexo.config;
if(config.post_asset_folder){
var link = data.permalink;
if(version.length > 0 && Number(version[0]) == 3)
var beginPos = getPosition(link, '/', 1) + 1;
else
var beginPos = getPosition(link, '/', 3) + 1;
// In hexo 3.1.1, the permalink of "about" page is like ".../about/index.html".
var endPos = link.lastIndexOf('/') + 1;
link = link.substring(beginPos, endPos);
var toprocess = ['excerpt', 'more', 'content'];
for(var i = 0; i < toprocess.length; i++){
var key = toprocess[i];
var $ = cheerio.load(data[key], {
ignoreWhitespace: false,
xmlMode: false,
lowerCaseTags: false,
decodeEntities: false
});
$('img').each(function(){
if ($(this).attr('src')){
// For windows style path, we replace '\' to '/'.
var src = $(this).attr('src').replace('\\', '/');
if(!/http[s]*.*|\/\/.*/.test(src) &&
!/^\s*\//.test(src)) {
// For "about" page, the first part of "src" can't be removed.
// In addition, to support multi-level local directory.
var linkArray = link.split('/').filter(function(elem){
return elem != '';
});
var srcArray = src.split('/').filter(function(elem){
return elem != '' && elem != '.';
});
if(srcArray.length > 1)
srcArray.shift();
src = srcArray.join('/');
$(this).attr('src', config.root + link + src);
console.info&&console.info("update link as:-->"+config.root + link + src);
}
}else{
console.info&&console.info("no src attr, skipped...");
console.info&&console.info($(this));
}
});
data[key] = $.html();
}
}
});
然后再进行生成,生成的图片链接就会正常了,也能够访问。