Skip to content
This repository was archived by the owner on Feb 18, 2020. It is now read-only.
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 57 additions & 52 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,57 +1,62 @@
'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;
}

hexo.extend.filter.register('after_post_render', function(data){
var config = hexo.config;
if(config.post_asset_folder){
var link = data.permalink;
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);
hexo.extend.filter.register('after_post_render', function (data) {
var config = hexo.config;
if (config.post_asset_folder) {
var link = data.permalink;
var getPosition = (str, m, i)=> str.split(m, i).join(m).length;
var beginPos = getPosition(link, '/', 3) + 1;
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
});
var prefix = data['source'].replace(/(.+\/)?([^\/]+)\.md$/, '$2');
var get_assets = assets => {
var paths = assets.split('/').filter(elem => elem != '' && elem != '.');
if (paths.length >= 2) {
if (paths[0] == prefix) {
paths.shift();
return paths.join('/');
}
}
return false;
}
}else{
console.info&&console.info("no src attr, skipped...");
console.info&&console.info($(this));
$('img').each(function () {
if ($(this).attr('src')) {
var attr = 'src';
if ($(this).attr('data-src')) {
attr = 'data-src';
}
var src = $(this).attr(attr).replace('\\', '/');
if (!/https?\:\/\//.test(src) && !/^\#/.test(src)) {
var dest = get_assets(src);
if (dest) {
$(this).attr(attr, dest);
// console.info && console.info('image src ' + src + " --> " + dest);
}
}
}
});
$('a').each(function () {
if ($(this).attr('href')) {
var src = $(this).attr('href').replace('\\', '/');
if (!/https?\:\/\//.test(src) && !/^\#/.test(src)) {
var dest = get_assets(src);
if (dest) {
$(this).attr('href', dest);
// console.info && console.info('link href ' + src + " --> " + dest);
}
}
}
});
data[key] = $.html();
}
});
data[key] = $.html();
}
}
}
});