2023-10-03 11:14:36 +08:00
|
|
|
var parse = require('./parse'),
|
|
|
|
render = require('dom-serializer');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* HTML Tags
|
|
|
|
*/
|
|
|
|
|
|
|
|
var tags = { tag: true, script: true, style: true };
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if the DOM element is a tag
|
|
|
|
*
|
|
|
|
* isTag(type) includes <script> and <style> tags
|
|
|
|
*/
|
|
|
|
|
|
|
|
exports.isTag = function(type) {
|
|
|
|
if (type.type) type = type.type;
|
|
|
|
return tags[type] || false;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert a string to camel case notation.
|
|
|
|
* @param {String} str String to be converted.
|
|
|
|
* @return {String} String in camel case notation.
|
|
|
|
*/
|
|
|
|
|
|
|
|
exports.camelCase = function(str) {
|
|
|
|
return str.replace(/[_.-](\w|$)/g, function(_, x) {
|
|
|
|
return x.toUpperCase();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert a string from camel case to "CSS case", where word boundaries are
|
|
|
|
* described by hyphens ("-") and all characters are lower-case.
|
|
|
|
* @param {String} str String to be converted.
|
|
|
|
* @return {string} String in "CSS case".
|
|
|
|
*/
|
|
|
|
exports.cssCase = function(str) {
|
|
|
|
return str.replace(/[A-Z]/g, '-$&').toLowerCase();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Iterate over each DOM element without creating intermediary Cheerio instances.
|
|
|
|
*
|
|
|
|
* This is indented for use internally to avoid otherwise unnecessary memory pressure introduced
|
|
|
|
* by _make.
|
|
|
|
*/
|
|
|
|
|
|
|
|
exports.domEach = function(cheerio, fn) {
|
|
|
|
var i = 0, len = cheerio.length;
|
|
|
|
while (i < len && fn.call(cheerio, i, cheerio[i]) !== false) ++i;
|
|
|
|
return cheerio;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a deep copy of the given DOM structure by first rendering it to a
|
|
|
|
* string and then parsing the resultant markup.
|
|
|
|
*
|
|
|
|
* @argument {Object} dom - The htmlparser2-compliant DOM structure
|
|
|
|
* @argument {Object} options - The parsing/rendering options
|
|
|
|
*/
|
|
|
|
exports.cloneDom = function(dom, options) {
|
|
|
|
return parse(render(dom, options), options).children;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* A simple way to check for HTML strings or ID strings
|
|
|
|
*/
|
|
|
|
|
|
|
|
var quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Check if string is HTML
|
|
|
|
*/
|
|
|
|
exports.isHtml = function(str) {
|
|
|
|
// Faster than running regex, if str starts with `<` and ends with `>`, assume it's HTML
|
|
|
|
if (str.charAt(0) === '<' && str.charAt(str.length - 1) === '>' && str.length >= 3) return true;
|
|
|
|
|
|
|
|
// Run the regex
|
|
|
|
var match = quickExpr.exec(str);
|
|
|
|
return !!(match && match[1]);
|
|
|
|
};
|