@mintlify/scraping
Version:
Scrape documentation frameworks to Mintlify docs
64 lines (56 loc) • 1.58 kB
text/typescript
import type { Root as HastRoot, Element } from 'hast';
import { visit, EXIT } from 'unist-util-visit';
import { framework } from '../utils/detectFramework.js';
import { intersection } from '../utils/intersection.js';
export function retrieveRootNavElement(rootNode: HastRoot): Element | undefined {
let rootTagName = 'aside';
switch (framework.vendor) {
case 'docusaurus':
rootTagName = 'nav';
break;
case 'gitbook':
rootTagName = 'aside';
break;
case 'readme':
rootTagName = 'nav';
break;
}
let rootSelectorSet = new Set(['page-no-toc:hidden']);
switch (framework.vendor) {
case 'docusaurus':
rootSelectorSet = new Set(['menu']);
break;
case 'gitbook':
rootSelectorSet = new Set([
'lg:page-no-toc:hidden',
'page-no-toc:hidden',
'page-no-toc:lg:hidden',
]);
break;
case 'readme':
rootSelectorSet = new Set(['rm-Sidebar']);
break;
}
let element: Element | undefined = undefined;
visit(rootNode, 'element', function (node) {
const { className } = node.properties;
if (
framework.vendor === 'gitbook' &&
node.tagName === 'aside' &&
(node.properties.id === 'table-of-contents' ||
node.properties.dataTestid === 'table-of-contents')
) {
element = node;
return EXIT;
}
if (
node.tagName === rootTagName &&
Array.isArray(className) &&
!!intersection(className, rootSelectorSet).size
) {
element = node;
return EXIT;
}
});
return element;
}