@silicajs/core 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/path.ts","../src/pipeline/frontmatter.ts","../src/tags.ts","../src/pipeline/index.ts","../src/pipeline/code-block.ts","../src/pipeline/obsidian.ts","../src/pipeline/plugins.ts"],"sourcesContent":["import path from \"node:path\";\n\ndeclare const filePathBrand: unique symbol;\ndeclare const fullSlugBrand: unique symbol;\ndeclare const simpleSlugBrand: unique symbol;\ndeclare const relativeUrlBrand: unique symbol;\n\nexport type FilePath = string & { readonly [filePathBrand]: \"FilePath\" };\nexport type FullSlug = string & { readonly [fullSlugBrand]: \"FullSlug\" };\nexport type SimpleSlug = string & { readonly [simpleSlugBrand]: \"SimpleSlug\" };\nexport type RelativeURL = string & {\n readonly [relativeUrlBrand]: \"RelativeURL\";\n};\n\nexport type SlugifyOptions = {\n numericPrefixes?: boolean;\n};\n\nexport type WikiLinkResolutionIndex = {\n candidates: ReadonlySet<string>;\n uniqueSlugByBasename: ReadonlyMap<string, string | null>;\n slugsByBasename?: ReadonlyMap<string, readonly string[]>;\n};\n\nexport type AssetResolutionIndex = {\n assetPathBySourcePath: ReadonlyMap<string, string | null>;\n assetPathByBasename: ReadonlyMap<string, string | null>;\n};\n\nexport type AssetResolutionEntry = {\n sourcePath: string;\n assetPath: string;\n};\n\nconst NUMERIC_PREFIX_RE =\n /^(\\d{1,2}|0\\d+|\\d{3,}(?=[._]))(?:[\\s._]+|-(?!\\d{1,2}(?:\\D|$)))(.+)$/;\nconst DOCUMENT_EXTENSION_RE = /\\.(md|markdown|mdx)$/i;\nconst UNORDERED_SEGMENT_SORT_PREFIX = \"~~~~~~~~~~\";\n\nexport function asFilePath(value: string): FilePath {\n return normalizePath(value) as FilePath;\n}\n\nexport function asFullSlug(value: string): FullSlug {\n return normalizeSlug(value) as FullSlug;\n}\n\nexport function asSimpleSlug(value: string): SimpleSlug {\n return simplifySlug(asFullSlug(value)) as SimpleSlug;\n}\n\nexport function asRelativeURL(value: string): RelativeURL {\n return value as RelativeURL;\n}\n\nexport function normalizePath(value: string): string {\n return value.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n}\n\nexport function stripNumericPrefix(segment: string): string {\n return segment.replace(NUMERIC_PREFIX_RE, \"$2\");\n}\n\nexport function hasNumericPrefix(segment: string): boolean {\n return NUMERIC_PREFIX_RE.test(segment);\n}\n\nexport function slugifySegment(\n segment: string,\n options: SlugifyOptions = {},\n): string {\n const displaySegment = options.numericPrefixes\n ? stripNumericPrefix(segment)\n : segment;\n return displaySegment\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .trim()\n .toLowerCase()\n .replace(/['\"]/g, \"\")\n .replace(/[^a-z0-9/_-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nexport function normalizeSlug(\n value: string,\n options: SlugifyOptions = {},\n): string {\n const cleaned = normalizePath(value)\n .replace(/^\\.\\//, \"\")\n .replace(DOCUMENT_EXTENSION_RE, \"\");\n const parts = cleaned\n .split(\"/\")\n .filter(Boolean)\n .map((part) => slugifySegment(part, options));\n return (parts.join(\"/\") || \"index\").replace(/\\/index\\/index$/, \"/index\");\n}\n\nexport function normalizeAssetReference(\n value: string,\n options: SlugifyOptions = {},\n): string {\n const cleaned = normalizePath(stripAssetReferenceSuffix(value)).replace(\n /^\\.\\//,\n \"\",\n );\n const parts = cleaned\n .split(\"/\")\n .filter(Boolean)\n .map((part) => normalizeAssetSegment(part, options))\n .filter(Boolean);\n return parts.join(\"/\");\n}\n\nexport function slugifyAssetPath(\n sourcePath: string,\n options: SlugifyOptions = {},\n): string {\n return normalizeAssetReference(sourcePath, options);\n}\n\nexport function slugifyFilePath(\n filePath: FilePath | string,\n contentDir = \"content\",\n options: SlugifyOptions = {},\n): FullSlug {\n const normalizedFile = normalizePath(filePath);\n const normalizedContent = normalizePath(contentDir);\n const relative = normalizedFile.startsWith(`${normalizedContent}/`)\n ? normalizedFile.slice(normalizedContent.length + 1)\n : normalizedFile;\n\n return asFullSlug(normalizeSlug(relative, options));\n}\n\nexport function hasNumericPrefixInPath(filePath: string): boolean {\n return normalizePath(filePath)\n .replace(DOCUMENT_EXTENSION_RE, \"\")\n .split(\"/\")\n .some((segment) => hasNumericPrefix(segment));\n}\n\nexport function numericPrefixSortKey(filePath: string): string {\n return normalizePath(filePath)\n .replace(DOCUMENT_EXTENSION_RE, \"\")\n .split(\"/\")\n .filter(Boolean)\n .map(numericPrefixSortSegment)\n .join(\"/\");\n}\n\nexport function simplifySlug(slug: FullSlug | string): SimpleSlug {\n const normalized = normalizeSlug(slug);\n if (normalized === \"index\") return \"\" as SimpleSlug;\n return normalized.replace(/\\/index$/, \"\") as SimpleSlug;\n}\n\nexport function slugToHref(slug: FullSlug | string): string {\n const simple = simplifySlug(slug).toString();\n return simple ? `/${simple}` : \"/\";\n}\n\nexport function hrefToSlug(href: string): FullSlug {\n const normalized = normalizePath(href.split(\"#\")[0] ?? \"\");\n return asFullSlug(normalized === \"\" ? \"index\" : normalized);\n}\n\nexport function pathToRoot(slug: FullSlug | string): RelativeURL {\n const simple = simplifySlug(slug).toString();\n const depth = simple ? simple.split(\"/\").length - 1 : 0;\n return asRelativeURL(depth === 0 ? \".\" : Array(depth).fill(\"..\").join(\"/\"));\n}\n\nexport function resolveRelative(\n currentSlug: FullSlug | string,\n target: string,\n options: SlugifyOptions = {},\n): FullSlug {\n const currentDir = normalizePath(currentSlug)\n .split(\"/\")\n .slice(0, -1)\n .join(\"/\");\n return asFullSlug(\n normalizeSlug(path.posix.join(currentDir, target), options),\n );\n}\n\nexport function createWikiLinkResolutionIndex(\n allSlugs: readonly string[],\n options: SlugifyOptions = {},\n): WikiLinkResolutionIndex {\n const candidates = new Set(\n allSlugs.map((slug) =>\n normalizeSlug(slug, { ...options, numericPrefixes: false }),\n ),\n );\n const uniqueSlugByBasename = new Map<string, string | null>();\n const slugsByBasename = new Map<string, string[]>();\n\n for (const slug of candidates) {\n const basename = basenameForNormalizedSlug(slug);\n if (!basename) continue;\n const basenameCandidates = slugsByBasename.get(basename);\n if (basenameCandidates) {\n basenameCandidates.push(slug);\n } else {\n slugsByBasename.set(basename, [slug]);\n }\n if (uniqueSlugByBasename.has(basename)) {\n uniqueSlugByBasename.set(basename, null);\n continue;\n }\n uniqueSlugByBasename.set(basename, slug);\n }\n\n for (const basenameCandidates of slugsByBasename.values()) {\n basenameCandidates.sort(compareSlugs);\n }\n\n return { candidates, uniqueSlugByBasename, slugsByBasename };\n}\n\nexport function createAssetResolutionIndex(\n assets: readonly AssetResolutionEntry[],\n options: SlugifyOptions = {},\n): AssetResolutionIndex {\n const assetPathBySourcePath = new Map<string, string | null>();\n const assetPathByBasename = new Map<string, string | null>();\n\n for (const asset of assets) {\n const sourcePath = normalizePath(asset.sourcePath);\n const assetPath = normalizePath(asset.assetPath);\n addUniqueCandidate(\n assetPathBySourcePath,\n normalizeAssetReference(sourcePath, options),\n assetPath,\n );\n addUniqueCandidate(\n assetPathByBasename,\n normalizeAssetReference(path.posix.basename(sourcePath), options),\n assetPath,\n );\n }\n\n return { assetPathBySourcePath, assetPathByBasename };\n}\n\nexport function resolveWikiLink(\n currentSlug: FullSlug | string,\n target: string,\n index: WikiLinkResolutionIndex,\n strategy: \"absolute\" | \"relative\" | \"shortest\" = \"shortest\",\n options: SlugifyOptions = {},\n): FullSlug | undefined {\n const [rawPath] = target.split(\"#\");\n const normalizedTarget = normalizeSlug(rawPath ?? target, options);\n const { candidates } = index;\n\n if (strategy === \"absolute\" && candidates.has(normalizedTarget))\n return asFullSlug(normalizedTarget);\n\n if (strategy === \"relative\") {\n const relative = resolveRelative(currentSlug, normalizedTarget, options);\n if (candidates.has(relative)) return relative;\n }\n\n if (candidates.has(normalizedTarget)) return asFullSlug(normalizedTarget);\n if (candidates.has(`${normalizedTarget}/index`))\n return asFullSlug(`${normalizedTarget}/index`);\n\n const targetBasename = normalizedTarget.split(\"/\").at(-1) ?? \"\";\n const byBasename = index.uniqueSlugByBasename.get(targetBasename);\n\n if (byBasename) return asFullSlug(byBasename);\n\n return closestWikiLinkCandidate(\n currentSlug,\n candidatesForBasename(index, targetBasename),\n );\n}\n\nexport function resolveAssetPath(\n currentSourcePath: string,\n target: string,\n index: AssetResolutionIndex,\n strategy: \"absolute\" | \"relative\" | \"shortest\" = \"shortest\",\n options: SlugifyOptions = {},\n): string | undefined {\n if (/^(?:https?:|#|\\/)/.test(target)) return undefined;\n const normalizedTarget = normalizeAssetReference(target, options);\n if (!normalizedTarget) return undefined;\n const isExplicitRelative = isExplicitRelativeAssetReference(target);\n\n if (isExplicitRelative || strategy === \"relative\") {\n const relative = resolveRelativeAsset(currentSourcePath, target, options);\n const resolved = uniqueValue(index.assetPathBySourcePath, relative);\n if (resolved || isExplicitRelative) return resolved;\n }\n\n if (strategy === \"absolute\") {\n return uniqueValue(index.assetPathBySourcePath, normalizedTarget);\n }\n\n return (\n uniqueValue(index.assetPathBySourcePath, normalizedTarget) ??\n uniqueValue(\n index.assetPathByBasename,\n normalizedTarget.split(\"/\").at(-1) ?? \"\",\n )\n );\n}\n\nexport function resolveRelativeAsset(\n currentSourcePath: string,\n target: string,\n options: SlugifyOptions = {},\n): string {\n const currentDir = normalizePath(currentSourcePath)\n .split(\"/\")\n .slice(0, -1)\n .join(\"/\");\n return normalizeAssetReference(\n path.posix.join(currentDir, stripAssetReferenceSuffix(target)),\n options,\n );\n}\n\nexport function joinSegments(...segments: string[]): string {\n return normalizePath(segments.filter(Boolean).join(\"/\"));\n}\n\nfunction basenameForNormalizedSlug(slug: string): string {\n const simplified = slug === \"index\" ? \"\" : slug.replace(/\\/index$/, \"\");\n return simplified.split(\"/\").at(-1) ?? \"\";\n}\n\nfunction candidatesForBasename(\n index: WikiLinkResolutionIndex,\n basename: string,\n): readonly string[] {\n const indexedCandidates = index.slugsByBasename?.get(basename);\n if (indexedCandidates) return indexedCandidates;\n\n return [...index.candidates]\n .filter((slug) => basenameForNormalizedSlug(slug) === basename)\n .sort(compareSlugs);\n}\n\nfunction closestWikiLinkCandidate(\n currentSlug: FullSlug | string,\n candidates: readonly string[],\n): FullSlug | undefined {\n if (candidates.length === 0) return undefined;\n\n const currentDirectory = normalizeSlug(currentSlug, {\n numericPrefixes: false,\n })\n .split(\"/\")\n .slice(0, -1);\n const [bestCandidate] = [...candidates].sort((left, right) => {\n const leftScore = wikiLinkCandidateScore(currentDirectory, left);\n const rightScore = wikiLinkCandidateScore(currentDirectory, right);\n\n return (\n rightScore.sharedPrefixLength - leftScore.sharedPrefixLength ||\n leftScore.depth - rightScore.depth ||\n compareSlugs(left, right)\n );\n });\n\n return bestCandidate ? asFullSlug(bestCandidate) : undefined;\n}\n\nfunction wikiLinkCandidateScore(currentDirectory: string[], slug: string) {\n const simplified = simplifyCandidateSlug(slug);\n const segments = simplified ? simplified.split(\"/\") : [];\n\n return {\n sharedPrefixLength: sharedPrefixLength(\n currentDirectory,\n segments.slice(0, -1),\n ),\n depth: segments.length,\n };\n}\n\nfunction simplifyCandidateSlug(slug: string): string {\n return slug === \"index\" ? \"\" : slug.replace(/\\/index$/, \"\");\n}\n\nfunction sharedPrefixLength(left: readonly string[], right: readonly string[]) {\n let length = 0;\n while (left[length] !== undefined && left[length] === right[length]) {\n length += 1;\n }\n return length;\n}\n\nfunction compareSlugs(left: string, right: string) {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\nfunction normalizeAssetSegment(\n segment: string,\n options: SlugifyOptions = {},\n): string {\n const extension = path.posix.extname(segment);\n if (!extension) return slugifySegment(segment, options);\n const stem = segment.slice(0, -extension.length);\n const normalizedStem = slugifySegment(stem, options);\n return normalizedStem ? `${normalizedStem}${extension.toLowerCase()}` : \"\";\n}\n\nfunction stripAssetReferenceSuffix(value: string): string {\n const suffixIndexes = [value.indexOf(\"?\"), value.indexOf(\"#\")].filter(\n (index) => index >= 0,\n );\n const suffixIndex = Math.min(...suffixIndexes);\n return Number.isFinite(suffixIndex) ? value.slice(0, suffixIndex) : value;\n}\n\nfunction isExplicitRelativeAssetReference(value: string): boolean {\n return /^\\.{1,2}\\//.test(normalizePath(stripAssetReferenceSuffix(value)));\n}\n\nfunction addUniqueCandidate(\n candidates: Map<string, string | null>,\n key: string,\n value: string,\n) {\n if (!key) return;\n const existing = candidates.get(key);\n if (existing === undefined) {\n candidates.set(key, value);\n return;\n }\n if (existing !== value) {\n candidates.set(key, null);\n }\n}\n\nfunction uniqueValue(\n candidates: ReadonlyMap<string, string | null>,\n key: string,\n): string | undefined {\n return candidates.get(key) ?? undefined;\n}\n\nfunction numericPrefixSortSegment(segment: string): string {\n const match = NUMERIC_PREFIX_RE.exec(segment);\n if (!match) {\n return `${UNORDERED_SEGMENT_SORT_PREFIX}:${slugifySegment(segment)}`;\n }\n\n const order = match[1]!.padStart(10, \"0\");\n return `${order}:${slugifySegment(match[2]!)}`;\n}\n","import { slug as slugifyHeading } from \"github-slugger\";\nimport { unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport {\n remarkObsidian,\n type ObsidianWikiEmbed,\n type ObsidianWikilink,\n} from \"@silicajs/remark-obsidian\";\nimport { resolveWikiLink, slugToHref } from \"../path.js\";\nimport type { BrokenLink, RenderContext } from \"../types.js\";\n\ntype PagePropertyTextPart = {\n type: \"text\";\n value: string;\n};\n\ntype PagePropertyLinkPart = {\n type: \"link\";\n value: string;\n target: string;\n slug: string;\n href: string;\n};\n\ntype PagePropertyBrokenLinkPart = {\n type: \"broken-link\";\n value: string;\n target: string;\n};\n\nexport type PagePropertyPart =\n | PagePropertyTextPart\n | PagePropertyLinkPart\n | PagePropertyBrokenLinkPart;\n\nexport type PageProperty = {\n key: string;\n label: string;\n value: string;\n parts?: PagePropertyPart[];\n};\n\nexport type PagePropertyResolution = {\n parts: PagePropertyPart[];\n links: string[];\n brokenLinks: BrokenLink[];\n};\n\ntype PositionedNode = {\n type: string;\n position?: {\n start?: { offset?: number };\n end?: { offset?: number };\n };\n children?: PositionedNode[];\n};\n\ntype PropertyWikiNode = (ObsidianWikilink | ObsidianWikiEmbed) & PositionedNode;\n\nconst RESERVED_FRONTMATTER_KEYS = new Set([\n \"aliases\",\n \"alias\",\n \"created\",\n \"cssclass\",\n \"cssclasses\",\n \"date\",\n \"description\",\n \"draft\",\n \"listed\",\n \"menu_label\",\n \"modified\",\n \"permalink\",\n \"publish\",\n \"tag\",\n \"tags\",\n \"title\",\n]);\n\nexport function getMenuLabel(\n frontmatter: Record<string, unknown>,\n title: string,\n): string {\n if (\n typeof frontmatter.menu_label === \"string\" &&\n frontmatter.menu_label.trim()\n ) {\n return frontmatter.menu_label.trim();\n }\n return title;\n}\n\nexport function getPageProperties(\n frontmatter: Record<string, unknown>,\n): PageProperty[] {\n return Object.entries(frontmatter)\n .filter(([key]) => !RESERVED_FRONTMATTER_KEYS.has(key.toLowerCase()))\n .map(([key, value]) => {\n const formatted = formatPropertyValue(value);\n if (formatted === undefined) return undefined;\n return {\n key,\n label: formatPropertyLabel(key),\n value: formatted,\n };\n })\n .filter((property): property is PageProperty => property !== undefined)\n .sort((a, b) => a.key.localeCompare(b.key));\n}\n\nexport function getResolvedPageProperties(\n frontmatter: Record<string, unknown>,\n context: RenderContext,\n): PageProperty[] {\n return getPageProperties(frontmatter).map((property) => ({\n ...property,\n parts: resolvePagePropertyValue(property.value, context).parts,\n }));\n}\n\nexport function analyzePagePropertyLinks(\n frontmatter: Record<string, unknown>,\n context: RenderContext,\n): { links: string[]; brokenLinks: BrokenLink[] } {\n const links = new Set<string>();\n const brokenLinks: BrokenLink[] = [];\n\n for (const property of getPageProperties(frontmatter)) {\n const resolution = resolvePagePropertyValue(property.value, context);\n for (const link of resolution.links) links.add(link);\n brokenLinks.push(...resolution.brokenLinks);\n }\n\n return { links: [...links], brokenLinks };\n}\n\nexport function resolvePagePropertyValue(\n value: string,\n context: RenderContext,\n): PagePropertyResolution {\n const nodes = collectPropertyWikiNodes(value, context);\n if (nodes.length === 0) {\n return {\n parts: [{ type: \"text\", value }],\n links: [],\n brokenLinks: [],\n };\n }\n\n const parts: PagePropertyPart[] = [];\n const links = new Set<string>();\n const brokenLinks: BrokenLink[] = [];\n let cursor = 0;\n\n for (const node of nodes) {\n const range = nodeRange(node);\n if (!range || range.start < cursor) continue;\n if (range.start > cursor) {\n parts.push({ type: \"text\", value: value.slice(cursor, range.start) });\n }\n\n const label = node.alias || node.target || \"\";\n const targetPath = node.linkTarget.path || String(context.slug);\n const resolved = resolvePagePropertyWikiTarget(context, targetPath);\n if (resolved) {\n links.add(resolved);\n parts.push({\n type: \"link\",\n value: label,\n target: node.rawTarget,\n slug: resolved,\n href: `${slugToHref(resolved)}${targetFragment(node)}`,\n });\n } else {\n brokenLinks.push({\n source: String(context.slug),\n target: node.rawTarget,\n });\n parts.push({\n type: \"broken-link\",\n value: label,\n target: node.rawTarget,\n });\n }\n\n cursor = range.end;\n }\n\n if (cursor < value.length) {\n parts.push({ type: \"text\", value: value.slice(cursor) });\n }\n\n return { parts, links: [...links], brokenLinks };\n}\n\nexport function formatPropertyLabel(key: string): string {\n return key\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .toLowerCase();\n}\n\nexport function formatPropertyValue(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10);\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed || undefined;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n const items = value\n .map((item) => formatPropertyValue(item))\n .filter((item): item is string => item !== undefined);\n return items.length ? items.join(\", \") : undefined;\n }\n\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n\n return String(value);\n}\n\nfunction collectPropertyWikiNodes(\n value: string,\n context: RenderContext,\n): PropertyWikiNode[] {\n const processor = unified()\n .use(remarkParse)\n .use(remarkObsidian, { inlineTags: context.tags?.inline ?? true });\n const tree = processor.parse(value) as PositionedNode;\n const nodes: PropertyWikiNode[] = [];\n visitPropertyNodes(tree, (node) => {\n if (!isPropertyWikiNode(node)) return;\n if (node.type === \"obsidianWikiEmbed\" && isAssetTarget(node.rawTarget)) {\n return;\n }\n nodes.push(node);\n });\n return nodes.sort(\n (a, b) => (nodeRange(a)?.start ?? 0) - (nodeRange(b)?.start ?? 0),\n );\n}\n\nfunction visitPropertyNodes(\n node: PositionedNode,\n visitor: (node: PositionedNode) => void,\n): void {\n visitor(node);\n for (const child of node.children ?? []) {\n visitPropertyNodes(child, visitor);\n }\n}\n\nfunction isPropertyWikiNode(node: PositionedNode): node is PropertyWikiNode {\n return node.type === \"obsidianWikilink\" || node.type === \"obsidianWikiEmbed\";\n}\n\nfunction resolvePagePropertyWikiTarget(\n context: RenderContext,\n targetPath: string,\n): string | undefined {\n if (context.resolveWikiLink) {\n return context.resolveWikiLink(context.slug, targetPath);\n }\n if (!context.wikilinkIndex) return undefined;\n return resolveWikiLink(\n context.slug,\n targetPath,\n context.wikilinkIndex,\n context.wikilinkStrategy ?? \"shortest\",\n context.ordering,\n );\n}\n\nfunction nodeRange(\n node: PositionedNode,\n): { start: number; end: number } | undefined {\n const start = node.position?.start?.offset;\n const end = node.position?.end?.offset;\n if (typeof start !== \"number\" || typeof end !== \"number\" || end < start) {\n return undefined;\n }\n return { start, end };\n}\n\nfunction targetFragment(node: ObsidianWikilink | ObsidianWikiEmbed): string {\n if (node.linkTarget.blockId) {\n return `#^${encodeURIComponent(node.linkTarget.blockId)}`;\n }\n if (node.linkTarget.heading) {\n return `#${slugifyHeading(node.linkTarget.heading)}`;\n }\n return \"\";\n}\n\nfunction isAssetTarget(target: string): boolean {\n return /\\.(png|jpe?g|gif|webp|svg|pdf|mp4|mov|mp3|wav|ogg|canvas)(?:[?#].*)?$/i.test(\n target,\n );\n}\n","import { normalizeTag } from \"@silicajs/remark-obsidian\";\n\nexport function tagToHref(tag: string): string {\n const normalized = normalizeTag(tag);\n if (!normalized) return \"/tags\";\n const encoded = normalized\n .split(\"/\")\n .map((segment) => encodeURIComponent(segment))\n .join(\"/\");\n return `/tags/${encoded}`;\n}\n","import matter from \"gray-matter\";\nimport { unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport remarkFrontmatter from \"remark-frontmatter\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport remarkRehype from \"remark-rehype\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize, { defaultSchema } from \"rehype-sanitize\";\nimport rehypeKatex from \"rehype-katex\";\nimport rehypeSlug from \"rehype-slug\";\nimport rehypeAutolinkHeadings from \"rehype-autolink-headings\";\nimport rehypeShiki from \"@shikijs/rehype\";\nimport rehypeReact from \"rehype-react\";\nimport rehypeStringify from \"rehype-stringify\";\nimport { getTags, remarkObsidian } from \"@silicajs/remark-obsidian\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nimport type {\n AnalyzeResult,\n RenderContext,\n RenderResult,\n TocItem,\n} from \"../types.js\";\nimport { rehypeShikiCodeBlockWrapper } from \"./code-block.js\";\nimport {\n createSilicaObsidianHandlers,\n remarkSilicaObsidian,\n} from \"./obsidian.js\";\nimport { analyzePagePropertyLinks } from \"./frontmatter.js\";\nimport {\n getDataArray,\n rehypeCleanFootnoteHeadings,\n rehypeCollectTocAndLinks,\n rehypeExternalLinks,\n rehypeRestoreObsidianBlockIds,\n rehypeUnwrapSilicaEmbeds,\n} from \"./plugins.js\";\n\ntype MdastNode = {\n type: string;\n value?: string;\n raw?: string;\n tag?: string;\n children?: MdastNode[];\n};\n\ntype PlainTextOptions = {\n skipLeadingHeading?: boolean;\n};\n\nconst plainTextSkipTypes = new Set([\n \"code\",\n \"definition\",\n \"footnoteDefinition\",\n \"footnoteReference\",\n \"image\",\n \"imageReference\",\n \"inlineMath\",\n \"math\",\n \"obsidianBlockId\",\n \"obsidianComment\",\n \"obsidianWikiEmbed\",\n \"thematicBreak\",\n \"yaml\",\n]);\n\nconst headingLinkIcon = {\n type: \"element\",\n tagName: \"svg\",\n properties: {\n ariaHidden: \"true\",\n className: [\"silica-heading-link-icon\"],\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n viewBox: \"0 0 24 24\",\n },\n children: [\n {\n type: \"element\",\n tagName: \"path\",\n properties: {\n d: \"M9 17H7A5 5 0 0 1 7 7h2\",\n },\n children: [],\n },\n {\n type: \"element\",\n tagName: \"path\",\n properties: {\n d: \"M15 7h2a5 5 0 1 1 0 10h-2\",\n },\n children: [],\n },\n {\n type: \"element\",\n tagName: \"line\",\n properties: {\n x1: 8,\n x2: 16,\n y1: 12,\n y2: 12,\n },\n children: [],\n },\n ],\n} as const;\n\nconst sanitizeSchema = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n span: [\n ...(defaultSchema.attributes?.span ?? []),\n [\"className\", \"silica-broken-link\"],\n [\"className\", \"silica-block-id\"],\n [\"dataSilicaBlockId\"],\n [\"data-silica-block-id\"],\n [\"ariaHidden\"],\n [\"aria-hidden\"],\n ],\n sup: [\n ...(defaultSchema.attributes?.sup ?? []),\n [\"className\", \"silica-inline-footnote\"],\n ],\n img: [...(defaultSchema.attributes?.img ?? []), [\"width\"], [\"height\"]],\n audio: [[\"src\"], [\"controls\"], [\"width\"], [\"height\"]],\n video: [[\"src\"], [\"controls\"], [\"width\"], [\"height\"]],\n source: [[\"src\"], [\"type\"]],\n figure: [\n ...(defaultSchema.attributes?.figure ?? []),\n [\"className\", \"silica-embed\", \"silica-note-embed\"],\n [\"dataEmbedKind\"],\n [\"data-embed-kind\"],\n [\"dataEmbedTarget\"],\n [\"data-embed-target\"],\n ],\n strong: [\n ...(defaultSchema.attributes?.strong ?? []),\n [\"className\", \"silica-callout-title\"],\n [\"dataCallout\"],\n [\"data-callout\"],\n [\"dataCalloutFold\"],\n [\"data-callout-fold\"],\n ],\n \"silica-callout\": [\n [\"className\", \"silica-callout\"],\n [\"dataCallout\"],\n [\"data-callout\"],\n [\"dataCalloutTitle\"],\n [\"data-callout-title\"],\n [\"dataCalloutFoldable\"],\n [\"data-callout-foldable\"],\n [\"dataCalloutOpen\"],\n [\"data-callout-open\"],\n ],\n \"silica-embed\": [\n [\"src\"],\n [\"width\"],\n [\"height\"],\n [\"dataEmbedKind\"],\n [\"data-embed-kind\"],\n [\"dataEmbedTarget\"],\n [\"data-embed-target\"],\n ],\n \"silica-mermaid\": [\n [\"dataSource\"],\n [\"data-source\"],\n [\"dataLanguage\"],\n [\"data-language\"],\n [\"dataLanguageLabel\"],\n [\"data-language-label\"],\n ],\n mark: defaultSchema.attributes?.mark ?? [],\n },\n tagNames: [\n ...(defaultSchema.tagNames ?? []),\n \"mark\",\n \"audio\",\n \"video\",\n \"source\",\n \"figure\",\n \"silica-callout\",\n \"silica-embed\",\n \"silica-mermaid\",\n ],\n};\n\nexport async function renderMarkdown(\n raw: string,\n context: RenderContext,\n): Promise<RenderResult> {\n const parsed = matter(raw);\n const processor = baseProcessor(context)\n .use(rehypeUnwrapSilicaEmbeds)\n .use(rehypeRaw)\n .use(rehypeSanitize, sanitizeSchema)\n .use(rehypeRestoreObsidianBlockIds)\n .use(rehypeUnwrapSilicaEmbeds)\n .use(rehypeKatex);\n\n if (hasCodeFence(parsed.content)) {\n processor.use(rehypeShiki, {\n themes: {\n light: \"github-light\",\n dark: \"github-dark\",\n },\n defaultColor: \"light-dark()\",\n // Ensure unlabeled fences still flow through Shiki so they pick up the\n // wrapper transformer below (just without a language header).\n defaultLanguage: \"text\",\n rootStyle: false,\n transformers: [rehypeShikiCodeBlockWrapper()],\n });\n }\n\n processor\n .use(rehypeSlug)\n .use(rehypeAutolinkHeadings, {\n behavior: \"wrap\",\n content: headingLinkIcon,\n properties: { className: [\"silica-heading-link\"] },\n })\n .use(rehypeCleanFootnoteHeadings)\n .use(rehypeCollectTocAndLinks)\n .use(rehypeExternalLinks)\n .use(rehypeReact, {\n Fragment,\n jsx,\n jsxs,\n components: context.components,\n });\n\n const file = await processor.process(parsed.content);\n const toc = getDataArray<TocItem>(file.data, \"toc\");\n\n return {\n content: file.result,\n toc,\n };\n}\n\nexport async function renderMarkdownHtml(\n raw: string,\n context: RenderContext,\n): Promise<string> {\n const parsed = matter(raw);\n const processor = baseProcessor(context)\n .use(rehypeUnwrapSilicaEmbeds)\n .use(rehypeRaw)\n .use(rehypeSanitize, sanitizeSchema)\n .use(rehypeRestoreObsidianBlockIds)\n .use(rehypeUnwrapSilicaEmbeds)\n .use(rehypeKatex);\n\n if (hasCodeFence(parsed.content)) {\n processor.use(rehypeShiki, {\n themes: {\n light: \"github-light\",\n dark: \"github-dark\",\n },\n defaultColor: \"light-dark()\",\n defaultLanguage: \"text\",\n rootStyle: false,\n transformers: [rehypeShikiCodeBlockWrapper()],\n });\n }\n\n processor.use(rehypeExternalLinks).use(rehypeStringify);\n\n const file = await processor.process(parsed.content);\n return String(file);\n}\n\nexport async function analyzeMarkdown(\n raw: string,\n context: RenderContext,\n): Promise<AnalyzeResult> {\n const parsed = matter(raw);\n const inlineTags = context.tags?.inline ?? true;\n const file = await runRemarkObsidian(parsed.content, context);\n const plainText = extractPlainText(parsed.content);\n const frontmatter = parsed.data;\n const contentBrokenLinks = getDataArray<{ target: string }>(\n file.data,\n \"silicaObsidianBrokenLinks\",\n ).map((link) => ({ source: String(context.slug), target: link.target }));\n const pagePropertyLinks = analyzePagePropertyLinks(frontmatter, context);\n const description = getDescription(frontmatter);\n\n return {\n frontmatter,\n links: [\n ...new Set([\n ...getDataArray<string>(file.data, \"silicaObsidianLinks\"),\n ...pagePropertyLinks.links,\n ]),\n ],\n embeds: getDataArray<string>(file.data, \"silicaObsidianEmbeds\"),\n brokenLinks: [...contentBrokenLinks, ...pagePropertyLinks.brokenLinks],\n plainText,\n title: getTitle(frontmatter),\n description,\n generatedDescription: description\n ? undefined\n : generateDescriptionFromContent(parsed.content),\n tags: getTags(frontmatter, parsed.content, { inline: inlineTags }),\n };\n}\n\nexport function getTitle(\n frontmatter: Record<string, unknown>,\n): string | undefined {\n if (typeof frontmatter.title === \"string\" && frontmatter.title.trim())\n return frontmatter.title.trim();\n return undefined;\n}\n\nexport function getDescription(\n frontmatter: Record<string, unknown>,\n): string | undefined {\n if (\n typeof frontmatter.description === \"string\" &&\n frontmatter.description.trim()\n ) {\n return cleanPlainText(frontmatter.description.trim());\n }\n return undefined;\n}\n\nexport function generateDescriptionFromContent(\n markdown: string,\n maxLength = 160,\n): string | undefined {\n return cleanPlainText(markdown, maxLength, { skipLeadingHeading: true });\n}\n\nexport function getMetaDescription(\n entry: {\n description?: string;\n generatedDescription?: string;\n },\n maxLength = 160,\n): string | undefined {\n const text = entry.description ?? entry.generatedDescription;\n if (!text) return undefined;\n if (text.length <= maxLength) return text;\n return cleanPlainText(text, maxLength);\n}\n\nfunction cleanPlainText(\n text: string,\n maxLength?: number,\n options: PlainTextOptions = {},\n): string | undefined {\n const cleaned = extractPlainText(text, options).trim();\n if (!cleaned) return undefined;\n if (maxLength === undefined) return cleaned;\n const truncated = cleaned.slice(0, maxLength).trim();\n return truncated || undefined;\n}\n\nfunction baseProcessor(context: RenderContext) {\n return unified()\n .use(remarkParse)\n .use(remarkFrontmatter, [\"yaml\"])\n .use(remarkGfm)\n .use(remarkMath)\n .use(remarkObsidian, { inlineTags: context.tags?.inline ?? true })\n .use(remarkSilicaObsidian, context)\n .use(remarkRehype, {\n allowDangerousHtml: true,\n handlers: createSilicaObsidianHandlers(context),\n });\n}\n\nasync function runRemarkObsidian(markdown: string, context: RenderContext) {\n const processor = unified()\n .use(remarkParse)\n .use(remarkFrontmatter, [\"yaml\"])\n .use(remarkGfm)\n .use(remarkMath)\n .use(remarkObsidian, { inlineTags: context.tags?.inline ?? true })\n .use(remarkSilicaObsidian, context);\n const tree = processor.parse(markdown);\n const file = { data: {} };\n await processor.run(tree, file);\n return file;\n}\n\nfunction extractPlainText(\n markdown: string,\n options: PlainTextOptions = {},\n): string {\n const tree = parsePlainTextMarkdown(markdown);\n const children =\n options.skipLeadingHeading && tree.children?.[0]?.type === \"heading\"\n ? tree.children.slice(1)\n : (tree.children ?? []);\n const parts: string[] = [];\n\n for (const child of children) {\n collectPlainText(child, parts);\n }\n\n return normalizePlainText(parts.join(\" \"));\n}\n\nfunction parsePlainTextMarkdown(markdown: string): MdastNode {\n return unified()\n .use(remarkParse)\n .use(remarkFrontmatter, [\"yaml\"])\n .use(remarkGfm)\n .use(remarkMath)\n .use(remarkObsidian)\n .parse(markdown) as MdastNode;\n}\n\nfunction collectPlainText(node: MdastNode, parts: string[]): void {\n if (plainTextSkipTypes.has(node.type)) return;\n\n if (node.type === \"obsidianTag\") {\n const raw = node.raw?.replace(/^#/, \"\");\n const tag = raw || node.tag;\n if (tag) parts.push(tag);\n return;\n }\n\n if (typeof node.value === \"string\") {\n parts.push(node.value);\n }\n\n for (const child of node.children ?? []) {\n collectPlainText(child, parts);\n }\n}\n\nfunction normalizePlainText(text: string): string {\n return text\n .replace(/\\s+/g, \" \")\n .replace(/\\s+([.,;:!?])/g, \"$1\")\n .trim();\n}\n\nfunction hasCodeFence(markdown: string): boolean {\n return /(^|\\n)(```|~~~)/.test(markdown);\n}\n","import type { Element, Root } from \"hast\";\nimport type { ShikiTransformer } from \"shiki\";\n\nconst LANGUAGE_LABELS: Record<string, string> = {\n bash: \"Bash\",\n c: \"C\",\n cpp: \"C++\",\n cs: \"C#\",\n css: \"CSS\",\n diff: \"Diff\",\n docker: \"Dockerfile\",\n dockerfile: \"Dockerfile\",\n go: \"Go\",\n graphql: \"GraphQL\",\n html: \"HTML\",\n ini: \"INI\",\n java: \"Java\",\n javascript: \"JavaScript\",\n js: \"JavaScript\",\n json: \"JSON\",\n jsonc: \"JSON\",\n jsx: \"JSX\",\n kotlin: \"Kotlin\",\n less: \"Less\",\n lua: \"Lua\",\n markdown: \"Markdown\",\n md: \"Markdown\",\n mdx: \"MDX\",\n objc: \"Objective-C\",\n php: \"PHP\",\n ps: \"PowerShell\",\n ps1: \"PowerShell\",\n powershell: \"PowerShell\",\n py: \"Python\",\n python: \"Python\",\n r: \"R\",\n rb: \"Ruby\",\n ruby: \"Ruby\",\n rs: \"Rust\",\n rust: \"Rust\",\n scala: \"Scala\",\n scss: \"SCSS\",\n sh: \"Shell\",\n shell: \"Shell\",\n sql: \"SQL\",\n svelte: \"Svelte\",\n swift: \"Swift\",\n toml: \"TOML\",\n ts: \"TypeScript\",\n tsx: \"TSX\",\n typescript: \"TypeScript\",\n vue: \"Vue\",\n xml: \"XML\",\n yaml: \"YAML\",\n yml: \"YAML\",\n zig: \"Zig\",\n zsh: \"Zsh\",\n};\n\nconst HIDDEN_LANGUAGES = new Set([\n \"\",\n \"text\",\n \"plain\",\n \"plaintext\",\n \"txt\",\n \"ansi\",\n]);\n\nfunction formatLanguage(lang: string | undefined): string | null {\n if (!lang) return null;\n const lower = lang.toLowerCase();\n if (HIDDEN_LANGUAGES.has(lower)) return null;\n return LANGUAGE_LABELS[lower] ?? lang;\n}\n\n/**\n * Wraps every Shiki-rendered `<pre>` in a semantic custom element. Shiki keeps\n * owning highlighting, while themes can map the element to their code chrome.\n */\nexport function rehypeShikiCodeBlockWrapper(): ShikiTransformer {\n return {\n name: \"silica:code-block-wrapper\",\n root(hast: Root): Root {\n const pre = hast.children.find(\n (child): child is Element =>\n child.type === \"element\" && child.tagName === \"pre\",\n );\n if (!pre) return hast;\n\n const rawLang =\n typeof this.options.lang === \"string\" ? this.options.lang : undefined;\n const label = formatLanguage(rawLang);\n const isMermaid = rawLang?.toLowerCase() === \"mermaid\";\n\n const wrapper: Element = {\n type: \"element\",\n tagName: isMermaid ? \"silica-mermaid\" : \"silica-code-block\",\n properties: {\n ...(rawLang ? { \"data-language\": rawLang } : {}),\n ...(isMermaid ? { \"data-source\": toText(pre) } : {}),\n ...(label ? { \"data-language-label\": label } : {}),\n },\n children: [pre],\n };\n\n hast.children = [wrapper];\n return hast;\n },\n };\n}\n\nfunction toText(node: Element): string {\n return node.children\n .map((child) => {\n if (child.type === \"text\") return child.value;\n if (child.type === \"element\") return toText(child);\n return \"\";\n })\n .join(\"\");\n}\n","import { visit } from \"unist-util-visit\";\nimport type {\n ObsidianBlockId,\n ObsidianCallout,\n ObsidianComment,\n ObsidianEmbedSize,\n ObsidianHighlight,\n ObsidianInlineFootnote,\n ObsidianTag,\n ObsidianWikiEmbed,\n ObsidianWikilink,\n} from \"@silicajs/remark-obsidian\";\nimport type { Nodes, PhrasingContent, Root, RootContent } from \"mdast\";\nimport type { Properties } from \"hast\";\nimport { slug as slugifyHeading } from \"github-slugger\";\nimport { tagToHref } from \"../tags.js\";\nimport { resolveAssetPath, resolveWikiLink, slugToHref } from \"../path.js\";\nimport type { RenderContext } from \"../types.js\";\n\ndeclare module \"mdast\" {\n interface Data {\n silicaBroken?: boolean;\n silicaResolvedSlug?: string;\n silicaEmbedHtml?: string;\n hProperties?: Properties;\n }\n}\n\ntype VFileLike = {\n data: Record<string, unknown>;\n};\n\ntype SilicaMdastNode = Nodes;\n\ntype MdastParent = Extract<Nodes, { children: unknown[] }>;\n\ntype HastNode = {\n type: \"element\" | \"text\" | \"raw\";\n tagName?: string;\n value?: string;\n properties?: Record<string, unknown>;\n children?: HastNode[];\n};\n\ntype HandlerState = {\n all: (node: Nodes) => HastNode[];\n};\n\nexport function remarkSilicaObsidian(context: RenderContext) {\n return async (tree: Root, file: VFileLike) => {\n const links = new Set<string>();\n const embeds = new Set<string>();\n const brokenLinks: Array<{ target: string }> = [];\n const assetBaseUrl = context.assetBaseUrl ?? \"/silica\";\n const embedPromises: Array<Promise<void>> = [];\n\n transformInlineFootnotes(tree);\n\n visit(tree, (node: SilicaMdastNode) => {\n if (node.type === \"image\" && typeof node.url === \"string\") {\n node.url = rewriteAssetUrl(\n resolveAssetTarget(context, node.url) ?? node.url,\n assetBaseUrl,\n );\n applyImageSize(node);\n return;\n }\n\n if (!isWikiNode(node)) return;\n if (node.type === \"obsidianWikiEmbed\" && !isAssetTarget(node.rawTarget)) {\n embedPromises.push(resolveEmbedNode(node, context));\n }\n\n const targetPath = node.linkTarget.path || String(context.slug);\n if (node.type === \"obsidianWikiEmbed\" && isAssetTarget(node.rawTarget)) {\n const resolvedAsset = resolveAssetTarget(context, node.rawTarget);\n if (resolvedAsset) {\n node.data = {\n ...node.data,\n silicaResolvedAssetPath: resolvedAsset,\n };\n }\n return;\n }\n\n const resolved = resolveWikiTarget(context, targetPath);\n\n node.data = { ...node.data };\n if (!resolved) {\n node.data.silicaBroken = true;\n brokenLinks.push({ target: node.rawTarget });\n return;\n }\n\n node.data.silicaResolvedSlug = resolved;\n links.add(resolved);\n if (node.type === \"obsidianWikiEmbed\") {\n embeds.add(resolved);\n }\n });\n\n await Promise.all(embedPromises);\n file.data.silicaObsidianLinks = [...links];\n file.data.silicaObsidianEmbeds = [...embeds];\n file.data.silicaObsidianBrokenLinks = brokenLinks;\n };\n}\n\nfunction resolveWikiTarget(\n context: RenderContext,\n targetPath: string,\n): string | undefined {\n if (context.resolveWikiLink) {\n return context.resolveWikiLink(context.slug, targetPath);\n }\n if (!context.wikilinkIndex) return undefined;\n return resolveWikiLink(\n context.slug,\n targetPath,\n context.wikilinkIndex,\n context.wikilinkStrategy ?? \"shortest\",\n context.ordering,\n );\n}\n\nexport function createSilicaObsidianHandlers(context: RenderContext) {\n return {\n obsidianWikilink(\n state: HandlerState,\n node: ObsidianWikilink & { data?: Record<string, unknown> },\n ) {\n return wikilinkToHast(state, node);\n },\n obsidianWikiEmbed(\n state: HandlerState,\n node: ObsidianWikiEmbed & { data?: Record<string, unknown> },\n ) {\n if (node.rawTarget && isAssetTarget(node.rawTarget)) {\n return assetEmbedToHast(context, node);\n }\n const embedHtml = getStringData(node, \"silicaEmbedHtml\");\n if (embedHtml) {\n return {\n type: \"element\",\n tagName: \"figure\",\n properties: {\n className: [\"silica-embed\", \"silica-note-embed\"],\n \"data-embed-kind\": \"note\",\n \"data-embed-target\": node.rawTarget,\n },\n children: [{ type: \"raw\", value: embedHtml }],\n };\n }\n return wikilinkToHast(state, node);\n },\n obsidianHighlight(state: HandlerState, node: ObsidianHighlight) {\n return {\n type: \"element\",\n tagName: \"mark\",\n properties: {},\n children: state.all(node),\n };\n },\n obsidianCallout(state: HandlerState, node: ObsidianCallout) {\n return {\n type: \"element\",\n tagName: \"silica-callout\",\n properties: {\n className: [\"silica-callout\"],\n \"data-callout\": node.kind ?? \"note\",\n \"data-callout-title\": node.title ?? titleCase(node.kind ?? \"note\"),\n ...(node.fold\n ? {\n \"data-callout-foldable\": \"true\",\n \"data-callout-open\": node.fold === \"open\" ? \"true\" : \"false\",\n }\n : {}),\n },\n children: state.all(node),\n };\n },\n obsidianTag(state: HandlerState, node: ObsidianTag) {\n return {\n type: \"element\",\n tagName: \"a\",\n properties: { href: tagToHref(node.tag ?? \"\") },\n children: state.all(node),\n };\n },\n obsidianComment(_state: HandlerState, _node: ObsidianComment) {\n return { type: \"text\", value: \"\" };\n },\n obsidianBlockId(_state: HandlerState, node: ObsidianBlockId) {\n return {\n type: \"element\",\n tagName: \"span\",\n properties: {\n id: `^${node.id}`,\n className: [\"silica-block-id\"],\n \"data-silica-block-id\": node.id,\n ariaHidden: \"true\",\n },\n children: [],\n };\n },\n };\n}\n\nfunction transformInlineFootnotes(tree: Root) {\n const definitions: RootContent[] = [];\n let nextIndex = 1;\n\n visit(\n tree,\n \"obsidianInlineFootnote\",\n (node: ObsidianInlineFootnote, index, parent: MdastParent | undefined) => {\n if (index === undefined || !parent) return;\n const identifier = `obsidian-inline-${nextIndex++}`;\n parent.children[index] = {\n type: \"footnoteReference\",\n identifier,\n label: identifier,\n } as PhrasingContent;\n definitions.push({\n type: \"footnoteDefinition\",\n identifier,\n label: identifier,\n children: [\n {\n type: \"paragraph\",\n children: node.children.length\n ? node.children\n : [{ type: \"text\", value: node.value }],\n },\n ],\n } as RootContent);\n },\n );\n\n tree.children.push(...definitions);\n}\n\nfunction wikilinkToHast(\n _state: HandlerState,\n node: (ObsidianWikilink | ObsidianWikiEmbed) & {\n data?: Record<string, unknown>;\n },\n): HastNode {\n const label = node.alias || node.target || \"\";\n const resolved = getResolvedSlug(node);\n if (!resolved) {\n return {\n type: \"element\",\n tagName: \"span\",\n properties: { className: [\"silica-broken-link\"] },\n children: [{ type: \"text\", value: label }],\n };\n }\n\n return {\n type: \"element\",\n tagName: \"a\",\n properties: { href: `${slugToHref(resolved)}${targetFragment(node)}` },\n children: [{ type: \"text\", value: label }],\n };\n}\n\nfunction isWikiNode(node: SilicaMdastNode): node is (\n | ObsidianWikilink\n | ObsidianWikiEmbed\n) & {\n data?: Record<string, unknown>;\n} {\n return (\n (node.type === \"obsidianWikilink\" || node.type === \"obsidianWikiEmbed\") &&\n typeof node.rawTarget === \"string\"\n );\n}\n\nfunction getResolvedSlug(node: SilicaMdastNode): string | undefined {\n const value = node.data?.silicaResolvedSlug;\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction getStringData(node: SilicaMdastNode, key: string): string | undefined {\n const value = (node.data as Record<string, unknown> | undefined)?.[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nasync function resolveEmbedNode(\n node: ObsidianWikiEmbed & { data?: Record<string, unknown> },\n context: RenderContext,\n): Promise<void> {\n if (!context.resolveEmbed) return;\n const maxDepth = context.maxEmbedDepth ?? 3;\n const depth = context.embedDepth ?? 0;\n if (depth >= maxDepth) return;\n const html = await context.resolveEmbed(node.linkTarget);\n if (!html) return;\n node.data = {\n ...node.data,\n silicaEmbedHtml: html,\n };\n}\n\nfunction assetEmbedToHast(\n context: RenderContext,\n node: ObsidianWikiEmbed,\n): HastNode {\n const kind = assetKind(node.rawTarget);\n const target =\n getStringData(node, \"silicaResolvedAssetPath\") ?? node.rawTarget;\n const src = assetUrl(context.assetBaseUrl ?? \"/silica\", target);\n const label =\n node.alias || node.rawTarget.split(\"/\").at(-1) || node.rawTarget;\n const dimensions = sizeProperties(\n node.embedSize ?? sizeFromParams(node.linkTarget.params),\n );\n\n if (kind === \"image\") {\n return {\n type: \"element\",\n tagName: \"img\",\n properties: {\n src,\n alt: label,\n ...dimensions,\n },\n children: [],\n };\n }\n\n if (kind === \"audio\" || kind === \"video\") {\n return {\n type: \"element\",\n tagName: kind,\n properties: {\n src,\n controls: true,\n ...dimensions,\n },\n children: [],\n };\n }\n\n return {\n type: \"element\",\n tagName: \"silica-embed\",\n properties: {\n src,\n \"data-embed-kind\": kind,\n \"data-embed-target\": node.rawTarget,\n ...dimensions,\n },\n children: [{ type: \"text\", value: label }],\n };\n}\n\nfunction targetFragment(node: ObsidianWikilink | ObsidianWikiEmbed): string {\n if (node.linkTarget.blockId) {\n return `#^${encodeURIComponent(node.linkTarget.blockId)}`;\n }\n if (node.linkTarget.heading) {\n return `#${slugifyHeading(node.linkTarget.heading)}`;\n }\n return \"\";\n}\n\nfunction applyImageSize(node: SilicaMdastNode) {\n const size = node.data?.obsidianEmbedSize as ObsidianEmbedSize | undefined;\n if (!size) return;\n node.data = {\n ...node.data,\n hProperties: {\n ...(node.data?.hProperties ?? {}),\n ...sizeProperties(size),\n },\n };\n}\n\nfunction sizeFromParams(\n params: Record<string, string> | undefined,\n): ObsidianEmbedSize | undefined {\n const height = Number(params?.height);\n if (!Number.isFinite(height) || height <= 0) return;\n return { width: 0, height };\n}\n\nfunction sizeProperties(size: ObsidianEmbedSize | undefined) {\n if (!size) return {};\n return {\n ...(size.width > 0 ? { width: size.width } : {}),\n ...(size.height ? { height: size.height } : {}),\n };\n}\n\nfunction rewriteAssetUrl(url: string, assetBaseUrl: string): string {\n if (!isAssetTarget(url)) return url;\n if (/^(?:https?:|#|\\/)/.test(url)) return url;\n return `${assetBaseUrl}/${url.replace(/^\\.?\\//, \"\")}`;\n}\n\nfunction resolveAssetTarget(\n context: RenderContext,\n target: string,\n): string | undefined {\n if (/^(?:https?:|#|\\/)/.test(target)) return undefined;\n const sourcePath = context.sourcePath ?? String(context.slug);\n const resolved =\n context.resolveAsset?.(sourcePath, target) ??\n (context.assetIndex\n ? resolveAssetPath(\n sourcePath,\n target,\n context.assetIndex,\n context.wikilinkStrategy ?? \"shortest\",\n context.ordering,\n )\n : undefined);\n return resolved ? `${resolved}${assetReferenceSuffix(target)}` : undefined;\n}\n\nfunction isAssetTarget(target: string): boolean {\n return /\\.(png|jpe?g|gif|webp|svg|pdf|mp4|mov|mp3|wav|ogg|canvas)(?:[?#].*)?$/i.test(\n target,\n );\n}\n\nfunction isImageTarget(target: string): boolean {\n return /\\.(png|jpe?g|gif|webp|svg)(?:[?#].*)?$/i.test(target);\n}\n\nfunction assetKind(\n target: string,\n): \"image\" | \"audio\" | \"video\" | \"pdf\" | \"canvas\" | \"file\" {\n if (isImageTarget(target)) return \"image\";\n if (/\\.(mp3|wav|ogg)(?:[?#].*)?$/i.test(target)) return \"audio\";\n if (/\\.(mp4|mov)(?:[?#].*)?$/i.test(target)) return \"video\";\n if (/\\.pdf(?:[?#].*)?$/i.test(target)) return \"pdf\";\n if (/\\.canvas(?:[?#].*)?$/i.test(target)) return \"canvas\";\n return \"file\";\n}\n\nfunction assetUrl(assetBaseUrl: string, target: string): string {\n const cleaned = stripEmbedOnlyParams(target);\n if (/^(?:https?:|#|\\/)/.test(cleaned)) return cleaned;\n return `${assetBaseUrl}/${cleaned.replace(/^\\/+/, \"\")}`;\n}\n\nfunction stripEmbedOnlyParams(target: string): string {\n const hashIndex = target.indexOf(\"#\");\n if (hashIndex === -1) return target;\n const before = target.slice(0, hashIndex);\n const fragment = target.slice(hashIndex + 1);\n if (!fragment.includes(\"=\")) return target;\n const params = new URLSearchParams(fragment);\n params.delete(\"height\");\n const remaining = params.toString();\n return remaining ? `${before}#${remaining}` : before;\n}\n\nfunction assetReferenceSuffix(target: string): string {\n const suffixIndexes = [target.indexOf(\"?\"), target.indexOf(\"#\")].filter(\n (index) => index >= 0,\n );\n const suffixIndex = Math.min(...suffixIndexes);\n return Number.isFinite(suffixIndex) ? target.slice(suffixIndex) : \"\";\n}\n\nfunction titleCase(value: string): string {\n return value\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part[0]!.toUpperCase() + part.slice(1))\n .join(\" \");\n}\n","import Slugger from \"github-slugger\";\nimport { toString } from \"hast-util-to-string\";\nimport { visit } from \"unist-util-visit\";\nimport type { BrokenLink, TocItem } from \"../types.js\";\nimport { hrefToSlug } from \"../path.js\";\n\ntype VFileLike = {\n data: Record<string, unknown>;\n};\n\ntype HastNode = {\n type: string;\n tagName?: string;\n value?: string;\n properties?: Record<string, unknown>;\n children?: HastNode[];\n};\n\nexport function rehypeCollectTocAndLinks() {\n return (tree: HastNode, file: VFileLike) => {\n const toc: TocItem[] = [];\n const links = new Set<string>();\n const slugger = new Slugger();\n\n visit(tree, \"element\", (node: HastNode) => {\n if (isHeading(node)) {\n const text = toString(node as never);\n const id = String(node.properties?.id ?? slugger.slug(text));\n node.properties = { ...node.properties, id };\n if (id !== \"footnote-label\") {\n toc.push({ id, text, depth: Number(node.tagName?.slice(1) ?? 2) });\n }\n }\n\n if (node.tagName === \"a\" && typeof node.properties?.href === \"string\") {\n const href = node.properties.href;\n if (href.startsWith(\"/\") && !href.startsWith(\"/silica/\")) {\n links.add(hrefToSlug(href));\n }\n }\n });\n\n file.data.toc = toc;\n file.data.links = [...links];\n };\n}\n\nexport function rehypeCleanFootnoteHeadings() {\n return (tree: HastNode) => {\n visit(tree, \"element\", (node: HastNode) => {\n if (node.properties?.id !== \"footnote-label\") return;\n const child = node.children?.[0];\n if (child?.tagName !== \"a\") return;\n node.children = child.children ?? [];\n });\n };\n}\n\nexport function rehypeExternalLinks() {\n return (tree: HastNode) => {\n visit(tree, \"element\", (node: HastNode) => {\n if (node.tagName !== \"a\" || typeof node.properties?.href !== \"string\")\n return;\n if (!/^https?:\\/\\//.test(node.properties.href)) return;\n node.properties = {\n ...node.properties,\n rel: \"noreferrer noopener\",\n target: \"_blank\",\n };\n });\n };\n}\n\nexport function rehypeUnwrapSilicaEmbeds() {\n return (tree: HastNode) => {\n unwrapStandaloneEmbeds(tree);\n };\n}\n\nexport function rehypeRestoreObsidianBlockIds() {\n return (tree: HastNode) => {\n restoreGeneratedFootnoteIds(tree);\n\n visit(tree, \"element\", (node: HastNode) => {\n if (node.tagName !== \"span\") return;\n const blockId = getStringProperty(\n node,\n \"dataSilicaBlockId\",\n \"data-silica-block-id\",\n );\n if (!blockId) return;\n node.properties = { ...node.properties, id: `^${blockId}` };\n });\n };\n}\n\nexport function getDataArray<T>(\n data: Record<string, unknown>,\n key: string,\n): T[] {\n const value = data[key];\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\nexport function mergeBrokenLinks(\n a: BrokenLink[],\n b: BrokenLink[],\n): BrokenLink[] {\n const seen = new Set<string>();\n const merged: BrokenLink[] = [];\n for (const item of [...a, ...b]) {\n const key = `${item.source}\\0${item.target}`;\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(item);\n }\n return merged;\n}\n\nfunction isHeading(node: HastNode): boolean {\n return node.type === \"element\" && /^h[1-6]$/.test(node.tagName ?? \"\");\n}\n\nfunction getStringProperty(\n node: HastNode,\n camelCaseKey: string,\n kebabCaseKey: string,\n): string | undefined {\n const value =\n node.properties?.[camelCaseKey] ?? node.properties?.[kebabCaseKey];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction restoreGeneratedFootnoteIds(node: HastNode, inFootnotes = false) {\n const isFootnotes = inFootnotes || isFootnotesSection(node);\n if (isFootnotes || isFootnoteReference(node)) {\n normalizeGeneratedFootnoteProperties(node);\n }\n\n for (const child of node.children ?? []) {\n restoreGeneratedFootnoteIds(child, isFootnotes);\n }\n}\n\nfunction normalizeGeneratedFootnoteProperties(node: HastNode) {\n if (!node.properties) return;\n normalizeProperty(node, \"id\");\n normalizeProperty(node, \"href\");\n normalizeProperty(node, \"ariaDescribedBy\");\n normalizeProperty(node, \"aria-describedby\");\n}\n\nfunction normalizeProperty(node: HastNode, key: string) {\n const value = node.properties?.[key];\n if (typeof value !== \"string\") return;\n node.properties = {\n ...node.properties,\n [key]: normalizeGeneratedFootnoteReference(value),\n };\n}\n\nfunction normalizeGeneratedFootnoteReference(value: string): string {\n const prefix = value.startsWith(\"#\") ? \"#\" : \"\";\n const id = prefix ? value.slice(1) : value;\n if (id === \"user-content-footnote-label\") return `${prefix}footnote-label`;\n if (id.startsWith(\"user-content-user-content-fn\")) {\n return `${prefix}${id.replace(/^user-content-/, \"\")}`;\n }\n return value;\n}\n\nfunction isFootnotesSection(node: HastNode): boolean {\n return (\n node.tagName === \"section\" &&\n hasProperty(node, \"dataFootnotes\", \"data-footnotes\")\n );\n}\n\nfunction isFootnoteReference(node: HastNode): boolean {\n return (\n node.tagName === \"a\" &&\n hasProperty(node, \"dataFootnoteRef\", \"data-footnote-ref\")\n );\n}\n\nfunction hasProperty(\n node: HastNode,\n camelCaseKey: string,\n kebabCaseKey: string,\n): boolean {\n return (\n node.properties?.[camelCaseKey] !== undefined ||\n node.properties?.[kebabCaseKey] !== undefined\n );\n}\n\nfunction unwrapStandaloneEmbeds(parent: HastNode) {\n if (!parent.children) return;\n\n parent.children = parent.children.map((child) => {\n unwrapStandaloneEmbeds(child);\n if (child.tagName !== \"p\") return child;\n\n const renderedChildren = child.children?.filter(\n (candidate) => !isWhitespaceText(candidate),\n );\n const onlyChild = renderedChildren?.[0];\n if (renderedChildren?.length === 1 && isStandaloneEmbed(onlyChild)) {\n return onlyChild;\n }\n return child;\n });\n}\n\nfunction isStandaloneEmbed(node: HastNode | undefined): node is HastNode {\n if (node?.tagName === \"silica-embed\") return true;\n if (node?.tagName !== \"figure\") return false;\n const kind =\n node.properties?.dataEmbedKind ?? node.properties?.[\"data-embed-kind\"];\n return kind === \"note\";\n}\n\nfunction isWhitespaceText(node: HastNode): boolean {\n return node.type === \"text\" && /^\\s*$/.test(node.value ?? \"\");\n}\n"],"mappings":"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","names":["unified","remarkParse","remarkObsidian","slugifyHeading","isAssetTarget","targetFragment","slugifyHeading","visit","visit","unified","remarkParse","remarkObsidian"]}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { q as SilicaConfig, l as ResolvedSilicaConfig, P as PrecomputeResult } from './theme-DuygYyeF.js';
2
- export { A as AnalyzeResult, a as AssetResolutionEntry, b as AssetResolutionIndex, B as BrokenLink, F as FilePath, c as FullSlug, G as Graph, M as Manifest, d as ManifestEntry, e as MarkdownComponents, N as Navigation, f as NavigationEntry, g as PrerenderManifest, h as PrerenderSelectorContext, R as RelativeURL, i as RenderCacheState, j as RenderContext, k as RenderResult, m as ResolvedSilicaPrerenderConfig, n as ResolvedSilicaRenderConfig, S as SilicaAuthConfig, o as SilicaCalloutProps, p as SilicaCodeBlockProps, r as SilicaEmbedProps, s as SilicaMermaidProps, t as SilicaNextConfig, u as SilicaNextConfigOverride, v as SilicaPrerenderConfig, w as SilicaPrerenderSelectionOptions, x as SilicaRenderConfig, y as SilicaTheme, z as SimpleSlug, T as ThemeBacklink, C as ThemeBreadcrumb, D as ThemeConfig, E as ThemeLayoutConfig, H as ThemePage, I as ThemePageProps, J as ThemeProviderComponent, K as ThemeRootLayoutProps, L as ThemeSiteLayoutProps, O as TocItem, W as WikiLinkResolutionIndex, Q as asFilePath, U as asFullSlug, V as asRelativeURL, X as asSimpleSlug, Y as createAssetResolutionIndex, Z as createWikiLinkResolutionIndex, _ as hrefToSlug, $ as joinSegments, a0 as normalizeAssetReference, a1 as normalizePath, a2 as normalizeSlug, a3 as pathToRoot, a4 as resolveAssetPath, a5 as resolveRelative, a6 as resolveRelativeAsset, a7 as resolveWikiLink, a8 as simplifySlug, a9 as slugToHref, aa as slugifyAssetPath, ab as slugifyFilePath, ac as slugifySegment } from './theme-DuygYyeF.js';
3
- export { PageProperty, analyzeMarkdown, formatPropertyLabel, formatPropertyValue, generateDescriptionFromContent, getDescription, getMenuLabel, getMetaDescription, getPageProperties, getTitle, renderMarkdown, renderMarkdownHtml, tagToHref } from './runtime.js';
1
+ import { t as SilicaConfig, o as ResolvedSilicaConfig, i as PrecomputeResult } from './theme-D67Ma7mz.js';
2
+ export { A as AnalyzeResult, a as AssetResolutionEntry, b as AssetResolutionIndex, B as BrokenLink, F as FilePath, c as FullSlug, G as Graph, M as Manifest, d as ManifestEntry, e as MarkdownComponents, N as Navigation, f as NavigationEntry, P as PageProperty, g as PagePropertyPart, h as PagePropertyResolution, j as PrerenderManifest, k as PrerenderSelectorContext, R as RelativeURL, l as RenderCacheState, m as RenderContext, n as RenderResult, p as ResolvedSilicaPrerenderConfig, q as ResolvedSilicaRenderConfig, S as SilicaAuthConfig, r as SilicaCalloutProps, s as SilicaCodeBlockProps, u as SilicaEmbedProps, v as SilicaMermaidProps, w as SilicaNextConfig, x as SilicaNextConfigOverride, y as SilicaPrerenderConfig, z as SilicaPrerenderSelectionOptions, C as SilicaRenderConfig, D as SilicaTheme, E as SimpleSlug, T as ThemeBacklink, H as ThemeBreadcrumb, I as ThemeConfig, J as ThemeLayoutConfig, K as ThemePage, L as ThemePageProps, O as ThemeProviderComponent, Q as ThemeRootLayoutProps, U as ThemeSiteLayoutProps, V as TocItem, W as WikiLinkResolutionIndex, X as analyzePagePropertyLinks, Y as asFilePath, Z as asFullSlug, _ as asRelativeURL, $ as asSimpleSlug, a0 as createAssetResolutionIndex, a1 as createWikiLinkResolutionIndex, a2 as formatPropertyLabel, a3 as formatPropertyValue, a4 as getMenuLabel, a5 as getPageProperties, a6 as getResolvedPageProperties, a7 as hrefToSlug, a8 as joinSegments, a9 as normalizeAssetReference, aa as normalizePath, ab as normalizeSlug, ac as pathToRoot, ad as resolveAssetPath, ae as resolvePagePropertyValue, af as resolveRelative, ag as resolveRelativeAsset, ah as resolveWikiLink, ai as simplifySlug, aj as slugToHref, ak as slugifyAssetPath, al as slugifyFilePath, am as slugifySegment } from './theme-D67Ma7mz.js';
3
+ export { analyzeMarkdown, generateDescriptionFromContent, getDescription, getMetaDescription, getTitle, renderMarkdown, renderMarkdownHtml, tagToHref } from './runtime.js';
4
4
  import 'react';
5
5
  import '@silicajs/search';
6
6
  import '@silicajs/remark-obsidian';
package/dist/index.js CHANGED
@@ -1,20 +1,20 @@
1
- import {
2
- formatPropertyLabel,
3
- formatPropertyValue,
4
- getMenuLabel,
5
- getPageProperties
6
- } from "./chunk-HFUUGJO6.js";
7
1
  import {
8
2
  analyzeMarkdown,
3
+ analyzePagePropertyLinks,
9
4
  asFilePath,
10
5
  asFullSlug,
11
6
  asRelativeURL,
12
7
  asSimpleSlug,
13
8
  createAssetResolutionIndex,
14
9
  createWikiLinkResolutionIndex,
10
+ formatPropertyLabel,
11
+ formatPropertyValue,
15
12
  generateDescriptionFromContent,
16
13
  getDescription,
14
+ getMenuLabel,
17
15
  getMetaDescription,
16
+ getPageProperties,
17
+ getResolvedPageProperties,
18
18
  getTitle,
19
19
  hasNumericPrefixInPath,
20
20
  hrefToSlug,
@@ -27,6 +27,7 @@ import {
27
27
  renderMarkdown,
28
28
  renderMarkdownHtml,
29
29
  resolveAssetPath,
30
+ resolvePagePropertyValue,
30
31
  resolveRelative,
31
32
  resolveRelativeAsset,
32
33
  resolveWikiLink,
@@ -37,7 +38,7 @@ import {
37
38
  slugifySegment,
38
39
  stripNumericPrefix,
39
40
  tagToHref
40
- } from "./chunk-2EKH4A4V.js";
41
+ } from "./chunk-4A6TRY75.js";
41
42
 
42
43
  // src/config.ts
43
44
  import path from "path";
@@ -1119,6 +1120,7 @@ function titleFromFilePath(relativePath, ordering) {
1119
1120
  }
1120
1121
  export {
1121
1122
  analyzeMarkdown,
1123
+ analyzePagePropertyLinks,
1122
1124
  asFilePath,
1123
1125
  asFullSlug,
1124
1126
  asRelativeURL,
@@ -1134,6 +1136,7 @@ export {
1134
1136
  getMenuLabel,
1135
1137
  getMetaDescription,
1136
1138
  getPageProperties,
1139
+ getResolvedPageProperties,
1137
1140
  getTitle,
1138
1141
  hrefToSlug,
1139
1142
  isMarkdownFile,
@@ -1148,6 +1151,7 @@ export {
1148
1151
  renderMarkdownHtml,
1149
1152
  resolveAssetPath,
1150
1153
  resolveConfig,
1154
+ resolvePagePropertyValue,
1151
1155
  resolvePublicAssetPath,
1152
1156
  resolveRelative,
1153
1157
  resolveRelativeAsset,