94 lines
2.4 KiB
TypeScript
94 lines
2.4 KiB
TypeScript
import type { AnyNode } from 'domhandler';
|
|
import type { Cheerio } from './cheerio.js';
|
|
|
|
/**
|
|
* Checks if an object is a Cheerio instance.
|
|
*
|
|
* @category Utils
|
|
* @param maybeCheerio - The object to check.
|
|
* @returns Whether the object is a Cheerio instance.
|
|
*/
|
|
export function isCheerio<T>(maybeCheerio: any): maybeCheerio is Cheerio<T> {
|
|
return maybeCheerio.cheerio != null;
|
|
}
|
|
|
|
/**
|
|
* Convert a string to camel case notation.
|
|
*
|
|
* @private
|
|
* @category Utils
|
|
* @param str - The string to be converted.
|
|
* @returns String in camel case notation.
|
|
*/
|
|
export function camelCase(str: string): string {
|
|
return str.replace(/[._-](\w|$)/g, (_, x) => x.toUpperCase());
|
|
}
|
|
|
|
/**
|
|
* Convert a string from camel case to "CSS case", where word boundaries are
|
|
* described by hyphens ("-") and all characters are lower-case.
|
|
*
|
|
* @private
|
|
* @category Utils
|
|
* @param str - The string to be converted.
|
|
* @returns String in "CSS case".
|
|
*/
|
|
export function cssCase(str: string): string {
|
|
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.
|
|
*
|
|
* @category Utils
|
|
* @param array - The array to iterate over.
|
|
* @param fn - Function to call.
|
|
* @returns The original instance.
|
|
*/
|
|
export function domEach<
|
|
T extends AnyNode,
|
|
Arr extends ArrayLike<T> = Cheerio<T>,
|
|
>(array: Arr, fn: (elem: T, index: number) => void): Arr {
|
|
const len = array.length;
|
|
for (let i = 0; i < len; i++) fn(array[i], i);
|
|
return array;
|
|
}
|
|
|
|
const enum CharacterCodes {
|
|
LowerA = 97,
|
|
LowerZ = 122,
|
|
UpperA = 65,
|
|
UpperZ = 90,
|
|
Exclamation = 33,
|
|
}
|
|
|
|
/**
|
|
* Check if string is HTML.
|
|
*
|
|
* Tests for a `<` within a string, immediate followed by a letter and
|
|
* eventually followed by a `>`.
|
|
*
|
|
* @private
|
|
* @category Utils
|
|
* @param str - The string to check.
|
|
* @returns Indicates if `str` is HTML.
|
|
*/
|
|
export function isHtml(str: string): boolean {
|
|
const tagStart = str.indexOf('<');
|
|
|
|
if (tagStart < 0 || tagStart > str.length - 3) return false;
|
|
|
|
const tagChar = str.charCodeAt(tagStart + 1);
|
|
|
|
return (
|
|
((tagChar >= CharacterCodes.LowerA && tagChar <= CharacterCodes.LowerZ) ||
|
|
(tagChar >= CharacterCodes.UpperA && tagChar <= CharacterCodes.UpperZ) ||
|
|
tagChar === CharacterCodes.Exclamation) &&
|
|
str.includes('>', tagStart + 2)
|
|
);
|
|
}
|