@mui/internal-docs-infra
Version:
MUI Infra - internal documentation creation tools.
76 lines (68 loc) • 2.42 kB
JavaScript
import { getShallowTextContent, hasClass, isCommentSpan as isCommentSpanShared, isConstantSpan, isEntityNameSpan, isKeywordSpan as isKeywordSpanShared, isPropertyNameSpan, isStringLiteralSpan as isStringLiteralSpanShared } from "../loadServerTypes/hastTypeUtils.mjs";
import { toKebabCase } from "../loaderUtils/toKebabCase.mjs";
/**
* Converts a prop path (array of property names) to a kebab-case dotted string.
* Each segment is independently converted.
* Example: ["homeAddress", "streetName"] → "home-address.street-name"
*/
export function propPathToString(propPath, propName) {
const allParts = [...propPath, propName];
return allParts.map(toKebabCase).join('.');
}
/**
* Checks if an element is a linkable span (pl-c1 or pl-en).
* In CSS contexts, pl-v (CSS variables) and pl-e (class selectors) are also linkable.
* Only spans are considered linkable - not anchors we've already created.
*/
export function isLinkableSpan(element, lang) {
if (isConstantSpan(element) || isEntityNameSpan(element)) {
return true;
}
if (lang?.semantics === 'css') {
return isPropertyNameSpan(element) || element.tagName === 'span' && hasClass(element, 'pl-e');
}
return false;
}
/**
* Checks if an element is a property span (pl-v or pl-e).
*/
export function isPropertySpan(element) {
return isPropertyNameSpan(element) || element.tagName === 'span' && hasClass(element, 'pl-e');
}
/**
* Checks if an element is a keyword span (pl-k).
*/
export function isKeywordSpan(element) {
return isKeywordSpanShared(element);
}
/**
* Checks if an element is a comment span (pl-c).
*/
export function isCommentSpan(element) {
return isCommentSpanShared(element);
}
/**
* Checks if an element is an identifier reference span (pl-smi).
*/
export function isSmiSpan(element) {
return element.tagName === 'span' && hasClass(element, 'pl-smi');
}
/**
* Checks if an element is a string literal span (pl-s).
*/
export function isStringLiteralSpan(element) {
return isStringLiteralSpanShared(element);
}
/**
* Gets the text content of an element (concatenates all text children).
*/
export function getTextContent(element) {
return getShallowTextContent(element);
}
/**
* Gets the class names from an element's properties.
*/
export function getClassName(element) {
const className = element.properties?.className;
return Array.isArray(className) ? className : undefined;
}