yiyungent/hexo-asset-img

路径中有空格时,因为markdown需要encode空格的原因,会匹配失败

blackier opened this issue · 5 comments

var regExp = RegExp("!\\[(.*?)\\]\\(" + fileName + '/(.+?)\\)', "g");

如果图片路径有空格,比如 ![](t a/a.png),在markdown中需要encode空格,就变成了 ![](t%20a/a.png)。这时候就会匹配失败,导致没法替换成功。

个人试着修改了下,简单的改成

    // ![example](postname/example.jpg)  -->  {% asset_img example.jpg example %}
    var regExp = RegExp("!\\[+?(.*?)\\]+?\\((" + fileName + "|" + fileName.replace(" ", "%20") + ')/(.+?)\\)', "g");
    // hexo g
    data.content = data.content.replace(regExp, "{% asset_img $3 $1 %}","g");

是可以成功的,希望作者能完善下这个的匹配。

然后我再测试发现,文件里有空格,也是有问题。需要改下最后的匹配格式,但如果文件名本身就有%20,那么也会问题。但这个的概率感觉比空格的概率低。

    data.content = data.content.replace(regExp, function(matchStr, group1, group2, group3){
        var imgname = group3.replace("%20", " ");
        return `{% asset_img "${imgname}" "${group1}" %}`;
       }, "g");

收到,感谢你的贡献!最近比较忙(电脑都用不上),等下次有时间我再来更新下(好奇怪,我居然没收到这个issue通知),其实你可以直接pull request,然后我自己合并也行

收到,感谢你的贡献!最近比较忙(电脑都用不上),等下次有时间我再来更新下(好奇怪,我居然没收到这个issue通知),其实你可以直接pull request,然后我自己合并也行

呃主要是我不是搞js的,代码不多大致看得懂流程才学了下语法,就改了下,pr就不提了,等你后面修改吧。

tedcy commented

文件名里面有特殊符号都会有问题
根据https://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript的建议
文件名用escapeRegex处理一下就可以解决问题了

function escapeRegex(string) {
    return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}

然后我再测试发现,文件里有空格,也是有问题。需要改下最后的匹配格式,但如果文件名本身就有%20,那么也会问题。但这个的概率感觉比空格的概率低。

    data.content = data.content.replace(regExp, function(matchStr, group1, group2, group3){
        var imgname = group3.replace("%20", " ");
        return `{% asset_img "${imgname}" "${group1}" %}`;
       }, "g");

今天想起来写了个在线测试 demo (懒癌晚期),这个写法不行啊

https://replit.com/@yiyungent/hexo-asset-img-test#index.js

image