feat(f7): block splitter for the render engine (#21)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Ben Stull
2026-06-11 08:42:11 -07:00
parent f6b3efe7a5
commit 247a450e10
2 changed files with 100 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
import { describe, it, expect } from "vitest";
import { splitBlocks } from "../src/trackChangesModel";
describe("splitBlocks", () => {
it("splits prose paragraphs on blank lines, dropping empties", () => {
const blocks = splitBlocks("# Heading\n\nFirst para.\n\nSecond para.\n");
expect(blocks.map((b) => b.type)).toEqual(["prose", "prose", "prose"]);
expect(blocks[0].raw).toBe("# Heading");
expect(blocks[2].raw).toBe("Second para.");
});
it("keeps a fenced code block whole and tags it `code`", () => {
const text = "Intro.\n\n```ts\nconst a = 1;\n\nconst b = 2;\n```\n\nOutro.\n";
const blocks = splitBlocks(text);
expect(blocks.map((b) => b.type)).toEqual(["prose", "code", "prose"]);
expect(blocks[1].raw).toBe("```ts\nconst a = 1;\n\nconst b = 2;\n```");
});
it("tags a mermaid fence `mermaid`", () => {
const blocks = splitBlocks("```mermaid\nflowchart LR\n a-->b\n```\n");
expect(blocks).toHaveLength(1);
expect(blocks[0].type).toBe("mermaid");
});
it("normalizes the key (whitespace-collapsed) for matching", () => {
const blocks = splitBlocks("Hello world\n");
expect(blocks[0].key).toBe("hello world");
});
});