@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.
- package/dist/{chunk-BEINUFYU.js → chunk-2EKH4A4V.js} +128 -5
- package/dist/chunk-2EKH4A4V.js.map +1 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.js +113 -24
- package/dist/index.js.map +1 -1
- package/dist/precompute-worker.js +5 -1
- package/dist/precompute-worker.js.map +1 -1
- package/dist/runtime.d.ts +2 -2
- package/dist/runtime.js +11 -1
- package/dist/{theme-BK5ZRXFG.d.ts → theme-DuygYyeF.d.ts} +18 -2
- package/dist/theme.d.ts +1 -1
- package/package.json +2 -2
- package/dist/chunk-BEINUFYU.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/path.ts
|
|
2
2
|
import path from "path";
|
|
3
|
-
var NUMERIC_PREFIX_RE = /^(\d
|
|
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(
|
|
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(
|
|
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
|
|
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-
|
|
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 {
|
|
2
|
-
export { A as AnalyzeResult, B as BrokenLink, F as FilePath,
|
|
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
|
-
|
|
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
|
-
|
|
29
|
+
sourcePath: string;
|
|
30
|
+
assetPath: string;
|
|
30
31
|
};
|
|
31
32
|
type ContentScan = {
|
|
32
33
|
markdown: ContentMarkdownFile[];
|