@silicajs/core 0.5.1 → 0.6.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.
@@ -33,6 +33,17 @@ function normalizeSlug(value, options = {}) {
33
33
  const parts = cleaned.split("/").filter(Boolean).map((part) => slugifySegment(part, options));
34
34
  return (parts.join("/") || "index").replace(/\/index\/index$/, "/index");
35
35
  }
36
+ function normalizeAssetReference(value, options = {}) {
37
+ const cleaned = normalizePath(stripAssetReferenceSuffix(value)).replace(
38
+ /^\.\//,
39
+ ""
40
+ );
41
+ const parts = cleaned.split("/").filter(Boolean).map((part) => normalizeAssetSegment(part, options)).filter(Boolean);
42
+ return parts.join("/");
43
+ }
44
+ function slugifyAssetPath(sourcePath, options = {}) {
45
+ return normalizeAssetReference(sourcePath, options);
46
+ }
36
47
  function slugifyFilePath(filePath, contentDir = "content", options = {}) {
37
48
  const normalizedFile = normalizePath(filePath);
38
49
  const normalizedContent = normalizePath(contentDir);
@@ -87,6 +98,25 @@ function createWikiLinkResolutionIndex(allSlugs, options = {}) {
87
98
  }
88
99
  return { candidates, uniqueSlugByBasename };
89
100
  }
101
+ function createAssetResolutionIndex(assets, options = {}) {
102
+ const assetPathBySourcePath = /* @__PURE__ */ new Map();
103
+ const assetPathByBasename = /* @__PURE__ */ new Map();
104
+ for (const asset of assets) {
105
+ const sourcePath = normalizePath(asset.sourcePath);
106
+ const assetPath = normalizePath(asset.assetPath);
107
+ addUniqueCandidate(
108
+ assetPathBySourcePath,
109
+ normalizeAssetReference(sourcePath, options),
110
+ assetPath
111
+ );
112
+ addUniqueCandidate(
113
+ assetPathByBasename,
114
+ normalizeAssetReference(path.posix.basename(sourcePath), options),
115
+ assetPath
116
+ );
117
+ }
118
+ return { assetPathBySourcePath, assetPathByBasename };
119
+ }
90
120
  function resolveWikiLink(currentSlug, target, index, strategy = "shortest", options = {}) {
91
121
  const [rawPath] = target.split("#");
92
122
  const normalizedTarget = normalizeSlug(rawPath ?? target, options);
@@ -104,6 +134,31 @@ function resolveWikiLink(currentSlug, target, index, strategy = "shortest", opti
104
134
  const byBasename = index.uniqueSlugByBasename.get(targetBasename);
105
135
  return byBasename ? asFullSlug(byBasename) : void 0;
106
136
  }
137
+ function resolveAssetPath(currentSourcePath, target, index, strategy = "shortest", options = {}) {
138
+ if (/^(?:https?:|#|\/)/.test(target)) return void 0;
139
+ const normalizedTarget = normalizeAssetReference(target, options);
140
+ if (!normalizedTarget) return void 0;
141
+ const isExplicitRelative = isExplicitRelativeAssetReference(target);
142
+ if (isExplicitRelative || strategy === "relative") {
143
+ const relative = resolveRelativeAsset(currentSourcePath, target, options);
144
+ const resolved = uniqueValue(index.assetPathBySourcePath, relative);
145
+ if (resolved || isExplicitRelative) return resolved;
146
+ }
147
+ if (strategy === "absolute") {
148
+ return uniqueValue(index.assetPathBySourcePath, normalizedTarget);
149
+ }
150
+ return uniqueValue(index.assetPathBySourcePath, normalizedTarget) ?? uniqueValue(
151
+ index.assetPathByBasename,
152
+ normalizedTarget.split("/").at(-1) ?? ""
153
+ );
154
+ }
155
+ function resolveRelativeAsset(currentSourcePath, target, options = {}) {
156
+ const currentDir = normalizePath(currentSourcePath).split("/").slice(0, -1).join("/");
157
+ return normalizeAssetReference(
158
+ path.posix.join(currentDir, stripAssetReferenceSuffix(target)),
159
+ options
160
+ );
161
+ }
107
162
  function joinSegments(...segments) {
108
163
  return normalizePath(segments.filter(Boolean).join("/"));
109
164
  }
@@ -111,6 +166,37 @@ function basenameForNormalizedSlug(slug) {
111
166
  const simplified = slug === "index" ? "" : slug.replace(/\/index$/, "");
112
167
  return simplified.split("/").at(-1) ?? "";
113
168
  }
169
+ function normalizeAssetSegment(segment, options = {}) {
170
+ const extension = path.posix.extname(segment);
171
+ if (!extension) return slugifySegment(segment, options);
172
+ const stem = segment.slice(0, -extension.length);
173
+ const normalizedStem = slugifySegment(stem, options);
174
+ return normalizedStem ? `${normalizedStem}${extension.toLowerCase()}` : "";
175
+ }
176
+ function stripAssetReferenceSuffix(value) {
177
+ const suffixIndexes = [value.indexOf("?"), value.indexOf("#")].filter(
178
+ (index) => index >= 0
179
+ );
180
+ const suffixIndex = Math.min(...suffixIndexes);
181
+ return Number.isFinite(suffixIndex) ? value.slice(0, suffixIndex) : value;
182
+ }
183
+ function isExplicitRelativeAssetReference(value) {
184
+ return /^\.{1,2}\//.test(normalizePath(stripAssetReferenceSuffix(value)));
185
+ }
186
+ function addUniqueCandidate(candidates, key, value) {
187
+ if (!key) return;
188
+ const existing = candidates.get(key);
189
+ if (existing === void 0) {
190
+ candidates.set(key, value);
191
+ return;
192
+ }
193
+ if (existing !== value) {
194
+ candidates.set(key, null);
195
+ }
196
+ }
197
+ function uniqueValue(candidates, key) {
198
+ return candidates.get(key) ?? void 0;
199
+ }
114
200
  function numericPrefixSortSegment(segment) {
115
201
  const match = NUMERIC_PREFIX_RE.exec(segment);
116
202
  if (!match) {
@@ -265,7 +351,10 @@ function remarkSilicaObsidian(context) {
265
351
  transformInlineFootnotes(tree);
266
352
  visit(tree, (node) => {
267
353
  if (node.type === "image" && typeof node.url === "string") {
268
- node.url = rewriteAssetUrl(node.url, assetBaseUrl);
354
+ node.url = rewriteAssetUrl(
355
+ resolveAssetTarget(context, node.url) ?? node.url,
356
+ assetBaseUrl
357
+ );
269
358
  applyImageSize(node);
270
359
  return;
271
360
  }
@@ -275,6 +364,13 @@ function remarkSilicaObsidian(context) {
275
364
  }
276
365
  const targetPath = node.linkTarget.path || String(context.slug);
277
366
  if (node.type === "obsidianWikiEmbed" && isAssetTarget(node.rawTarget)) {
367
+ const resolvedAsset = resolveAssetTarget(context, node.rawTarget);
368
+ if (resolvedAsset) {
369
+ node.data = {
370
+ ...node.data,
371
+ silicaResolvedAssetPath: resolvedAsset
372
+ };
373
+ }
278
374
  return;
279
375
  }
280
376
  const resolved = resolveWikiTarget(context, targetPath);
@@ -455,7 +551,8 @@ async function resolveEmbedNode(node, context) {
455
551
  }
456
552
  function assetEmbedToHast(context, node) {
457
553
  const kind = assetKind(node.rawTarget);
458
- const src = assetUrl(context.assetBaseUrl ?? "/silica", node.rawTarget);
554
+ const target = getStringData(node, "silicaResolvedAssetPath") ?? node.rawTarget;
555
+ const src = assetUrl(context.assetBaseUrl ?? "/silica", target);
459
556
  const label = node.alias || node.rawTarget.split("/").at(-1) || node.rawTarget;
460
557
  const dimensions = sizeProperties(
461
558
  node.embedSize ?? sizeFromParams(node.linkTarget.params)
@@ -533,6 +630,18 @@ function rewriteAssetUrl(url, assetBaseUrl) {
533
630
  if (/^(?:https?:|#|\/)/.test(url)) return url;
534
631
  return `${assetBaseUrl}/${url.replace(/^\.?\//, "")}`;
535
632
  }
633
+ function resolveAssetTarget(context, target) {
634
+ if (/^(?:https?:|#|\/)/.test(target)) return void 0;
635
+ const sourcePath = context.sourcePath ?? String(context.slug);
636
+ const resolved = context.resolveAsset?.(sourcePath, target) ?? (context.assetIndex ? resolveAssetPath(
637
+ sourcePath,
638
+ target,
639
+ context.assetIndex,
640
+ context.wikilinkStrategy ?? "shortest",
641
+ context.ordering
642
+ ) : void 0);
643
+ return resolved ? `${resolved}${assetReferenceSuffix(target)}` : void 0;
644
+ }
536
645
  function isAssetTarget(target) {
537
646
  return /\.(png|jpe?g|gif|webp|svg|pdf|mp4|mov|mp3|wav|ogg|canvas)(?:[?#].*)?$/i.test(
538
647
  target
@@ -565,6 +674,13 @@ function stripEmbedOnlyParams(target) {
565
674
  const remaining = params.toString();
566
675
  return remaining ? `${before}#${remaining}` : before;
567
676
  }
677
+ function assetReferenceSuffix(target) {
678
+ const suffixIndexes = [target.indexOf("?"), target.indexOf("#")].filter(
679
+ (index) => index >= 0
680
+ );
681
+ const suffixIndex = Math.min(...suffixIndexes);
682
+ return Number.isFinite(suffixIndex) ? target.slice(suffixIndex) : "";
683
+ }
568
684
  function titleCase(value) {
569
685
  return value.split(/[-_\s]+/).filter(Boolean).map((part) => part[0].toUpperCase() + part.slice(1)).join(" ");
570
686
  }
@@ -1017,6 +1133,8 @@ export {
1017
1133
  stripNumericPrefix,
1018
1134
  slugifySegment,
1019
1135
  normalizeSlug,
1136
+ normalizeAssetReference,
1137
+ slugifyAssetPath,
1020
1138
  slugifyFilePath,
1021
1139
  hasNumericPrefixInPath,
1022
1140
  numericPrefixSortKey,
@@ -1026,7 +1144,10 @@ export {
1026
1144
  pathToRoot,
1027
1145
  resolveRelative,
1028
1146
  createWikiLinkResolutionIndex,
1147
+ createAssetResolutionIndex,
1029
1148
  resolveWikiLink,
1149
+ resolveAssetPath,
1150
+ resolveRelativeAsset,
1030
1151
  joinSegments,
1031
1152
  tagToHref,
1032
1153
  renderMarkdown,
@@ -1037,4 +1158,4 @@ export {
1037
1158
  generateDescriptionFromContent,
1038
1159
  getMetaDescription
1039
1160
  };
1040
- //# sourceMappingURL=chunk-2TXWBKM4.js.map
1161
+ //# sourceMappingURL=chunk-2EKH4A4V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/path.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};\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\n for (const slug of candidates) {\n const basename = basenameForNormalizedSlug(slug);\n if (!basename) continue;\n if (uniqueSlugByBasename.has(basename)) {\n uniqueSlugByBasename.set(basename, null);\n continue;\n }\n uniqueSlugByBasename.set(basename, slug);\n }\n\n return { candidates, uniqueSlugByBasename };\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 return byBasename ? asFullSlug(byBasename) : undefined;\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 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 { 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 {\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 brokenLinks = getDataArray<{ target: string }>(\n file.data,\n \"silicaObsidianBrokenLinks\",\n ).map((link) => ({ source: String(context.slug), target: link.target }));\n const description = getDescription(frontmatter);\n\n return {\n frontmatter,\n links: getDataArray<string>(file.data, \"silicaObsidianLinks\"),\n embeds: getDataArray<string>(file.data, \"silicaObsidianEmbeds\"),\n 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":["visit","visit"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { o as SilicaConfig, j as ResolvedSilicaConfig, P as PrecomputeResult } from './theme-BK5ZRXFG.js';
2
- export { A as AnalyzeResult, B as BrokenLink, F as FilePath, a as FullSlug, G as Graph, M as Manifest, b as ManifestEntry, c as MarkdownComponents, N as Navigation, d as NavigationEntry, e as PrerenderManifest, f as PrerenderSelectorContext, R as RelativeURL, g as RenderCacheState, h as RenderContext, i as RenderResult, k as ResolvedSilicaPrerenderConfig, l as ResolvedSilicaRenderConfig, S as SilicaAuthConfig, m as SilicaCalloutProps, n as SilicaCodeBlockProps, p as SilicaEmbedProps, q as SilicaMermaidProps, r as SilicaNextConfig, s as SilicaNextConfigOverride, t as SilicaPrerenderConfig, u as SilicaPrerenderSelectionOptions, v as SilicaRenderConfig, w as SilicaTheme, x as SimpleSlug, T as ThemeBacklink, y as ThemeBreadcrumb, z as ThemeConfig, C as ThemeLayoutConfig, D as ThemePage, E as ThemePageProps, H as ThemeProviderComponent, I as ThemeRootLayoutProps, J as ThemeSiteLayoutProps, K as TocItem, W as WikiLinkResolutionIndex, L as asFilePath, O as asFullSlug, Q as asRelativeURL, U as asSimpleSlug, V as createWikiLinkResolutionIndex, X as hrefToSlug, Y as joinSegments, Z as normalizePath, _ as normalizeSlug, $ as pathToRoot, a0 as resolveRelative, a1 as resolveWikiLink, a2 as simplifySlug, a3 as slugToHref, a4 as slugifyFilePath, a5 as slugifySegment } from './theme-BK5ZRXFG.js';
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
3
  export { PageProperty, analyzeMarkdown, formatPropertyLabel, formatPropertyValue, generateDescriptionFromContent, getDescription, getMenuLabel, getMetaDescription, getPageProperties, getTitle, renderMarkdown, renderMarkdownHtml, tagToHref } from './runtime.js';
4
4
  import 'react';
5
5
  import '@silicajs/search';
@@ -14,7 +14,7 @@ declare function resolvePublicAssetPath(asset?: string): string | undefined;
14
14
 
15
15
  type ContentMarkdownFile = {
16
16
  absolutePath: string;
17
- relativePath: string;
17
+ sourcePath: string;
18
18
  slug: string;
19
19
  raw: string;
20
20
  body: string;
@@ -26,7 +26,8 @@ type ContentMarkdownFile = {
26
26
  };
27
27
  type ContentAssetFile = {
28
28
  absolutePath: string;
29
- relativePath: string;
29
+ sourcePath: string;
30
+ assetPath: string;
30
31
  };
31
32
  type ContentScan = {
32
33
  markdown: ContentMarkdownFile[];