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)
}
blockElements
和isBlock()
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)
}
voidElements
、isVoid()
和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)
}
meaningfulWhenBlankElements
、isMeaningfulWhenBlank()
和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}))
}