Files
30-seconds-of-code/node_modules/hast-util-to-html/lib/omission/opening.js
2019-08-20 15:52:05 +02:00

99 lines
2.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict'
var is = require('unist-util-is')
var element = require('hast-util-is-element')
var before = require('./util/siblings').before
var first = require('./util/first')
var place = require('./util/place')
var whiteSpaceLeft = require('./util/white-space-left')
var closing = require('./closing')
var omission = require('./omission')
var own = {}.hasOwnProperty
var uniqueHeadMetadata = ['title', 'base']
var meta = ['meta', 'link', 'script', 'style', 'template']
var tableContainers = ['thead', 'tbody']
var tableRow = 'tr'
module.exports = omission({
html: html,
head: head,
body: body,
colgroup: colgroup,
tbody: tbody
})
/* Whether to omit `<html>`. */
function html(node) {
var head = first(node)
return !head || !is('comment', head)
}
/* Whether to omit `<head>`. */
function head(node) {
var children = node.children
var length = children.length
var map = {}
var index = -1
var child
var name
while (++index < length) {
child = children[index]
name = child.tagName
if (element(child, uniqueHeadMetadata)) {
if (own.call(map, name)) {
return false
}
map[name] = true
}
}
return Boolean(length)
}
/* Whether to omit `<body>`. */
function body(node) {
var head = first(node, true)
return (
!head ||
(!is('comment', head) && !whiteSpaceLeft(head) && !element(head, meta))
)
}
/* Whether to omit `<colgroup>`.
* The spec describes some logic for the opening tag,
* but its easier to implement in the closing tag, to
* the same effect, so we handle it there instead. */
function colgroup(node, index, parent) {
var prev = before(parent, index)
var head = first(node, true)
/* Previous colgroup was already omitted. */
if (element(prev, 'colgroup') && closing(prev, place(parent, prev), parent)) {
return false
}
return head && element(head, 'col')
}
/* Whether to omit `<tbody>`. */
function tbody(node, index, parent) {
var prev = before(parent, index)
var head = first(node)
/* Previous table section was already omitted. */
if (
element(prev, tableContainers) &&
closing(prev, place(parent, prev), parent)
) {
return false
}
return head && element(head, tableRow)
}