@principal-ade/markdown-utils
v0.1.3
Published
Core markdown parsing and presentation utilities without React dependencies
Maintainers
Readme
@a24z/markdown-utils
Core markdown parsing and presentation utilities without React dependencies. Extract slides, parse chunks, and handle markdown transformations.
Installation
npm install @a24z/markdown-utils
# or
bun add @a24z/markdown-utilsFeatures
- 📝 Markdown parsing - Parse markdown into typed chunks
- 🎯 Slide extraction - Split markdown into presentation slides
- 🔀 Presentation diffing - Compare two presentations slide-by-slide
- 🔌 Extensible - Plugin system for custom chunk types
- 🚀 Zero React dependencies - Pure TypeScript utilities
- 📦 Lightweight - ~22KB bundled
Usage
Parse Markdown into Chunks
import { parseMarkdownChunks, CHUNK_TYPES } from '@a24z/markdown-utils';
const chunks = parseMarkdownChunks(markdownContent, 'my-prefix');
chunks.forEach(chunk => {
if (chunk.type === CHUNK_TYPES.MERMAID) {
// Handle mermaid diagram
console.log('Mermaid:', chunk.content);
}
});Create Presentation from Markdown
import { parseMarkdownIntoPresentation, MarkdownPresentationFormat } from '@a24z/markdown-utils';
// Split by horizontal rules (---)
const presentation = parseMarkdownIntoPresentation(
markdownContent,
MarkdownPresentationFormat.HORIZONTAL_RULE
);
console.log(`${presentation.slides.length} slides found`);Compare Two Presentations
import { diffPresentations, parseMarkdownIntoPresentation } from '@a24z/markdown-utils';
const beforePresentation = parseMarkdownIntoPresentation(beforeMarkdown);
const afterPresentation = parseMarkdownIntoPresentation(afterMarkdown);
const diff = diffPresentations(beforePresentation, afterPresentation);
console.log(`${diff.summary.modified} slides modified`);
console.log(`${diff.summary.added} slides added`);
console.log(`${diff.summary.removed} slides removed`);
// Iterate through slide-by-slide diffs
diff.slideDiffs.forEach(slideDiff => {
console.log(`Slide status: ${slideDiff.status}`);
if (slideDiff.status === 'modified') {
// Access line-by-line content changes
slideDiff.contentChanges?.forEach(change => {
if (change.type === 'add') {
console.log(`+ ${change.value}`);
} else if (change.type === 'remove') {
console.log(`- ${change.value}`);
}
});
}
});Extend with Custom Chunks
import { BaseChunk, parseMarkdownChunks } from '@a24z/markdown-utils';
// Define custom chunk type
interface MathChunk extends BaseChunk<'math_chunk'> {
formula: string;
}
// Custom parser
const mathParser = (content: string, idPrefix: string): MathChunk[] => {
// Parse LaTeX math blocks...
return [];
};
// Use with parser
const chunks = parseMarkdownChunks<MathChunk | ContentChunk>(
content,
'prefix',
[mathParser]
);API
Types
Chunks:
BaseChunk<T>- Base interface for extensible chunksMarkdownChunk,MermaidChunk,CodeChunk- Built-in chunk types
Presentations:
MarkdownPresentation,MarkdownSlide- Presentation types
Diffs:
PresentationDiff- Complete diff analysis between two presentationsSlideDiff- Diff between two versions of a slideDiffSummary- Summary statistics for a presentation diffDiffStatus- Status of a slide:'added' | 'removed' | 'modified' | 'unchanged' | 'moved'TextDiff- Line-level text change
Functions
Parsing:
parseMarkdownChunks()- Parse markdown into typed chunksparseMarkdownIntoPresentation()- Create presentation from markdownextractSlideTitle()- Extract title from slide content
Diffing:
diffPresentations()- Compare two presentations and generate diffcalculateDiffSummary()- Generate summary statistics from a diffdiffText()- Low-level line-by-line text comparisonhasChanges()- Check if a diff has any changesformatDiffSummary()- Format summary as human-readable string
Utilities:
parseBashCommands()- Parse bash code blockstransformImageUrl()- Transform relative URLs to absoluteslidesAreEqual()- Check if two slides are identicalnormalizeText()- Normalize text for comparison
License
MIT - a24z Team
