StarryNights

每一个你所后悔的现在,都有一个不够努力的曾经

站内检索

循着字句,邂逅星光

搜索文章标题与正文,直达命中的章节

开始一次轻盈的站内探索

从这些主题开始探索

输入关键词

可同时输入多个词语缩小范围

发现内容

在摘要中查看高亮的关键词

快速直达

点击文章或章节标题继续阅读

# 引言

Hexo 资源文件夹 启用后,使得文章图片等外挂资源可以按文件夹和文章对应。

  • Hexo 若正常发布,需要 {% asset_img slug [title] %} 引入图片,或者 [](image file name),无法在本地 markdwon 书写时预览
  • Markdown 若正常预览, 引入图片需要采用 相对路径 ,Hexo 发布时则 图片链接 异常

本文主要解决两者之间的冲突,使得二者能够兼得.

# 实现

本地编写仍然采用方便预览的相对路径引入方式, 编写 Hexo 过滤器, 在文章渲染结束后,将 img 的 资源路径 进行替换

'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;
        var appendLink = '';
        if (/.*\/index\.html$/.test(link)) {
            appendLink = 'index/';
            var endPos = link.lastIndexOf('/');
        }
        else {
            var endPos = link.lastIndexOf('.');
        }
        link = link.substring(beginPos, endPos) + '/' + appendLink;

        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('data-src')) {
                    var src = $(this).attr('data-src').replace('\\', '/');
                    if (!(/http[s]*.*|\/\/.*/.test(src)
                        || /^\s+\//.test(src)
                        || /^\s*\/uploads|images\//.test(src))) {
                        var srcArray = src.split('/').filter(function (elem) {
                            return elem != '' && elem != '.';
                        });
                        if (srcArray.length > 1)
                            srcArray.shift();
                        src = srcArray.join('/');

                        $(this).attr('data-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();
        }
    }
});

# 主题集成

集成到主题内部的方式,可以查看博客文章 Shoka主题: 资源文件夹图片相对路径引用转换

本文只是基于 Hexo 的 过滤器,阐述原理并给出实现

# 结语

参考链接:

更新于 阅读次数 — 次
STARRY NIGHTSPERSONAL NOTES

赞赏

文章至此,故事还在继续。

Seiun

长按或右键保存收款码

文章关联

1 篇关联

顺着引用的连线,读见篇章交错的脉络

展开关系图

拖动平移 · Ctrl / ⌘ + 滚轮缩放 · 点击节点阅读使用 + / − 按钮缩放 · 放大视图后可拖动 · 点击节点阅读单指拖动平移 · 使用 + / − 按钮缩放 · 点击节点阅读

当前文章本文引用
引用列表

引用本文0

暂无

本文引用1

  • Shoka主题: 自定义过滤器重定向资源文件夹图片相对路径引用
    AI 摘要

    文章讨论 Hexo 启用资源文件夹后,Markdown 用相对路径引用图片便于本地预览,却与生成发布时的资源路径重定向冲突,官方方案又会破坏本地预览。作者提出利用 Hexo 的 after_post_render 过滤器,通过 cheerio 处理文章内容中的 img 标签,将 data-src 修改为指向文章资源文件夹的正确路径,从而兼顾本地预览和发布重定向。

文章关联