Motor de layout de código aberto · v1.22.1

O compositor programável para a web

O Postext parte de markdown semântico e aplica regras editoriais com séculos de história (justificação Knuth-Plass, colunas equilibradas, flutuantes que sabem o seu lugar) para produzir páginas com qualidade editorial em HTML, canvas ou PDF pronto para impressão.

Cada página é calculada no seu navegador

Postext

Em poucas palavras

O Postext é um software livre e gratuito que diagrama as páginas de livros, revistas e relatórios. Você escreve o texto com algumas marcações simples, e o Postext o transforma em páginas prontas, como as de um livro impresso. Ele segue regras que os impressores usam há séculos, para que o texto seja fácil de ler. As páginas podem ir para um site, para um aplicativo ou para um PDF pronto para a gráfica. Foi feito para quem escreve, edita, projeta ou programa.

Transcrição

Tudo o que o narrador diz, com uma descrição do que aparece na tela.

  1. 0:00

    Na telaSobre fundo escuro, “MOGÚNCIA · 1455” acima de um fio dourado. Atrás da manchete “Durante cinco séculos, a imprensa aprendeu a compor a página.”, o ano avança de 1455 a 2026 em grandes algarismos vazados, e termos do ofício vão caindo em volta: Justificação, Kerning, Viúvas, órfãs, Colunas equilibradas, Entrelinha, Grade de base, hi·fe·ni·za·ção, Medida, Flutuantes, Cabeços, Rios. A câmera entra no ponto final, que enche a tela de dourado.

    NarraçãoDurante cinco séculos, a imprensa aprendeu a compor a página.

  2. 0:06

    Na telaManchete: “A web aprendeu a diagramar interfaces. Nunca aprendeu a compor uma página.” Uma janela de navegador em example.com/longform/article mostra um artigo justificado em três colunas, “Por que a web falha”; etiquetas vermelhas apontam rios de branco, uma órfã, uma viúva, uma imagem que cai sobre o texto e uma última coluna desequilibrada. Ao lado, um chip de código diz “column-count: 3;”, seguido de “…e pouco mais.” e de uma lista riscada com os mesmos cinco defeitos: Rios de branco, Órfãs, Viúvas, Colisões, Colunas desequilibradas. A janela se distorce e desaba.

    NarraçãoA web aprendeu a diagramar as interfaces. Nunca as páginas. Por isso o texto longo continua se quebrando: rios, viúvas, órfãs, colisões.

  3. 0:20

    Na telaDepois de um clarão branco e de uma varredura de faixas azul, dourada e vermelha, o logotipo do Postext sobe até o seu lugar com o lema “O tipógrafo programável para a web”. Embaixo: CÓDIGO ABERTO · LICENÇA MIT · v1.20.3 · FUNCIONA NO SEU NAVEGADOR.

    NarraçãoEste é o Postext: o tipógrafo programável para a web.

  4. 0:26

    Na telaSeção 01 de 07, “Entra o conteúdo”: “O Markdown diz o que é cada coisa.” Um arquivo Markdown, 03-por-que-postext.md, se digita sozinho: uma diretiva de parte, o título “Por que Postext” com um lead, um parágrafo que cita a figura fig-flow com :ref, uma linha ::resource e um bloco :::callout. Ao lado, config.ts chama buildDocument com diagramação em duas colunas, texto justificado e hifenização para “pt-BR”, sob a frase “A configuração decide como fica. O texto não contém nenhuma decisão de diagramação.”

    NarraçãoVocê escreve Markdown semântico, que diz o que é cada coisa. A configuração decide como fica.

  5. 0:34

    Na telaSeção 02, “O Pretext mede”: “Medido sem tocar no DOM.” Um título, um parágrafo e um boxe são escaneados um depois do outro, e linhas de cota dão a altura de cada um em pontos; um painel de código mostra prepare(text, '25px Lora') e layout(prepared, width, 38), que devolve uma altura e um número de linhas. Duas barras disputam 10.000 parágrafos: “Reflow do navegador · DOM” mal sai do lugar e “Pretext · canvas + aritmética” se enche na hora, e um contador sobe até 600× acima de “mais rápido que o DOM para medir texto, para que um livro inteiro se recomponha enquanto você digita” e “Baseado em @chenglou/pretext”.

    NarraçãoCada parágrafo se mede sem tocar o DOM, até seiscentas vezes mais rápido, graças ao Pretext, a biblioteca que o tornou possível.

  6. 0:44

    Na telaSeção 03, “O Postext decide”: “Cada linha no lugar antes de pintar um pixel.” Um anel de sete segmentos se acende por turnos, Estrutura, Medição, Disposição, Flutuantes, Refino, Equilíbrio e Ritmo, cada um com uma linha de explicação, enquanto ao lado se monta uma página em duas colunas do guia do Postext: os blocos etiquetados voam para as suas colunas, uma figura desliza até o lugar com a nota “:ref{id="fig-flow"} → pé da coluna”, a faixa de abertura desce, as linhas aparecem, as colunas se nivelam e a grade de base desce pela página. O anel percorre as iterações 1 a 3 e mostra “Estável em 3 iterações” com um visto; um boxe dá a caixa e a linha de base de uma linha.

    NarraçãoDepois, o Postext decide. Sete passadas posicionam cada linha, levam cada figura ao seu lugar e equilibram as colunas, até que nada se mova.

  7. 0:57

    Na telaSeção 04, “O documento virtual”: “Mude uma palavra. Só se recompõe o que muda.”, com a nota “Como o virtual DOM do React, mas para páginas: o VDT, uma árvore de documento virtual.” Sete páginas, da p. 7 à p. 13, em fila; um cursor marca uma edição na p. 11, o resto dessa coluna fica dourado como SUJO e uma faixa passa para a p. 12, que recebe um visto e ESTÁVEL, enquanto as anteriores dizem PULADA e as seguintes INTACTA. Três marcadores explicam a regra, e um painel com o título renderToHtmlIndexed() marca como ATUALIZADO os nós da árvore que mudaram.

    NarraçãoTudo vive num documento virtual, como o virtual DOM do React. Você muda uma palavra, e só o que mudou é recomposto.

  8. 1:07

    Na tela“Um documento longo? Só se pinta o que está na tela.” Uma coluna de páginas passa por uma moldura dourada chamada VIEWPORT, com uma margem de 200 pixels acima e abaixo: as páginas de dentro são desenhadas inteiras e as de fora são contornos tracejados. Um contador grande indica quantas das 51 páginas estão pintadas a cada momento (IntersectionObserver · +200 px), ao lado de “Geometria: todas as páginas. Pixels: só o que você vê.”

    NarraçãoE num livro longo, só são pintadas as páginas que estão visíveis na tela.

  9. 1:14

    Na telaSeção 05, “Justificação Knuth–Plass”: “Todas as formas de quebrar o parágrafo. Ao mesmo tempo.” À esquerda, sob “Gulosa · o navegador”, um parágrafo sobre a quebra de linhas é composto de forma gulosa, como faz o navegador, com as linhas mais frouxas em vermelho. Embaixo, cada palavra é um ponto sobre uma reta: arcos vermelhos para as quebras gulosas, arcos azuis tênues que testam todas as quebras possíveis e um caminho dourado com a melhor combinação. À direita, a versão “Knuth–Plass · Postext”, de espaçamento uniforme, com os deméritos de cada linha, a fórmula “(1 + feiura + penalidade)²” e uma soma de deméritos menor.

    NarraçãoUm navegador quebra as linhas de forma gulosa, uma a uma. O Postext usa Knuth-Plass, o algoritmo do TeX: pesa todas as formas de quebrar o parágrafo inteiro e fica com a mais uniforme.

  10. 1:29

    Na telaSeção 06, “Uma diagramação, cinco saídas”: “O que você vê é o que vai para a gráfica.” Sob a linha de código const vdt = buildDocument(content, config); uma página se divide em cinco. Canvas (renderToCanvas(), bitmaps exatos ao pixel) ganha uma lupa sobre a sua grade de pixels; HTML (renderToHtml(), selecionável e responsivo) contorna cada bloco com a sua etiqueta <h1>, <p>, <figure> etc.; em PDF (renderToPdf(), para impressão, PDF/UA, CMYK) quatro chapas de cor entram em registro e aparecem marcas de corte e uma barra de cor. Em EPUB 3 (renderToEpub(), livro digital, fixo ou refluível) a página aparece num leitor de livros digitais com a etiqueta “Layout fixo”; a tela se estreita até o tamanho de um celular, o texto se redistribui e a etiqueta passa a “Refluível”. Em Folio (postext-folio, um livro em 3D que vira as páginas) a página se abre numa página dupla e uma folha gira sobre a lombada.

    NarraçãoUma diagramação, cinco saídas: canvas, HTML, PDF para impressão, EPUB 3, fixo ou refluível, e um livro em 3D. O que você vê é o que vai para a gráfica.

  11. 1:45

    Na telaSeção 07, “Por que um padrão aberto”: “LaTeX definiu o padrão do papel. Hoje a edição vive também em cada tela.” Dois cartões: LaTeX, 1984, com xis ao lado de “Pensado para a página impressa”, “Preso às fontes e pacotes de uma máquina”, “Compilar, esperar, repetir” e “Sem diagramação editorial na web responsiva”; Postext, 2026, com vistos ao lado de “Web, PDF para gráfica e EPUB 3, uma diagramação”, “Um só arquivo .postext leva tudo”, “Recompõe ao vivo enquanto você digita” e “Em qualquer navegador · sem servidores · MIT”. O cartão do Postext se acende.

    NarraçãoO LaTeX definiu o padrão do papel. Mas hoje a edição vive em todas as telas.

  12. 1:52

    Na telaChamada “Um arquivo, o livro inteiro” e manchete “Um padrão aberto para a edição, além de onde o LaTeX chega.” Um ícone de arquivo .postext se abre em cinco peças: preset.json (configuração e design), chapters/*.md (um Markdown por capítulo), fonts/*.woff2 (as próprias fontes), images/ · SVG (cada imagem, incluída) e resources (tabelas, figuras e legendas). Rodapé: “Um ZIP comum: aberto, documentado e com licença MIT. Qualquer ferramenta pode lê-lo e escrevê-lo.”

    NarraçãoO Postext é um padrão aberto: um único arquivo portátil, documentado e com licença MIT, que qualquer ferramenta pode ler e escrever.

  13. 2:03

    Na tela“A amostra · composta pelo motor real”: um mural de páginas da edição brasileira do guia se afasta em perspectiva enquanto um contador chega a 51 páginas. Texto: “11 capítulos, 3 partes e as capas, diagramados em cerca de meio segundo. Cada página do guia do Postext, calculada em um navegador pelo postext v1.20.3 para esta peça. Nada posto à mão.” Depois, as etiquetas Livros didáticos, Revistas, Edições literárias, Catálogos.

    NarraçãoPor isso ele consegue diagramar livros de centenas de páginas em décimos de segundo.

  14. 2:10

    Na telaFechamento: o logotipo do Postext com o lema “O tipógrafo programável para a web”, o endereço postext.dev, uma linha de terminal que digita “$ pnpm add postext” e o rodapé “Código aberto · MIT · github.com/drnachio/postext”.

    NarraçãoPostext. Código aberto, em postext.dev.

Capítulo 1 · Por que o Postext

Diagramação editorial, calculada para a web

A tipografia impressa passou cinco séculos aprendendo a compor uma página; os navegadores aprenderam a dispor uma interface. O Postext leva esse saber da página impressa para o navegador.

O CSS oferece layout responsivo (flexbox, grid, colunas), mas não sabe equilibrar colunas, manter um título junto ao seu parágrafo, evitar viúvas e órfãs nem levar uma figura ao topo da coluna seguinte. São decisões editoriais, refinadas ao longo de séculos de impressão.

O Postext preenche essa lacuna. Você fornece markdown semântico e um objeto de configuração. Ele mede o texto de 300 a 600 vezes mais rápido que o DOM usando @chenglou/pretext (abre em uma nova aba), depois calcula a geometria completa da página (cada linha, flutuante e legenda) e a renderiza pelos renderizadores de HTML, canvas ou PDF pronto para impressão.

Entra markdown

:::part{number="I" title="Fundamentos"
  palette="band=#2b4acb"}
:::

# Por que Postext {lead="A tipografia
impressa passou cinco séculos…"}

O Postext é um **motor de layout
de código aberto** que leva à web
o ofício da tipografia impressa,
como mostra :ref{id="fig-fluxo"}.

:::callout{type="try"}
Mude uma palavra: a página
se compõe de novo.
:::

Saem páginas

Figura 1.1 O mesmo markdown antes e depois do motor: uma abertura de capítulo, duas colunas equilibradas e uma figura levada ao topo de uma coluna.

Em números

mais rápido que o DOM para medir texto, de modo que um livro inteiro se recompõe enquanto você digita
300–600×mais rápido que o DOM para medir texto, de modo que um livro inteiro se recompõe enquanto você digita
saídas a partir de uma única diagramação: HTML, canvas, PDF pronto para impressão e EPUB 3
4saídas a partir de uma única diagramação: HTML, canvas, PDF pronto para impressão e EPUB 3
PDF etiquetado e acessível, com marcadores e cor CMYK
PDF/UAPDF etiquetado e acessível, com marcadores e cor CMYK
servidores: o motor roda inteiramente no navegador, sob licença MIT
0servidores: o motor roda inteiramente no navegador, sob licença MIT

Capítulo 2 · Capacidades

O que os tipógrafos sempre souberam

Seis coisas de que uma página precisa e que o CSS nunca foi feito para decidir, calculadas pelo motor sempre da mesma maneira.

  1. 2.1

    Justificação Knuth-Plass

    O mesmo algoritmo ótimo de quebra de linhas que o TeX usa, com hifenização por padrões do TeX e controle de órfãs: blocos de texto uniformes, sem rios de branco, além do que o CSS consegue expressar.

    Ler na documentação
  2. 2.2

    Recursos e referências cruzadas

    Figuras, diagramas SVG e tabelas flutuam para o topo ou o pé de colunas e páginas, como os flutuantes na impressão, com numeração por tipo e referências cruzadas :ref sempre sincronizadas.

    Ler na documentação
  3. 2.3

    Tabelas e legendas

    Tabelas com tipografia independente para o corpo e o cabeçalho, divididas entre páginas com o cabeçalho repetido, e legendas que seguem a sua configuração, numeradas e posicionadas junto ao recurso que descrevem.

    Ler na documentação
  4. 2.4

    Diagramas em uma só tinta

    Recolore diagramas SVG em tons de uma única tinta segundo a luminância, para que cada ilustração combine com o seu design e fique pronta para impressão em cor especial.

    Ler na documentação
  5. 2.5

    Matemática em LaTeX

    Equações no texto e em destaque escritas em LaTeX, medidas e compostas pelo motor para assentar na grade de linhas de base junto ao texto.

    Ler na documentação
  6. 2.6

    Web, PDF pronto para impressão e EPUB

    Um motor de layout, quatro saídas. As mesmas páginas calculadas são renderizadas em HTML, canvas ou PDF pronto para impressão (com marcadores, cor CMYK e saída PDF/UA etiquetada e acessível) e saem como e-book EPUB 3, página a página ou refluível.

    Ler na documentação
Cada página do guia do Postext (capa, sumário, aberturas de parte e tudo mais) é composta pelo Postext, no seu navegador, enquanto você lê.
— Colofão do guia incluído

Vitrine

Livros de verdade, compostos no seu navegador

Um livro didático, uma revista, um poema épico anotado, um catálogo de exposição, um clássico chinês em 120 capítulos, As mil e uma noites em árabe, um romance japonês composto na vertical, um quadrinho em sete idiomas. Abra qualquer um deles no Sandbox, mude uma regra e veja todas as páginas se recomporem.

Capítulo 3 · Fluxo de trabalho

Diagramação editorial em três passos

O conteúdo em markdown, o design num objeto de configuração e as páginas numa única chamada de função.

  1. 3.1

    Escreva markdown semântico

    Escreva o conteúdo em markdown enriquecido: títulos, listas, tabelas, fórmulas, boxes e referências cruzadas :ref às suas figuras. Nada de diagramação nesta etapa, só conteúdo.

  2. 3.2

    Configure as regras de diagramação

    Defina o tamanho da página, as colunas, a tipografia, o design dos títulos, os cabeços e o posicionamento dos flutuantes num objeto PostextConfig, ou desenhe tudo visualmente no Sandbox.

  3. 3.3

    Renderize em HTML, canvas ou PDF

    Chame buildDocument e receba a geometria completa da diagramação; depois renderize-a com o renderizador de HTML, canvas ou PDF pronto para impressão.

API

Uma função, controle total

Chame buildDocument com o seu conteúdo e um objeto de configuração. Você recebe a geometria completa das páginas: desenhe qualquer página como imagem com renderPage ou componha o livro inteiro como PDF pronto para impressão com renderToPdf.

book.ts
import { buildDocument, renderPage } from "postext";
import { renderToPdf } from "postext-pdf";

const doc = buildDocument(
  { markdown },
  {
    page: { sizePreset: "21x28" },
    layout: { layoutType: "double" },
    bodyText: {
      fontSize: { value: 12, unit: "pt" },
      textAlign: "justify",
      hyphenation: { enabled: true, locale: "en-us" },
    },
  }
);

// Cada página como imagem…
const cover = renderPage(doc.pages[0], doc);
cover.toBlob((png) => save(png, "cover.png"));

// …ou o livro inteiro como PDF pronto para impressão
// fontProvider: bytes TTF por família e peso (veja a documentação)
const pdf = await renderToPdf(doc, { fontProvider });

Capítulo 4 · Formato aberto

Um arquivo, o livro inteiro

Um arquivo .postext leva tudo de que um documento precisa para ser composto de novo, em qualquer máquina: um formato aberto e editável que qualquer um pode adotar.

A maioria dos formatos editoriais espalha um projeto. Uma compilação LaTeX depende das fontes e dos pacotes instalados numa máquina, e os arquivos nativos dos grandes programas de diagramação fazem link para imagens e fontes guardadas fora deles. Ao mover o projeto, algo se perde. Nós mesmos esbarramos nesses limites com o LaTeX.

Um .postext é um arquivo ZIP comum que qualquer pessoa pode abrir, ler e editar: um manifesto JSON, um arquivo Markdown por capítulo e os próprios arquivos de fontes e imagens. O Sandbox o exporta, a skill para agentes postext-port o escreve e postext/bundle o abre em qualquer programa para compor de novo as mesmas páginas. O formato é documentado e tem licença MIT, pronto para qualquer ferramenta ler e escrever.

Dentro de postext-guide.postext
  1. 4.1preset.json

    Configuração. Página, grade, famílias tipográficas, estilos de título e de parágrafo, cores e cabeços, em JSON legível.

  2. 4.2chapters/<lang>/*.md

    Capítulos. Um arquivo Markdown por capítulo: aqui, 14 capítulos em 2 idiomas.

  3. 4.3fonts/*.woff2

    Famílias tipográficas. Os próprios arquivos de fonte, não só os nomes: 18 arquivos de Lora, Fraunces, Geist e Bricolage Grotesque.

  4. 4.4preset.json › resources

    Recursos. Legendas, numeração, posicionamento e conteúdo das tabelas para as 26 figuras e tabelas a que o texto remete.

  5. 4.5resources/*.svg

    Imagens. As próprias ilustrações, em SVG ou bitmap, com a versão de cada idioma: 38 arquivos.

Figura 4.1 O próprio .postext do guia, 847 KB: tudo de que o livro precisa e nada que ele tenha de buscar fora.

Experimente

Abra o guia, obtenha as suas páginas

O primeiro exemplo do Sandbox, o guia do Postext, é um único arquivo .postext. Abra-o no navegador e transforme cada página numa imagem: as fontes, figuras e tabelas vêm do próprio arquivo.

Baixar o guiapostext-guide.postext · 847 KB
open-guide.js
import { openBundle, loadBundleFonts, registerBundleImages,
  buildBundle, renderPageToCanvas } from "postext";

// O guia do Sandbox: configuração, capítulos, fontes e imagens
const file = await fetch("postext-guide.postext").then((r) => r.blob());
const book = await openBundle(file, { locale: "en" });

await loadBundleFonts(book);      // as fontes do próprio guia
await registerBundleImages(book); // as figuras do próprio guia

// Cada página de cada capítulo como imagem
for (const doc of buildBundle(book))
  for (const page of doc.pages) {
    const canvas = document.createElement("canvas");
    renderPageToCanvas(page, doc, canvas, { scale: 0.5 });
    document.body.append(canvas);
  }

Instalação

Comece em menos de um minuto

Um pacote, sem servidor, sem dependências nativas. Adicione o postext-pdf quando precisar imprimir.

quick-start.ts
// Início rápido
import { buildDocument, renderPage } from "postext";
import { renderToPdf } from "postext-pdf";

const doc = buildDocument({
  markdown: "# Hello World\n\nYour content here.",
});

// A primeira página, desenhada num canvas
document.body.append(renderPage(doc.pages[0], doc));

// O documento inteiro como PDF
const pdf = await renderToPdf(doc, { fontProvider });