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

news/2024/10/17 22:23:45/

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 #370var 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://www.ppmy.cn/news/51136.html

相关文章

基于Java+Springboot+Vue+elememt甜品屋蛋糕商城系统设计和实现

基于JavaSpringbootVueelememt甜品屋蛋糕商城系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系…

(十九)查找算法-线性查找

1 查找算法基本介绍 在 Java 中&#xff0c;常用的查找算法有4种&#xff1a; &#xff08;1&#xff09;顺序&#xff08;线性&#xff09;查找 &#xff08;2&#xff09;二分查找/折半查找 &#xff08;3&#xff09;插值查找 &#xff08;4&#xff09;斐波那契查找 2 线…

《程序员面试金典(第6版)》面试题 16.03. 交点(直线的一般式方程,克莱姆法则,行列式,C++)

题目描述 给定两条线段&#xff08;表示为起点start {X1, Y1}和终点end {X2, Y2}&#xff09;&#xff0c;如果它们有交点&#xff0c;请计算其交点&#xff0c;没有交点则返回空值。 要求浮点型误差不超过10^-6。若有多个交点&#xff08;线段重叠&#xff09;则返回 X 值最…

服务(第十二篇)LVS-DR模式

数据包流向分析&#xff1a; &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xff08;2&#xff09;Director Server 和 Re…

PCL点云库(3) — common模块

目录 3.1 common模块中的头文件 3.2 common模块中的基本函数 &#xff08;1&#xff09;angle角度转换 &#xff08;2&#xff09;distance距离计算 &#xff08;3&#xff09;random随机数生成 &#xff08;4&#xff09;sping扩展模块 &#xff08;5&#xff09;time获…

同步和异步的区别及优缺点 通俗理解

一、同步和异步的区别 程序里面的同步和异步和我们现实生活理解不太一样&#xff0c;一般我们对同步的理解是同时做很多事情&#xff0c;但程序中的同步是按照任务的顺序执行任务&#xff0c;前一个任务没有执行结束&#xff0c;下一个任务不会执行&#xff0c;要等待上一个任…

一个注解解决分布式锁和接口幂等性,springboot 实战 。强到离大谱

如今基本上都是分布式、多节点时代&#xff0c;我们业务代码中避免不了需要使用分布式锁。admin4j-lock 为我们提供分布式锁解决方案。支持redisson和zookeeper分布式锁 功能 支持redisson分布式锁和zookeeper 分布式锁 支持可重入锁 支持读写锁 支持红锁 redLock 支持一个…

Python 程序通过可执行文件部署

以下是两种常用的打包 Python 程序成 exe 的方式&#xff1a; PyInstaller&#xff1a; PyInstaller 是一个用于将 Python 程序打包成独立的可执行文件的工具。它可以自动解决 Python 程序的依赖性&#xff0c;并将所有必要的文件&#xff08;包括 Python 解释器&#xff09;…