@dogsbay/format-obsidian 0.2.0-beta.11 → 0.2.0-beta.110
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.map +1 -1
- package/dist/cli.js +146 -31
- package/dist/cli.js.map +1 -1
- package/dist/project.d.ts +49 -2
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +501 -33
- package/dist/project.js.map +1 -1
- package/dist/serialize.d.ts +19 -0
- package/dist/serialize.d.ts.map +1 -1
- package/dist/serialize.js +444 -111
- package/dist/serialize.js.map +1 -1
- package/package.json +7 -5
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,YA+EpB,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, writeFileSync, cpSync, readdirSync, statSync } from "node:fs";
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync, cpSync, readdirSync, statSync } from "node:fs";
|
|
2
2
|
import { join, dirname, resolve, relative } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { exportObsidianVault } from "./project.js";
|
|
@@ -12,6 +12,7 @@ export const plugin = {
|
|
|
12
12
|
exportOptions: [
|
|
13
13
|
{ flags: "--tabs <mode>", description: "Tab handling: dogsbay-tabs (default) or flatten", default: "dogsbay-tabs" },
|
|
14
14
|
{ flags: "--plugin <mode>", description: "Plugin setup: bundled (copy into vault), registry (list only), none", default: "bundled" },
|
|
15
|
+
{ flags: "--graph-groups <path>", description: "JSON file of graph-view colour groups: [{ \"query\": \"path:guides\", \"color\": \"#F2B36F\" }]. Replaces the default hub group. Ignored if the vault already has a graph.json" },
|
|
15
16
|
],
|
|
16
17
|
async export(pages, nav, output, opts) {
|
|
17
18
|
const pluginMode = opts.plugin ?? "bundled";
|
|
@@ -26,7 +27,34 @@ export const plugin = {
|
|
|
26
27
|
writeFileSync(fullPath, content);
|
|
27
28
|
}
|
|
28
29
|
console.log(`Generated ${result.files.size} vault files`);
|
|
29
|
-
//
|
|
30
|
+
// Mounted asset dirs (a Starlight `src/assets`, a Docusaurus `static/`),
|
|
31
|
+
// copied to `_assets/` to match the `/_assets/…` refs importers rewrite
|
|
32
|
+
// image paths to. Without this the vault carried the reference and not the
|
|
33
|
+
// file — the note renders with a broken image and nothing reports it.
|
|
34
|
+
const mounts = opts.assetMounts;
|
|
35
|
+
for (const mount of mounts ?? []) {
|
|
36
|
+
if (!existsSync(mount.dir))
|
|
37
|
+
continue;
|
|
38
|
+
// The mount carries the root its refs were rewritten to — `_assets`
|
|
39
|
+
// for an imported corpus, `images`/`assets` for hand-authored content.
|
|
40
|
+
// Hardcoding `_assets` here would copy the file somewhere the
|
|
41
|
+
// reference does not point, which is the broken-image-and-no-report
|
|
42
|
+
// failure this copy exists to prevent.
|
|
43
|
+
const root = mount.root ?? "_assets";
|
|
44
|
+
const dest = mount.into ? join(output, root, mount.into) : join(output, root);
|
|
45
|
+
mkdirSync(dest, { recursive: true });
|
|
46
|
+
// `mediaOnly` mounts are whole docs trees (the Docusaurus and VitePress
|
|
47
|
+
// importers mount their entire docs dir this way) — copying them wholesale
|
|
48
|
+
// buries hundreds of duplicate .md/.mdx notes under _assets/. Take only
|
|
49
|
+
// the media, matching format-dogsbay-md's copyMediaTree.
|
|
50
|
+
if (mount.mediaOnly) {
|
|
51
|
+
copyMediaTree(mount.dir, dest);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
cpSync(mount.dir, dest, { recursive: true });
|
|
55
|
+
}
|
|
56
|
+
// Co-located images from the source docs directory (the mkdocs shape,
|
|
57
|
+
// where media sits next to the markdown rather than in its own tree).
|
|
30
58
|
const sourceDir = opts.sourceDir;
|
|
31
59
|
if (sourceDir) {
|
|
32
60
|
copyImages(sourceDir, output);
|
|
@@ -38,8 +66,8 @@ export const plugin = {
|
|
|
38
66
|
else if (pluginMode === "registry") {
|
|
39
67
|
installRegistryRef(output);
|
|
40
68
|
}
|
|
41
|
-
// Pre-configure
|
|
42
|
-
|
|
69
|
+
// Pre-configure graph view: colour groups + forces tuned for a docs vault
|
|
70
|
+
installGraphConfig(output, opts.graphGroups);
|
|
43
71
|
},
|
|
44
72
|
};
|
|
45
73
|
/**
|
|
@@ -72,12 +100,17 @@ function installBundledPlugin(vaultDir) {
|
|
|
72
100
|
* Write .obsidian/community-plugins.json listing the plugin.
|
|
73
101
|
* Obsidian will prompt the user to install it from the registry.
|
|
74
102
|
*/
|
|
75
|
-
/**
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
103
|
+
/**
|
|
104
|
+
* Plugins listed in community-plugins.json.
|
|
105
|
+
*
|
|
106
|
+
* Only plugins the vault actually SHIPS belong here. Listing one we don't
|
|
107
|
+
* bundle made Obsidian report it as enabled while nothing loaded — the vault
|
|
108
|
+
* carried a data.json for Front Matter Title and no plugin, so graph labels
|
|
109
|
+
* silently fell back to filenames. Section notes are named `_<folder>.md` for
|
|
110
|
+
* exactly that reason, and readers who want frontmatter titles everywhere can
|
|
111
|
+
* install Front Matter Title themselves (see docs/obsidian-vaults.md).
|
|
112
|
+
*/
|
|
113
|
+
const RECOMMENDED_PLUGINS = [PLUGIN_ID];
|
|
81
114
|
function installRegistryRef(vaultDir) {
|
|
82
115
|
const obsidianDir = join(vaultDir, ".obsidian");
|
|
83
116
|
mkdirSync(obsidianDir, { recursive: true });
|
|
@@ -85,29 +118,85 @@ function installRegistryRef(vaultDir) {
|
|
|
85
118
|
console.log(`Listed plugins in community-plugins.json: ${RECOMMENDED_PLUGINS.join(", ")}`);
|
|
86
119
|
}
|
|
87
120
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
121
|
+
* Read `--graph-groups <path>`: `[{ "query": "path:guides", "color": "#F2B36F" }]`.
|
|
122
|
+
*
|
|
123
|
+
* Colours are accepted as `#RRGGBB`, `RRGGBB`, or a raw number, and converted
|
|
124
|
+
* to the decimal int Obsidian stores — asking an author to write `15905647`
|
|
125
|
+
* would be a needless papercut.
|
|
126
|
+
*
|
|
127
|
+
* Throws on a malformed file rather than silently shipping the default: a
|
|
128
|
+
* caller who passed the flag wants THEIR groups, and a quiet fallback would
|
|
129
|
+
* look like the flag being ignored.
|
|
91
130
|
*/
|
|
92
|
-
function
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
131
|
+
function readGraphGroups(path) {
|
|
132
|
+
let raw;
|
|
133
|
+
try {
|
|
134
|
+
raw = JSON.parse(readFileSync(path, "utf8"));
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
throw new Error(`--graph-groups: could not parse ${path} as JSON: ${err.message}`);
|
|
138
|
+
}
|
|
139
|
+
if (!Array.isArray(raw)) {
|
|
140
|
+
throw new Error(`--graph-groups: ${path} must contain a JSON array of { query, color }`);
|
|
141
|
+
}
|
|
142
|
+
return raw.map((entry, i) => {
|
|
143
|
+
const g = entry;
|
|
144
|
+
if (!g || typeof g.query !== "string" || !g.query) {
|
|
145
|
+
throw new Error(`--graph-groups: entry ${i} needs a non-empty "query" string`);
|
|
146
|
+
}
|
|
147
|
+
let rgb;
|
|
148
|
+
if (typeof g.color === "number") {
|
|
149
|
+
rgb = g.color;
|
|
150
|
+
}
|
|
151
|
+
else if (typeof g.color === "string") {
|
|
152
|
+
const hex = g.color.replace(/^#/, "");
|
|
153
|
+
if (!/^[0-9a-fA-F]{6}$/.test(hex)) {
|
|
154
|
+
throw new Error(`--graph-groups: entry ${i} colour "${g.color}" is not #RRGGBB`);
|
|
155
|
+
}
|
|
156
|
+
rgb = parseInt(hex, 16);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
throw new Error(`--graph-groups: entry ${i} needs a "color" (#RRGGBB or a number)`);
|
|
160
|
+
}
|
|
161
|
+
return { query: g.query, color: { a: 1, rgb } };
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
function installGraphConfig(vaultDir, groupsPath) {
|
|
165
|
+
const obsidianDir = join(vaultDir, ".obsidian");
|
|
166
|
+
const graphPath = join(obsidianDir, "graph.json");
|
|
167
|
+
if (existsSync(graphPath))
|
|
168
|
+
return; // the reader's own view state — leave it
|
|
169
|
+
const colorGroups = groupsPath
|
|
170
|
+
? readGraphGroups(groupsPath)
|
|
171
|
+
: // Default: only the group that is true of EVERY Dogsbay vault. Anything
|
|
172
|
+
// corpus-specific (a genre axis, a per-book split) belongs to whoever
|
|
173
|
+
// knows the corpus — pass --graph-groups for those.
|
|
174
|
+
[{ query: "file:/^_/", color: { a: 1, rgb: 0xf2b3_6f } }];
|
|
175
|
+
mkdirSync(obsidianDir, { recursive: true });
|
|
176
|
+
writeFileSync(graphPath, JSON.stringify({
|
|
177
|
+
"collapse-filter": false,
|
|
178
|
+
search: "",
|
|
179
|
+
showTags: false,
|
|
180
|
+
showAttachments: false,
|
|
181
|
+
hideUnresolved: true, // unresolved links are noise, not nodes
|
|
182
|
+
showOrphans: true,
|
|
183
|
+
"collapse-color-groups": false,
|
|
184
|
+
colorGroups,
|
|
185
|
+
"collapse-display": true,
|
|
186
|
+
showArrow: true, // direction matters when hubs point outward
|
|
187
|
+
textFadeMultiplier: -1.5, // labels only when zoomed in; a docs vault is dense
|
|
188
|
+
nodeSizeMultiplier: 0.9,
|
|
189
|
+
lineSizeMultiplier: 0.7,
|
|
190
|
+
"collapse-forces": true,
|
|
191
|
+
centerStrength: 0.5,
|
|
192
|
+
repelStrength: 7, // below the default 10 — let clusters tighten
|
|
193
|
+
linkStrength: 1,
|
|
194
|
+
linkDistance: 180,
|
|
195
|
+
scale: 1,
|
|
196
|
+
close: false,
|
|
197
|
+
}, null, 2) + "\n");
|
|
198
|
+
console.log("Pre-configured graph view (.obsidian/graph.json)");
|
|
106
199
|
}
|
|
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
200
|
function copyImages(sourceDir, vaultDir) {
|
|
112
201
|
const imageExts = new Set([".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp"]);
|
|
113
202
|
let count = 0;
|
|
@@ -158,4 +247,30 @@ function resolvePluginDist() {
|
|
|
158
247
|
}
|
|
159
248
|
return null;
|
|
160
249
|
}
|
|
250
|
+
/** Media extensions carried across for a `mediaOnly` mount — mirrors format-dogsbay-md. */
|
|
251
|
+
const MEDIA_EXTS = new Set([
|
|
252
|
+
".png", ".jpg", ".jpeg", ".gif", ".webp", ".avif",
|
|
253
|
+
".svg", ".ico", ".pdf", ".mp4", ".webm",
|
|
254
|
+
]);
|
|
255
|
+
/**
|
|
256
|
+
* Copy only media files out of a mount, preserving its subtree shape.
|
|
257
|
+
*
|
|
258
|
+
* A `mediaOnly` mount is a whole docs directory (Docusaurus and VitePress both
|
|
259
|
+
* mount theirs that way), so a recursive copy would bury every `.md`/`.mdx` in
|
|
260
|
+
* the source under `_assets/` as duplicate notes.
|
|
261
|
+
*/
|
|
262
|
+
function copyMediaTree(srcDir, destDir) {
|
|
263
|
+
for (const entry of readdirSync(srcDir, { withFileTypes: true })) {
|
|
264
|
+
const full = join(srcDir, entry.name);
|
|
265
|
+
if (entry.isDirectory()) {
|
|
266
|
+
copyMediaTree(full, join(destDir, entry.name));
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const dot = entry.name.lastIndexOf(".");
|
|
270
|
+
if (dot === -1 || !MEDIA_EXTS.has(entry.name.slice(dot).toLowerCase()))
|
|
271
|
+
continue;
|
|
272
|
+
mkdirSync(destDir, { recursive: true });
|
|
273
|
+
cpSync(full, join(destDir, entry.name));
|
|
274
|
+
}
|
|
275
|
+
}
|
|
161
276
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/project.d.ts
CHANGED
|
@@ -2,19 +2,66 @@
|
|
|
2
2
|
* Obsidian vault exporter.
|
|
3
3
|
*
|
|
4
4
|
* Takes ExportPage[] + NavItem[] and generates a complete Obsidian vault
|
|
5
|
-
* with folder structure from nav, sidebar_position frontmatter,
|
|
5
|
+
* with folder structure from nav, sidebar_position frontmatter, folder notes
|
|
6
6
|
* per section, and _nav.yml for lossless round-trip.
|
|
7
7
|
*/
|
|
8
8
|
import type { ExportPage, NavItem } from "@dogsbay/types";
|
|
9
9
|
export interface ObsidianVaultOptions {
|
|
10
10
|
vaultName?: string;
|
|
11
|
-
assetsDir?: string;
|
|
12
11
|
/** Section name — pages go under this subfolder, nav gets a top-level entry */
|
|
13
12
|
section?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Emit a `_<folder>.md` folder note per nav section (default `true`).
|
|
15
|
+
*
|
|
16
|
+
* These are **invented by this exporter** — no source format supplies them,
|
|
17
|
+
* and they do not appear in `_nav.yml` (a section is a label-only nav entry
|
|
18
|
+
* with no path), so the folder note is the only thing that makes a section
|
|
19
|
+
* addressable at all.
|
|
20
|
+
*
|
|
21
|
+
* Measured on the OpenShift 4.22 vault (2,105 notes), they are load-bearing
|
|
22
|
+
* once populated — they carry the nav as real links, and are the sole
|
|
23
|
+
* inbound link for ~470 content pages that no prose links to:
|
|
24
|
+
*
|
|
25
|
+
* | | notes | edges | no inbound | isolated |
|
|
26
|
+
* |---|---|---|---|---|
|
|
27
|
+
* | with, populated | 2,105 | 6,954 | 44 | 0 |
|
|
28
|
+
* | without | 1,796 | 4,893 | 523 | 278 |
|
|
29
|
+
*
|
|
30
|
+
* Set `false` for a vault that mirrors the source exactly — at the cost of
|
|
31
|
+
* the folder-click affordance and the nav-as-links layer.
|
|
32
|
+
*/
|
|
33
|
+
sectionIndexes?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Give every folder note a body listing its children (default `true`).
|
|
36
|
+
* Ignored when `sectionIndexes` is `false`.
|
|
37
|
+
*
|
|
38
|
+
* Without it a section index is frontmatter and nothing else: clicking a
|
|
39
|
+
* folder in Obsidian yields a title and white space, and the note has no
|
|
40
|
+
* outbound links, so it sits outside the graph. On the OpenShift 4.22 export
|
|
41
|
+
* that was 309 of 309 section indexes with zero links — the entire outer
|
|
42
|
+
* ring of orphans in the graph view.
|
|
43
|
+
*
|
|
44
|
+
* The listing is ordinary markdown links, so it also feeds backlinks, the
|
|
45
|
+
* local graph, and any consumer that reads links rather than a nav file.
|
|
46
|
+
*
|
|
47
|
+
* Set `false` to keep the frontmatter-only stubs (previous behaviour).
|
|
48
|
+
*/
|
|
49
|
+
sectionIndexLinks?: boolean;
|
|
14
50
|
}
|
|
15
51
|
export interface ObsidianVaultExport {
|
|
16
52
|
files: Map<string, string>;
|
|
17
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Path of a section's folder note.
|
|
56
|
+
*
|
|
57
|
+
* Named `_<folder>.md`, not `_index.md`: Obsidian labels graph nodes and tabs
|
|
58
|
+
* by FILENAME, so a vault of 309 sections showed 309 identical `_index` nodes.
|
|
59
|
+
* The leading underscore keeps the note sorted to the top of its folder and
|
|
60
|
+
* distinguishes it from a content page that shares the folder's name — 20
|
|
61
|
+
* sections in the OpenShift corpus contain `<folder>/<folder>.md`, so the bare
|
|
62
|
+
* folder name would collide. No page in that corpus starts with `_`.
|
|
63
|
+
*/
|
|
64
|
+
export declare function sectionNotePath(folderPath: string): string;
|
|
18
65
|
/**
|
|
19
66
|
* Export pages + nav to an Obsidian vault file map.
|
|
20
67
|
*/
|
package/dist/project.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;;;;;;;;;OAcG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EAAE,EACnB,GAAG,EAAE,OAAO,EAAE,EACd,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CA6YrB"}
|