starlight-obsidian 0.4.1 → 0.4.3
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/libs/markdown.ts +5 -2
- package/libs/obsidian.ts +5 -4
- package/libs/remark.ts +28 -10
- package/package.json +3 -1
package/libs/markdown.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { fromMarkdown } from 'mdast-util-from-markdown'
|
|
1
2
|
import { remark } from 'remark'
|
|
2
3
|
import remarkFrontmatter from 'remark-frontmatter'
|
|
3
4
|
import remarkGfm from 'remark-gfm'
|
|
@@ -23,8 +24,10 @@ export async function transformMarkdownToString(
|
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
export function transformMarkdownToAST(filePath: string, markdown: string, context: TransformContext) {
|
|
27
|
-
|
|
27
|
+
export async function transformMarkdownToAST(filePath: string, markdown: string, context: TransformContext) {
|
|
28
|
+
const { content } = await transformMarkdownToString(filePath, markdown, context)
|
|
29
|
+
|
|
30
|
+
return fromMarkdown(content)
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
function getVFile(filePath: string, markdown: string, context: TransformContext) {
|
package/libs/obsidian.ts
CHANGED
|
@@ -2,6 +2,7 @@ import fs from 'node:fs/promises'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
|
|
4
4
|
import { z } from 'astro/zod'
|
|
5
|
+
import decodeUriComponent from 'decode-uri-component'
|
|
5
6
|
import { slug } from 'github-slugger'
|
|
6
7
|
import { globby } from 'globby'
|
|
7
8
|
import yaml from 'yaml'
|
|
@@ -108,14 +109,14 @@ export function slugifyObsidianPath(obsidianPath: string) {
|
|
|
108
109
|
const isLastSegment = index === segments.length - 1
|
|
109
110
|
|
|
110
111
|
if (!isLastSegment) {
|
|
111
|
-
return slug(
|
|
112
|
+
return slug(decodeUriComponent(segment))
|
|
112
113
|
} else if (isObsidianFile(segment) && !isAssetFile(segment)) {
|
|
113
|
-
return
|
|
114
|
+
return decodeUriComponent(segment)
|
|
114
115
|
} else if (isAssetFile(segment)) {
|
|
115
|
-
return `${slug(
|
|
116
|
+
return `${slug(decodeUriComponent(stripExtension(segment)))}${getExtension(segment)}`
|
|
116
117
|
}
|
|
117
118
|
|
|
118
|
-
return slug(
|
|
119
|
+
return slug(decodeUriComponent(stripExtension(segment)))
|
|
119
120
|
})
|
|
120
121
|
.join('/')
|
|
121
122
|
}
|
package/libs/remark.ts
CHANGED
|
@@ -53,6 +53,7 @@ export function remarkStarlightObsidian() {
|
|
|
53
53
|
|
|
54
54
|
handleReplacements(tree, file)
|
|
55
55
|
await handleMermaid(tree, file)
|
|
56
|
+
await handleImagesAndNoteEmbeds(tree, file)
|
|
56
57
|
|
|
57
58
|
visit(tree, (node, index, parent) => {
|
|
58
59
|
const context: VisitorContext = { file, index, parent }
|
|
@@ -65,9 +66,6 @@ export function remarkStarlightObsidian() {
|
|
|
65
66
|
case 'link': {
|
|
66
67
|
return handleLinks(node, context)
|
|
67
68
|
}
|
|
68
|
-
case 'image': {
|
|
69
|
-
return handleImages(node, context)
|
|
70
|
-
}
|
|
71
69
|
case 'blockquote': {
|
|
72
70
|
return handleBlockquotes(node, context)
|
|
73
71
|
}
|
|
@@ -77,7 +75,10 @@ export function remarkStarlightObsidian() {
|
|
|
77
75
|
}
|
|
78
76
|
})
|
|
79
77
|
|
|
80
|
-
|
|
78
|
+
if (!file.data.embedded) {
|
|
79
|
+
handleFrontmatter(tree, file, obsidianFrontmatter)
|
|
80
|
+
}
|
|
81
|
+
|
|
81
82
|
handleImports(tree, file)
|
|
82
83
|
}
|
|
83
84
|
}
|
|
@@ -275,7 +276,7 @@ function handleLinks(node: Link, { file }: VisitorContext) {
|
|
|
275
276
|
return SKIP
|
|
276
277
|
}
|
|
277
278
|
|
|
278
|
-
function handleImages(node: Image, context: VisitorContext) {
|
|
279
|
+
async function handleImages(node: Image, context: VisitorContext) {
|
|
279
280
|
const { file } = context
|
|
280
281
|
|
|
281
282
|
ensureTransformContext(file)
|
|
@@ -299,7 +300,7 @@ function handleImages(node: Image, context: VisitorContext) {
|
|
|
299
300
|
}
|
|
300
301
|
|
|
301
302
|
if (isMarkdownFile(node.url, file)) {
|
|
302
|
-
replaceNode(context, getMarkdownFileNode(file, node.url))
|
|
303
|
+
replaceNode(context, await getMarkdownFileNode(file, node.url))
|
|
303
304
|
return SKIP
|
|
304
305
|
}
|
|
305
306
|
|
|
@@ -419,6 +420,21 @@ async function handleMermaid(tree: Root, file: VFile) {
|
|
|
419
420
|
)
|
|
420
421
|
}
|
|
421
422
|
|
|
423
|
+
async function handleImagesAndNoteEmbeds(tree: Root, file: VFile) {
|
|
424
|
+
const imageNodes: [node: Image, context: VisitorContext][] = []
|
|
425
|
+
|
|
426
|
+
visit(tree, 'image', (node, index, parent) => {
|
|
427
|
+
imageNodes.push([node, { file, index, parent }])
|
|
428
|
+
return SKIP
|
|
429
|
+
})
|
|
430
|
+
|
|
431
|
+
await Promise.all(
|
|
432
|
+
imageNodes.map(async ([node, context]) => {
|
|
433
|
+
await handleImages(node, context)
|
|
434
|
+
}),
|
|
435
|
+
)
|
|
436
|
+
}
|
|
437
|
+
|
|
422
438
|
function getFrontmatterNodeValue(file: VFile, obsidianFrontmatter?: ObsidianFrontmatter) {
|
|
423
439
|
let frontmatter: Frontmatter = {
|
|
424
440
|
title: file.stem,
|
|
@@ -587,7 +603,7 @@ function getCustomFileNode(filePath: string): RootContent {
|
|
|
587
603
|
}
|
|
588
604
|
}
|
|
589
605
|
|
|
590
|
-
function getMarkdownFileNode(file: VFile, fileUrl: string): RootContent {
|
|
606
|
+
async function getMarkdownFileNode(file: VFile, fileUrl: string): Promise<RootContent> {
|
|
591
607
|
ensureTransformContext(file)
|
|
592
608
|
|
|
593
609
|
const fileExt = file.data.vault.options.linkSyntax === 'wikilink' ? '.md' : ''
|
|
@@ -595,15 +611,16 @@ function getMarkdownFileNode(file: VFile, fileUrl: string): RootContent {
|
|
|
595
611
|
file.data.vault.options.linkFormat === 'relative' ? getRelativeFilePath(file, fileUrl) : fileUrl,
|
|
596
612
|
)
|
|
597
613
|
const url = path.posix.join(path.posix.sep, `${filePath}${fileExt}`)
|
|
598
|
-
|
|
599
|
-
|
|
614
|
+
const matchingFile = file.data.files.find(
|
|
615
|
+
(vaultFile) => vaultFile.path === url || vaultFile.isEqualStem(filePath) || vaultFile.isEqualFileName(filePath),
|
|
616
|
+
)
|
|
600
617
|
|
|
601
618
|
if (!matchingFile) {
|
|
602
619
|
return { type: 'text', value: '' }
|
|
603
620
|
}
|
|
604
621
|
|
|
605
622
|
const content = fs.readFileSync(matchingFile.fsPath, 'utf8')
|
|
606
|
-
const root = transformMarkdownToAST(matchingFile.fsPath, content, file.data)
|
|
623
|
+
const root = await transformMarkdownToAST(matchingFile.fsPath, content, { ...file.data, embedded: true })
|
|
607
624
|
|
|
608
625
|
return {
|
|
609
626
|
type: 'blockquote',
|
|
@@ -643,6 +660,7 @@ export interface TransformContext {
|
|
|
643
660
|
aliases?: string[]
|
|
644
661
|
assetImports?: [id: string, path: string][]
|
|
645
662
|
copyStarlightFrontmatter?: boolean
|
|
663
|
+
embedded?: boolean
|
|
646
664
|
files: VaultFile[]
|
|
647
665
|
includeKatexStyles?: boolean
|
|
648
666
|
includeTwitterComponent?: boolean
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "starlight-obsidian",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Starlight plugin to publish Obsidian vaults.",
|
|
6
6
|
"author": "HiDeoo <github@hideoo.dev> (https://hideoo.dev)",
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"@astro-community/astro-embed-twitter": "0.5.3",
|
|
21
21
|
"@astro-community/astro-embed-youtube": "0.4.4",
|
|
22
22
|
"@astrojs/markdown-remark": "4.2.1",
|
|
23
|
+
"decode-uri-component": "0.4.1",
|
|
23
24
|
"github-slugger": "2.0.0",
|
|
24
25
|
"globby": "14.0.0",
|
|
25
26
|
"hast-util-to-html": "9.0.0",
|
|
@@ -28,6 +29,7 @@
|
|
|
28
29
|
"html-escaper": "3.0.3",
|
|
29
30
|
"is-absolute-url": "4.0.1",
|
|
30
31
|
"mdast-util-find-and-replace": "3.0.1",
|
|
32
|
+
"mdast-util-from-markdown": "2.0.0",
|
|
31
33
|
"mdast-util-to-hast": "13.1.0",
|
|
32
34
|
"nanoid": "5.0.4",
|
|
33
35
|
"rehype": "13.0.1",
|