UNPKG

hexo-asset-image-fix

Version:

Give asset image in hexo a absolutely path automatically

61 lines (55 loc) 2.17 kB
"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("\\", "/") .replace(/^\s+|\s+$/gm, ""); // Not absolute path if (!/^http[s]?:\/\/.*/.test(src) && !/^\/+.*/.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(); } } });