import { isActive, normalize, endingSlashRE, isExternal, } from 'vitepress/dist/client/theme-default/utils' import { inBrowser } from 'vitepress' import type { Route } from 'vitepress' export * from 'vitepress/dist/client/theme-default/utils' export const throttleAndDebounce = (fn: () => any, delay: number) => { let timeout: ReturnType let called = false return () => { if (timeout) { clearTimeout(timeout) } if (!called) { fn() called = true setTimeout(() => { called = false }, delay) } else { timeout = setTimeout(fn, delay) } } } // When match === true, meaning `path` is a string for build regex export const isActiveLink = ( route: Route, pathPattern: string, match?: boolean ) => { if (!match) return isActive(route, pathPattern) const regex = new RegExp(pathPattern) return regex.test(normalize(`/${route.data.relativePath}`)) } export function createGitHubUrl( docsRepo: string, docsDir: string, docsBranch: string, path: string, folder = 'examples/', ext = '.vue' ) { const base = isExternal(docsRepo) ? docsRepo : `https://github.com/${docsRepo}` return `${base.replace(endingSlashRE, '')}/edit/${docsBranch}/${ docsDir ? `${docsDir.replace(endingSlashRE, '')}/` : '' }${folder || ''}${path}${ext || ''}` } export const isServer = typeof window === 'undefined' export function createCrowdinUrl(targetLang: string) { let translateLang = '' // for zh-CN zh-HK zh-TW, maybe later we will have cases like Chinese lang // for now we just keep it as simple as possible. if (targetLang.startsWith('zh-')) { translateLang = targetLang.split('-').join('').toLocaleLowerCase() } else { translateLang = targetLang.split('-').shift().toLocaleLowerCase() } return `https://crowdin.com/translate/element-plus/all/en-${translateLang}` } export function insertLinkIcon(contentRef: any) { if (!inBrowser) return const links = Array.from( contentRef.value?.$el.querySelectorAll('a:not(.header-anchor)') ?? [] ) links.forEach((link: any) => { if ( !link.href.startsWith(window.origin) && !link.innerHTML.includes(' ` } }) }