mirror of
https://github.com/wahyd4/vuepress.git
synced 2026-08-17 09:15:51 +10:00
102 lines
2.3 KiB
JavaScript
102 lines
2.3 KiB
JavaScript
export const hashRE = /#.*$/
|
|
export const extRE = /\.(md|html)$/
|
|
export const endingSlashRE = /\/$/
|
|
export const outboundRE = /^https?:/
|
|
|
|
export function normalize (path) {
|
|
return path
|
|
.replace(hashRE, '')
|
|
.replace(extRE, '')
|
|
}
|
|
|
|
export function getHash (path) {
|
|
const match = path.match(hashRE)
|
|
if (match) {
|
|
return match[0]
|
|
}
|
|
}
|
|
|
|
export function ensureExt (path) {
|
|
if (outboundRE.test(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 isActive (route, path) {
|
|
const routeHash = route.hash
|
|
const linkHash = getHash(path)
|
|
if (linkHash && routeHash !== linkHash) {
|
|
return false
|
|
}
|
|
const routePath = normalize(route.path)
|
|
const pagePath = normalize(path)
|
|
if (endingSlashRE.test(routePath) || endingSlashRE.test(pagePath)) {
|
|
return routePath === pagePath
|
|
} else {
|
|
return routePath.indexOf(pagePath) === 0
|
|
}
|
|
}
|
|
|
|
export function resolvePage (pages, rawPath, base) {
|
|
if (base) {
|
|
rawPath = resolvePath(rawPath, base)
|
|
}
|
|
const path = normalize(rawPath)
|
|
for (let i = 0; i < pages.length; i++) {
|
|
if (normalize(pages[i].path) === path) {
|
|
return Object.assign({}, pages[i], {
|
|
type: 'page',
|
|
path: ensureExt(rawPath)
|
|
})
|
|
}
|
|
}
|
|
console.error(`[vuepress] No matching page found for sidebar item "${rawPath}"`)
|
|
return {}
|
|
}
|
|
|
|
function resolvePath (relative, base, append) {
|
|
const firstChar = relative.charAt(0)
|
|
if (firstChar === '/') {
|
|
return relative
|
|
}
|
|
|
|
if (firstChar === '?' || firstChar === '#') {
|
|
return base + relative
|
|
}
|
|
|
|
const stack = base.split('/')
|
|
|
|
// remove trailing segment if:
|
|
// - not appending
|
|
// - appending to trailing slash (last segment is empty)
|
|
if (!append || !stack[stack.length - 1]) {
|
|
stack.pop()
|
|
}
|
|
|
|
// resolve relative path
|
|
const segments = relative.replace(/^\//, '').split('/')
|
|
for (let i = 0; i < segments.length; i++) {
|
|
const segment = segments[i]
|
|
if (segment === '..') {
|
|
stack.pop()
|
|
} else if (segment !== '.') {
|
|
stack.push(segment)
|
|
}
|
|
}
|
|
|
|
// ensure leading slash
|
|
if (stack[0] !== '') {
|
|
stack.unshift('')
|
|
}
|
|
|
|
return stack.join('/')
|
|
}
|