astro-loader-obsidian
Version:
Use your Obsidian Vault in Astro projects
63 lines (53 loc) • 1.7 kB
text/typescript
import type { AstroIntegrationLogger } from "astro";
import type { ObsidianContext } from "../types";
import type { ObsidianLink } from "../schemas";
import { parseWikilinks, type Wikilink } from "./wikiLink";
import { parseWikitags, type Wikitag } from "./wikiTag";
export const parseBody = (
body: string,
context: ObsidianContext,
logger: AstroIntegrationLogger,
): {
content: string;
audios: ObsidianLink[];
files: ObsidianLink[];
images: ObsidianLink[];
links: ObsidianLink[];
wikilinks: Wikilink[];
wikitags: Wikitag[];
} => {
let content = body;
const links: ObsidianLink[] = [];
const images: ObsidianLink[] = [];
const audios: ObsidianLink[] = [];
const files: ObsidianLink[] = [];
const wikilinks = parseWikilinks(body, 'body', context, logger);
let wikitags: Wikitag[] = [];
for (const wikilink of wikilinks) {
const hasTarget = typeof wikilink.link.href === "string";
// TODO: Check if it's possible to move this to post processing layer
if (wikilink.link.type === 'image') {
if (hasTarget) {
images.push(wikilink.link);
}
}
if (wikilink.link.type === 'audio') {
if (hasTarget) {
audios.push(wikilink.link);
}
}
if (wikilink.link.type === 'file') {
if (hasTarget) {
files.push(wikilink.link);
}
}
}
if (context.options.parseTagsIntoLinks !== false) {
wikitags = parseWikitags(body, 'body', context, logger);
}
// remove h1 from content
if (!("removeH1" in context.options) || context.options.removeH1 === true) {
content = content.replace(/^# .+$/m, "");
}
return { content, audios, files, images, links, wikilinks, wikitags };
};