@silicajs/core 0.5.0 → 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.
@@ -1,6 +1,6 @@
1
1
  // src/path.ts
2
2
  import path from "path";
3
- var NUMERIC_PREFIX_RE = /^(\d+)[\s._-]+(.+)$/;
3
+ var NUMERIC_PREFIX_RE = /^(\d{1,2}|0\d+|\d{3,}(?=[._]))(?:[\s._]+|-(?!\d{1,2}(?:\D|$)))(.+)$/;
4
4
  var DOCUMENT_EXTENSION_RE = /\.(md|markdown|mdx)$/i;
5
5
  var UNORDERED_SEGMENT_SORT_PREFIX = "~~~~~~~~~~";
6
6
  function asFilePath(value) {
@@ -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);
@@ -71,7 +82,9 @@ function resolveRelative(currentSlug, target, options = {}) {
71
82
  }
72
83
  function createWikiLinkResolutionIndex(allSlugs, options = {}) {
73
84
  const candidates = new Set(
74
- allSlugs.map((slug) => normalizeSlug(slug, options))
85
+ allSlugs.map(
86
+ (slug) => normalizeSlug(slug, { ...options, numericPrefixes: false })
87
+ )
75
88
  );
76
89
  const uniqueSlugByBasename = /* @__PURE__ */ new Map();
77
90
  for (const slug of candidates) {
@@ -85,6 +98,25 @@ function createWikiLinkResolutionIndex(allSlugs, options = {}) {
85
98
  }
86
99
  return { candidates, uniqueSlugByBasename };
87
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
+ }
88
120
  function resolveWikiLink(currentSlug, target, index, strategy = "shortest", options = {}) {
89
121
  const [rawPath] = target.split("#");
90
122
  const normalizedTarget = normalizeSlug(rawPath ?? target, options);
@@ -102,6 +134,31 @@ function resolveWikiLink(currentSlug, target, index, strategy = "shortest", opti
102
134
  const byBasename = index.uniqueSlugByBasename.get(targetBasename);
103
135
  return byBasename ? asFullSlug(byBasename) : void 0;
104
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
+ }
105
162
  function joinSegments(...segments) {
106
163
  return normalizePath(segments.filter(Boolean).join("/"));
107
164
  }
@@ -109,6 +166,37 @@ function basenameForNormalizedSlug(slug) {
109
166
  const simplified = slug === "index" ? "" : slug.replace(/\/index$/, "");
110
167
  return simplified.split("/").at(-1) ?? "";
111
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
+ }
112
200
  function numericPrefixSortSegment(segment) {
113
201
  const match = NUMERIC_PREFIX_RE.exec(segment);
114
202
  if (!match) {
@@ -263,7 +351,10 @@ function remarkSilicaObsidian(context) {
263
351
  transformInlineFootnotes(tree);
264
352
  visit(tree, (node) => {
265
353
  if (node.type === "image" && typeof node.url === "string") {
266
- node.url = rewriteAssetUrl(node.url, assetBaseUrl);
354
+ node.url = rewriteAssetUrl(
355
+ resolveAssetTarget(context, node.url) ?? node.url,
356
+ assetBaseUrl
357
+ );
267
358
  applyImageSize(node);
268
359
  return;
269
360
  }
@@ -273,6 +364,13 @@ function remarkSilicaObsidian(context) {
273
364
  }
274
365
  const targetPath = node.linkTarget.path || String(context.slug);
275
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
+ }
276
374
  return;
277
375
  }
278
376
  const resolved = resolveWikiTarget(context, targetPath);
@@ -453,7 +551,8 @@ async function resolveEmbedNode(node, context) {
453
551
  }
454
552
  function assetEmbedToHast(context, node) {
455
553
  const kind = assetKind(node.rawTarget);
456
- const src = assetUrl(context.assetBaseUrl ?? "/silica", node.rawTarget);
554
+ const target = getStringData(node, "silicaResolvedAssetPath") ?? node.rawTarget;
555
+ const src = assetUrl(context.assetBaseUrl ?? "/silica", target);
457
556
  const label = node.alias || node.rawTarget.split("/").at(-1) || node.rawTarget;
458
557
  const dimensions = sizeProperties(
459
558
  node.embedSize ?? sizeFromParams(node.linkTarget.params)
@@ -531,6 +630,18 @@ function rewriteAssetUrl(url, assetBaseUrl) {
531
630
  if (/^(?:https?:|#|\/)/.test(url)) return url;
532
631
  return `${assetBaseUrl}/${url.replace(/^\.?\//, "")}`;
533
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
+ }
534
645
  function isAssetTarget(target) {
535
646
  return /\.(png|jpe?g|gif|webp|svg|pdf|mp4|mov|mp3|wav|ogg|canvas)(?:[?#].*)?$/i.test(
536
647
  target
@@ -563,6 +674,13 @@ function stripEmbedOnlyParams(target) {
563
674
  const remaining = params.toString();
564
675
  return remaining ? `${before}#${remaining}` : before;
565
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
+ }
566
684
  function titleCase(value) {
567
685
  return value.split(/[-_\s]+/).filter(Boolean).map((part) => part[0].toUpperCase() + part.slice(1)).join(" ");
568
686
  }
@@ -1015,6 +1133,8 @@ export {
1015
1133
  stripNumericPrefix,
1016
1134
  slugifySegment,
1017
1135
  normalizeSlug,
1136
+ normalizeAssetReference,
1137
+ slugifyAssetPath,
1018
1138
  slugifyFilePath,
1019
1139
  hasNumericPrefixInPath,
1020
1140
  numericPrefixSortKey,
@@ -1024,7 +1144,10 @@ export {
1024
1144
  pathToRoot,
1025
1145
  resolveRelative,
1026
1146
  createWikiLinkResolutionIndex,
1147
+ createAssetResolutionIndex,
1027
1148
  resolveWikiLink,
1149
+ resolveAssetPath,
1150
+ resolveRelativeAsset,
1028
1151
  joinSegments,
1029
1152
  tagToHref,
1030
1153
  renderMarkdown,
@@ -1035,4 +1158,4 @@ export {
1035
1158
  generateDescriptionFromContent,
1036
1159
  getMetaDescription
1037
1160
  };
1038
- //# sourceMappingURL=chunk-BEINUFYU.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[];