@dogsbay/format-obsidian 0.2.0-beta.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/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { FormatPlugin } from "@dogsbay/types";
2
+ export declare const plugin: FormatPlugin;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AAKxE,eAAO,MAAM,MAAM,EAAE,YAiDpB,CAAC"}
package/dist/cli.js ADDED
@@ -0,0 +1,161 @@
1
+ import { existsSync, mkdirSync, writeFileSync, cpSync, readdirSync, statSync } from "node:fs";
2
+ import { join, dirname, resolve, relative } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { exportObsidianVault } from "./project.js";
5
+ const PLUGIN_ID = "dogsbay-docs";
6
+ export const plugin = {
7
+ name: "obsidian",
8
+ canImport: false,
9
+ canExport: true,
10
+ detectSource: (path) => existsSync(join(path, ".obsidian")),
11
+ importOptions: [],
12
+ exportOptions: [
13
+ { flags: "--tabs <mode>", description: "Tab handling: dogsbay-tabs (default) or flatten", default: "dogsbay-tabs" },
14
+ { flags: "--plugin <mode>", description: "Plugin setup: bundled (copy into vault), registry (list only), none", default: "bundled" },
15
+ ],
16
+ async export(pages, nav, output, opts) {
17
+ const pluginMode = opts.plugin ?? "bundled";
18
+ const result = exportObsidianVault(pages, nav, {
19
+ vaultName: opts.siteName,
20
+ section: opts.section,
21
+ });
22
+ // Write all vault files to disk
23
+ for (const [filePath, content] of result.files) {
24
+ const fullPath = join(output, filePath);
25
+ mkdirSync(dirname(fullPath), { recursive: true });
26
+ writeFileSync(fullPath, content);
27
+ }
28
+ console.log(`Generated ${result.files.size} vault files`);
29
+ // Copy images from source docs directory into vault
30
+ const sourceDir = opts.sourceDir;
31
+ if (sourceDir) {
32
+ copyImages(sourceDir, output);
33
+ }
34
+ // Set up plugin
35
+ if (pluginMode === "bundled") {
36
+ installBundledPlugin(output);
37
+ }
38
+ else if (pluginMode === "registry") {
39
+ installRegistryRef(output);
40
+ }
41
+ // Pre-configure Front Matter Title plugin (graph view shows title, not filename)
42
+ installFrontMatterTitleConfig(output);
43
+ },
44
+ };
45
+ /**
46
+ * Copy built plugin files into the vault's .obsidian/plugins/ directory.
47
+ * User just needs to enable it in Obsidian settings.
48
+ */
49
+ function installBundledPlugin(vaultDir) {
50
+ const pluginDistDir = resolvePluginDist();
51
+ if (!pluginDistDir) {
52
+ console.warn("Warning: Dogsbay Obsidian plugin not found — skipping plugin bundling.");
53
+ console.warn(" Build the plugin first: cd ../dogsbay-obsidian/plugin && pnpm build");
54
+ // Fall back to registry ref so the vault at least knows it wants the plugin
55
+ installRegistryRef(vaultDir);
56
+ return;
57
+ }
58
+ const destDir = join(vaultDir, ".obsidian", "plugins", PLUGIN_ID);
59
+ mkdirSync(destDir, { recursive: true });
60
+ for (const file of ["manifest.json", "main.js", "styles.css"]) {
61
+ const src = join(pluginDistDir, file);
62
+ if (existsSync(src)) {
63
+ cpSync(src, join(destDir, file));
64
+ }
65
+ }
66
+ // Write community-plugins.json listing our plugin + recommended plugins
67
+ const obsidianDir = join(vaultDir, ".obsidian");
68
+ writeFileSync(join(obsidianDir, "community-plugins.json"), JSON.stringify(RECOMMENDED_PLUGINS, null, 2) + "\n");
69
+ console.log(`Bundled ${PLUGIN_ID} plugin into vault`);
70
+ }
71
+ /**
72
+ * Write .obsidian/community-plugins.json listing the plugin.
73
+ * Obsidian will prompt the user to install it from the registry.
74
+ */
75
+ /** Recommended community plugins — listed so Obsidian prompts to install them */
76
+ const FRONT_MATTER_TITLE_ID = "obsidian-front-matter-title-plugin";
77
+ const RECOMMENDED_PLUGINS = [
78
+ PLUGIN_ID,
79
+ FRONT_MATTER_TITLE_ID, // Shows frontmatter title in graph view instead of filename
80
+ ];
81
+ function installRegistryRef(vaultDir) {
82
+ const obsidianDir = join(vaultDir, ".obsidian");
83
+ mkdirSync(obsidianDir, { recursive: true });
84
+ writeFileSync(join(obsidianDir, "community-plugins.json"), JSON.stringify(RECOMMENDED_PLUGINS, null, 2) + "\n");
85
+ console.log(`Listed plugins in community-plugins.json: ${RECOMMENDED_PLUGINS.join(", ")}`);
86
+ }
87
+ /**
88
+ * Pre-configure Front Matter Title plugin so graph view shows titles.
89
+ * User still needs to install the plugin from community browser,
90
+ * but the settings will be ready when they do.
91
+ */
92
+ function installFrontMatterTitleConfig(vaultDir) {
93
+ const configDir = join(vaultDir, ".obsidian", "plugins", FRONT_MATTER_TITLE_ID);
94
+ mkdirSync(configDir, { recursive: true });
95
+ const settings = {
96
+ templates: {
97
+ common: { main: "title", fallback: "fallback_title" },
98
+ },
99
+ features: {
100
+ graph: { enabled: true, templates: { main: "", fallback: "" } },
101
+ explorer: { enabled: true, templates: { main: "", fallback: "" } },
102
+ tab: { enabled: true, templates: { main: "", fallback: "" } },
103
+ },
104
+ };
105
+ writeFileSync(join(configDir, "data.json"), JSON.stringify(settings, null, 2) + "\n");
106
+ }
107
+ /**
108
+ * Copy images from source docs directory into the vault root.
109
+ * Image paths in markdown (e.g. /img/foo.png) become relative vault paths.
110
+ */
111
+ function copyImages(sourceDir, vaultDir) {
112
+ const imageExts = new Set([".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp"]);
113
+ let count = 0;
114
+ function walk(dir) {
115
+ for (const entry of readdirSync(dir)) {
116
+ const full = join(dir, entry);
117
+ if (statSync(full).isDirectory()) {
118
+ walk(full);
119
+ }
120
+ else {
121
+ const ext = entry.substring(entry.lastIndexOf(".")).toLowerCase();
122
+ if (imageExts.has(ext)) {
123
+ const rel = relative(sourceDir, full);
124
+ const dest = join(vaultDir, rel);
125
+ mkdirSync(dirname(dest), { recursive: true });
126
+ cpSync(full, dest);
127
+ count++;
128
+ }
129
+ }
130
+ }
131
+ }
132
+ try {
133
+ walk(sourceDir);
134
+ }
135
+ catch { /* source may not exist */ }
136
+ if (count > 0)
137
+ console.log(`Copied ${count} images into vault`);
138
+ }
139
+ /**
140
+ * Find the built plugin dist directory.
141
+ * Searches relative to this package (sibling repo) and common locations.
142
+ */
143
+ function resolvePluginDist() {
144
+ const thisDir = dirname(fileURLToPath(import.meta.url));
145
+ // Sibling repo: dogsbay-obsidian/plugin/dist/ (relative to monorepo root)
146
+ const candidates = [
147
+ // From packages/format-obsidian/src/ → ../../../../dogsbay-obsidian/plugin/dist/
148
+ resolve(thisDir, "..", "..", "..", "..", "dogsbay-obsidian", "plugin", "dist"),
149
+ // From packages/format-obsidian/dist/ → ../../../../dogsbay-obsidian/plugin/dist/
150
+ resolve(thisDir, "..", "..", "..", "..", "dogsbay-obsidian", "plugin", "dist"),
151
+ // Env override
152
+ process.env.DOGSBAY_PLUGIN_DIR ?? "",
153
+ ];
154
+ for (const dir of candidates) {
155
+ if (dir && existsSync(join(dir, "manifest.json"))) {
156
+ return dir;
157
+ }
158
+ }
159
+ return null;
160
+ }
161
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { treeToObsidian } from "./serialize.js";
2
+ export { exportObsidianVault } from "./project.js";
3
+ export type { ObsidianVaultOptions, ObsidianVaultExport } from "./project.js";
4
+ export type { TreeNode, InlineNode, ExportPage, NavItem } from "@dogsbay/types";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ // Obsidian format plugin — serialize (tree → Obsidian markdown) + vault export
2
+ export { treeToObsidian } from "./serialize.js";
3
+ export { exportObsidianVault } from "./project.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Obsidian vault exporter.
3
+ *
4
+ * Takes ExportPage[] + NavItem[] and generates a complete Obsidian vault
5
+ * with folder structure from nav, sidebar_position frontmatter, _index.md
6
+ * per section, and _nav.yml for lossless round-trip.
7
+ */
8
+ import type { ExportPage, NavItem } from "@dogsbay/types";
9
+ export interface ObsidianVaultOptions {
10
+ vaultName?: string;
11
+ assetsDir?: string;
12
+ /** Section name — pages go under this subfolder, nav gets a top-level entry */
13
+ section?: string;
14
+ }
15
+ export interface ObsidianVaultExport {
16
+ files: Map<string, string>;
17
+ }
18
+ /**
19
+ * Export pages + nav to an Obsidian vault file map.
20
+ */
21
+ export declare function exportObsidianVault(pages: ExportPage[], nav: NavItem[], options?: ObsidianVaultOptions): ObsidianVaultExport;
22
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG1D,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EAAE,EACnB,GAAG,EAAE,OAAO,EAAE,EACd,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAwGrB"}
@@ -0,0 +1,214 @@
1
+ import { treeToObsidian } from "./serialize.js";
2
+ /**
3
+ * Export pages + nav to an Obsidian vault file map.
4
+ */
5
+ export function exportObsidianVault(pages, nav, options = {}) {
6
+ const files = new Map();
7
+ const section = options.section;
8
+ // Build a slug → page lookup
9
+ const pageBySlug = new Map();
10
+ for (const page of pages) {
11
+ pageBySlug.set(page.slug, page);
12
+ }
13
+ // Walk nav to assign folder paths and sidebar positions
14
+ // When section is set, prefix all folder paths with the section name
15
+ const assignments = new Map();
16
+ const pathPrefix = section || "";
17
+ assignPaths(nav, pathPrefix, assignments, pageBySlug);
18
+ // Generate pages
19
+ for (const page of pages) {
20
+ const assignment = assignments.get(page.slug);
21
+ const fallbackFolder = section || "";
22
+ const filePath = assignment
23
+ ? `${assignment.folderPath}/${fileNameFromSlug(page.slug)}.md`
24
+ : fallbackFolder
25
+ ? `${fallbackFolder}/${fileNameFromSlug(page.slug)}.md`
26
+ : `${fileNameFromSlug(page.slug)}.md`;
27
+ let content = treeToObsidian(page.tree);
28
+ // Prepend frontmatter — always include title + alias, add sidebar_position if from nav
29
+ if (assignment) {
30
+ const fm = buildFrontmatter(page.title, assignment.position);
31
+ if (content.startsWith("---\n")) {
32
+ const endIdx = content.indexOf("\n---\n", 4);
33
+ if (endIdx !== -1) {
34
+ const existingFm = content.substring(4, endIdx);
35
+ content = `---\n${existingFm}\naliases:\n - ${yamlStr(page.title)}\nsidebar_position: ${assignment.position}\n---\n${content.substring(endIdx + 5)}`;
36
+ }
37
+ }
38
+ else {
39
+ content = `${fm}\n\n${content}`;
40
+ }
41
+ }
42
+ else if (page.title) {
43
+ // No nav assignment (e.g. group header page) — still add title + alias
44
+ const fm = `---\ntitle: ${yamlStr(page.title)}\naliases:\n - ${yamlStr(page.title)}\n---`;
45
+ if (!content.startsWith("---\n")) {
46
+ content = `${fm}\n\n${content}`;
47
+ }
48
+ }
49
+ files.set(filePath, content);
50
+ }
51
+ // Generate _index.md for nav sections (folders)
52
+ generateSectionIndexes(nav, pathPrefix, files);
53
+ // Build slug → vault path lookup (without .md extension) for nav yaml and link rewriting
54
+ const slugToVaultPath = new Map();
55
+ // Also build link rewrite map: keys are paths as they appear in content links
56
+ // (which include the section prefix), values are actual vault paths
57
+ const linkRewrites = new Map();
58
+ for (const page of pages) {
59
+ const assignment = assignments.get(page.slug);
60
+ const fallbackFolder = section || "";
61
+ const fileName = fileNameFromSlug(page.slug);
62
+ let vaultPath;
63
+ if (assignment) {
64
+ vaultPath = assignment.folderPath
65
+ ? `${assignment.folderPath}/${fileName}`
66
+ : fileName;
67
+ }
68
+ else {
69
+ vaultPath = fallbackFolder
70
+ ? `${fallbackFolder}/${fileName}`
71
+ : fileName;
72
+ }
73
+ slugToVaultPath.set(page.slug, vaultPath);
74
+ // Links in content use section-prefixed paths (e.g. "ddos-protection/managed-rulesets")
75
+ // The vault file path may differ (e.g. "ddos-protection/managed-rulesets/managed-rulesets")
76
+ const linkPath = section ? `${section}/${page.slug}` : page.slug;
77
+ if (linkPath !== vaultPath) {
78
+ linkRewrites.set(linkPath, vaultPath);
79
+ }
80
+ }
81
+ // Rewrite internal links: source paths → vault file paths
82
+ if (linkRewrites.size > 0) {
83
+ for (const [filePath, content] of files) {
84
+ if (!filePath.endsWith(".md"))
85
+ continue;
86
+ let updated = content;
87
+ for (const [from, to] of linkRewrites) {
88
+ // Rewrite markdown links: (path) or (path#anchor)
89
+ updated = updated.replaceAll(`(${from})`, `(${to})`);
90
+ updated = updated.replaceAll(`(${from}#`, `(${to}#`);
91
+ }
92
+ if (updated !== content) {
93
+ files.set(filePath, updated);
94
+ }
95
+ }
96
+ }
97
+ // Generate _nav.yml with actual vault paths
98
+ files.set("_nav.yml", navToYaml(nav, 0, slugToVaultPath));
99
+ return { files };
100
+ }
101
+ function assignPaths(items, parentFolder, assignments, pageBySlug) {
102
+ let position = 1;
103
+ for (const item of items) {
104
+ if (item.children && item.children.length > 0) {
105
+ // Section with children → create folder
106
+ // Use source path from href when available (preserves source directory structure)
107
+ // Fall back to slugified label for groups without href
108
+ const folderName = item.href ? folderNameFromHref(item.href) : slugify(item.label);
109
+ const folderPath = parentFolder ? `${parentFolder}/${folderName}` : folderName;
110
+ // If section has its own page, assign it
111
+ if (item.href) {
112
+ const slug = hrefToSlug(item.href);
113
+ if (slug && pageBySlug.has(slug)) {
114
+ assignments.set(slug, { folderPath, position });
115
+ position++;
116
+ }
117
+ }
118
+ // Recurse into children
119
+ assignPaths(item.children, folderPath, assignments, pageBySlug);
120
+ position++;
121
+ }
122
+ else if (item.href) {
123
+ // Leaf page
124
+ const slug = hrefToSlug(item.href);
125
+ if (slug && pageBySlug.has(slug)) {
126
+ assignments.set(slug, { folderPath: parentFolder, position });
127
+ }
128
+ position++;
129
+ }
130
+ }
131
+ }
132
+ function generateSectionIndexes(items, parentFolder, files) {
133
+ for (const item of items) {
134
+ if (item.children && item.children.length > 0) {
135
+ const folderName = item.href ? folderNameFromHref(item.href) : slugify(item.label);
136
+ const folderPath = parentFolder ? `${parentFolder}/${folderName}` : folderName;
137
+ // Create _index.md for this section
138
+ files.set(`${folderPath}/_index.md`, `---\ntitle: ${item.label}\n---\n`);
139
+ // Recurse
140
+ generateSectionIndexes(item.children, folderPath, files);
141
+ }
142
+ }
143
+ }
144
+ // ── _nav.yml generation ─────────────────────────────────
145
+ function navToYaml(items, indent = 0, slugToVaultPath) {
146
+ const prefix = " ".repeat(indent);
147
+ const lines = [];
148
+ for (const item of items) {
149
+ if (item.children && item.children.length > 0) {
150
+ lines.push(`${prefix}- label: ${yamlStr(item.label)}`);
151
+ if (item.href) {
152
+ const path = resolveNavPath(item.href, slugToVaultPath);
153
+ lines.push(`${prefix} path: ${yamlStr(path)}`);
154
+ }
155
+ lines.push(`${prefix} children:`);
156
+ lines.push(navToYaml(item.children, indent + 2, slugToVaultPath));
157
+ }
158
+ else if (item.href) {
159
+ const path = resolveNavPath(item.href, slugToVaultPath);
160
+ lines.push(`${prefix}- label: ${yamlStr(item.label)}`);
161
+ lines.push(`${prefix} path: ${yamlStr(path)}`);
162
+ }
163
+ }
164
+ return lines.join("\n");
165
+ }
166
+ /** Resolve an href to the actual vault path, falling back to hrefToPath. */
167
+ function resolveNavPath(href, slugToVaultPath) {
168
+ if (slugToVaultPath) {
169
+ const slug = hrefToSlug(href);
170
+ const vaultPath = slugToVaultPath.get(slug);
171
+ if (vaultPath)
172
+ return `${vaultPath}.md`;
173
+ }
174
+ return hrefToPath(href);
175
+ }
176
+ // ── Frontmatter ─────────────────────────────────────────
177
+ function buildFrontmatter(title, position) {
178
+ return `---\ntitle: ${yamlStr(title)}\naliases:\n - ${yamlStr(title)}\nsidebar_position: ${position}\n---`;
179
+ }
180
+ // ── Utilities ───────────────────────────────────────────
181
+ function hrefToSlug(href) {
182
+ return href
183
+ .replace(/^\/docs\/?/, "")
184
+ .replace(/\/$/, "")
185
+ || "index";
186
+ }
187
+ function hrefToPath(href) {
188
+ const slug = hrefToSlug(href);
189
+ return slug === "index" ? "index.md" : `${slug}.md`;
190
+ }
191
+ function fileNameFromSlug(slug) {
192
+ // "tutorial/first-steps" → "first-steps" (folder handles parent)
193
+ const parts = slug.split("/");
194
+ return parts[parts.length - 1] || "index";
195
+ }
196
+ /** Extract the last path segment from an href to use as folder name. */
197
+ function folderNameFromHref(href) {
198
+ const slug = hrefToSlug(href);
199
+ const parts = slug.split("/");
200
+ return parts[parts.length - 1] || parts[parts.length - 2] || slug;
201
+ }
202
+ function slugify(text) {
203
+ return text
204
+ .toLowerCase()
205
+ .replace(/[^a-z0-9]+/g, "-")
206
+ .replace(/^-|-$/g, "");
207
+ }
208
+ function yamlStr(s) {
209
+ if (/[:#\[\]{}&*!|>'"@`,%]/.test(s) || s.includes("\n")) {
210
+ return `"${s.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
211
+ }
212
+ return s;
213
+ }
214
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Obsidian serializer — TreeNode[] → Obsidian-flavored Markdown.
3
+ *
4
+ * Handles the Obsidian-specific syntax for callouts, highlights, math,
5
+ * and uses `dogsbay-tabs`/`dogsbay-code` code blocks for features
6
+ * that have no native Obsidian equivalent.
7
+ */
8
+ import type { TreeNode } from "@dogsbay/types";
9
+ /**
10
+ * Convert TreeNode[] to Obsidian-flavored Markdown.
11
+ */
12
+ export declare function treeToObsidian(nodes: TreeNode[]): string;
13
+ //# sourceMappingURL=serialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAC;AA2B3D;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAExD"}
@@ -0,0 +1,625 @@
1
+ /**
2
+ * Transform an href for Obsidian vault paths.
3
+ *
4
+ * Obsidian needs relative paths from vault root, not absolute URLs:
5
+ * /ddos-protection/managed-rulesets/ → ddos-protection/managed-rulesets
6
+ * /ddos-protection/path/#heading → ddos-protection/path#heading
7
+ * https://example.com → https://example.com (unchanged)
8
+ * #local-anchor → #local-anchor (unchanged)
9
+ */
10
+ function obsidianHref(href) {
11
+ // External URLs — leave as-is
12
+ if (href.startsWith("http://") || href.startsWith("https://"))
13
+ return href;
14
+ // Local anchors — rewrite to block ID reference
15
+ if (href.startsWith("#"))
16
+ return `#^${href.slice(1)}`;
17
+ // Strip leading /
18
+ let result = href.replace(/^\//, "");
19
+ // Strip trailing /
20
+ result = result.replace(/\/$/, "");
21
+ // Normalize /#anchor to #anchor (strip / before #)
22
+ result = result.replace(/\/#/, "#");
23
+ // Rewrite #slug anchors to #^slug block ID references
24
+ result = result.replace(/#(.+)$/, "#^$1");
25
+ return result;
26
+ }
27
+ /**
28
+ * Convert TreeNode[] to Obsidian-flavored Markdown.
29
+ */
30
+ export function treeToObsidian(nodes) {
31
+ return nodes.map(nodeToObsidian).filter(Boolean).join("\n\n");
32
+ }
33
+ // ── Block dispatcher ────────────────────────────────────
34
+ function nodeToObsidian(node) {
35
+ switch (node.type) {
36
+ case "frontmatter":
37
+ return `---\n${node.props?.content ?? ""}\n---`;
38
+ case "references":
39
+ return referencesToObsidian(node);
40
+ case "heading":
41
+ return headingToObsidian(node);
42
+ case "paragraph":
43
+ return childrenToObsidian(node);
44
+ case "prose":
45
+ return proseToObsidian(node);
46
+ case "callout":
47
+ return calloutToObsidian(node);
48
+ case "details":
49
+ return detailsToObsidian(node);
50
+ case "tabs":
51
+ return tabsToObsidian(node);
52
+ case "code":
53
+ return codeToObsidian(node);
54
+ case "diagram":
55
+ return diagramToObsidian(node);
56
+ case "math-block":
57
+ return mathBlockToObsidian(node);
58
+ case "table":
59
+ return tableToObsidian(node);
60
+ case "blockquote":
61
+ return blockquoteToObsidian(node);
62
+ case "ordered-list":
63
+ return orderedListToObsidian(node);
64
+ case "unordered-list":
65
+ return unorderedListToObsidian(node);
66
+ case "list-item":
67
+ return listItemToObsidian(node);
68
+ case "deflist":
69
+ return deflistToObsidian(node);
70
+ case "dt":
71
+ return `**${childrenToObsidian(node)}**`;
72
+ case "dd":
73
+ return `: ${childrenToObsidian(node)}`;
74
+ case "steps":
75
+ return stepsToObsidian(node);
76
+ case "step":
77
+ return childrenToObsidian(node);
78
+ case "substeps":
79
+ return childrenToObsidian(node);
80
+ case "annotation-list":
81
+ return childrenToObsidian(node);
82
+ case "link-button": {
83
+ const href = obsidianHref(node.props?.href ?? "");
84
+ const text = childrenToObsidian(node) || href;
85
+ return `[${text}](${href})`;
86
+ }
87
+ case "hr":
88
+ return "---";
89
+ case "html":
90
+ return node.html ?? "";
91
+ case "html-container":
92
+ return childrenToObsidian(node);
93
+ case "figure": {
94
+ const caption = node.props?.caption;
95
+ const inner = childrenToObsidian(node);
96
+ return caption ? `${inner}\n\n*${caption}*` : inner;
97
+ }
98
+ case "card":
99
+ return cardToObsidian(node);
100
+ case "cards":
101
+ case "grid":
102
+ return cardsToObsidian(node);
103
+ case "youtube":
104
+ return youtubeToObsidian(node);
105
+ case "api-class":
106
+ case "api-member":
107
+ return apiSymbolToObsidian(node);
108
+ case "api-doc":
109
+ return apiDocToObsidian(node);
110
+ case "api-params":
111
+ return apiParamsToObsidian(node);
112
+ case "api-source":
113
+ return apiSourceToObsidian(node);
114
+ case "footnote-list":
115
+ return footnoteListToObsidian(node);
116
+ case "footnote-def":
117
+ return footnoteDefToObsidian(node);
118
+ default:
119
+ if (node.html)
120
+ return stripHtml(node.html);
121
+ if (node.children)
122
+ return childrenToObsidian(node);
123
+ return "";
124
+ }
125
+ }
126
+ // ── Inline rendering ────────────────────────────────────
127
+ function inlineToObsidian(nodes) {
128
+ return nodes.map(inlineNodeToObsidian).join("");
129
+ }
130
+ function inlineNodeToObsidian(node) {
131
+ switch (node.type) {
132
+ case "text": {
133
+ let text = node.text;
134
+ if (node.bold && node.italic)
135
+ text = `***${text}***`;
136
+ else if (node.bold)
137
+ text = `**${text}**`;
138
+ else if (node.italic)
139
+ text = `*${text}*`;
140
+ if (node.strikethrough)
141
+ text = `~~${text}~~`;
142
+ return text;
143
+ }
144
+ case "link": {
145
+ const text = inlineToObsidian(node.children);
146
+ const title = node.title ? ` "${node.title}"` : "";
147
+ return `[${text}](${obsidianHref(node.href)}${title})`;
148
+ }
149
+ case "image": {
150
+ const alt = node.alt ?? "";
151
+ return `![${alt}](${node.src})`;
152
+ }
153
+ case "code":
154
+ return `\`${node.text}\``;
155
+ case "highlight":
156
+ return `==${inlineToObsidian(node.children)}==`;
157
+ case "footnote-ref":
158
+ return `[^${node.label}]`;
159
+ case "kbd":
160
+ return node.keys.map((k) => `<kbd>${k}</kbd>`).join("+");
161
+ case "math":
162
+ return `$${node.latex}$`;
163
+ case "icon":
164
+ return `:${node.name}:`;
165
+ case "html-inline":
166
+ return node.html;
167
+ case "break":
168
+ return " \n";
169
+ default:
170
+ return "";
171
+ }
172
+ }
173
+ // ── Prose (inline or HTML fallback) ─────────────────────
174
+ function proseToObsidian(node) {
175
+ if (node.inline)
176
+ return inlineToObsidian(node.inline);
177
+ if (node.html)
178
+ return stripHtml(node.html);
179
+ return "";
180
+ }
181
+ // ── Callouts (lossless mapping) ─────────────────────────
182
+ function calloutToObsidian(node) {
183
+ const variant = node.props?.variant ?? "note";
184
+ const title = node.props?.title;
185
+ let opener = `> [!${variant}]`;
186
+ const autoTitle = variant.charAt(0).toUpperCase() + variant.slice(1);
187
+ if (title && title !== autoTitle)
188
+ opener += ` ${title}`;
189
+ if (title === null)
190
+ opener += "";
191
+ const inner = childrenToObsidian(node);
192
+ if (!inner)
193
+ return opener;
194
+ return `${opener}\n${prefixLines(inner, "> ")}`;
195
+ }
196
+ function detailsToObsidian(node) {
197
+ const variant = node.props?.variant ?? "note";
198
+ const title = node.props?.title;
199
+ const open = node.props?.open;
200
+ const foldMarker = open ? "+" : "-";
201
+ let opener = `> [!${variant}]${foldMarker}`;
202
+ const autoTitle = variant.charAt(0).toUpperCase() + variant.slice(1);
203
+ if (title && title !== autoTitle)
204
+ opener += ` ${title}`;
205
+ const inner = childrenToObsidian(node);
206
+ if (!inner)
207
+ return opener;
208
+ return `${opener}\n${prefixLines(inner, "> ")}`;
209
+ }
210
+ // ── Tabs (dogsbay-tabs code block) ──────────────────────
211
+ /**
212
+ * Track nesting depth to alternate fence characters.
213
+ *
214
+ * Depth 0 (outer): ~~~ for tabs, ``` for code blocks inside
215
+ * Depth 1 (inner): ``` for tabs, ~~~ for code blocks inside
216
+ * Depth 2+: ~~~~ / ```` etc.
217
+ *
218
+ * Each level's tab fence must differ from the code fence at the
219
+ * same level, and the inner tab fence must differ from the outer
220
+ * tab fence (since the raw markdown file sees them as nested).
221
+ *
222
+ * MarkdownRenderer.render() processes each tab's content as a
223
+ * fresh document, so the inner code fences don't conflict at runtime.
224
+ */
225
+ /**
226
+ * Track code block nesting to alternate fence characters.
227
+ * Tabs and steps both use fenced code blocks, so they share a depth counter.
228
+ * Even depths use ~~~ (tildes), odd depths use ``` (backticks).
229
+ */
230
+ let codeBlockNestingDepth = 0;
231
+ function tabsToObsidian(node) {
232
+ if (!node.children)
233
+ return "";
234
+ // Alternate: even depths use tildes, odd depths use backticks
235
+ const fence = codeBlockNestingDepth % 2 === 0 ? "~~~" : "```";
236
+ codeBlockNestingDepth++;
237
+ const inner = node.children
238
+ .map((tab) => {
239
+ const title = tab.props?.title ?? "Tab";
240
+ const content = tabContentToObsidian(tab);
241
+ if (!content)
242
+ return `tab: ${title}\n---`;
243
+ return `tab: ${title}\n---\n${content}`;
244
+ })
245
+ .join("\n\n");
246
+ codeBlockNestingDepth--;
247
+ return `${fence}dogsbay-tabs\n${inner}\n${fence}`;
248
+ }
249
+ /** Render tab content — delegates to nodeToObsidian which respects nesting depth. */
250
+ function tabContentToObsidian(node) {
251
+ return childrenToObsidian(node);
252
+ }
253
+ // ── Code blocks ─────────────────────────────────────────
254
+ function codeToObsidian(node) {
255
+ const lang = node.props?.lang ?? "";
256
+ const code = (node.props?.code ?? "").replace(/\n$/, "");
257
+ const title = node.props?.title;
258
+ const highlights = node.props?.highlights;
259
+ const annotations = node.props?.annotations;
260
+ // When nested inside tabs/steps code blocks, use 4-space indent
261
+ // to avoid fence conflicts at depth 2+
262
+ if (codeBlockNestingDepth >= 2) {
263
+ return code.split("\n").map((l) => ` ${l}`).join("\n");
264
+ }
265
+ // At depth 0-1, choose a fence that doesn't conflict with the parent
266
+ const fence = codeBlockNestingDepth === 0
267
+ ? chooseFence(code)
268
+ : (codeBlockNestingDepth % 2 === 0 ? "~~~" : "```");
269
+ // Use dogsbay-code when there's metadata (title, highlights, annotations)
270
+ if (title || highlights || (annotations && Object.keys(annotations).length > 0)) {
271
+ const header = [];
272
+ header.push(`lang: ${lang || "text"}`);
273
+ if (title)
274
+ header.push(`file: ${title}`);
275
+ if (highlights)
276
+ header.push(`highlight: ${highlights}`);
277
+ if (annotations && Object.keys(annotations).length > 0) {
278
+ header.push("annotations:");
279
+ for (const [num, text] of Object.entries(annotations)) {
280
+ header.push(` ${num}: ${JSON.stringify(text)}`);
281
+ }
282
+ }
283
+ return `${fence}dogsbay-code\n${header.join("\n")}\n---\n${code}\n${fence}`;
284
+ }
285
+ return `${fence}${lang}\n${code}\n${fence}`;
286
+ }
287
+ function diagramToObsidian(node) {
288
+ const lang = node.props?.lang ?? "mermaid";
289
+ const code = (node.props?.code ?? "").replace(/\n$/, "");
290
+ return `\`\`\`${lang}\n${code}\n\`\`\``;
291
+ }
292
+ // ── Math ────────────────────────────────────────────────
293
+ function mathBlockToObsidian(node) {
294
+ const latex = node.props?.latex ?? "";
295
+ return `$$\n${latex}\n$$`;
296
+ }
297
+ // ── Tables (GFM pipe tables) ────────────────────────────
298
+ function tableToObsidian(node) {
299
+ if (!node.children)
300
+ return "";
301
+ const rows = [];
302
+ let headerCount = 0;
303
+ for (const child of node.children) {
304
+ if (child.type === "thead" && child.children) {
305
+ for (const tr of child.children) {
306
+ if (tr.type === "tr" && tr.children) {
307
+ const cells = tr.children.map((c) => cellText(c));
308
+ rows.push(cells);
309
+ headerCount = cells.length;
310
+ }
311
+ }
312
+ }
313
+ else if (child.type === "tbody" && child.children) {
314
+ for (const tr of child.children) {
315
+ if (tr.type === "tr" && tr.children) {
316
+ rows.push(tr.children.map((c) => cellText(c)));
317
+ }
318
+ }
319
+ }
320
+ else if (child.type === "tr" && child.children) {
321
+ // Bare tr without thead/tbody wrapper (from Starlight parser)
322
+ const cells = child.children.map((c) => cellText(c));
323
+ rows.push(cells);
324
+ // First row with th cells is the header
325
+ if (headerCount === 0 && child.children.some((c) => c.type === "th")) {
326
+ headerCount = cells.length;
327
+ }
328
+ }
329
+ }
330
+ if (rows.length === 0)
331
+ return "";
332
+ // Compute column widths
333
+ const colCount = Math.max(headerCount, ...rows.map((r) => r.length));
334
+ const widths = Array(colCount).fill(3);
335
+ for (const row of rows) {
336
+ for (let i = 0; i < row.length; i++) {
337
+ widths[i] = Math.max(widths[i], row[i].length);
338
+ }
339
+ }
340
+ const lines = [];
341
+ for (let r = 0; r < rows.length; r++) {
342
+ const padded = rows[r].map((cell, i) => cell.padEnd(widths[i]));
343
+ // Pad missing columns
344
+ while (padded.length < colCount)
345
+ padded.push(" ".repeat(widths[padded.length]));
346
+ lines.push(`| ${padded.join(" | ")} |`);
347
+ // Insert separator after header row(s)
348
+ if (r === 0) {
349
+ const sep = widths.map((w) => "-".repeat(w));
350
+ lines.push(`| ${sep.join(" | ")} |`);
351
+ }
352
+ }
353
+ return lines.join("\n");
354
+ }
355
+ function cellText(node) {
356
+ const text = childrenToObsidian(node) || proseToObsidian(node);
357
+ // Flatten to single line and escape pipes for GFM table cells
358
+ return text.replace(/\n+/g, " ").replace(/\s+/g, " ").replace(/\|/g, "\\|").trim();
359
+ }
360
+ // ── Lists ───────────────────────────────────────────────
361
+ function orderedListToObsidian(node) {
362
+ if (!node.children)
363
+ return "";
364
+ const start = node.props?.start || 1;
365
+ return node.children
366
+ .map((child, i) => {
367
+ const num = start + i;
368
+ const text = nodeToObsidian(child);
369
+ const first = `${num}. ${text.split("\n")[0]}`;
370
+ const rest = text.split("\n").slice(1);
371
+ if (rest.length === 0)
372
+ return first;
373
+ return `${first}\n${rest.map((l) => (l ? ` ${l}` : l)).join("\n")}`;
374
+ })
375
+ .join("\n");
376
+ }
377
+ function unorderedListToObsidian(node) {
378
+ if (!node.children)
379
+ return "";
380
+ return node.children
381
+ .map((child) => {
382
+ const text = nodeToObsidian(child);
383
+ const first = `- ${text.split("\n")[0]}`;
384
+ const rest = text.split("\n").slice(1);
385
+ if (rest.length === 0)
386
+ return first;
387
+ return `${first}\n${rest.map((l) => (l ? ` ${l}` : l)).join("\n")}`;
388
+ })
389
+ .join("\n");
390
+ }
391
+ function listItemToObsidian(node) {
392
+ if (!node.children)
393
+ return "";
394
+ const parts = node.children.map(nodeToObsidian).filter(Boolean);
395
+ // Join with blank line between items to ensure Obsidian treats
396
+ // consecutive blockquote-style elements (callouts, details) as separate
397
+ return parts.join("\n\n");
398
+ }
399
+ // ── Definition lists (degraded) ─────────────────────────
400
+ function deflistToObsidian(node) {
401
+ if (!node.children)
402
+ return "";
403
+ return node.children.map(nodeToObsidian).join("\n");
404
+ }
405
+ // ── Steps (numbered list) ───────────────────────────────
406
+ function stepsToObsidian(node) {
407
+ if (!node.children)
408
+ return "";
409
+ const fence = codeBlockNestingDepth % 2 === 0 ? "~~~" : "```";
410
+ codeBlockNestingDepth++;
411
+ // Use dogsbay-steps element for richer rendering
412
+ const inner = node.children
413
+ .map((child) => {
414
+ const title = child.props?.title || "";
415
+ const content = childrenToObsidian(child);
416
+ if (title) {
417
+ return content ? `step: ${title}\n---\n${content}` : `step: ${title}\n---`;
418
+ }
419
+ // No title — just content (Starlight steps are titleless list items)
420
+ return content ? `step:\n---\n${content}` : `step:\n---`;
421
+ })
422
+ .join("\n\n");
423
+ codeBlockNestingDepth--;
424
+ return `${fence}dogsbay-steps\n${inner}\n${fence}`;
425
+ }
426
+ // ── Other block types ───────────────────────────────────
427
+ function headingToObsidian(node) {
428
+ const level = node.props?.level ?? 1;
429
+ const slug = node.props?.slug ?? "";
430
+ const hashes = "#".repeat(level);
431
+ const blockId = slug ? ` ^${slug}` : "";
432
+ if (node.inline)
433
+ return `${hashes} ${inlineToObsidian(node.inline)}${blockId}`;
434
+ const text = childrenToObsidian(node) || (node.props?.text ?? "");
435
+ return `${hashes} ${text}${blockId}`;
436
+ }
437
+ function blockquoteToObsidian(node) {
438
+ const inner = childrenToObsidian(node);
439
+ return prefixLines(inner, "> ");
440
+ }
441
+ function referencesToObsidian(node) {
442
+ const entries = (node.props?.entries ?? []);
443
+ return entries
444
+ .map((e) => {
445
+ let line = `[${e.label}]: ${obsidianHref(e.href)}`;
446
+ if (e.title)
447
+ line += ` "${e.title}"`;
448
+ return line;
449
+ })
450
+ .join("\n");
451
+ }
452
+ function youtubeToObsidian(node) {
453
+ const id = node.props?.videoId ?? "";
454
+ const title = node.props?.title ?? "Video";
455
+ return `[![${title}](https://img.youtube.com/vi/${id}/maxresdefault.jpg)](https://www.youtube.com/watch?v=${id})`;
456
+ }
457
+ function cardToObsidian(node) {
458
+ const title = node.props?.title || "";
459
+ const href = node.props?.href;
460
+ const icon = node.props?.icon;
461
+ const content = childrenToObsidian(node);
462
+ const header = [];
463
+ if (title)
464
+ header.push(`title: ${title}`);
465
+ if (href)
466
+ header.push(`href: ${obsidianHref(href)}`);
467
+ if (icon)
468
+ header.push(`icon: ${icon}`);
469
+ if (header.length === 0 && !content)
470
+ return "";
471
+ const meta = header.join("\n");
472
+ if (content) {
473
+ return `\`\`\`dogsbay-card\n${meta}\n---\n${content}\n\`\`\``;
474
+ }
475
+ return `\`\`\`dogsbay-card\n${meta}\n\`\`\``;
476
+ }
477
+ function cardsToObsidian(node) {
478
+ // Flatten cards/grid to a simple unordered list
479
+ if (!node.children)
480
+ return "";
481
+ return node.children.map(nodeToObsidian).join("\n\n");
482
+ }
483
+ // ── API nodes ───────────────────────────────────────────
484
+ function apiSymbolToObsidian(node) {
485
+ const name = node.props?.name ?? "";
486
+ const kind = node.props?.kind ?? "class";
487
+ const level = node.type === "api-class" ? 3 : 4;
488
+ const hashes = "#".repeat(level);
489
+ const sig = node.props?.signature ?? "";
490
+ const bases = node.props?.bases;
491
+ const parts = [];
492
+ parts.push(`${hashes} ${kind} \`${name}\``);
493
+ if (bases)
494
+ parts.push(`Bases: \`${bases}\``);
495
+ if (sig)
496
+ parts.push(`\`\`\`python\n${sig}\n\`\`\``);
497
+ if (node.children)
498
+ parts.push(childrenToObsidian(node));
499
+ return parts.filter(Boolean).join("\n\n");
500
+ }
501
+ function apiParamsToObsidian(node) {
502
+ const params = (node.props?.params ?? []);
503
+ if (params.length === 0)
504
+ return "";
505
+ // Render as HTML table — GFM tables can't handle multi-line cells with
506
+ // code blocks, links, and paragraphs. Obsidian renders HTML tables well.
507
+ const rows = params.map((p) => {
508
+ const name = `<code>${escapeHtmlChars(p.name)}</code>`;
509
+ // Use docHtml if available (preserves links, code, formatting)
510
+ // Fall back to doc (markdown), then description
511
+ let desc = p.docHtml || "";
512
+ if (!desc && p.doc)
513
+ desc = `<p>${escapeHtmlChars(p.doc)}</p>`;
514
+ if (!desc && p.description)
515
+ desc = `<p>${escapeHtmlChars(p.description)}</p>`;
516
+ // Add type and default below description
517
+ const meta = [];
518
+ if (p.type)
519
+ meta.push(`<strong>TYPE:</strong> <code>${escapeHtmlChars(p.type)}</code>`);
520
+ if (p.default != null)
521
+ meta.push(`<strong>DEFAULT:</strong> <code>${escapeHtmlChars(String(p.default))}</code>`);
522
+ if (p.required)
523
+ meta.push(`<strong>REQUIRED</strong>`);
524
+ const metaHtml = meta.length > 0
525
+ ? `<p class="param-meta">${meta.join(" &nbsp;·&nbsp; ")}</p>`
526
+ : "";
527
+ return `<tr><td>${name}</td><td>${desc}${metaHtml}</td></tr>`;
528
+ });
529
+ return [
530
+ '<table>',
531
+ '<thead><tr><th>PARAMETER</th><th>DESCRIPTION</th></tr></thead>',
532
+ '<tbody>',
533
+ ...rows,
534
+ '</tbody>',
535
+ '</table>',
536
+ ].join("\n");
537
+ }
538
+ function escapeHtmlChars(s) {
539
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
540
+ }
541
+ function apiDocToObsidian(node) {
542
+ // api-doc has HTML content in props.html — convert to markdown
543
+ const html = node.props?.html ?? "";
544
+ if (html)
545
+ return stripHtml(html);
546
+ return childrenToObsidian(node);
547
+ }
548
+ function apiSourceToObsidian(node) {
549
+ const code = node.props?.code ?? "";
550
+ const file = node.props?.file ?? "";
551
+ const line = node.props?.line;
552
+ const parts = [];
553
+ if (file) {
554
+ const ref = line ? `${file}:${line}` : file;
555
+ parts.push(`*Source: \`${ref}\`*`);
556
+ }
557
+ if (code) {
558
+ parts.push(`\`\`\`python\n${code.replace(/\n$/, "")}\n\`\`\``);
559
+ }
560
+ return parts.join("\n\n");
561
+ }
562
+ // ── Footnotes ───────────────────────────────────────────
563
+ function footnoteListToObsidian(node) {
564
+ if (!node.children)
565
+ return "";
566
+ return node.children.map(nodeToObsidian).join("\n");
567
+ }
568
+ function footnoteDefToObsidian(node) {
569
+ const label = node.props?.label ?? "1";
570
+ const content = childrenToObsidian(node);
571
+ return `[^${label}]: ${content}`;
572
+ }
573
+ // ── Utilities ───────────────────────────────────────────
574
+ function childrenToObsidian(node) {
575
+ if (!node.children || node.children.length === 0)
576
+ return "";
577
+ return node.children.map(nodeToObsidian).filter(Boolean).join("\n\n");
578
+ }
579
+ function prefixLines(text, prefix) {
580
+ return text
581
+ .split("\n")
582
+ .map((line) => (line ? `${prefix}${line}` : prefix.trimEnd()))
583
+ .join("\n");
584
+ }
585
+ function indent(text, spaces) {
586
+ const prefix = " ".repeat(spaces);
587
+ return text
588
+ .split("\n")
589
+ .map((line) => (line ? `${prefix}${line}` : line))
590
+ .join("\n");
591
+ }
592
+ /**
593
+ * Choose a fence string (```) that doesn't conflict with content.
594
+ * Scans for the longest run of backticks in the content and uses one more.
595
+ */
596
+ function chooseFence(content) {
597
+ let max = 2;
598
+ const matches = content.match(/`{3,}/g);
599
+ if (matches) {
600
+ for (const m of matches) {
601
+ if (m.length > max)
602
+ max = m.length;
603
+ }
604
+ }
605
+ return "`".repeat(max + 1);
606
+ }
607
+ /**
608
+ * Strip HTML tags, preserving text content.
609
+ * Handles common inline HTML from prose nodes.
610
+ */
611
+ function stripHtml(html) {
612
+ return html
613
+ .replace(/<br\s*\/?>/gi, "\n")
614
+ .replace(/<\/p>\s*<p[^>]*>/gi, "\n\n")
615
+ .replace(/<\/?(?:p|div|span|strong|em|s|a|code|sup|sub|mark|kbd|abbr)[^>]*>/gi, "")
616
+ .replace(/<img[^>]+alt="([^"]*)"[^>]*>/gi, "![$1]")
617
+ .replace(/<[^>]+>/g, "")
618
+ .replace(/&amp;/g, "&")
619
+ .replace(/&lt;/g, "<")
620
+ .replace(/&gt;/g, ">")
621
+ .replace(/&quot;/g, '"')
622
+ .replace(/&#39;/g, "'")
623
+ .trim();
624
+ }
625
+ //# sourceMappingURL=serialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@dogsbay/format-obsidian",
3
+ "version": "0.2.0-beta.0",
4
+ "description": "Obsidian format plugin for Dogsbay — import/export Obsidian vaults via TreeNode[]",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./cli": {
14
+ "types": "./dist/cli.d.ts",
15
+ "import": "./dist/cli.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md"
21
+ ],
22
+ "devDependencies": {
23
+ "@types/node": "^25.5.0",
24
+ "typescript": "^5.7.0",
25
+ "vitest": "^3.0.0"
26
+ },
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "@dogsbay/types": "0.2.0-beta.0"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/dogsbay/dogsbay.git",
34
+ "directory": "packages/format-obsidian"
35
+ },
36
+ "homepage": "https://github.com/dogsbay/dogsbay/tree/main/packages/format-obsidian",
37
+ "bugs": {
38
+ "url": "https://github.com/dogsbay/dogsbay/issues"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc",
42
+ "test": "vitest run",
43
+ "test:watch": "vitest"
44
+ }
45
+ }