| | |
| | | import { slug } from "github-slugger" |
| | | // this file must be isomorphic so it can't use node libs (e.g. path) |
| | | |
| | | // Quartz Paths |
| | | // Things in boxes are not actual types but rather sources which these types can be acquired from |
| | |
| | | // └────────────┤ MD File ├─────┴─────────────────┘ |
| | | // └─────────┘ |
| | | |
| | | export const QUARTZ = "quartz" |
| | | |
| | | /// Utility type to simulate nominal types in TypeScript |
| | | type SlugLike<T> = string & { __brand: T } |
| | | |
| | |
| | | return results |
| | | } |
| | | |
| | | export const QUARTZ = "quartz" |
| | | export interface TransformOptions { |
| | | strategy: "absolute" | "relative" | "shortest" |
| | | allSlugs: ServerSlug[] |
| | | } |
| | | |
| | | export function transformLink( |
| | | src: CanonicalSlug, |
| | | target: string, |
| | | opts: TransformOptions, |
| | | ): RelativeURL { |
| | | let targetSlug: string = transformInternalLink(target) |
| | | |
| | | if (opts.strategy === "relative") { |
| | | return _addRelativeToStart(targetSlug) as RelativeURL |
| | | } else { |
| | | targetSlug = _stripSlashes(targetSlug.slice(".".length)) |
| | | let [targetCanonical, targetAnchor] = splitAnchor(targetSlug) |
| | | |
| | | if (opts.strategy === "shortest") { |
| | | // if the file name is unique, then it's just the filename |
| | | const matchingFileNames = opts.allSlugs.filter((slug) => { |
| | | const parts = slug.split("/") |
| | | const fileName = parts.at(-1) |
| | | return targetCanonical === fileName |
| | | }) |
| | | |
| | | // only match, just use it |
| | | if (matchingFileNames.length === 1) { |
| | | const targetSlug = canonicalizeServer(matchingFileNames[0]) |
| | | return (resolveRelative(src, targetSlug) + targetAnchor) as RelativeURL |
| | | } |
| | | } |
| | | |
| | | // if it's not unique, then it's the absolute path from the vault root |
| | | return joinSegments(pathToRoot(src), targetSlug) as RelativeURL |
| | | } |
| | | } |
| | | |
| | | function _canonicalize(fp: string): string { |
| | | fp = _trimSuffix(fp, "index") |
| | |
| | | } |
| | | |
| | | function _getFileExtension(s: string): string | undefined { |
| | | return s.match(/\.[A-Za-z]+$/)?.[0] |
| | | return s.match(/\.[A-Za-z0-9]+$/)?.[0] |
| | | } |
| | | |
| | | function _isRelativeSegment(s: string): boolean { |