UNPKG

vuepress-theme-justskiv

Version:
170 lines (154 loc) 4.2 kB
export const hashRE = /#.*$/ export const extRE = /\.(md|html)$/ export const endingSlashRE = /\/$/ export const outboundRE = /^[a-z]+:/i export function normalize (path) { return decodeURI(path) .replace(hashRE, '') .replace(extRE, '') } export function getCssVar(key) { return window.getComputedStyle(document.documentElement).getPropertyValue(key).trim(); } /* * find parent vm by ref * @param {String} ref * @param {Vue} vm * @param {any} def default value * @returns {Element} */ export function findContainerInVm(ref, vm, def) { if (!ref) return def let container let parent = vm while ((parent = parent.$parent) && !container) { container = parent.$refs[ref] } // Ensure it's html element (ref could be component) if (container && container.$el) { container = container.$el } return container || def } export function isExternal (path) { return outboundRE.test(path) } export function isMailto (path) { return /^mailto:/.test(path) } export function isTel (path) { return /^tel:/.test(path) } export function ensureExt (path) { if (isExternal(path)) { return path } const hashMatch = path.match(hashRE) const hash = hashMatch ? hashMatch[0] : '' const normalized = normalize(path) if (endingSlashRE.test(normalized)) { return path } return normalized + '.html' + hash } export function resolveNavLinkItem (linkItem) { return Object.assign(linkItem, { type: linkItem.items && linkItem.items.length ? 'links' : 'link' }) } /** * @param { Route } route * @param { Array<string|string[]> | Array<SidebarGroup> | [link: string]: SidebarConfig } config * @returns { base: string, config: SidebarConfig } */ export function resolveMatchingConfig (regularPath, config) { if (Array.isArray(config)) { return { base: '/', config: config } } for (const base in config) { if (ensureEndingSlash(regularPath).indexOf(encodeURI(base)) === 0) { return { base, config: config[base] } } } return {} } /** * @param { Page } page * @returns { SidebarGroup } */ function resolveHeaders (page) { const headers = groupHeaders(page.headers || []) return [{ type: 'group', collapsable: false, title: page.title, path: null, children: headers.map(h => ({ type: 'auto', title: h.title, basePath: page.path, path: page.path + '#' + h.slug, children: h.children || [] })) }] } /** * @param { Page } page * @param { string } regularPath * @param { SiteData } site * @param { string } localePath * @returns { SidebarGroup } */ export function resolveSidebarItems (page, regularPath, site, localePath) { const { pages, themeConfig } = site const localeConfig = localePath && themeConfig.locales ? themeConfig.locales[localePath] || themeConfig : themeConfig const pageSidebarConfig = page.frontmatter.sidebar || localeConfig.sidebar || themeConfig.sidebar if (pageSidebarConfig === 'auto') { return resolveHeaders(page) } const sidebarConfig = localeConfig.sidebar || themeConfig.sidebar if (!sidebarConfig) { return [] } else { const { base, config } = resolveMatchingConfig(regularPath, sidebarConfig) if (config === 'auto') { return resolveHeaders(page) } return config ? config.map(item => resolveItem(item, pages, base)) : [] } } function resolveItem (item, pages, base, groupDepth = 1) { if (typeof item === 'string') { return resolvePage(pages, item, base) } else if (Array.isArray(item)) { return Object.assign(resolvePage(pages, item[0], base), { title: item[1] }) } else { const children = item.children || [] if (children.length === 0 && item.path) { return Object.assign(resolvePage(pages, item.path, base), { title: item.title }) } return { type: 'group', path: item.path, title: item.title, sidebarDepth: item.sidebarDepth, initialOpenGroupIndex: item.initialOpenGroupIndex, children: children.map(child => resolveItem(child, pages, base, groupDepth + 1)), collapsable: item.collapsable !== false } } }