Turndown 源码解析:一、辅助函数

news/2024/7/5 13:51:57

extend()

Object.assign的补丁。

function extend (destination) {
  for (var i = 1; i < arguments.length; i++) {
    var source = arguments[i];
    for (var key in source) {
      if (source.hasOwnProperty(key)) destination[key] = source[key];
    }
  }
  return destination
}

repeat()

String.repeat()的补丁。

function repeat (character, count) {
  return Array(count + 1).join(character)
}

trimLeadingNewlines()trimTrailingNewlines()

分别是去掉开头和结尾的换行(\n)。trimLeadingNewlines()直接用了正则替换。

trimTrailingNewlines()是用下标和循环实现的,看注释是性能原因。其中indexEnd是字符串末尾的后一位,从length遍历到1

function trimLeadingNewlines (string) {
  return string.replace(/^\n*/, '')
}

function trimTrailingNewlines (string) {
  // avoid match-at-end regexp bottleneck, see #370
  var indexEnd = string.length;
  while (indexEnd > 0 && string[indexEnd - 1] === '\n') indexEnd--;
  return string.substring(0, indexEnd)
}

blockElementsisBlock()

blockElements定义了块级元素(就是单独一行显示的元素)。

isBlock判断某个节点是不是块级元素。

var blockElements = [
  'ADDRESS', 'ARTICLE', 'ASIDE', 'AUDIO', 'BLOCKQUOTE', 'BODY', 'CANVAS',
  'CENTER', 'DD', 'DIR', 'DIV', 'DL', 'DT', 'FIELDSET', 'FIGCAPTION', 'FIGURE',
  'FOOTER', 'FORM', 'FRAMESET', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEADER',
  'HGROUP', 'HR', 'HTML', 'ISINDEX', 'LI', 'MAIN', 'MENU', 'NAV', 'NOFRAMES',
  'NOSCRIPT', 'OL', 'OUTPUT', 'P', 'PRE', 'SECTION', 'TABLE', 'TBODY', 'TD',
  'TFOOT', 'TH', 'THEAD', 'TR', 'UL'
];

function isBlock (node) {
  return is(node, blockElements)
}

voidElementsisVoid()hasVoid()

voidElements定义空元素(就是不显示在 MD 中的元素),isVoid()判断某个节点是否是空元素。hasVoid()判断某个节点是否直接包含空元素。

var voidElements = [
  'AREA', 'BASE', 'BR', 'COL', 'COMMAND', 'EMBED', 'HR', 'IMG', 'INPUT',
  'KEYGEN', 'LINK', 'META', 'PARAM', 'SOURCE', 'TRACK', 'WBR'
];

function isVoid (node) {
  return is(node, voidElements)
}

function hasVoid (node) {
  return has(node, voidElements)
}

meaningfulWhenBlankElementsisMeaningfulWhenBlank()hasMeaningfulWhenBlank()

meaningfulWhenBlankElements定义有意义的空白元素,也就是没有内容的时候也需要显示在 MD 中的元素。isMeaningfulWhenBlank判断某个节点是不是有意义的空白元素。hasMeaningfulWhenBlank判断某个节点是否直接包含有意义的空白元素。

var meaningfulWhenBlankElements = [
  'A', 'TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TH', 'TD', 'IFRAME', 'SCRIPT',
  'AUDIO', 'VIDEO'
];

function isMeaningfulWhenBlank (node) {
  return is(node, meaningfulWhenBlankElements)
}

function hasMeaningfulWhenBlank (node) {
  return has(node, meaningfulWhenBlankElements)
}

is()has()

所有isXXX()都被转向到is(),它判断某个节点的名称是否几个名称之一,等价于tagNames.includes(node.nodeName)

所有hasXXX()都被转向到has(),它判断某个节点的直接子节点的名称是否是几个名称之一,等价于Array.from(node.children).some(ch => tagNames.includes(ch.nodeName))

function is (node, tagNames) {
  return tagNames.indexOf(node.nodeName) >= 0
}

function has (node, tagNames) {
  return (
    node.getElementsByTagName &&
    tagNames.some(function (tagName) {
      return node.getElementsByTagName(tagName).length
    })
  )
}

http://lihuaxi.xjx100.cn/news/1067993.html

相关文章

VBA实战篇学习笔记04 文本内容的处理技巧

文章目录 课时17: Format函数(数字_日期)Format处理数字格式Format处理日期格式 课时18: Format函数(文本)课时19: 正则捕获组 课时20: 正则环视 课时17: Format函数(数字_日期) 00:53 Format函数定义 Format处理数字格式 02:23 Format函数数字常用格式名称 05:12 数字常用格式…

SpringBoot 中如何正确的实现模块日志入库?

目录 1.简述2.踩坑记录3.LoginController4.LoginService5.LoginLogService5.1 Async实现异步5.2 自定义线程池实现异步1&#xff09;自定义线程池2&#xff09;复制上下文请求3&#xff09;自定义线程池实现异步 6.补充&#xff1a;LoginService 手动提交事务 背景&#xff1a;…

【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手

目录 类型 String 字符串 List 列表 Set 集合 Sorted Set /ZSet 有序集合 Hash 哈希表 GEO 地理空间 HyperLogLog 基数统计 Bitmap 位图 BitField 位域 Stream 流 线上测试地址 常用命令 key 操作指令 String 操作指令 List 操作指令 Set 操作指令 ZSet 操作…

SQL优化(2):主键优化

在上一小节&#xff0c;我们提到&#xff0c;主键顺序插入的性能是要高于乱序插入的。 这一小节&#xff0c;就来介绍一下具体的 原因&#xff0c;然后再分析一下主键又该如何设计。 1 数据组织方式 在InnoDB存储引擎中&#xff0c;表数据都是根据主键顺序组织存放的&#xf…

【Python小技巧】使用Gradio构建基于ChatGPT的 Web 应用(附源码)

文章目录 前言一、Gradio是什么&#xff1f;二、使用Gradio构建基于ChatGPT的 Web 应用1. 安装gradio库2. 安装openai库&#xff08;ChatGPT的python库&#xff09;3. Web 应用示例&#xff08;源代码&#xff09; 总结 前言 随着人工智能的不断发展&#xff0c;各种智能算法越…

修炼汇编语言第二章:内存地址空间(概述)

目录 前言 一、主板和接口卡 二、存储器各类芯片 三&#xff1a;内存地址空间 总结 前言 什么是内存地址空间呢&#xff1f;如果地址线为10&#xff0c;那么可以寻址1024个地址空间&#xff0c;这1024个地址空间就构成这个CPU的内存地址空间&#xff0c;下面本文将会介绍…

快来看看这些前端开发技巧你掌握多少吧

文章目录 一、代码整洁推荐1.1 三元(三目)运算符1.2 短路判断简写1.3 变量声明简写1.4 if真值判断简写1.5 For循环简写1.6 对象属性简写1.7 箭头函数简写1.8 隐式返回简写1.9 模板字符串1.10 默认参数值1.11 解构赋值简写1.12 多条件判断简写1.13 多变量赋值简写1.14 解构时重命…

Apache默认解析后缀

Apache HTTP服务器默认情况下支持解析以下常见的文件扩展名&#xff1a; HTML文件.htmlHTML文件.htmServer Side Includes (SSI) HTML文件.shtml PHP脚本文件.phpPHP脚本文件.php3PHP脚本文件.php4PHP脚本文件.php5 Python脚本文件.pyCommon Gateway Interface (CGI) 脚本文件…