diff --git a/index.js b/index.js index 59da07d..c26fa7d 100644 --- a/index.js +++ b/index.js @@ -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(); - } - } + } });