首页 > 编程语言 >Turndown 源码解析:一、辅助函数

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

时间:2023-04-25 16:22:43浏览次数:35  
标签:node Turndown return function 元素 源码 var 解析 节点

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
    })
  )
}

标签:node,Turndown,return,function,元素,源码,var,解析,节点
From: https://www.cnblogs.com/apachecn/p/17352962.html

相关文章

  • 环保家具网站源码产品展示招商加盟二开模板定制开发
    包含了网站首页;关于我们; 新闻动态;产品中心;案例展示;荣誉资质;招商加盟;联系我们;等多个版块,可以快速搭建家装设计品牌招商官网1.品牌展示:网站可以展示各种家具品牌的产品和服务,包括品牌介绍、产品展示、服务范围等,便于用户了解品牌的相关信息,帮助其选择适合自己的品......
  • Android开发之一:10.0 USB弹窗权限流程解析
    1.新建activity,获取UsbManagerusbManager=(UsbManager)getSystemService(Context.USB_SERVICE)2.获取所以的USB设备HashMap<String,UsbDevice>map=usbManager.getDeviceList()3.过滤别的USB设备,拿到自己USB的USBDevice类,然后请求USB权限,usbManager.requestPermission(us......
  • [问题记录]k8s集群中coredns解析失败
    目录[问题记录]k8s集群中coredns解析失败故障现象问题排查问题解析举例说明:解决方案修改ndots参数参考文档[问题记录]k8s集群中coredns解析失败故障现象在k8s集群,使用coredns提供集群内部dns服务但是在使用过程中,偶现解析公网域名失败的情况,应用内日志记录显示UnknownHost问......
  • 直播商城源码,PopupWindow菜单在ListView中显示
    直播商城源码,PopupWindow菜单在ListView中显示  privatePopupWindowmOperaPopup;  privatevoidshowMenuPopup(Viewanchor)  {    if(mOperaPopup==null)    {      ViewpopupView=View.inflate(mContext,R.layout.popup_opera_sub......
  • Android源码在线查看网站
    一、aospxrefhttp://aospxref.com/优点:更新速度快缺点:历史版本较少二、androidxrefhttp://androidxref.com/优点:历史版本较多缺点:更新速度慢两者可搭配使用。非常便利三、Google在线源码上面两个的平台存在如下几点问题:搜索关键字困难且不精确,特别是对有括号和“_”的......
  • 分享Python采集88个NET电子商务源码,总有一款适合您
    Python采集的88个NET电子商务源码下载链接:百度网盘请输入提取码 提取码:c0gh编辑众筹系统(RaiseDreams众筹梦想)V2.1.6云点滴客户关系管理CRMOA系统V1.02.13云点滴客户解决方案V1.0.0创想商务B2B网站管理系统V3.1冰兔(Btoo)网店系统V6.39ASP.NET4.0电子商城MVC+EF水果市场2......
  • CentOS 服务器部署 DNS 解析服务
    需求在centos云服务器上部署一个dns解析服务,以供windows电脑可以使用这个服务器ip作为网络的dns代理。我的服务器ip为192.168.126.241,我想在我的windows电脑访问abc.baidu.com时解析到ip为110.112.113.111的服务器上,访问www.baidu.com时解析到123.111.111.111的服务器上。尽量模......
  • 环保家具网站源码
    演示地址:www.m1.wuhaojie.cn 包含了网站首页;关于我们; 新闻动态;产品中心;案例展示;荣誉资质;招商加盟;联系我们;等多个版块,可以快速搭建家装设计品牌招商官网1.品牌展示:网站可以展示各种家具品牌的产品和服务,包括品牌介绍、产品展示、服务范围等,便于用户了解品牌的相......
  • 深入理解C#泛型:new与where关键字全解析
    C#泛型中new和where是重要的关键字,它们都可以用于约束泛型类型参数的限制;它们都用于提高代码的安全性和可用性,它们的作用在很大程度上提高了代码的可读性和可维护性。在这篇文章中,我们将一起了解泛型中的new和where,以及它们之间的区别。1.new关键字在C#泛型中,new关键字被用于指......
  • 内核源码解读基础
    module_init宏的定义第一段代码:typedefint(*initcall_t)(void);......#define__define_initcall(level,fn,id)\staticinitcall_t__initcall_##fn##id__attribute_used_\__attribute__((__section__(".initcall"level".init")))=fn......#def......