/
deka
/
buffer
Обзор
Документация
Войти
/
deka
/
buffer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
tests/converters/board-text.test.mjs
84 строки
4 KB
Maksim Ratnikov
feat: текстовый кодек доски, нативный HTML в блоки и обратно
05 авг 2026, 11:20
05 авг 2026, 11:20
f12d9ca
Код
Авторство
О чём код?
import assert from "node:assert/strict"; import { parseNativeText, renderNativeText } from "../../src/converters/board-text.js"; assert.deepEqual(parseNativeText("<p></p>"), { blocks: [] }, "пустая ячейка доски со служебным U+FEFF даёт ноль блоков"); assert.deepEqual(parseNativeText(""), { blocks: [] }, "пустая строка даёт ноль блоков"); assert.deepEqual(parseNativeText(undefined), { blocks: [] }, "отсутствующий текст не роняет разбор"); assert.deepEqual( parseNativeText("Андреев Алексей Валерьевич"), { blocks: [{ type: "p", spans: [{ text: "Андреев Алексей Валерьевич" }] }] }, "текст без тегов — один параграф" ); assert.deepEqual( parseNativeText("<ul><li>asdf</li><li>bsdf</li></ul>"), { blocks: [ { type: "ul", spans: [{ text: "asdf" }] }, { type: "ul", spans: [{ text: "bsdf" }] } ] }, "каждый li — отдельный блок списка" ); assert.deepEqual( parseNativeText("<ol><li><b><i>x</i></b></li></ol>"), { blocks: [{ type: "ol", spans: [{ text: "x", bold: true, italic: true }] }] }, "вложенные b/i дают модификаторы спана" ); assert.equal(renderNativeText({ blocks: [] }), "<p></p>", "пустой текст сериализуется в пустой параграф доски"); assert.equal( renderNativeText({ blocks: [ { type: "ul", spans: [{ text: "a" }] }, { type: "ul", spans: [{ text: "b" }] } ] }), "<ul><li>a</li><li>b</li></ul>", "соседние блоки списка попадают в один ul" ); assert.equal( renderNativeText({ blocks: [{ type: "p", spans: [{ text: "a<b", bold: true }] }] }), "<p><b>a<b</b></p>", "текст экранируется, модификаторы становятся тегами" ); // Пробелы вокруг inline-тегов — без этого текст на доске склеится в «helloworld». assert.deepEqual( parseNativeText("<p>Hello <b>bold</b> world</p>"), { blocks: [{ type: "p", spans: [ { text: "Hello " }, { text: "bold", bold: true }, { text: " world" } ] }] }, "пробелы между спанами сохраняются" ); assert.equal( renderNativeText(parseNativeText("<p>Hello <b>bold</b> world</p>")), "<p>Hello <b>bold</b> world</p>", "и переживают обратную сборку" ); assert.deepEqual( parseNativeText("<p> ведущие и хвостовые </p>"), { blocks: [{ type: "p", spans: [{ text: "ведущие и хвостовые" }] }] }, "пробелы по краям блока обрезаются" ); assert.deepEqual( parseNativeText("<p><b><b>дважды</b></b></p>"), { blocks: [{ type: "p", spans: [{ text: "дважды", bold: true }] }] }, "повторно вложенный одинаковый модификатор не ломает счётчик" ); assert.deepEqual( parseNativeText(renderNativeText({ blocks: [{ type: "p", spans: [{ text: "a" }, { text: "b" }] }] })), parseNativeText("<p>ab</p>"), "соседние спаны с одинаковыми модификаторами склеиваются в канонический вид" ); const raw = "<ol><li><b><i>asdadsas</i></b></li><li><b><i>asdasd</i></b></li></ol>"; assert.deepEqual( parseNativeText(renderNativeText(parseNativeText(raw))), parseNativeText(raw), "разбор идемпотентен: parse(render(parse(x))) == parse(x)" ); console.log("board-text tests passed");