UNPKG

@mintlify/scraping

Version:

Scrape documentation frameworks to Mintlify docs

99 lines (87 loc) 3.05 kB
import { Tab } from '@mintlify/models'; import type { Root as HastRoot, Element } from 'hast'; import { visit, EXIT, CONTINUE } from 'unist-util-visit'; import { framework } from '../utils/detectFramework.js'; import { findTitle, getTitleFromLink } from '../utils/title.js'; export function retrieveTabLinks(rootNode: HastRoot): Array<Tab> | undefined { if (framework.vendor !== 'readme' && framework.vendor !== 'docusaurus') return undefined; let element: Element | undefined = undefined as Element | undefined; visit(rootNode, 'element', function (node) { if (framework.vendor === 'readme') { if ( node.tagName === 'header' && node.properties.className && Array.isArray(node.properties.className) && node.properties.className.includes('rm-Header') ) { element = node; return EXIT; } } if (framework.vendor === 'docusaurus') { if ( node.tagName === 'nav' && node.properties.className && Array.isArray(node.properties.className) && node.properties.className.includes('navbar') ) { element = node; return EXIT; } } }); if (!element) return undefined; const links: Array<Tab> = []; visit(element as Element, 'element', function (node) { if (framework.vendor === 'readme') { if ( node.tagName !== 'nav' && !( node.tagName === 'div' && node.properties.className && Array.isArray(node.properties.className) && node.properties.className.includes('rm-Header-right') ) ) return CONTINUE; visit(node, 'element', function (subNode) { if ( subNode.tagName !== 'a' || !subNode.properties.href || typeof subNode.properties.href !== 'string' || subNode.properties.href.startsWith('http') ) return CONTINUE; const title = findTitle(subNode); links.push({ name: title || getTitleFromLink(subNode.properties.href), url: subNode.properties.href, }); }); } if (framework.vendor === 'docusaurus') { if (node.tagName !== 'nav') return CONTINUE; visit(node, 'element', function (subNode, _, parent) { if ( subNode.tagName !== 'a' || !subNode.properties.href || typeof subNode.properties.href !== 'string' || subNode.properties.href.startsWith('http') || !parent || parent.type !== 'element' || !Array.isArray(parent.properties.className) || parent.properties.className.length !== 1 || parent.properties.className[0] !== 'navbar__items' || parent.properties.className.includes('navbar__items--right') ) return CONTINUE; const title = findTitle(subNode); links.push({ name: title || getTitleFromLink(subNode.properties.href), url: subNode.properties.href, }); }); } }); return links; }