import { ParsedMarkdown } from '../utils/types.js';
import matter from 'gray-matter';
export class MarkdownParser {
parse(content: string): ParsedMarkdown {
const parsed = matter(content);
return {
content: parsed.content,
frontmatter: parsed.data,
links: this.extractLinks(parsed.content),
tags: this.extractTags(parsed.content),
};
}
private extractLinks(content: string): string[] {
const links: string[] = [];
// Wikilinks: [[link]] or [[link|alias]]
const wikilinkRegex = /\[\[([^\]|]+)(?:\|[^\]]+)?\]\]/g;
let match;
while ((match = wikilinkRegex.exec(content)) !== null) {
links.push(match[1]);
}
// Markdown links: [text](url)
const markdownLinkRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
while ((match = markdownLinkRegex.exec(content)) !== null) {
links.push(match[2]);
}
return [...new Set(links)]; // Remove duplicates
}
private extractTags(content: string): string[] {
const tags: string[] = [];
// Tags: #tag or #tag/subtag
const tagRegex = /#([a-zA-Z0-9/_-]+)/g;
let match;
while ((match = tagRegex.exec(content)) !== null) {
tags.push(match[1]);
}
return [...new Set(tags)]; // Remove duplicates
}
extractFrontmatter(content: string): Record<string, any> | undefined {
try {
const parsed = matter(content);
return Object.keys(parsed.data).length > 0 ? parsed.data : undefined;
} catch {
return undefined;
}
}
}