adoctra-wasm открывает JavaScript парсер — но не конвертеры. Он сделан для редакторов: разбор устойчив к ошибкам, у каждого блока есть байтовые диапазоны, а поток токенов управляет подсветкой синтаксиса.
Сборка
rustup target add wasm32-unknown-unknown
wasm-pack build crates/adoctra-wasm --target web # или --target bundler
API
parse_json(text)-
{ document, diagnostics, tokens }; у диагностик и токенов — байтовые диапазоны UTF-8 ({ source_id, start, end }). tokens_json(text)-
только токены подсветки.
ResourceWorkspace-
виртуальная файловая система для включений и изображений:
set(name, text),set_binary(name, bytes),remove(name),load(target, relative_to),parse_json(source_id),tokens_json(source_id).
import init, { parse_json, ResourceWorkspace } from "./pkg/adoctra_wasm.js";
await init();
const { document, diagnostics, tokens } = JSON.parse(parse_json("= Title\n\nText"));
const ws = new ResourceWorkspace();
ws.set("/main.adoc", "= Book\n\ninclude::chapter.adoc[]");
ws.set("/chapter.adoc", "== Chapter");
const main = ws.load("/main.adoc");
const book = JSON.parse(ws.parse_json(main));
Некорректный ввод никогда не вызывает исключение: результат — частичный документ и диагностики, поэтому редактор продолжает показывать структуру и подсветку, пока пользователь печатает.
Диаграммы
Браузер не может запускать инструменты диаграмм, поэтому они рисуются через Kroki или сервер PlantUML. Разбор синхронный, а сетевые запросы — нет: разбор перечисляет нужные запросы, хост выполняет их и разбирает документ снова.
const ws = new DiagramWorkspace("https://kroki.io/", "kroki_io");
let result = JSON.parse(ws.parse_json(text, 0));
for (const r of result.diagrams.requests) {
const response = await fetch(r.url, r.body === undefined ? {} :
{ method: "POST", body: r.body, headers: { "Content-Type": r.content_type } });
if (response.ok) ws.set_response(r.key, new Uint8Array(await response.arrayBuffer()));
else ws.set_error(r.key, `${response.status} "${response.statusText}"`);
}
result = JSON.parse(ws.parse_json(text, 0)); // изображения в result.diagrams.images
Чтобы читать файлы диаграмм из ResourceWorkspace, вызовите ws.enable_diagrams(url, type) и передавайте ответы через set_diagram_response/set_diagram_error. Диаграммам PlantUML в браузере нужен preprocess=false.