/
deka
/
buffer
Обзор
Документация
Войти
/
deka
/
buffer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
tests/converters/layout-renderer.test.mjs
53 строки
2 KB
Maksim Ratnikov
fix: emit the wiki's own block serialization for paste
28 июл 2026, 15:46
28 июл 2026, 15:46
e62552e
Код
Авторство
О чём код?
import assert from "node:assert/strict"; import { renderLayoutBlocks, renderLayoutBlock, renderLayoutTable } from "../../src/converters/layout-renderer.js"; globalThis.window ??= { crypto: { randomUUID: () => "id-deadbeef" } }; // Empty input assert.equal(renderLayoutBlocks([]), ""); // Heading block (uses block.text per the renderer contract) const heading = renderLayoutBlock({ type: "heading", level: 2, text: "Hello" }); assert.match(heading, /^<h2 [^>]*>Hello<\/h2>$/); // Paragraph block const para = renderLayoutBlock({ type: "paragraph", text: "Just text" }); assert.match(para, /<p [^>]*>Just text<\/p>/); // Table block (contract: 3 columns -> widths sum to 1500) const tableHtml = renderLayoutTable({ type: "table", headers: ["A", "B", "C"], rows: [["1", "2", "3"]] }); assert.match(tableHtml, /columnwidths="500,500,500"/); assert.match(tableHtml, /<th [^>]*><span><p [^>]*>A<\/p><\/span><\/th>/); assert.match(tableHtml, /<td [^>]*><p [^>]*>1<\/p><\/td>/); // Wiki serialization contract: the editor's own copy carries data-indent on every // text block, id==data-id on headings, numbered-column-td on cells, and a panel // descriptor div. Mirror it exactly — that shape is what pastes back into the wiki. assert.match(heading, /<h2 data-id="id-deadbeef" data-indent="0" id="id-deadbeef" style="text-align: justify; margin-left: 0px !important;">/); assert.match(para, /<p data-id="[^"]+" data-indent="0" style=/); assert.match(tableHtml, /<td [^>]*class="numbered-column-td"/); const panel = renderLayoutBlock({ type: "panel", title: "Заголовок", blocks: [{ type: "paragraph", text: "Тело" }] }); assert.match(panel, /custombackground="gray" customborderstyle="none" customborderwidth="1" custombordercolor="gray" data-type="info"/); assert.match(panel, /<div>\[Информационная панель: тип - info, заголовок - Заголовок, показывать заголовок - true, показывать иконку - true\./); assert.match(panel, /<\/div><div><p [^>]*>Тело<\/p><\/div><\/div>$/); const grid = renderLayoutBlock({ type: "blocksGrid", columns: [[{ type: "paragraph", text: "L" }]] }); assert.match(grid, /data-type="column" class="column_yu7m7"><div class="content_yu7m7">/); // Multiple blocks render in order const multi = renderLayoutBlocks([ { type: "heading", level: 1, text: "H" }, { type: "paragraph", text: "P" } ]); assert.match(multi, /<h1[\s\S]*<\/h1>[\s\S]*<p[\s\S]*<\/p>/); console.log("layout-renderer smoke tests passed");