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.