一键将HTML网页选中区块复制转换为Markdown格式

工具

浏览器插件:tampermonkey 油猴
JS脚本:nameldk 的《复制为Markdown格式》 0.3.1版本
基础上添加代码。

需求

看到网页中想要保存的内容,复制保存,样式经常会变形。
带上样式的复制,相当于保存了很多无用的样式,后续编辑也会变得复杂。
程序员做笔记最简洁的就是markdown了,如果能直接转存为markdown格式就好了,样式统一,编辑也方便。

于是乎找了上面的工具和脚本,实现html转markdown。
其支持标签区块识别(像是印象笔记或有道云笔记的网页剪辑那种),随选随转,十分方便。
转换代码块、图片、超链接文字都很好,
唯一的缺点就是不支持table转换。

table在网页中可是太常见了,
尤其是程序员列个清单用法什么的,基本都用表格形式。
所以需要让现有的工具,支持table标签转换。

实现

下面就是需要添加的内容,使其在原有的基础上,支持了table转换。
测试了几个我想保存的页面,没什么问题。至于其他网页碰到再说,暂不确定兼容情况。

在转换规则中,添加tr、td&th、table规则

删掉顶部的// @require那句,将其引用的turndown.js内容完整复制,粘贴到在JS脚本头部,然后在其中添加table转换的部分。


  // // ==============================================================================
  // // 在turndown中添加的转换table部分(author:watfe)
  // // ==============================================================================

  rules.td = {
    filter: ['td','th'],
    replacement: function (content, node, options) {
      content = content.replace('|','/');
      content = content.replace('\n','; ');
      return '|'+content
    }
  };

  rules.tr = {
    filter: ['tr'],
    replacement: function (content, node, options) {
      return '|\n'+content
    }
  };

  function repeatStringNumTimes(str, num) { //字符串重复N次
    let repeatStr = '';
    for(let i = 0; i < num; i++){
      repeatStr += str;
    }
    return repeatStr;
  }

  rules.table = {
    filter: ['table'],
    replacement: function (content, node, options) {
      // 删首尾空,删除最前面多余的|,并在最后补全|
      content = content.trim();
      content = content.replace(/\n+/g, '\n');
      if (content.indexOf('|')===0){
        content = content.substring(1, content.length)+'|';
      }
      // 检查表格包含几个|,数字减1就是列数,模拟出markdown表格中间的---:
      var verticalLineCount = content.substring(content.lastIndexOf("\n") + 1, content.length).match(/\|/ig).length
      var tableMDLine = '|'+repeatStringNumTimes('---|',verticalLineCount-1);
      // 检查是否包含表头
      if (content.indexOf('\n|\n')>0){
          content = content.replace('\n|\n', '|\n'+tableMDLine+'\n');
      }
      else{
          content = repeatStringNumTimes('|',verticalLineCount)+'\n'+ content;
      }
      //console.log(content);
      return content
    }
  };
  // // ==============================================================================
  // // 添加完毕
  // // ==============================================================================

调整markdown输出格式

比如:h1用#而不是下划线,代码块用```等等。
在JS脚本建立TurndownService实例前,加入这些配置。

    // ==============================================================================
    // 根据turndown文档,调整一些参数,让转化出来的markdown格式,满足自己的需要
    // https://github.com/domchristie/turndown
    // ==============================================================================
    let options = {
      headingStyle: 'atx',
      bulletListMarker: '+',
      codeBlockStyle: 'fenced',
      emDelimiter: '*'
    };
    // ==============================================================================
    // 添加完毕
    // ==============================================================================
    let turndownService = new TurndownService(options);

测试

转换成功
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章