修改超链接属性

概述

由于网站和笔记的结构不同,所以在makrdown转换上需要一个方法去协调这个问题。本身网站做了单页面模式,所以网站内链接直接跳转,而外部链接使用target="_blank"在新窗口打开链接。基于以上的需求,就需要对现有的markdown-it功能做下调整。

假设有两个链接:

[链接1](/path/of/article)
[链接2](https://www.ibm.com)

理想的转换结果为:

<a href="/path/of/article">链接1</a>
<a href="https://www.ibm.com" target="_blank">链接2</a>

解决办法

md.renderer.rules.link_open = (tokens,idx) => {
    var token = tokens[idx];
    var attrs = Object.fromEntries(token.attrs);
    if(attrs.href.indexOf('http') == 0){
        attrs.target = '_blank';
    }
    var result = '<a ';
    for(var p in attrs){
        result += `${p}="${attrs[p]}" `;
    }
    result += '>';
    return result;
};

修改markdown-it对象的初始化部分,在link_open时,使用自定义方法。

由于token.attrs返回的是二维数组,诸如[['href','/aa/bb/cc'],['target','_blank']]的形式,所以需要使用过Object.fromEntries()转换为对象。Object.fromEntries()是ES新标准的方法,需要nodejs v12才得到支持。