@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 +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +161 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/project.d.ts +22 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +214 -0
- package/dist/project.js.map +1 -0
- package/dist/serialize.d.ts +13 -0
- package/dist/serialize.d.ts.map +1 -0
- package/dist/serialize.js +625 -0
- package/dist/serialize.js.map +1 -0
- package/package.json +45 -0
package/dist/cli.d.ts
ADDED
|
@@ -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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/project.js
ADDED
|
@@ -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":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAahD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAmB,EACnB,GAAc,EACd,UAAgC,EAAE;IAElC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,6BAA6B;IAC7B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,wDAAwD;IACxD,qEAAqE;IACrE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAoD,CAAC;IAChF,MAAM,UAAU,GAAG,OAAO,IAAI,EAAE,CAAC;IACjC,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAEtD,iBAAiB;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,cAAc,GAAG,OAAO,IAAI,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,UAAU;YACzB,CAAC,CAAC,GAAG,UAAU,CAAC,UAAU,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YAC9D,CAAC,CAAC,cAAc;gBACd,CAAC,CAAC,GAAG,cAAc,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;gBACvD,CAAC,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAE1C,IAAI,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExC,uFAAuF;QACvF,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC7D,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC7C,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;oBAClB,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBAChD,OAAO,GAAG,QAAQ,UAAU,mBAAmB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,UAAU,CAAC,QAAQ,UAAU,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gBACxJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,GAAG,EAAE,OAAO,OAAO,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,uEAAuE;YACvE,MAAM,EAAE,GAAG,eAAe,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAC3F,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,OAAO,GAAG,GAAG,EAAE,OAAO,OAAO,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,gDAAgD;IAChD,sBAAsB,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAE/C,yFAAyF;IACzF,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,8EAA8E;IAC9E,oEAAoE;IACpE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,cAAc,GAAG,OAAO,IAAI,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,SAAiB,CAAC;QACtB,IAAI,UAAU,EAAE,CAAC;YACf,SAAS,GAAG,UAAU,CAAC,UAAU;gBAC/B,CAAC,CAAC,GAAG,UAAU,CAAC,UAAU,IAAI,QAAQ,EAAE;gBACxC,CAAC,CAAC,QAAQ,CAAC;QACf,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,cAAc;gBACxB,CAAC,CAAC,GAAG,cAAc,IAAI,QAAQ,EAAE;gBACjC,CAAC,CAAC,QAAQ,CAAC;QACf,CAAC;QACD,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAE1C,wFAAwF;QACxF,4FAA4F;QAC5F,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACjE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACxC,IAAI,OAAO,GAAG,OAAO,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC;gBACtC,kDAAkD;gBAClD,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;gBACrD,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;IAE1D,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AASD,SAAS,WAAW,CAClB,KAAgB,EAChB,YAAoB,EACpB,WAAwC,EACxC,UAAmC;IAEnC,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,wCAAwC;YACxC,kFAAkF;YAClF,uDAAuD;YACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnF,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;YAE/E,yCAAyC;YACzC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAChD,QAAQ,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;YAED,wBAAwB;YACxB,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YAChE,QAAQ,EAAE,CAAC;QACb,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,YAAY;YACZ,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAgB,EAChB,YAAoB,EACpB,KAA0B;IAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnF,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;YAE/E,oCAAoC;YACpC,KAAK,CAAC,GAAG,CACP,GAAG,UAAU,YAAY,EACzB,eAAe,IAAI,CAAC,KAAK,SAAS,CACnC,CAAC;YAEF,UAAU;YACV,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,CAAC;AAED,2DAA2D;AAE3D,SAAS,SAAS,CAChB,KAAgB,EAChB,SAAiB,CAAC,EAClB,eAAqC;IAErC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;gBACxD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,WAAW,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,aAAa,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,WAAW,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4EAA4E;AAC5E,SAAS,cAAc,CACrB,IAAY,EACZ,eAAqC;IAErC,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,SAAS;YAAE,OAAO,GAAG,SAAS,KAAK,CAAC;IAC1C,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,2DAA2D;AAE3D,SAAS,gBAAgB,CAAC,KAAa,EAAE,QAAgB;IACvD,OAAO,eAAe,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,KAAK,CAAC,uBAAuB,QAAQ,OAAO,CAAC;AAC9G,CAAC;AAED,2DAA2D;AAE3D,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;WAChB,OAAO,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,iEAAiE;IACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC;AAC5C,CAAC;AAED,wEAAwE;AACxE,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AACpE,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -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 ``;
|
|
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 `[](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(" · ")}</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, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
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(/&/g, "&")
|
|
619
|
+
.replace(/</g, "<")
|
|
620
|
+
.replace(/>/g, ">")
|
|
621
|
+
.replace(/"/g, '"')
|
|
622
|
+
.replace(/'/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
|
+
}
|